LinuxАдминистрирование

Установка облачного хранилища Seafile на Debian

Seafile - хранилище файлов, которая организует их в библиотеки и синхронизирует на различных устройствах. Seafile обладает потрясающей производительностью в синхронизации файлов, позволяет настроить различные правила доступа к разным файлам. Подключаться к хранилищу можно с разных клиентов, которые доступны на Linux, macOS, Windows, iOS и Android.

Установка зависимостей

Для начала обновите локальную базу пакетов:

$ apt update

Установите необходимые для работы хранилища пакеты python:

$ apt install python3 python3-setuptools python3-pip python3-ldap -y
$ pip3 install --timeout=3600 Pillow pylibmc captcha jinja2 sqlalchemy psd-tools django-pylibmc django-simple-captcha

Загрузка последней стабильной версии

Устанавливать будем в папку /opt/seafile:

$ mkdir /opt/seafile

Скачайте с помощью утилиты wget архив с последней версией продукта, последняя версия во время написания инструкции - 7.0.5, актуальную версию можно посмотреть на официальном сайте:

$ mkdir /opt/seafile/installed
$ wget -P /opt/seafile/installed https://download.seadrive.org/seafile-server_7.0.5_x86-64.tar.gz
$ tar -xz -C /opt/seafile -f /opt/seafile/installed/seafile-server_*

Настройка Seafile Server и базы данных

Запустите скрипт установки и настройки БД:

$ /opt/seafile/seafile-server-7.0.5/setup-seafile-mysql.sh
ОпцияЗначение
[ server name ]< название сервера >
[ This server's ip or domain ]< домен или IP адрес >
[ default "/opt/seafile/seafile-data" ]"место хранения файлов, например /srv/seafile-data"
[ default "8082" ]< порт >
[ 1 or 2 ]"1 (создать новые БД)"
[ default "localhost" ]< хост БД >
[ default "3306" ]< порт БД >
[ root password ]< root пароль от БД >
[ default "seafile" ]< пользователь от БД  >
[ password for seafile ]< пароль от БД >
[ default "ccnet-db" ]< >
[ default "seafile-db" ]< >
[ default "seahub-db" ]< >

Если ошибок не возникло — значит все прошло успешно. Можно запустить файловое хранилище seafile с созданной конфигурацией:

$ /opt/seafile/seafile-server-latest/seafile.sh start

И веб-интерфейс, к которому можно подключиться через браузер:

$ /opt/seafile/seafile-server-latest/seahub.sh start

При первом запуске будет необходимо создать административный аккаунт. Еще я поменял стандартный порт на 8081, вместо 8000. В файле /opt/seafile/conf/gunicorn.conf указал bind = "0.0.0.0:8081".

WebDAV я повесил на 8083 порт, в файле /opt/seafile/conf/seafdav.conf — port = 8083.

Настройка Nginx

У меня получился вот такой конфигурационный файл хоста:

log_format seafileformat '$http_x_forwarded_for $remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $upstream_response_time';

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name host_name;
    server_tokens off;

    keepalive_timeout   60;
    ssl_certificate     /etc/letsencrypt/live/host_name/cert.pem;
    ssl_certificate_key /etc/letsencrypt/live/host_name/privkey.pem;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  "RC4:HIGH:!aNULL:!MD5:!kEDH";
    # add_header Strict-Transport-Security 'max-age=604800';
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

    proxy_set_header X-Forwarded-For $remote_addr;

    location / {
        proxy_pass     http://127.0.0.1:8081;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
        proxy_set_header   X-Forwarded-Proto https;
        proxy_read_timeout 1200s;

        # used for view/edit office file via Office Online Server
        client_max_body_size 0;

        access_log     /var/log/nginx/host_name.access.log seafileformat;
        error_log      /var/log/nginx/host_name.error.log;
    }

    location /seafhttp {
        rewrite ^/seafhttp(.*)$ $1 break;
        proxy_pass http://127.0.0.1:8082;
        client_max_body_size 0;
        proxy_request_buffering off;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_connect_timeout   36000s;
        proxy_read_timeout  36000s;
        proxy_send_timeout  36000s;

        send_timeout        36000s;

        access_log      /var/log/nginx/host_name.access.log seafileformat;
        error_log       /var/log/nginx/host_name.error.log;
    }

    location /media {
        root /opt/seafile/seafile-server-latest/seahub;
    }

    location /seafdav {
        fastcgi_pass    127.0.0.1:8083;
        fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
        fastcgi_param   PATH_INFO           $fastcgi_script_name;

        fastcgi_param   SERVER_PROTOCOL     $server_protocol;
        fastcgi_param   QUERY_STRING        $query_string;
        fastcgi_param   REQUEST_METHOD      $request_method;
        fastcgi_param   CONTENT_TYPE        $content_type;
        fastcgi_param   CONTENT_LENGTH      $content_length;
        fastcgi_param   SERVER_ADDR         $server_addr;
        fastcgi_param   SERVER_PORT         $server_port;
        fastcgi_param   SERVER_NAME         $server_name;
        fastcgi_param   HTTPS               on;
        fastcgi_param   HTTP_SCHEME         https;

        client_max_body_size 0;
        proxy_connect_timeout  36000s;
        proxy_read_timeout  36000s;
        proxy_send_timeout  36000s;
        send_timeout  36000s;

        # This option is only available for Nginx >= 1.8.0. See more details below.
        proxy_request_buffering off;

        access_log      /var/log/nginx/seafdav.access.log;
        error_log       /var/log/nginx/seafdav.error.log;
    }
}

Не забудьте заменить host_name на реальный домен.

В файле /opt/seafile/conf/ccnet.conf необходимо также указать домен:

SERVICE_URL = https://host_name

И добавить строчку в файл /opt/seafile/conf/seahub_settings.py:

FILE_SERVER_ROOT = 'https://host_name/seafhttp'

Настройка smtp для отправки почты

В файле /opt/seafile/conf/seahub_settings.py надо указать следующие настройки (я использую Gmail):

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'cloud@host_name'
EMAIL_HOST_PASSWORD = 'PASSWORD'
EMAIL_PORT = 587
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
SERVER_EMAIL = EMAIL_HOST_USER

Автозагрузка Seafile (systemd)

Более подробно с сервисами systemd можно познакомиться тут. Файлы юнитов.

/etc/systemd/system/seafile.service:

[Unit]
Description=Seafile
# add mysql.service or postgresql.service depending on your database to the line below
After=network.target mysql.service

[Service]
Type=oneshot
ExecStart=/opt/seafile/seafile-server-latest/seafile.sh start
ExecStop=/opt/seafile/seafile-server-latest/seafile.sh stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

/etc/systemd/system/seahub.service:

[Unit]
Description=Seafile hub
After=network.target seafile.service

[Service]
# change start to start-fastcgi if you want to run fastcgi
ExecStart=/opt/seafile/seafile-server-latest/seahub.sh start
ExecStop=/opt/seafile/seafile-server-latest/seahub.sh stop
User=seafserver
Group=seafserver
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Перегружаем конфигурацию systemd:

$ systemctl daemon-reload

Останавливаем сервер Seafile:

$ /opt/seafile/seafile-server-latest/seahub.sh stop && /opt/seafile/seafile-server-latest/seafile.sh stop

Активируем сервисы:

$ systemctl enable seafile && systemctl enable seahub

Запускаем Seafile:

$ systemctl start seahub && systemctl start seafile

Резервная копия данных

БД MySQL:

$ mysqldump -h [mysqlhost] -u[username] -p[password] --opt ccnet-db > /backup/databases/ccnet-db.sql.`date +"%Y-%m-%d-%H-%M-%S"`

$ mysqldump -h [mysqlhost] -u[username] -p[password] --opt seafile-db > /backup/databases/seafile-db.sql.`date +"%Y-%m-%d-%H-%M-%S"`

$ mysqldump -h [mysqlhost] -u[username] -p[password] --opt seahub-db > /backup/databases/seahub-db.sql.`date +"%Y-%m-%d-%H-%M-%S"`

Файлы:

$ rsync -az /srv/seafile-data /backup/data

Конфиги:

$ rsync -az /opt/seafile /backup/conf

Восстанавливать в обратном порядке. После восстановления желательно запустить seaf-fsck для проверки данных.

Seafile FSCK

На стороне сервера Seafile хранит файлы в библиотеках во внутреннем формате. Seafile имеет свое собственное представление каталогов и файлов (аналогично Git).

При установке по умолчанию эти внутренние объекты хранятся непосредственно в файловой системе сервера (например, Ext4, NTFS). Но большинство файловых систем не обеспечивают целостность содержимого файла после жесткого отключения или сбоя системы. Таким образом, если новые внутренние объекты Seafile записываются при сбое системы, они могут быть повреждены после перезагрузки системы. Это сделает часть соответствующей библиотеки недоступной.

Начиная с версии 2.0, сервер Seafile поставляется с инструментом seaf-fsck, который поможет вам справиться с этим повреждением (аналогично инструменту git-fsck). Этот инструмент восстанавливает любую поврежденную библиотеку до ее последнего согласованного и пригодного для использования состояния.

Инструмент seaf-fsck принимает следующие аргументы:

$ cd /opt/seafile/seafile-server-latest
$ ./seaf-fsck.sh [--repair | -r] [--export | -E export_path] [repo_id_1 [repo_id_2 ...]]

Для seaf-fsck есть три режима работы:

  • проверка целостности библиотек
  • восстановление поврежденных библиотек
  • экспорт библиотек

Более подробно можно прочитать в документации.

Программа "сборки мусора"

Seafile использует технологию дедупликации хранилища, чтобы уменьшить использование хранилища. Базовые блоки данных не будут удалены сразу после удаления файла или библиотеки. В результате количество неиспользуемых блоков данных на сервере Seafile увеличится.

Чтобы освободить пространство памяти, занимаемое неиспользованными блоками, вы должны запустить программу "сборки мусора" для очистки неиспользуемых блоков на вашем сервере.

Чтобы увидеть, сколько мусора можно собрать, фактически не удаляя мусор, используйте опцию пробного запуска:

$ seaf-gc.sh --dry-run

Чтобы фактически удалить блоки мусора, запустите без опции --dry-run:

$ seaf-gc.sh

Ниже приведён скрипт для очистки мусора, который можно поставить на cron:

#!/bin/bash

#####
# Uncomment the following line if you rather want to run the script manually.
# Display usage if the script is not run as root user
#        if [[ $USER != "root" ]]; then
#                echo "This script must be run as root user!"
#                exit 1
#        fi
#
# echo "Super User detected!!"
# read -p "Press [ENTER] to start the procedure, this will stop the seafile server!!"
#####

# stop the server
echo Stopping the Seafile-Server...
systemctl stop seafile.service
systemctl stop seahub.service

echo Giving the server some time to shut down properly....
sleep 20

# run the cleanup
echo Seafile cleanup started...
sudo -u seafile $pathtoseafile/seafile-server-latest/seaf-gc.sh

echo Giving the server some time....
sleep 10

# start the server again
echo Starting the Seafile-Server...
systemctl start seafile.service
systemctl start seahub.service

echo Seafile cleanup done!

Очистка устаревших данных

Сессии:

$ ./seahub.sh python-env seahub/manage.py clearsessions

Устаревшие данные библиотеки:

$ ./seahub.sh python-env seahub/manage.py clear_invalid_repo_data
Loading...