Облачное хранилище Nextcloud с доступом по Web и WebDAV

By | 2016-12-10
Корпорация Добра сливает инфу в АНБ? Мы смеёмся.
Google Reader закрыли, выкинув всех юзеров на мороз? Мы смеёмся, и просим ещё.
Мы бездушно синхронизируем что угодно, наши предпочтения не основаны на интересах больших компаний,
мы — истинное лицо файлшеринга.
dr Equivalent

Учитывая практически повсеместную доступность интернета, облака, являются весьма удобным средством хранения и обмена файлами. Но что делать, если не хочется чтобы к ним имели доступ посторонние люди? Поднять своё.


Установка описана для FreeBSD 11.
Разработчики Nextcloud, в качестве сервера рекомендуют Apache, но так как у меня уже используется nginx, воспользуюсь им. Ну и в качестве СУБДMySQL:

pkg install nginx
pkg install mysql56-client mysql56-server

Установку самого Nextcloud можно выполнить через pkg, но на момент написания статьи в качестве зависимостей был указан php56 и сопутствующие библиотеки, а уж почти как год вышел PHP7, который обещает повышение производительности, да и вообще как минимум поддержки. Поставим вручную.
Выполняем pkg install nextcloud, установщик выдаст список зависимостей и у всех пакетов, содержащих php, заменим php56 на php70 и получившийся список ставим:

pkg install php70 php70-bz2 php70-ctype php70-curl php70-dom php70-exif php70-fileinfo php70-filter php70-gd php70-hash php70-iconv php70-json php70-json php70-mbstring php70-mysqli php70-openssl php70-pdo php70-pdo_mysql php70-posix php70-session php70-simplexml php70-wddx php70-xml php70-xmlreader php70-xmlwriter php70-xsl php70-zip php70-zlib
pkg install libffi mp3info openldap-client python27 python2 readline talloc tdb tevent

Если хотим подключать внешние диски по smb, то необходимо поставить samba36-libsmbclient, который также требует php56.
В файле /etc/make.conf устанавливаем версию PHP по умолчанию:

echo "DEFAULT_PHP_VER?=70" >> /etc/make.conf

И, как обычно, ставим пакет из портов:

cd /usr/ports/net/samba-libsmbclient
make && make install && make clean

Скачиваем свежий релиз с офсайта, распаковываем в папку web-сервера и устанавливаем папке владельца:

fetch https://download.nextcloud.com/server/releases/nextcloud-10.0.1.tar.bz2
tar -C /usr/local/www/ -xzf nextcloud-10.0.1.tar.bz2
chown -R www:www /usr/local/www/nextcloud/

В /usr/local/etc/php-fpm.conf прописываем сокет, который будет слушать php-fpm, его владельца с правами и раскоментируем установку переменных окружения:

listen = /var/run/php-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0660
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

В /usr/local/etc/php.ini устанавливаем максимальное количество одновременно загружаемых файлов и их размер:

post_max_size = 2048G
upload_max_filesize = 2048M
max_file_uploads = 20

Правим настройки Web-сервера в /usr/local/etc/nginx/nginx.conf:

#Настройки даны для подпапки на сервере.
http {
        include       mime.types;
        default_type  application/octet-stream;

        sendfile        on;
        keepalive_timeout  65;

        server {
                listen       80 default_server;
                server_name  example.com;
                root   /usr/local/www/example.com;
                return 301 https://$server_name$request_uri;
        }
        server {
                listen       443 ssl;
                server_name  example.com;
                root   /usr/local/www/example.com;

                ssl_certificate      /etc/ssl/certs/mydomain.ca-bundle;
                ssl_certificate_key  /etc/ssl/certs/mydomain.key;
                ssl_dhparam /etc/ssl/certs/dhparam.pem;

                ssl_session_cache    shared:SSL:50m;
                ssl_session_timeout  1d;
                ssl_session_tickets off;

                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
                ssl_prefer_server_ciphers  on;

                ssl_stapling on;
                ssl_stapling_verify on;
                resolver 127.0.0.1; # 8.8.4.4 8.8.8.8;

		add_header Strict-Transport-Security 'max-age=631138519; includeSubDomains; preload' always;
                add_header X-Content-Type-Options nosniff;
                add_header X-Frame-Options "SAMEORIGIN";
                add_header X-XSS-Protection "1; mode=block";
                add_header X-Robots-Tag none;
                add_header X-Download-Options noopen;
                add_header X-Permitted-Cross-Domain-Policies none;

                # The following 2 rules are only needed for the user_webfinger app.
                # Uncomment it if you're planning to use this app.
                rewrite ^/mycloud/.well-known/host-meta /owncloud/public.php?service=host-meta last;
                rewrite ^/mycloud/.well-known/host-meta.json /owncloud/public.php?service=host-meta-json last;

                location = /mycloud/.well-known/carddav {
                        return 301 $scheme://$host/mycloud/remote.php/dav;
                }
                location = /mycloud/.well-known/caldav {
                        return 301 $scheme://$host/mycloud/remote.php/dav;
                }

                location ^~ /mycloud {
                        # set max upload size
                        client_max_body_size 2G;
                        #client_body_buffer_size 1m;
                        #client_header_timeout 3m;
                        #client_body_timeout 3m;

                        fastcgi_buffering off;
                        fastcgi_buffers 64 4K;

                        gzip off;

                        error_page 403 /mycloud/core/templates/403.php;
                        error_page 404 /mycloud/core/templates/404.php;

                        location /mycloud {
                                rewrite ^/mycloud/caldav(.*)$ /mycloud/remote.php/caldav$1 redirect;
                                rewrite ^/mycloud/carddav(.*)$ /mycloud/remote.php/carddav$1 redirect;
                                rewrite ^/mycloud/webdav(.*)$ /mycloud/remote.php/webdav$1 redirect;
                                rewrite ^(/mycloud/core/doc/[^\/]+/)$ $1/index.html;
                                rewrite ^ /mycloud/index.php$uri;
                        }

                        location ~ ^/mycloud/(?:build|tests|config|lib|3rdparty|templates|data)/ {
                                deny all;
                        }
                        location ~ ^/mycloud/(?:\.|autotest|occ|issue|indie|db_|console) {
                                deny all;
                        }

                        location ~ ^/mycloud/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
                                include fastcgi_params;
                                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                                fastcgi_param PATH_INFO $fastcgi_path_info;
                                fastcgi_param HTTPS on;
                                #Avoid sending the security headers twice
                                fastcgi_param modHeadersAvailable true;
                                fastcgi_param front_controller_active true;
                                fastcgi_pass unix:/var/run/php-fpm.sock;
                                fastcgi_intercept_errors on;
                                fastcgi_request_buffering off;
                        }

                        location ~ ^/mycloud/(?:updater|ocs-provider)(?:$|/) {
                                try_files $uri/ =404;
                                index index.php;
                        }

                        # Adding the cache control header for js and css files
                        # Make sure it is BELOW the PHP block
                        location ~* \.(?:css|js)$ {
                                try_files $uri /mycloud/index.php$uri$is_args$args;
                                add_header Cache-Control "public, max-age=7200";
                                # Add headers to serve security related headers  (It is intended
                                # to have those duplicated to the ones above)
                                # Before enabling Strict-Transport-Security headers please read
                                add_header Strict-Transport-Security "max-age=15768000;
                                # includeSubDomains; preload;";
                                add_header X-Content-Type-Options nosniff;
                                add_header X-Frame-Options "SAMEORIGIN";
                                add_header X-XSS-Protection "1; mode=block";
                                add_header X-Robots-Tag none;
                                add_header X-Download-Options noopen;
                                add_header X-Permitted-Cross-Domain-Policies none;
                                # Optional: Don't log access to assets
                                access_log off;
                        }

                        location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
                                try_files $uri /mycloud/index.php$uri$is_args$args;
                                # Optional: Don't log access to other assets
                                access_log off;
                        }
                }
        }
}

Разрешаем и запускаем службы:

echo 'nginx_enable="YES"' >> /etc/rc.conf
echo 'php_fpm_enable="YES"' >> /etc/rc.conf
echo 'mysql_enable="YES"' >> /etc/rc.conf
service mysql start
service php-fpm start
service nginx start

Зайдем в консоль MySQL и создадим пользователя:

mysql> GRANT ALL ON nextcloud.* TO 'ncuser'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

Открываем в браузере https://наш_серсер/mycloud и установим имя/пароль админа, учетные данные к базе данных:
[ Здесь должна быть картинка, но её не будет, т.к. всё уже поставлено, а скрины не сделаны 🙁 ]

Далее заходим в систему и видим симпатичную мордаху:
Nextcloud web interface
Теперь можно полазить по настройкам и установить дополнительные приложения, например «Календарь», «Контакты» и т.д.

Доступ по WebDAV из под Windows 10
Запускаем службу «Веб-клиент»

net start webclient

Открываем «МойЭтот Компьютер», жмём «Компьютер»«Подключить сетевой диск»:
Подключить сетевой диск

В поле «Папка» пишем https://наш_сервер/mycloud/remote.php/webdav отмечаем галку «Использовать другие данные» и нажимаем готово:
Подключить сетевой диск

В следующем окне вводим имя пользователя и пароль:
Имя пользователя и пароль

В результате в системе появится сетевой диск:
Сетевой диск

Пользователи из LDAP
Идём в Приложения и добавляем External user support и LDAP user and group backend.
Далее в Интеграция с LDAP/AD, прописываем сервер, имя/пароль пользователя, который будет читать каталог и DN.
Пользователи LDAP

Внешнее SMB-хранилище
Ставим приложение External storage support.
Идём во Внешнее хранилище прописываем сервер, папку и пользователя.
Внешнее хранилище

Два выше приведённых пункта имеют обширные настройки групп и безопасности, что делает сие приложение достаточно годным для применения в небольшой и бедной организации.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *