Пост

Установка Seafile 7.1.0 + Nginx + Percona на Centos 7

Seafile - это кроссплатформенная система программного обеспечения для размещения файлов с открытым исходным кодом. Файлы хранятся на центральном сервере и могут быть синхронизированы с персональными компьютерами и мобильными устройствами через приложения.

Подготовка

Обновляем операционную систему, добавляем репозиторий EPEL, устанавливаем софт

1
2
3
$ sudo yum -y update
$ sudo yum -y install epel-release
$ sudo yum -y install nano wget net-tools

Устанавливаем необходимые для SeaFile пакеты

1
2
$ sudo yum -y install python3 python3-setuptools python3-pip python-ldap memcached java-1.8.0-openjdk libmemcached libreoffice-headless libreoffice-pyuno libffi-devel pwgen curl
$ sudo pip3 install --timeout=3600 Pillow pylibmc captcha jinja2 sqlalchemy psd-tools django-pylibmc django-simple-captcha

Переводим SELinux в режим permissive

1
2
3
$ sudo setenforce 0
$ sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
$ sudo getenforce

Запускаем службу memcached

1
$ sudo systemctl enable --now memcached

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

Добавим репозиторий Nginx

1
2
3
4
5
6
$ sudo nano /etc/yum.repos.d/nginx.repo 
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Установка web-сервера Nginx

1
$ sudo yum -y install nginx

Создадим директории для виртуальных хостов

1
$ sudo mkdir /etc/nginx/{sites-available,sites-enabled}

Отредактируем основной конфиг nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
$ sudo nano /etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
#worker_rlimit_nofile 40000;

events {
    # worker_connections 8096;
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    server_tokens off;
    server_names_hash_bucket_size 128;
    client_max_body_size 50M;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    client_body_timeout 12;
    client_header_timeout 12;
    keepalive_timeout 15;
    send_timeout 10;

    # Fully disabled gzip compression to mitigate Django BREACH attack: https://www.djangoproject.com/weblog/2013/aug/06/breach-and-django/
    gzip off;
    #gzip_vary on;
    #gzip_proxied expired no-cache no-store private auth any;
    #gzip_comp_level 9;
    #gzip_min_length 10240;
    #gzip_buffers 16 8k;
    #gzip_http_version 1.1;
    #gzip_types text/plain text/css text/xml text/javascript application/javascript application/x-javascript application/xml font/woff2;
    #gzip_disable "MSIE [1-6].";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
}

Отредактируем конфиг seafile.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
$ sudo nano /etc/nginx/sites-available/seafile.conf
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 80;
    server_name seafile.example.com;

    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_set_header   X-Forwarded-Proto $scheme;
         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 seafileformat;
         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;

        access_log      /var/log/nginx/seafhttp.access.log seafileformat;
        error_log       /var/log/nginx/seafhttp.error.log;
    }
    location /media {
        root /opt/seafile/seafile-server-latest/seahub;
    }
    location /seafdav {
        proxy_pass         http://127.0.0.1:8080/seafdav;
        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 $scheme;
        proxy_read_timeout  1200s;

        client_max_body_size 0;

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

Создаем сим линк, чтобы активировать конфиг seafile.conf

1
$ sudo ln -s /etc/nginx/sites-available/seafile.conf /etc/nginx/sites-enabled/seafile.conf

Проверяем конфиги Nginx на ошибки

1
$ sudo nginx -t

Добавляем Nginx в автозагрузку и запускаем Web-сервер

1
$ sudo systemctl enable --now nginx

Firewall

Настройка Firewall, открываем порты

1
2
$ sudo firewall-cmd --zone=public --add-service={http,https} --permanent
$ sudo firewall-cmd --reload

Установка сервера базы данных Percona

Добавим репозиторий Percona

1
$ sudo yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

Устанавливаем Percona Server

1
$ sudo yum -y install Percona-Server-server-57

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

1
$ sudo systemctl enable --now mysqld

Ищем пароль, который сгенерировался при установке и меняем его

1
2
3
4
5
6
7
8
9
$ sudo grep -i password /var/log/mysqld.log
$ sudo mysql_secure_installation
New password:
Re-enter new password:
Change the password for root ? ((Press y|Y for Yes, any other key for No) :
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

Что б в дальнейшем не было проблем с паролем для пользователя seafile, изменим политику паролей в PerconaDB

1
2
3
4
5
$ mysql -u root -p
> SHOW GLOBAL VARIABLES LIKE 'validate_password%';
> SET GLOBAL validate_password_special_char_count = 0;
> flush privileges;
> quit;

Установка Seafile

Создаем пользователя seafile

1
2
$ sudo useradd -m -U -r -d /opt/seafile seafile
$ sudo chmod 750 /opt/seafile

Добавляем пользователя nginx в группу seafile

1
$ sudo usermod -aG seafile nginx

Переключаемся на пользователя seafile

1
$ sudo su - seafile

Создаем директорию, куда потом перенесем архив с дистрибутивом

1
$ mkdir -p /opt/seafile/installed

Переходим в директорию, где будет установлен Seafile

1
$ cd

Скачиваем архив, распаковываем его

1
2
$ curl -OL https://download.seadrive.org/seafile-server_7.1.0_x86-64.tar.gz
$ tar xzf seafile-server_7.1.0_x86-64.tar.gz

Перемещаем архив в каталог installed

1
$ mv seafile-server_7.1.0_x86-64.tar.gz installed

Запускаем установку Seafile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$ ./seafile-server-7.1.0/setup-seafile-mysql.sh

Press ENTER to continue
[ server name ] seafile
[ This server's ip or domain ] seafile.example.com
[ default "8082" ] 

Please choose a way to initialize seafile databases:
[1] Create new ccnet/seafile/seahub databases
[2] Use existing ccnet/seafile/seahub databases
[ 1 or 2 ] 1

What is the host of mysql server?
[ default "localhost" ] 

What is the port of mysql server?
[ default "3306" ] 

What is the password of the mysql root user?
[ root password ]

verifying password of user root ...  done

Enter the name for mysql user of seafile. It would be created if not exists.
[ default "seafile" ] 

Enter the password for mysql user "seafile":
(тут лучше использовать пароль без спец.символов @#$%^)
[ password for seafile ]

Enter the database name for ccnet-server:
[ default "ccnet-db" ] 

Enter the database name for seafile-server:
[ default "seafile-db" ] 

Enter the database name for seahub:
[ default "seahub-db" ] 

This is your configuration
    server name:            seafile
    server ip/domain:       seafile.example.com

    seafile data dir:       /opt/seafile/seafile-data
    fileserver port:        8082

    database:               create new
    ccnet database:         ccnet-db
    seafile database:       seafile-db
    seahub database:        seahub-db
    database user:          seafile

Если что-то пошло не так, команды для управления базами/пользователями perconadb

1
2
3
4
5
6
7
8
9
10
$ mysql -u root -p
> SHOW databases;
> SELECT User,mysql_native_passwor,Host FROM mysql.user;
> SELECT User,Host FROM mysql.user;
> SHOW GRANTS FOR 'seafile'@'localhost';
> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'seafile'@'localhost';
> DROP USER 'seafile'@'localhost';
> DROP DATABASE `ccnet-db`;
> DROP DATABASE `seafile-db`;
> DROP DATABASE `seahub-db`;

Переключаемся на предыдущего пользователя (правами sudo)

1
$ exit

Создаем файл seafile.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sudo nano /etc/systemd/system/seafile.service
[Unit]
Description=Seafile Server
After=network.target remote-fs.target mysqld.service

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

[Install]
WantedBy=multi-user.target

Создаем файл seahub.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sudo nano /etc/systemd/system/seahub.service
[Unit]
Description=Seafile Seahub
After=network.target seafile.service

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

[Install]
WantedBy=multi-user.target

Скрипт для перезапуска Seafile

1
2
3
4
5
6
7
$ sudo nano /usr/local/sbin/seafile-server-restart
#!/bin/bash
for ACTION in stop start ; do
    for SERVICE in seafile seahub ; do
      systemctl ${ACTION} ${SERVICE}
    done
done

Назначим права

1
$ sudo chmod 700 /usr/local/sbin/seafile-server-restart

Настройка SeaFile

Отредактируем seafdav.conf, для активации webdav

1
2
3
4
5
6
$ sudo nano /opt/seafile/conf/seafdav.conf
[WEBDAV]
enabled = true
port = 8080
fastcgi = true
share_name = /seafdav

Проверяем настройки ccnet.conf

1
2
3
4
$ sudo nano /opt/seafile/conf/ccnet.conf
[General]
SERVICE_URL = http://seafile.example.com
...

Включим кеширование Memcached, капчу, время хранение сессии и языки (добавляем после строчек, которые были в файле).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$ sudo nano /opt/seafile/conf/seahub_settings.py
...
CACHES = {
    'default': {
        'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',
        'LOCATION': '127.0.0.1:11211',
    },
    'locmem': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    },
}
COMPRESS_CACHE_BACKEND = 'locmem'

# Email settings
EMAIL_USE_TLS                       = False
EMAIL_HOST                          = 'mail.example.com'
EMAIL_HOST_USER                     = '[email protected]'
EMAIL_HOST_PASSWORD                 = ''
EMAIL_PORT                          = '25'
DEFAULT_FROM_EMAIL                  = EMAIL_HOST_USER
SERVER_EMAIL                        = EMAIL_HOST_USER
# https://download.seafile.com/published/seafile-manual/config/sending_email.md

TIME_ZONE                           = 'Europe/Moscow'
SITE_BASE                           = 'http://seafile.example.com'
SITE_NAME                           = 'Seafile Server'
SITE_TITLE                          = 'Seafile Server'
SITE_ROOT                           = '/'
ENABLE_SIGNUP                       = False
ACTIVATE_AFTER_REGISTRATION         = False
SEND_EMAIL_ON_ADDING_SYSTEM_MEMBER  = True
SEND_EMAIL_ON_RESETTING_USER_PASSWD = True
CLOUD_MODE                          = False
FILE_PREVIEW_MAX_SIZE               = 30 * 1024 * 1024
SESSION_COOKIE_AGE                  = 60 * 60 * 24 * 7 * 2
SESSION_SAVE_EVERY_REQUEST          = False
SESSION_EXPIRE_AT_BROWSER_CLOSE     = False

# User management options
LOGIN_REMEMBER_DAYS = 1
LOGIN_ATTEMPT_LIMIT = 3

# Other options
MAX_NUMBER_OF_FILES_FOR_FILEUPLOAD = 10
LANGUAGE_CODE = 'ru'
LANGUAGES = (
    ('en', 'English'),
    ('ru', 'Russian'),
)

FILE_SERVER_ROOT                    = 'http://seafile.example.com/seafhttp'

Дополнительные параметры можно посмотреть на официальном сайте

Отредактируем файл seafile.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ sudo nano /opt/seafile/conf/seafile.conf
[fileserver]
port = 8082
max_upload_size=64
max_download_dir_size=64

[quota]
default = 2

[history]
keep_days = 7

# Очищать корзину, кол-во дней
[library_trash]
expire_days = 30

# Configure Syslog
[general]
enable_syslog = true
...

В процессе первого запуска задаем имя и пароль администратора.

1
2
3
4
5
$ sudo su - seafile /opt/seafile/seafile-server-latest/seafile.sh start
$ sudo su - seafile /opt/seafile/seafile-server-latest/seahub.sh start
[ admin email ] [email protected]
[ admin password ] 
[ admin password again ]

Останавливаем

1
2
$ sudo su - seafile /opt/seafile/seafile-server-latest/seahub.sh stop
$ sudo su - seafile /opt/seafile/seafile-server-latest/seafile.sh stop

Добавляем службы в автозапуск и запускаем их

1
2
3
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now seafile
$ sudo systemctl enable --now seahub

Если надо скинуть пароль админа, выполняем команду

1
$ sudo su - seafile /opt/seafile/seafile-server-latest/reset-admin.sh

UPD 2021.06.01

При очередной установке, при выполнении команды sudo pip3 install ... появлялась ошибка связанная с отсутствия нужных утилит

Решение:

1
$ sudo yum -y install gcc gcc-c++ python36-devel
Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.