Часто ли вам приходится пользоваться сайтами-файлообменниками? А хотите иметь свой собственный файлообменник? В этом руководстве мы изучим, как производится установка и настройка сервера Seafile для синхронизации и общего доступа к файлам на Ubuntu 20.04.
Seafile – это платформа с открытым исходным кодом, которая предназначена для предоставления доступа к файлам, хранящимся на вашем сервере. Данный сервис применяется для загрузки файлов на ваш общедоступный ресурс, синхронизации содержимого этого ресурса с библиотеками на локальных устройствах, а также, для предоставления доступа к выложенным файлам для всех или определённых вами пользователям в рамках предоставленных им полномочий.
В качестве основы для установки Seafile мы будем использовать виртуальный сервер с установленной операционной системой Ubuntu 20.04. Сервер должен иметь как минимум 2GB оперативной памяти. Все подключения к серверу мы будем осуществлять под учётной записью, которая не является root-ом, но имеет полномочия sudo. В нашем руководстве это будет пользователь your-user. Также, на сервере должен быть установлен и настроен брандмауэр UFW.
Поскольку, ваш файловый сервер будет работать на сайте, вы должны иметь своё зарегистрированное доменное имя. При этом, А-запись вашего домена должна будет указывать на IP-адрес вашего виртуального сервера. В нашем руководстве мы будем использовать my-domain.host в качестве имени домена.
В качестве СУБД на нашем сервере мы будем использовать MariaDB, а в качестве веб-сервера – Apache. Также, мы настроим доступ к нашему сайту по защищённому протоколу HTTPS.
Установка MariaDB
На нашем сервере в качестве системы управления базами данных мы будем использовать MariaDB. Поэтому сначала необходимо установить на сервер данную СУБД.
Для чего обновите индексы пакетов на сервере:
$ sudo apt updateПосле этого запустите установку пакета MariaDB:
$ sudo apt install mariadb-serverПо окончании установки нужно будет запустить скрипт безопасности:
$ sudo mysql_secure_installationСкрипт должен попросить вас ввести пароль пользователя root для установленной СУБД. Так как мы пока ещё не настраивали этого пользователя, укажите, что этот пароль отсутствует, нажав Enter. Далее скрипт запросит сменить пароль пользователя root, на что следует ответить “Нет”, нажав n. На остальные вопросы скрипта можно отвечать утвердительно.

Установка веб-сервера Apache
В качестве веб-сервера в данном руководстве мы будем использовать Apache. Поскольку Apache доступен для установки из официального репозитория Ubuntu, инсталляцию пакета нужно будет произвести при помощи apt:
$ sudo apt install apache2Когда установка завершится, произведите настройку брандмауэра UFW. Запустите команду для просмотра списка приложений, включённых в брандмауэр в качестве разрешённых:
$ sudo ufw app list
Позже мы настроим доступ к нашему ресурсу по протоколу HTTPS. А пока разрешите трафик исключительно по порту 80:
$ sudo ufw allow 'Apache'Чтобы проверить изменения наберите:
$ sudo ufw status
Теперь следует запустить проверку статуса службы Apache:
$ sudo systemctl status apache2Вывод команды должен выглядеть примерно так:

И остаётся лишь удостовериться в том, что наш веб-сервер доступен по сети. Для чего в браузере наберите IP-адрес вашего VPS. Вы должны увидеть стартовую страницу Apache:

Настройка виртуального хоста
Теперь привяжем имя нашего домена к установленному на наш VPS веб-серверу. Для этого необходимо на Apache произвести настройку виртуального хоста. В нашем руководстве мы будем использовать доменное имя my-domain.host. Настройку виртуального хоста нужно будет выполнить по пунктам:
- Создайте директорию для настраиваемого домена:
$ sudo mkdir /var/www/my-domain.host- Далее, измените владельца директории и права на неё:
$ sudo chown -R $USER:$USER /var/www/my-domain.host
$ sudo chmod -R 755 /var/www/my-domain.host- В данной директории создайте файл вашего сайта index.html:
$ cd /var/www/my-domain.host
$ sudo nano index.html- В создаваемый файл скопируйте следующие строки:
<html>
   <head>
      <title>My domain on Apache!</title>
   </head>
   <body>
      <h1>MY-DOMAIN.HOST</h1>
      <p>It is my domain.</p>
   </body>
</html>- Закройте файл с сохранением внесённых изменений.
- Создайте конфигурационный файл для виртуального хоста:
$ sudo nano /etc/apache2/sites-available/my-domain.host.conf- В него вставьте следующий текст. Не забывайте заменять my-domain.hostна имя вашего домена, а в строкуServerAdminвпишите доступный адрес электронной почты:
<VirtualHost *:80>
   ServerAdmin admin@my-domain.host
   ServerName my-domain.host
   ServerAlias www.my-domain.host
   DocumentRoot /var/www/my-domain.host
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>- Активируйте созданный хост:
$ sudo a2ensite my-domain.host.conf- Отключите дефолтный домен:
$ sudo a2dissite 000-default.conf- Проверьте синтаксис конфигурации созданного хоста:
$ sudo apache2ctl configtest- Проверка должна выдать результат – Syntax Ok.
- Перезагрузите службу Apache:
$ sudo systemctl restart apache2Теперь проверьте доступность домена набрав в браузере его адрес http://my-domain.host:

Обеспечение безопасности Apache с помощью Let’s Encrypt
В этом разделе нам будет необходимо обеспечить возможность шифрования трафика на нашем веб-сервере. Мы настроим Apache таким образом, чтобы наш домен был доступен по протоколу HTTPS.
Для начала установите на свой сервер программное обеспечение Certbot. Для чего в командной строке следует набрать:
$ sudo apt install certbot python3-certbot-apacheТеперь перейдём к настройке брандмауэра UFW. Ранее мы разрешили в нашем брандмауэре трафик только по порту 80. Сейчас мы настроим доступ к нашему ресурсу по протоколу HTTPS, а доступ через HTTP, наоборот, закроем. Для этого используйте следующие две команды:
$ sudo ufw allow 'Apache Full'
$ sudo ufw delete allow 'Apache'Далее, запустите проверку статуса брандмауэра:
$ sudo ufw status
Далее, запустите получение SSL-сертификата при помощи Certbot через плагин Apache:
$ sudo certbot --apacheДанный скрипт попросит вас ответить на несколько вопросов, ответы на которые позволят вам сконфигурировать полученный SSL-сертификат на вашем сервере. Во-первых, введите доступный вам адрес электронной почты. Этот E-mail будет использоваться для уведомлений о продлении сертификата, а также, об изменениях настроек системы безопасности. Во-вторых, подтвердите своё согласие с условиями предоставления услуг Let’s Encrypt нажав A. Далее, вас спросят, хотите ли вы, получать на вашу почту информацию от Electronic Frontier Foundation. Нажмите N, чтобы отказаться от рассылки, либо Y, чтобы согласиться на неё. И, наконец, вы должны будете проинформировать Certbot о том, в отношении какого из доменных имён вы хотели бы активировать доступ по протоколу HTTPS. Если вы хотите сделать это в отношении всех представленных в списке сайтов, оставьте поле пустым и нажмите Enter. Либо, перечислите соответствующие номера строк, разделяя их при помощи запятых или пробелов, и нажмите Enter.

После этого шага Certbot активирует SSL-сертификат для вашего домена, о чём проинформирует вас при помощи своих сообщений.

Проверить доступность вашего сайта через защищённое соединение вы можете набрав в браузере ваше доменное имя с префиксом https://, например, https://my-domain.host.

Создание баз данных для компонентов Seafile
Три компоненты Seafile должны быть установлены в вашей системе для того, чтобы настраиваемый файловый сервер функционировал корректно:
- Seahub – фронтендовый веб-интерфейс Seafile. Он написан на Python с использованием фреймворка Django. С помощью Seahub вы сможете получать доступ к своим файлам, управлять ими и организовывать общий доступ к ним через браузер.
- Сервер Seafile – служба для работы с данными, которая управляет выгрузкой файлов, их загрузкой и синхронизацией. Вам не нужно будет взаимодействовать с сервером напрямую, достаточно использовать какое-либо клиентское приложение, либо веб-интерфейс сервера.
- Сервер Ccnet – RPC-служба, предназначенная для обеспечения внутренних связей между различными сегментами Seafile. При помощи этого сервиса Seahub сможет получать доступ к данным на сервере Seafile.
Все эти сегменты будут хранить свои данные отдельно, каждый в своей базе данных. Именно поэтому, теперь мы должны создать три разных базы данных. Их мы создадим при помощи MariaDB. Также, нужно будет создать для них пользователя.
Итак, подключитесь к MariaDB:
$ sudo mariadbВ командной строке MariaDB введите команду для создания пользователя ваших баз данных:
> CREATE USER 'mdb-user'@'localhost' IDENTIFIED BY 'p@$$word';Здесь, mdb-user – имя создаваемого пользователя, а p@$$word – пароль для него.
Далее, необходимо создать базы данных для всех трёх компонентов Seafile:
- seahubdb– для фронтендового веб-интерфейса Seafile;
- seafiledb– для сервера Seafile;
- ccnetdb– для сервера Ccnet.
Для создания баз данных наберите в командной строке MariaDB:
> CREATE DATABASE `seahubdb` CHARACTER SET = 'utf8';
> CREATE DATABASE `seafiledb` CHARACTER SET = 'utf8';
> CREATE DATABASE `ccnetdb` CHARACTER SET = 'utf8';Теперь, нужно дать все полномочия созданному пользователю для работы с новыми базами:
> GRANT ALL PRIVILEGES ON `seahubdb`.* to `mdb-user`@localhost;
> GRANT ALL PRIVILEGES ON `seafiledb`.* to `mdb-user`@localhost;
> GRANT ALL PRIVILEGES ON `ccnetdb`.* to `mdb-user`@localhost;После этого можно выйти из MariaDB. Для этого используйте команду:
> exitУстановка зависимостей и загрузка Seafile
Определённые элементы Seafile написаны на Python и, следовательно, для работы Seafile необходимо наличие программ и дополнительных модулей Python. На этом шаге мы установим требуемые зависимости прежде, чем скачать и распаковать пакет сервера Seafile.
Итак, во-первых, установите pip – менеджер пакетов Python. Соответствующий пакет для Debian называется python3-pip. Для установки пакета запустите:
$ sudo apt install -y python3-pipПо окончании установки пакета pip запустите инсталляцию дополнительных зависимостей при помощи команды pip3:
$ pip3 install Pillow captcha django-simple-captchaДля команды pip3 install необязательно использование sudo. Эти пакеты устанавливаются в домашний каталог вашего пользователя, и поэтому их инсталляция не требует привилегий root. Сервер Seafile требует установки пакета Pillow, библиотеки для обработки образов. Также, для работы Seafile требуется установка пакетов captcha и django-simple-captcha, чтобы обеспечить поддержку каптча для аутентификации.
Теперь, когда необходимые зависимости установлены, вы можете загрузить установочный пакет Seafile. Для его инсталляции нам потребуются дополнительные каталоги. Их нужно будет создать в домашнем каталоге вашего пользователя:
$ cd ~
$ mkdir seafile
$ cd seafileДалее, загрузите последнюю версию Seafile. В нашем руководстве мы будем устанавливать версию 7.1.5:
$ wget https://download.seadrive.org/seafile-server_7.1.5_x86-64.tar.gzЗагруженный дистрибутив Seafile представляет из себя tar-архив, который вам нужно будет распаковать, прежде чем продолжить:
$ tar -zxvf seafile-server_7.1.5_x86-64.tar.gzПосле чего перейдите в разархивированную директорию:
$ cd seafile-server-7.1.5Настройка сервера Seafile
Для своей работы сервер Seafile потребует от вас некоторой информации. Её необходимо предоставить сервису перед первым его запуском. Эта информация включает в себя такие данные как имя домена и настройки базы данных. Чтобы начать наполнение Seafile ответами на требуемые вопросы, вам нужно запустить на исполнение скрипт setup_seafile_mysql.sh,  который входит в состав архива, распакованного на предыдущем шаге:
$ bash setup-seafile-mysql.sh
Для продолжения нажмите Enter.
Далее скрипт задаст вам несколько вопросов. Везде, где вы хотите использовать значения по умолчанию, просто нажимайте клавишу Enter не вводя никакой информации.
В качестве имени сервера здесь мы будем использовать Seafile-Server. Вы, конечно же, можете ввести другое:

Далее, введите ваше имя домена:

Введите номер порта, который вы хотите использовать на своём файловом сервере. Для принятия значения по умолчанию нажмите Enter:

Далее, следует выбрать создание новых баз данных для Seafile или использование уже существующих. В нашем примере, выбор – пункт 2:

Оставшиеся вопросы относятся к СУБД MariaDB. Здесь вам нужно будет ввести имя и пароль пользователя MariaDB, который вы создали ранее. А также, примите значения по умолчанию в назначении хоста и порта для сервера mysql:

Если пароль вашего пользователя принят, скрипт попросит вас набрать имена баз данных Seafile. В нашем руководстве эти базы мы назвали seahubdb, seafiledb и ccnetdb. Скрипт проверит корректность подключения к базам данных и отобразит на экране сводную информацию о начальной конфигурации:

Для подтверждения нажмите Enter:

Поскольку вы будете запускать сервер Seafile, который по факту находится за Apache, то в брандмауэре нет необходимости открывать порты 8000 и 8082. Следовательно, вы можете игнорировать заключительную часть вывода.
Настройка веб-сервера Apache
В этом разделе мы произведём настройку веб-сервера Apache. Эта настройка нужна для того, чтобы Apache умел пересылать все получаемые запросы в Seafile. Применение такой настройки Apache позволит ему использовать только URL-адрес, без номера порта. А также, это поможет включать HTTPS-соединения при обмене данными с Seafile и использовать кэширование в Apache для повышения производительности.
Чтобы начать пересылать запросы нужно в конфигурации Apache включить модуль proxy_http. Этот модуль делает возможным использование проксирования HTTP и HTTPS запросов. Включите модуль следующей командой:
$ sudo a2enmod proxy_httpДля этой настройки также требуется наличие модулей ssl и rewrite. Их мы уже включили, когда настраивали шифрование трафика Apache при помощи Let’s Encrypt.
Далее, нужно будет настроить виртуальный хост my-domain.host. Это необходимо для того, чтобы обеспечить перенаправление запросов на  Seafile и Seahub. Чтобы сделать это, откройте для редактирования файл конфигурации. Он располагается в каталоге /etc/apache2/sites-enabled/:
$ cd /etc/apache2/sites-enabled
$ sudo nano my-domain.host-le-ssl.confВ этом файле строки от ServerAdmin до SSLCertificateKeyFile относятся к настройке шифрования при помощи Let’s Encrypt, которую мы сделали ранее. Добавьте выделенные строки в файл, используя имя вашего пользователя вместо your-user:
<IfModule mod_ssl.c>
<VirtualHost *:443>
   ServerAdmin mail@my-domain.host
   ServerName my-domain.host
   ServerAlias www.my-domain.host
   DocumentRoot /var/www/my-domain.host
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/my-domain.host/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my-domain.host/privkey.pem
Alias /media  /home/your-user/seafile/seafile-server-latest/seahub/media
    <Location /media>
        Require all granted
    </Location>
    # seafile fileserver
    ProxyPass /seafhttp http://127.0.0.1:8082
    ProxyPassReverse /seafhttp http://127.0.0.1:8082
    RewriteEngine On
    RewriteRule ^/seafhttp - [QSA,L]
    # seahub web interface
    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
    ProxyPass / http://127.0.0.1:8000/
    ProxyPassReverse / http://127.0.0.1:8000/
</VirtualHost>
</IfModule>Здесь, используется несколько директив:
- Alias– сопоставляет путь- my-domain.host/mediaс каталогом в системе, на которой установлен Seafile.
- Location– в ней указано, что доступ к содержимому этого каталога открыт.
- ProxyPassи- ProxyPassReverse– принуждают Apache работать как обратный прокси-сервер для хоста. То есть, все запросы, попадающие на порты 8000 и 8082, перенаправляются в каталоги файлового сервера и веб-интерфейса Seafile- /и- /seafhttpсоответственно.
- RewriteRule– передаёт запросы в директорию- /seafhttpне изменяя их, а также, прекращает обработку дальнейших правил (- [QSA,L]).
По окончании редактирования закройте файл, сохранив внесённые изменения. После чего проверьте корректность синтаксиса Apache:
$ sudo apache2ctl configtestЕсли проверка выдала Syntax OK, перезапустите Apache для применения изменений:
$ sudo systemctl restart apache2Изменение конфигурации Seafile и запуск сервисов
Так как вы используете Apache, чтобы проксировать все запросы к Seafile, вам нужно будет изменить URL-адреса в конфигурационных файлах Seafile. Для этого перейдите в каталог conf и откройте для редактирования файл ccnet.conf:
$ cd ~/seafile/conf
$ sudo nano ccnet.confВ этом файле отредактируйте значение переменной SERVICE_URL, указав в качестве значения новый URL-адрес без указания номера порта, но с префиксом https:
SERVICE_URL = https://my-domain.host
Сохраните изменения и закройте файл. После чего откройте файл seahub_settings.py:
$ sudo nano seahub_settings.pyЗдесь вам необходимо добавить переменную FILE_SERVER_ROOT, определяющую путь, который Seafile будет прослушивать для загрузки и выгрузки файлов:
FILE_SERVER_ROOT = 'https://my_domain.host/seafhttp'
Сохраните изменения, закройте файл. Затем запустите службу Seafile и интерфейс Seahub:
$ cd ~/seafile/seafile-server-7.1.5
$ ./seafile.sh start
$ ./seahub.sh startТак как вы впервые запускаете сервис Seahub, вам нужно будет создать учетную запись администратора. Здесь введите доступный вам адрес электронной почты и пароль для создаваемого пользователя:

В случае, если при запуске seahub.sh, у вас появится сообщение:
LC_ALL is not set in ENV, set to en_US.UTF-8то, вам необходимо будет в файл /etc/default/locale добавить строку:
LC_ALL="en_US.UTF-8"Теперь откройте в браузере адрес вашего сайта и авторизуйтесь на нём с помощью адреса электронной почты и пароля:

После успешного подключения к системе вы попадёте в веб-интерфейс администратора.

Активизация старта сервера Seafile при загрузке системы
Чтобы ваш файловый сервер и веб-интерфейс запускался автоматически при загрузке системы, нужно будет создать файлы сервиса и активировать их.
Сначала создайте файл службы для файлового сервера Seafile:
$ cd /etc/systemd/system
$ sudo nano seafile.serviceДобавьте в этот файл следующие строки:
[Unit]
Description=Seafile
After=network.target mariadb.service
[Service]
Type=forking
ExecStart=/home/your-user/seafile/seafile-server-latest/seafile.sh start
ExecStop=/home/your-user/seafile/seafile-server-latest/seafile.sh stop
User=your-user
Group=your-user
[Install]
WantedBy=multi-user.targetВ строках ExectStart и ExecStop указаны команды запуска и остановки сервиса Seafile. Сервис будет запускаться от имени пользователя и группы your-user. Строка After определяет запуск службы Seafile только после старта сетевого окружения и сервиса MySQL.
Далее, создайте файл сервиса для веб-интерфейса Seahub:
$ cd /etc/systemd/system
$ sudo nano seahub.serviceЗдесь всё так же, как и в предыдущем файле. Единственное отличие заключается в том, что веб-интерфейс будет стартовать после службы Seafile:
[Unit]
Description=Seafile hub
After=network.target seafile.service
[Service]
Type=forking
ExecStart=/home/your-user/seafile/seafile-server-latest/seahub.sh start
ExecStop=/home/your-user/seafile/seafile-server-latest/seahub.sh stop
User=sammy
Group=sammy
[Install]
WantedBy=multi-user.targetЗакройте созданный файл с сохраненим изменений.
И наконец, активируйте автоматический старт обоих сервисов при запуске системы:
$ sudo systemctl enable seafile.service
$ sudo systemctl enable seahub.serviceТеперь, если вы перезагрузите свой сервер, Seafile запустится автоматически.
Тестирование функциональности синхронизации файлов и их совместного использования
В этом разделе мы протестируем функционал нашего настроенного сервера, касающийся синхронизации и совместного использования файлов. Чтобы это осуществить, нужно будет установить клиентское приложение Seafile на отдельную рабочую станцию или мобильное устройство.
Перейдите на страницу загрузки Seafile и следуя инструкциям установите последнюю версию клиентской программы. Клиентское программное обеспечение Seafile доступно для различных дистрибутивов Linux, а также, MacOS, и Windows. При этом мобильный клиент также доступен для устройств, работающих на Android и IOS, и его можно загрузить из соответствующих магазинов приложений.
Установив клиента, откройте его и примите дефолтное расположение каталога Seafile, нажмите Next.
В следующем окне нужно будет ввести адрес вашего сервера, имя пользователя и пароль, после чего нажать Login.
Далее, на стартовой странице правой кнопкой мыши нажмите на My Library и затем кликните Sync this library, либо Синхронизировать эту библиотеку. Примите дефолтное расположение библиотеки на вашем компьютере или устройстве.

Добавьте какой-нибудь файл, например, документ или фотографию, в каталог My Library. Спустя какое-то время файл загрузится на сервер, и вы сможете увидеть его в папке My Libraries, подключившись в браузере к вашему серверу.

Теперь правой кнопкой мыши нажмите на этот файл в браузере и кликните Share или Общий доступ. Таким образом, вы сможете сгенерировать ссылку на его скачивание.

Заключение
В данном руководстве мы создали и настроили приватный файловый сервер Seafile. Теперь, вы можете загружать на него свои файлы, добавлять на нём пользователей и группы пользователей и предоставлять им доступ на файлы не используя при этом никаких сторонних файлообменных сервисов.

Пипец проделано работы. Спасибо
2021-12-22 at 12:34Огромное Вам спасибо за подробное руководство.
2022-05-08 at 19:13Но у меня есть вопрос: Как добавить диски к дисковому пространству Seafile?
Я устанавливал систему на ssd диск и теперь, при подключении HDD к настроенной системе не вижу его.
Зависит от того, что именно вы хотите сделать.
– Если Вы хотите использовать HDD вместо SSD, то нужно будет перенести seafile директорию с данными и изменить настройки в файле seafile.ini
– Если вы хотите расширить объем текущего хранилища, то, скорее всего, Вам потребуется LVM для создания логического раздела.
2022-05-11 at 12:44У кого на команду “sudo ufw status” пишет “Status: inactive” используйте команду
2022-08-09 at 08:31sudo ufw enable
У кого не запускается seahub.sh (версия 9.0.6), запускаем с параметром start-fastcg и смотрим на чем останавливается.
2022-08-17 at 21:38Если ошибка “Do you install mysqlclient?”
Используйте команды:
$ sudo apt install default-libmysqlclient-dev
$ pip3 install mysqlclient