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