Seafile — это личное облачное хранилище для хранения данных в стиле Dropbox.
Сегодня мы развернём это хранилище на виртуальном сервере. В качестве гипервизора у нас 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/en/download/
Установка Ubuntu Server 18.04.2 LTS на виртуальную машину VMware
VMware - подключение нового диска в ubuntu
IIS как обратный прокси-сервер (reverse proxy)
IIS - SSL сертификат Let's Encrypt
IIS - редирект с HTTP на HTTPS плюс убираем WWW
Мануал:
Для тех кто хочет обойтись без 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
Для хранения файлов личного хранилища я собираюсь использовать отдельный диск. Подключаем новый диск к виртуальному серверу:
VMware - подключение нового диска в ubuntu
Я собираюсь добавить толстый диск объёмом 500 Гб
В свойствах виртуалки New standard hard disk.
Указываем нужный размер. 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.
Создаём основной раздел на диске:
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.
В разделе /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
Монтируем раздел:
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 ;
И пользователя для них, запоминаем пароль:
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 Server для MySQL
Работаем под пользователем sf. Запускаем скрипт установки Seafile Server для MySQL:
su - sf
cd /opt/seafile-server-6.3.4/
./setup-seafile-mysql.sh
Запускается мастер установки. В процессе установки нам зададут вопросы, отвечаем на них, у вас будут собственные ответы:
- 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.
Проверяем настройки. Нажимаем Enter. Начинается установка Seafile Server.
Работаем под пользователем 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 и 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]
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
systemctl status seahub
netstat -plntu
Настройка 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
Проверяем
Заходим на сервер по IP адресу http://192.168.1.12:
Входим под созданным нами e-mail и паролем. Пробуем создать библиотеку и загрузить файл.
Работает.
Настроим 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:
В IIS правой кнопкой на неё и Convert to Application. (Для неё я также создал отдельный пул приложений.)
Внутри папки 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 Гб)
Работаем под пользователем 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
Пробуем загрузить большой файл, больше гигабайта.
Есть контакт:
Доделки
Удаляем из 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)