Перейти к основному содержанию
 

Seafile — установка на Ubuntu 18.04 LTS

Seafile

Seafile — это личное облачное хранилище для хранения данных в стиле Dropbox.

https://www.seafile.com

Сегодня мы развернём это хранилище на виртуальном сервере. В качестве гипервизора у нас ESXi 6.7 Update 1.

  • Сервер с операционной системой Ubuntu 18.04 LTS
  • Seafile для безопасности запустим под отдельным пользователем.
  • В качестве БД используем MySQL 8 на отдельном сервере. Никто не мешает поднять отдельный MySQL на том же сервере, просто у меня уже есть настроенный MySQL, использую его.
  • Дополнительно поднимем и настроим Nginx на том же сервере в качестве вторичного фронтенда.
  • Дополнительно настроим IIS на отдельном сервере в качестве реверс-прокси сервера, первичного фронтенда и SSL терминатора. Можно и Nginx настроить с поддержкой SSL, и снова у меня уже есть IIS с настроенным получением сертификатов LetsEncrypt.

Ссылки

Для удобства все использованные в статье ссылки собраны здесь.

https://www.seafile.com

https://www.seafile.com/en/download/

Установка Ubuntu Server 18.04.2 LTS на виртуальную машину VMware

VMware - подключение нового диска в ubuntu

IIS как обратный прокси-сервер (reverse proxy)

IIS - SSL сертификат Let's Encrypt

IIS - редирект с HTTP на HTTPS плюс убираем WWW

Мануал:

https://manual.seafile.com/

Для тех кто хочет обойтись без IIS и настроить SSL на Nginx. Плюс настройка MySQL на том же сервере:

https://www.howtoforge.com/tutorial/seafile-on-ubuntu-with-nginx/

Подготовка сервера

Подготовим сервер с операционной системой Ubuntu 18.04 LTS:

Установка Ubuntu Server 18.04.2 LTS на виртуальную машину VMware

Seafile отличается низкими требованиями к ресурсам, поэтому выделяем 1 CPU и 1 Гб оперативной памяти. Жёсткий диск под систему: 20 Гб.

Работаем под рутом. Обновляем репозиторий:

sudo apt-get update

Я для собственного удобства устанавливаю mc:

sudo apt-get install mc -y

seafile

Для хранения файлов личного хранилища я собираюсь использовать отдельный диск. Подключаем новый диск к виртуальному серверу:

VMware - подключение нового диска в ubuntu

Я собираюсь добавить толстый диск объёмом 500 Гб

seafile

В свойствах виртуалки New standard hard disk.

seafile

Указываем нужный размер. Save.

Перезагружаем сервер:

sudo reboot

Работаем под рутом. После перезагрузки проверяем, что диск увиделся:

fdisk -l
root@mpcloud:~# fdisk -l
Disk /dev/loop0: 91 MiB, 95408128 bytes, 186344 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: CE15A055-7F7F-47FF-8A0F-2E02DF0943EA

Device     Start      End  Sectors Size Type
/dev/sda1   2048     4095     2048   1M BIOS boot
/dev/sda2   4096 41940991 41936896  20G Linux filesystem

Disk /dev/sdb: 500 GiB, 536870912000 bytes, 1048576000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

У нас появился новый диск Disk /dev/sdb: 500 GiB.

seafile

Создаём основной раздел на диске:

fdisk /dev/sdb

Пример:

root@mpcloud:~# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x9e1f69b0.

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p):

Using default response p.
Partition number (1-4, default 1):
First sector (2048-1048575999, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-1048575999, default 1048575999):

Created a new partition 1 of type 'Linux' and of size 500 GiB.

Command (m for help): p
Disk /dev/sdb: 500 GiB, 536870912000 bytes, 1048576000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9e1f69b0

Device     Boot Start        End    Sectors  Size Id Type
/dev/sdb1        2048 1048575999 1048573952  500G 83 Linux

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Проверяем:

fdisk -l
root@mpcloud:~# fdisk -l
Disk /dev/loop0: 91 MiB, 95408128 bytes, 186344 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: CE15A055-7F7F-47FF-8A0F-2E02DF0943EA

Device     Start      End  Sectors Size Type
/dev/sda1   2048     4095     2048   1M BIOS boot
/dev/sda2   4096 41940991 41936896  20G Linux filesystem

Disk /dev/sdb: 500 GiB, 536870912000 bytes, 1048576000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9e1f69b0

Device     Boot Start        End    Sectors  Size Id Type
/dev/sdb1        2048 1048575999 1048573952  500G 83 Linux

На диске появился раздел /dev/sdb1.

seafile

В разделе /dev/sdb1 нужно создать файловую систему:

mkfs.ext4 -m 0 /dev/sdb1
root@mpcloud:~# mkfs.ext4 -m 0 /dev/sdb1
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 131071744 4k blocks and 32768000 inodes
Filesystem UUID: a709f15f-fb32-4a85-ab7d-1759609cd0ff
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
        102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

Примонтируем /dev/sdb1 в /opt. В папке opt будет лежать всё, что касается Seafile. Проверим что /opt существует:

cd /
ll | grep opt/
root@mpcloud:/# cd /
root@mpcloud:/# ll | grep opt/
drwxr-xr-x   2 root root       4096 фев 14 09:49 opt/

Узнаем UUID раздела /dev/sdb1.

blkid /dev/sdb1
root@mpcloud:~# blkid /dev/sdb1
/dev/sdb1: UUID="a709f15f-fb32-4a85-ab7d-1759609cd0ff" TYPE="ext4" PARTUUID="9e1f69b0-01"
1ba103ae-5859-4452-a077-61ad6fba5020

Добавим строку в /etc/fstab:

UUID=a709f15f-fb32-4a85-ab7d-1759609cd0ff /opt      ext4     defaults               0 0

seafile

Монтируем раздел:

sudo mount -a

Проверяем:

df -h
root@mpcloud:/etc# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            464M     0  464M   0% /dev
tmpfs            99M  1,1M   98M   2% /run
/dev/sda2        20G  3,8G   15G  21% /
tmpfs           493M     0  493M   0% /dev/shm
tmpfs           5,0M     0  5,0M   0% /run/lock
tmpfs           493M     0  493M   0% /sys/fs/cgroup
/dev/loop0       91M   91M     0 100% /snap/core/6350
tmpfs            99M     0   99M   0% /run/user/1000
/dev/sdb1       492G   73M  492G   1% /opt

Видим что /dev/sdb1 примонтирован в /opt и имеет 492G свободного места. Теперь после перезагрузки раздел будет монтироваться автоматически.

Сервер подготовлен.

Установка дополнительных пакетов

Перед установкой Seafile нам потребуется установить дополнительные пакеты:

  • python 2.7
  • python-setuptools
  • python-ldap
  • python-mysqldb
  • python-urllib3
  • python-memcache (или python-memcached)
  • python-requests

Работаем под рутом.

sudo apt-get install python -y
sudo apt-get install python2.7 libpython2.7 python-setuptools python-pil python-ldap python-urllib3 ffmpeg python-pip python-mysqldb python-memcache python-requests -y
sudo pip install moviepy

Создание БД

Для работы Seafile потребуется создать три базы данных:

CREATE SCHEMA `seafile-ccnet` DEFAULT CHARACTER SET utf8 ;
CREATE SCHEMA `seafile-db` DEFAULT CHARACTER SET utf8 ;
CREATE SCHEMA `seafile-seahub` DEFAULT CHARACTER SET utf8 ;

seafile

И пользователя для них, запоминаем пароль:

CREATE USER 'seafile'@'localhost' identified by 'Seafile01@';
GRANT ALL PRIVILEGES ON `seafile-ccnet`.* to `seafile`@localhost;
GRANT ALL PRIVILEGES ON `seafile-db`.* to `seafile`@localhost;
GRANT ALL PRIVILEGES ON `seafile-seahub`.* to `seafile`@localhost;

Я все эти операции произвожу на отдельном сервере, там у меня уже есть MySQL 8.

Seafile пользователь и Seafile Server

Работаем под рутом. Создадим пользователя в Ubuntu, под которым будет работать Seafile. Назовём его sf. Дадим ему права на /opt.

useradd -m -s /bin/bash sf
cd /
chown -R sf\: ./opt/
ll | grep opt
drwxr-xr-x   3 sf   sf         4096 мая  7 19:11 opt/

Теперь права на папку opt принадлежат пользователю sf.

Работаем под пользователем sf. Скачиваем и распаковываем Seafile Server для Linux. На текущий момент доступна версия Server for generic Linux 6.3.4 64bit.

https://www.seafile.com/en/download/

su - sf
cd /opt
wget https://download.seadrive.org/seafile-server_6.3.4_x86-64.tar.gz
tar -xf seafile-server_6.3.4_x86-64.tar.gz

seafile

Установка Seafile Server для MySQL

Работаем под пользователем sf. Запускаем скрипт установки Seafile Server для MySQL:

su - sf
cd /opt/seafile-server-6.3.4/
./setup-seafile-mysql.sh

seafile

Запускается мастер установки. В процессе установки нам зададут вопросы, отвечаем на них, у вас будут собственные ответы:

  • What is the name of the server? It will be displayed on the client. Пишу имя хоста - mpcloud.
  • What is the ip or domain of the server? Пишу будущее доменное имя - cloud.internet-lab.ru.
  • Where do you want to put your seafile data? Определяемся, где хранить данные. У меня всё в папке /opt, путь по умолчанию будет /opt/seafile-data, меня это устраивает, оставляю как есть.
  • Which port do you want to use for the seafile fileserver? Порт по умолчанию 8082 - устраивает.
  • Please choose a way to initialize seafile databases:
    [1] Create new ccnet/seafile/seahub databases
    [2] Use existing ccnet/seafile/seahub databases
    Я уже создал все БД, указываю 2.
  • What is the host of mysql server? По умолчанию сервер БД localhost, у меня другой, указываю его IP адрес - 192.168.1.11.
  • From which hosts could the mysql account be used? По умолчанию %, я указываю IP адрес виртуалки - 192.168.1.12.
  • What is the port of mysql server? Порт по умолчанию 3306, меня устраивает.
  • Which mysql user to use for seafile? Указываем имя пользователя MySQL. Я пишу seafile.
  • What is the password for mysql user "seafile"? Указываем пароль от пользователя MySQL.
  • Enter the existing database name for ccnet: Пишу seafile-ccnet.
  • Enter the existing database name for seafile: Пишу seafile-db.
  • Enter the existing database name for seahub: Пишу seafile-seahub.

seafile

Проверяем настройки. Нажимаем Enter. Начинается установка Seafile Server.

seafile

Работаем под пользователем sf. Пробуем запустить seafile:

su - sf
cd /opt/seafile-server-latest/
./seafile.sh start
sf@mpcloud:/opt/seafile-server-6.3.4$ cd /opt/seafile-server-latest/
sf@mpcloud:/opt/seafile-server-latest$ ./seafile.sh start

[05/07/19 21:08:53] ../common/session.c(132): using config file /opt/conf/ccnet.conf
Starting seafile server, please wait ...
Seafile server started

Done.

Пробуем запустить seahub:

./seahub.sh start

При первом запуске нас попросят создать админа для seafile, укажите email и пароль.

seafile

Проверим, что сервисы seafile и seahub работают и используют порты 8000 и 8082:

netstat -plntu
sf@mpcloud:/opt/seafile-server-latest$ netstat -plntu
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name 
tcp        0      0 0.0.0.0:8082            0.0.0.0:*               LISTEN      9347/seaf-server 
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      9380/python2.7   
tcp6       0      0 :::22                   :::*                    LISTEN      -                
udp        0      0 127.0.0.53:53           0.0.0.0:*                           -                

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

./seafile.sh stop
./seahub.sh stop

Установка и настройка Nginx

Работаем под рутом. Устанавливаем пакет:

sudo apt install nginx -y

Запускаем сервис nginx и добавляем его в автозагрузку:

systemctl start nginx
systemctl enable nginx

Создаём конфигурационный файл:

cd /etc/nginx/
vim sites-available/seafile

Содержимое конфигурационного файла:

server {
        listen 80;
        server_name _;

        server_tokens off;
        proxy_set_header X-Forwarded-For $remote_addr;

        location / {
            proxy_pass         http://127.0.0.1:8000;
            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_read_timeout  1200s;

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

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

        location /seafhttp {
            rewrite ^/seafhttp(.*)$ $1 break;
            proxy_pass http://127.0.0.1:8082;
            client_max_body_size 0;
            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;
        }
        location /media {
            root /opt/seafile-server-latest/seahub;
        }
    }

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

rm -f /etc/nginx/sites-enabled/default
ln -s /etc/nginx/sites-available/seafile /etc/nginx/sites-enabled/
nginx -t
systemctl restart nginx

Настройка Seafile Server

Работаем под пользователем sf. Настраиваем ccnet.conf.

su - sf
cd /opt/conf/
vim ccnet.conf

Вносим изменения, указываем внешний URL нашего домашнего облака. Временное указываем локальный HTTP URL, потом отдельно будем менять на HTTPS, но позже:

SERVICE_URL = http://192.168.1.12:8000

Настраиваем gunicorn.conf:

vim gunicorn.conf

Вносим изменения:

bind = "0.0.0.0:8000"

Настраиваем seafile.conf:

vim seafile.conf

Вносим изменения:

[fileserver]
host = 0.0.0.0
port = 8082

[history]
keep_days = 30

Настраиваем seahub_settings.py:

vim seahub_settings.py

Вносим изменения:

# Устранение проблем с кодировкой UTF-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

ALLOWED_HOSTS = ['cloud.internet-lab.ru','192.168.1.12']
ENABLE_WIKI = True
DISABLE_SYNC_WITH_ANY_FOLDER = True
ENABLE_REPO_HISTORY_SETTING = False
THUMBNAIL_ROOT = '/opt/seahub-data/thumbnail/thumb/'

TIME_ZONE = 'Europe/Moscow'
LANGUAGE_CODE = 'ru'
LANGUAGES = (
    ('en', 'English'),
    ('ru', 'Русский'),
)
SITE_NAME = 'Cloud internet-lab.ru'

Настройка автозапуска Seafile в качестве сервисов

Работаем под рутом. Создаём сервис seafile:

cd /etc/systemd/system/
vim seafile.service

Содержимое:

[Unit]
Description=Seafile
After=network.target

[Service]
Type=forking
ExecStart=/opt/seafile-server-latest/seafile.sh start
ExecStop=/opt/seafile-server-latest/seafile.sh stop
LimitNOFILE=infinity
User=sf
Group=sf

[Install]
WantedBy=multi-user.target

Создаём сервис seahub:

vim seahub.service

Содержимое:

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

[Service]
Type=simple
ExecStart=/opt/seafile-server-latest/seahub.sh start
ExecStop=/opt/seafile-server-latest/seahub.sh stop
User=sf
Group=sf

[Install]
WantedBy=multi-user.target

Запускаем сервисы и настраиваем автозагрузку:

systemctl daemon-reload
systemctl start seafile
systemctl start seahub
systemctl enable seafile
systemctl enable seahub

Проверяем:

systemctl status seafile

seafile

systemctl status seahub

seafile

netstat -plntu

seafile

Настройка UFW Firewall

Включаем firewall:

ufw allow ssh
ufw enable

Соглашаемся - Y. Разрешаем HTTP и HTTPS.

ufw allow http
ufw allow https
ufw allow 8000
ufw allow 8082

Проверяем:

ufw status numbered

seafile

Проверяем

Заходим на сервер по IP адресу http://192.168.1.12:

seafile

Входим под созданным нами e-mail и паролем. Пробуем создать библиотеку и загрузить файл.

seafile

Работает.

Настроим HTTPS на IIS в качестве реверс-прокси

Создаём домен для облачного хранилища, я создаю cloud.internet-lab.ru, делегируем его на IIS.

Устанавливаем на IIS дополнительные пакеты, чтобы он умел работать как обратный реверс-прокси:

IIS как обратный прокси-сервер (reverse proxy)

В IIS создаём сайт. для cloud.internet-lab.ru. Делаем SSL сертификат:

IIS - SSL сертификат Let's Encrypt

Настраиваем редиректы с HTTP на HTTPS:

IIS - редирект с HTTP на HTTPS плюс убираем WWW

В корне сайте web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Redirect from HTTP to HTTPS" stopProcessing="true">
                    <match url="^(.*)$" />
                    <conditions>
                        <add input="{HTTPS}" pattern="^OFF$" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
                </rule>
                <rule name="Redirect to remove www" stopProcessing="true">
                    <match url="^(.*)$" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
                    </conditions>
                    <action type="Redirect" redirectType="Permanent" url="https://{C:1}/{R:1}" appendQueryString="true" />
                </rule>
                <rule name="seafile" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://192.168.1.12/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

Самое главное здесь - это проксирование запроса с https://cloud.internet-lab.ru на http://192.168.1.12.

Внутри создаём папку seafhttp:

seafile

В IIS правой кнопкой на неё и Convert to Application. (Для неё я также создал отдельный пул приложений.)

seafile

Внутри папки seafhttp правим web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="4294967295" />
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>

maxAllowedContentLength="4294967295" - это мы разрешаем грузить по этому URL файлы до 4 ГБ.

В свойствах сайта настраиваем:

  • Connection Time-out: 36000
  • Maximum Bandwidth: 4294967295 (4 Гб)

seafile

Работаем под пользователем sf. Настраиваем ccnet.conf.

su - sf
cd /opt/conf/
vim ccnet.conf

Вносим изменения, меняем URL на HTTPS:

SERVICE_URL = https://cloud.internet-lab.ru

Изменяем seahub_settings.py:

vim seahub_settings.py

Добавляем:

FILE_SERVER_ROOT = 'https://cloud.internet-lab.ru/seafhttp'

Работаем под рутом. Перезапускаем сервисы:

sudo service seafile restart
sudo service seahub restart

Проверяем работу HTTPS уже снаружи. Заходим на https://cloud.internet-lab.ru

seafile

Пробуем загрузить большой файл, больше гигабайта.

seafile

Есть контакт:

seafile

Доделки

Удаляем из firewall порты 8000 и 8082, они нужны были только для отладки.

ufw status numbered
root@mpcloud:/opt/conf# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 8000                       ALLOW IN    Anywhere
[ 5] 8082                       ALLOW IN    Anywhere
[ 6] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 7] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 8] 443/tcp (v6)               ALLOW IN    Anywhere (v6)
[ 9] 8000 (v6)                  ALLOW IN    Anywhere (v6)
[10] 8082 (v6)                  ALLOW IN    Anywhere (v6)
ufw delete 10
ufw delete 9
ufw delete 5
ufw delete 4
root@mpcloud:/opt/conf# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)