Содержание

Seafile

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


В отличие от Nextcloud/OwnCloud этот сервис работает не на PHP, его ядро написано на Си, само хранилище в специфичном формате в виде блоков, изменения в файлах отправляются только теми кусками, которые изменились (как в rsync), в общем, это одно из самых производительных открытых решений.

Для всего хранилища наверно нет, но вот то что должно быть оперативно под рукой самое то…

Данная статья как будто не про мануал, а про понимание как это работает
Я настраиваю сервис, поэтапно его усложняя и модифицируя…

В конце опишу различные тонкости, с которыми столкнусь в ходе изучения этого продукта.

Официальная документация

Раскатка из compose

В официальной документации есть достаточно избыточная инструкция
https://manual.seafile.com/13.0/setup/setup_ce_by_docker/

В ней говорится следующее:

  1. # создаем папку и переходим в нее
  2. mkdir /opt/seafile
  3. cd /opt/seafile
  1. # скачаем шаблон с env файлом, который нужно будет подредактировать (пароли, домены, логины...)
  2. wget -O .env https://manual.seafile.com/13.0/repo/docker/ce/env
  1. #скачаем три шаблона docker-compose
  2. wget https://manual.seafile.com/13.0/repo/docker/ce/seafile-server.yml
  3. wget https://manual.seafile.com/13.0/repo/docker/seadoc.yml
  4. wget https://manual.seafile.com/13.0/repo/docker/caddy.yml
  1. #отредактируем .env
  2. nano .env
  1. #стартуем...
  2. docker compose up -d

Еще в инструкции подробно расписаны все переменные, которые нужно отредактировать в .env файле

Использование существующего сервера mysql

И есть еще одна страничка, которая описывает использование внешнего mysql сервера
https://manual.seafile.com/13.0/setup/setup_with_an_existing_mysql_server/

Зачем такое нужно?
А представьте что у нас несколько десятков подобных сервисов - разные блоги, форумы, планировщики, хранилища, и у каждого свой контейнер с базой…
Что лучше, один сервер mysql или несколько десятков серверов с точки зрения экономии ресурсов на скромном железе? Я считаю что лучше один, но это лично мое.

И второй момент, который пока не подтверждаю на 100%, вероятно я не умею готовить докер,
у меня были такие приложения типа импорт каталога, обработка сотен тысяч зависимых объектов…
Мое приложение выполняло ну очень много операций за секунду по нажатию одной кнопочки и вот когда mysql положил внутрь докера, то вместо 3 секунд эта обработка длилась 5-6 секунд,
но тут опять же, скорее всего я просто не умею готовить докер и тюннить высокоскоростные файловые операции.

Отдельный реверс-прокси

Опять кидаю ссылку на орфициальную документацию, используйте ее как первоисточник, т.к. в данной статье будет лишь выжимка конкретно под мою ситуацию
https://manual.seafile.com/13.0/setup/use_other_reverse_proxy/#add-reverse-proxy-for-related-services

Опять отвечаю на вопрос зачем? У меня стоит один единственный nginx, и только он слушает 80 и 443 порты и он проксирует трафик на несколько десятков контейнеров, а контейнеры в свою очередь шарят порты которые доступны только на локальном хосте.

Второй момент - на этом nginx стоит certbot, который автоматически беспокоится о продлении всех сертификатов lets-encrypt…

Итак, приступим, будем делать по официальной документации, но всё равно по-своему.
А вы должны делать по-своему, т.к. каждая ситуация уникальна, вероятно что мой опыт вам пригодится.

Подготовка

У меня есть папка /storage, куда примонтирован RAID массив, т.е. все данные зеркалированы дважды…

Далее я создал папку /storage/DockerApps чтобы локализовать конфиги и данные всех моих сервисов,
если потребуется мигрировать на новый сервер, то я просто подключу внешний диск на 6тб и перенесу на него эту папку.

Аналогично, я локализовал место хранения различных докер-томов и mysql-data чтобы они хранились на рейд-томе.

  1. # 1. Создаем директорию сервиса
  2. mkdir -p /storage/DockerApps/seafile/


Если что-то пошло не по плану
docker compose down
и
чистим папку и по новой,
иначе, инициализация дважды не пройдет


Дальше качнем конфиги, но не все, из этого набора нам не нужен caddy

  1. #переходим в папку
  2. cd /storage/DockerApps/seafile/
  3.  
  4. #это делаем, только если не правили и не готовили свой env или он вам не нужен
  5. wget -O .env https://manual.seafile.com/13.0/repo/docker/ce/env
  1. wget https://manual.seafile.com/13.0/repo/docker/ce/seafile-server.yml
  2. wget https://manual.seafile.com/13.0/repo/docker/seadoc.yml

Поправим env

Ознакомимся… если хотим, то руками поправим, если не хотим - идем дальше, будут команды

  1. nano .env

Удалим caddy

  1. sed -i "s/,caddy\.yml\|caddy\.yml,//g" .env
  2. grep COMPOSE_FILE .env

Должно получиться так

  1. COMPOSE_FILE='seafile-server.yml,seadoc.yml'

Основная папка BASIC_STORAGE_PATH

В этой папке будут подпапки для остальных контейнеров и их данных

  1. sed -i 's|^BASIC_STORAGE_PATH=/opt|BASIC_STORAGE_PATH=/storage/DockerApps/seafile|g' .env
  2. grep BASIC_STORAGE_PATH= .env

Внутри как видим остальные пути строятся относительно этой папки

  1. BASIC_STORAGE_PATH=/storage/DockerApps/seafile
  2. SEAFILE_VOLUME=$BASIC_STORAGE_PATH/seafile-data
  3. SEAFILE_MYSQL_VOLUME=$BASIC_STORAGE_PATH/seafile-mysql/db
  4. SEAFILE_CADDY_VOLUME=$BASIC_STORAGE_PATH/seafile-caddy
  5. SEADOC_VOLUME=$BASIC_STORAGE_PATH/seadoc-data

Заполним секреты (пароли)

JWT_PRIVATE_KEY

  1. sed -i "s|^JWT_PRIVATE_KEY=.*|JWT_PRIVATE_KEY=$(pwgen 42)|g" .env
  2. sed -i "s|^SEAFILE_MYSQL_DB_PASSWORD=.*|SEAFILE_MYSQL_DB_PASSWORD=$(pwgen 32)|g" .env
  3. sed -i "s|^INIT_SEAFILE_MYSQL_ROOT_PASSWORD=.*|INIT_SEAFILE_MYSQL_ROOT_PASSWORD=$(pwgen 42)|g" .env
  4. sed -i "s|^INIT_SEAFILE_ADMIN_PASSWORD=.*|INIT_SEAFILE_ADMIN_PASSWORD=$(pwgen 42)|g" .env
  5. sed -i "s|^REDIS_PASSWORD=.*|REDIS_PASSWORD=$(pwgen 42)|g" .env

Проверим

  1. grep -E "^JWT_PRIVATE_KEY=|^SEAFILE_MYSQL_DB_PASSWORD=|^INIT_SEAFILE_MYSQL_ROOT_PASSWORD=|^INIT_SEAFILE_ADMIN_PASSWORD=|^REDIS_PASSWORD=" .env

Должно быть так

  1. JWT_PRIVATE_KEY=ooJ2igier2iekeag1aepaiye6YaibohyooD1ieshuu
  2. SEAFILE_MYSQL_DB_PASSWORD=Daeth1aem1aedoh2Reixu6thieree6ba
  3. REDIS_PASSWORD=ohm5Aith4mahdaa5ay4ooPooyeijee2eevie2OwaeR
  4. INIT_SEAFILE_MYSQL_ROOT_PASSWORD=aGh9wafe3yaej2yei4ohg1vair6ucuRaeDa1adoopa
  5. INIT_SEAFILE_ADMIN_PASSWORD=ou1eiwukooTee0ang3feel3EeHa6voozipeeShie8R

Только не спешите меня взламывать, я еще раз эту команду выполню и все пароли поменяются))

Поправим compose.yml

Прокинем локальный порт в seafile

На данном этапе мы просто получим результат, который будем наращивать, поэтому мы даже домен не задали, только учтите, тут мы поиграемся и вероятно всё удалим и заново создадим…

  1. nano seafile-server.yml

найдем и раскоментируем, отредактируем строчки в сервисе seafile

  1. seafile:
  2. image: ${SEAFILE_IMAGE:-seafileltd/seafile-mc:13.0-latest}
  3. container_name: seafile
  4. restart: unless-stopped
  5. ports:
  6. - "8123:80"

таким образом, мы прокинули порт 8123 внутрь контейнера и можем подключаться к нему или с локального пк или в локальной сети (ведь мы за роутером) балуемся,
иначе не оставляйте на долгое время это…

Стартуем!!!

  1. docker compose up -d

ждем пока все контейнеры запустятся…



На этом этапе посмотрим логи

  1. docker logs -f seafile

Если видим фразу

  1. ----------------------------------------
  2. Successfully created seafile admin
  3. ----------------------------------------
  4.  
  5.  
  6.  
  7.  
  8. Seahub is started
  9.  
  10. Done.

То открываем в браузере наш адрес по ip и порту 8123 (или какой вы задали)


Берем логин и пароль из файла .env и заходим
INIT_SEAFILE_ADMIN_EMAIL - логин
INIT_SEAFILE_ADMIN_PASSWORD - пароль

Ошибок нет, файлы загружаются, кто молодец?
Мы молодцы, статья закончилась, остальное сами)))

Что бы сделать еще?

Ну это решение хоть и рабочее, но не продакшн…

Миграция БД на хост

Определимся с подсетью

В mysql при создании пользователей принято после собаки указывать подсеть из которой ему доступно подключиться
Например так root@127.0.0.1 или root@192.168.1.%

Наш compose создает что-то случайное и мы заранее не сможем создать пользователя и прописать шлюз через который будет подключаться,
а если создали контейнер и сеть, то уже поздно создавать пользователя, у нас что-то обязательно рухнет при инициализации.

Вот такая команда покажет все действующие подсети докера

  1. docker network ls --format "{{.Name}}" | \
  2. xargs -I {} sh -c 'echo "Network: {}"; docker network inspect {} --format '\''{{range .IPAM.Config}}{{.Subnet}}
  3. - {{.Gateway}}{{println}}{{end}}'\'' \
  4. 2>/dev/null; echo "---"'

Вот пример ее вывода (у меня как оказалось еще много забытых сетей)

  1. Network: bridge
  2. 172.17.0.0/16 - 172.17.0.1
  3.  
  4. ---
  5. Network: host
  6.  
  7. ---
  8. Network: nextcloud_net
  9. 172.22.0.0/16 - 172.22.0.1
  10.  
  11. ---

Ну и как мы видим, например 172.23.0.0 не занята, давайте этим воспользуемся и создадим…

  1. docker network create \
  2. --driver bridge \
  3. --subnet=172.23.0.0/16 \
  4. --gateway=172.23.0.1 \
  5. seafile-net

Теперь подсеть создана вме docker-compose и не управляется им и вообще прибита гвоздями…
Если вы раскатаете другой композ а потом этот вернете на место ничего не уедет.

Но есть один момент, открываем наш seadoc и seafile-server.yml

И меняем кусочек

  1. networks:
  2. seafile-net:
  3. name: seafile-net

на

  1. networks:
  2. seafile-net:
  3. name: seafile-net
  4. external: true

Это знак для compose, что сеть создавать не нужно, она уже кем то была создана.

На этом этапе docker-compose.yml пока рабочий, можно даже снова запустить и проверить, всё работает, мы только прибили гвоздями сеть.

У нас есть два пути - когда сервер чистый и можно всё с нуля на новой БД инициализировать
и когда сервер какое то время поработал и нужно переехать из докера на полноценную базу, вероятно даже на отдельном сервере…

Предлагаю для начала мигрировать

Переносим бд из докера

Этот вариант мне чем-то нравится, что не потребуется создавать пользователя root,
можно инициализироваться в докере, а потом перенести на другой сервер имея только ограниченную учетную запись.

Резервирование дампа

сперва подгрузим .env чтобы задействовать его переменные

  1. cd /storage/DockerApps/seafile
  2. source .env


создадим на хосте папку с дампами (мы внутри /storage/DockerApps/seafile)

  1. mkdir dumps

Резервируем три базы, используя переменные

  1. docker exec seafile-mysql \
  2. mysqldump -u ${SEAFILE_MYSQL_DB_USER} \
  3. -p${SEAFILE_MYSQL_DB_PASSWORD} \
  4. ${SEAFILE_MYSQL_DB_CCNET_DB_NAME} > ./dumps/ccnet_dump.sql
  5.  
  6. docker exec seafile-mysql \
  7. mysqldump -u ${SEAFILE_MYSQL_DB_USER} \
  8. -p${SEAFILE_MYSQL_DB_PASSWORD} \
  9. ${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME} > ./dumps/seafile_dump.sql
  10.  
  11. docker exec seafile-mysql \
  12. mysqldump -u ${SEAFILE_MYSQL_DB_USER} \
  13. -p${SEAFILE_MYSQL_DB_PASSWORD} \
  14. ${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME} > ./dumps/seahub_dump.sql
Подключение mysql к хосту

Как помним, мы создали подсеть с шлюзом (первый адрес) 172.23.0.1
Берем и перевинчиваем в файле .env адрес БД

  1. ## Database
  2. SEAFILE_MYSQL_DB_HOST=172.23.0.1
  3. #SEAFILE_MYSQL_DB_HOST=db
Создаем бд, разворачиваем из дампа

Почистим если существуют (вы должны понимать что делаете)

  1. source .env
  2.  
  3. mariadb -u root << EOF
  4. DROP DATABASE IF EXISTS ${SEAFILE_MYSQL_DB_CCNET_DB_NAME};
  5. DROP DATABASE IF EXISTS ${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME};
  6. DROP DATABASE IF EXISTS ${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME};
  7. EOF

создадим базы, юзеров и дадим права

  1. mariadb -u root << EOF
  2. CREATE DATABASE ${SEAFILE_MYSQL_DB_CCNET_DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  3. CREATE DATABASE ${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  4. CREATE DATABASE ${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  5.  
  6. CREATE USER '${SEAFILE_MYSQL_DB_USER}'@'172.23.%' IDENTIFIED BY '${SEAFILE_MYSQL_DB_PASSWORD}';
  7. GRANT ALL PRIVILEGES ON ${SEAFILE_MYSQL_DB_CCNET_DB_NAME}.* TO '${SEAFILE_MYSQL_DB_USER}'@'172.23.%';
  8. GRANT ALL PRIVILEGES ON ${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME}.* TO '${SEAFILE_MYSQL_DB_USER}'@'172.23.%';
  9. GRANT ALL PRIVILEGES ON ${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME}.* TO '${SEAFILE_MYSQL_DB_USER}'@'172.23.%';
  10. -- Добавляем GRANT OPTION, так как это часто требуется для инициализации Seafile
  11. GRANT GRANT OPTION ON ${SEAFILE_MYSQL_DB_CCNET_DB_NAME}.* TO '${SEAFILE_MYSQL_DB_USER}'@'172.23.%';
  12. GRANT GRANT OPTION ON ${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME}.* TO '${SEAFILE_MYSQL_DB_USER}'@'172.23.%';
  13. GRANT GRANT OPTION ON ${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME}.* TO '${SEAFILE_MYSQL_DB_USER}'@'172.23.%';
  14. FLUSH PRIVILEGES;
  15. EOF

Ну и грузим дампы, которые создавали

  1. mariadb -u root "${SEAFILE_MYSQL_DB_CCNET_DB_NAME}" < ./dumps/ccnet_dump.sql
  2. mariadb -u root "${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME}" < ./dumps/seafile_dump.sql
  3. mariadb -u root "${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME}" < ./dumps/seahub_dump.sql

На данном этапе пока не трогаем композ, мы только поменяли хост в .env, если что, будет шаг назад

  1. docker compose down
  2.  
  3. docker compose up -d

На данном этапе всё получилось, убираем из compose файла контейнер с базой данных, комментируем этот участок в файле seafile-server.yml

  1. # db:
  2. # image: ${SEAFILE_DB_IMAGE:-mariadb:10.11}
  3. # container_name: seafile-mysql
  4. # restart: unless-stopped
  5. # environment:
  6. # - MYSQL_ROOT_PASSWORD=${INIT_SEAFILE_MYSQL_ROOT_PASSWORD:-}
  7. # - MYSQL_LOG_CONSOLE=true
  8. # - MARIADB_AUTO_UPGRADE=1
  9. # volumes:
  10. # - "${SEAFILE_MYSQL_VOLUME:-/opt/seafile-mysql/db}:/var/lib/mysql"
  11. # networks:
  12. # - seafile-net
  13. # healthcheck:
  14. # test:
  15. # [
  16. # "CMD",
  17. # "/usr/local/bin/healthcheck.sh",
  18. # "--connect",
  19. # "--mariadbupgrade",
  20. # "--innodb_initialized",
  21. # ]
  22. # interval: 20s
  23. # start_period: 30s
  24. # timeout: 5s
  25. # retries: 10

остановим бд

  1. docker stop seafile-mysql
  2. docker rm seafile-mysql

есть зависимость у seadoc

  1. #depends_on:
  2. # db:
  3. # condition: service_healthy

А еще в seafile-server

  1. depends_on:
  2. # db:
  3. # condition: service_healthy
  4. redis:
  5. condition: service_started

Вариант 2 - чистая база

Если у вас новая установка, база была чистой или вы изначально создаете на чистой базе

  1. docker compose down
Очистка

это опционалдьно, если уже инициализировали
сперва почистим если что то есть на бд хоста

  1. mariadb -u root << EOF
  2. DROP USER IF EXISTS '${SEAFILE_MYSQL_DB_USER}'@'172.23.%';
  3. DROP DATABASE IF EXISTS ${SEAFILE_MYSQL_DB_CCNET_DB_NAME};
  4. DROP DATABASE IF EXISTS ${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME};
  5. DROP DATABASE IF EXISTS ${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME};
  6. FLUSH PRIVILEGES;
  7. EOF

потом почистим папки, если они есть, то инит не произойдет

  1. rm -r ./seafile-mysql/ ./seafile-data/ ./seadoc-data/
Создание пользователя
  1. mariadb -u root << EOF
  2. CREATE USER IF NOT EXISTS 'root'@'172.23.%' IDENTIFIED BY '${INIT_SEAFILE_MYSQL_ROOT_PASSWORD}';
  3. GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.23.%' WITH GRANT OPTION;
  4. FLUSH PRIVILEGES;
  5. EOF
Инициализация
  1. docker up -d

ну и ждем логи

  1. docker logs -r seafile

успех это

  1. ----------------------------------------
  2. Successfully created seafile admin
  3. ----------------------------------------
  4.  
  5.  
  6.  
  7.  
  8. Seahub is started
  9.  
  10. Done.

Дальше нужно удалить этого временого рута из бд

  1. mariadb -u root << EOF
  2. DROP USER IF EXISTS 'root'@'172.23.%';
  3. FLUSH PRIVILEGES;
  4. EOF

Дальше и пользователь оказывается был создан seafile@% т.е. с любых хостов, а нам надо ограничить по сети

Настройка nginx

Не забываем определиться с доменом, например, super.puper.disk.ru

Этот домен нужно вписать в конфиг .env

  1. SEAFILE_SERVER_HOSTNAME=...

Создаем файлик /etc/nginx/sites-enabled/seadoc

  1. server {
  2. listen 80; # Или 443 ssl, если будете настраивать SSL позже
  3. server_name super.puper.disk.ru;
  4.  
  5. # Основной прокси для Seafile
  6. location / {
  7. proxy_pass http://127.0.0.1:8123; # <-- Проксируем на порт хоста, куда проброшен порт 80 контейнера seafile
  8. proxy_read_timeout 310s;
  9. proxy_set_header Host $host;
  10. proxy_set_header X-Real-IP $remote_addr;
  11. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  12. proxy_set_header X-Forwarded-Proto $scheme; # Важно для правильного определения HTTPS внутри контейнера
  13. proxy_set_header Connection "";
  14. proxy_http_version 1.1;
  15. client_max_body_size 0;
  16. }
  17.  
  18. # Прокси для Seadoc API
  19. location /sdoc-server/ {
  20. proxy_pass http://127.0.0.1:8124/; # <-- Проксируем на порт хоста, куда проброшен порт 80 контейнера seadoc
  21. proxy_redirect off;
  22. proxy_set_header Host $host;
  23. proxy_set_header X-Real-IP $remote_addr;
  24. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  25. proxy_set_header X-Forwarded-Host $server_name;
  26. proxy_set_header X-Forwarded-Proto $scheme; # Важно
  27. client_max_body_size 100m;
  28. }
  29.  
  30. # Прокси для Seadoc WebSocket
  31. location /socket.io {
  32. proxy_pass http://127.0.0.1:8124; # <-- Проксируем на порт хостат 80 контейнера seadoc
  33. proxy_http_version 1.1;
  34. proxy_set_header Upgrade $http_upgrade;
  35. proxy_set_header Connection 'upgrade';
  36. proxy_redirect off;
  37. proxy_buffers 8 32k;
  38. proxy_buffer_size 64k;
  39. proxy_set_header X-Real-IP $remote_addr;
  40. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  41. proxy_set_header X-Forwarded-Proto $scheme; # Важно
  42. proxy_set_header Host $http_host;
  43. proxy_set_header X-NginX-Proxy true;
  44. }
  45.  
  46. # Добавьте логи (по желанию)
  47. #access_log /var/log/nginx/suped.disk.h.dev66.ru.access.log;
  48. #error_log /var/log/nginx/suped.disk.h.dev66.ru.error.log;
  49. }

Проверим, перезагрузим…

  1. nginx -t
  2.  
  3. service nginx restart

Настроим ssl

В файле env

  1. SEAFILE_SERVER_PROTOCOL=https

Запустим certbot, он сам всё поправит…

Теперь открываем по ссылке https://...

OnlyOffice

https://manual.seafile.com/13.0/extension/only_office/

Я тут не буду рассматривать прикрутку того офиса, который поднял для nextcloud, его у меня скорее всего не будет
Сперва качаем composer…

  1. wget https://manual.seafile.com/13.0/repo/docker/onlyoffice.yml

Допишем в .env еще строчки

  1. # OnlyOffice
  2. ONLYOFFICE_IMAGE=onlyoffice/documentserver:8.1.0.1
  3. ONLYOFFICE_VOLUME=/storage/DockerApps/seafile/onlyoffice-data
  4. ONLYOFFICE_PORT=6233
  5. ONLYOFFICE_JWT_SECRET=сгенерим его через pwgen

Далее в файле onlyoffice.yml
пропишем опять что у нас сеть внешняя

  1. networks:
  2. seafile-net:
  3. name: seafile-net
  4. external: true

Уберем лейблы caddy

  1. labels:
  2. caddy: ${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}:${ONLYOFFICE_PORT:-6233}
  3. caddy.reverse_proxy: "{{upstreams}}"

и сервис тоже caddy уберем

Получим что то такое

  1. services:
  2. onlyoffice:
  3. image: ${ONLYOFFICE_IMAGE:-onlyoffice/documentserver:8.1.0.1}
  4. restart: unless-stopped
  5. container_name: seafile-onlyoffice
  6. environment:
  7. #- DB_TYPE=${DB_TYPE:-mariadb}
  8. #- DB_HOST=${SEAFILE_MYSQL_DB_HOST:-db}
  9. #- DB_USER=${SEAFILE_MYSQL_DB_USER:-seafile}
  10. #- DB_PWD=${SEAFILE_MYSQL_DB_PASSWORD:?Variable is not set or empty}
  11. - JWT_ENABLED=true
  12. - JWT_SECRET=${ONLYOFFICE_JWT_SECRET:?Variable is not set or empty}
  13. volumes:
  14. - ${ONLYOFFICE_VOLUME:-/opt/onlyoffice}/logs:/var/log/onlyoffice
  15. - ${ONLYOFFICE_VOLUME:-/opt/onlyoffice}/data:/var/www/onlyoffice/Data
  16. - ${ONLYOFFICE_VOLUME:-/opt/onlyoffice}/lib:/var/lib/onlyoffice
  17. labels:
  18. caddy: ${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}:${ONLYOFFICE_PORT:-6233}
  19. caddy.reverse_proxy: "{{upstreams}}"
  20. networks:
  21. - seafile-net
  22.  
  23. networks:
  24. seafile-net:
  25. name: seafile-net
  26. external: true

Подредактируем файлик .env

  1. COMPOSE_FILE='seafile-server.yml,seadoc.yml,onlyoffice.yml'

Пересоздаем контейнеры

  1. docker compose down
  2. docker compose up -d

Проверяем что сервис работает

  1. curl -I http://127.0.0.1:6233/welcome/

Далее правим nginx

  1.  
  1. nginx -t && systemctl reload nginx

Onlyoffice на отдельном домене… seafile-data/seafile/conf/seahub_settings.py

  1. ENABLE_ONLYOFFICE = True
  2. ONLYOFFICE_APIJS_URL = 'http://super.puper.disk.ru/onlyofficeds/web-apps/apps/api/documents/api.js'
  3. ONLYOFFICE_JWT_SECRET = 'ваш_секрет_из_этапа_1'
  4. # Опционально:
  5. OFFICE_PREVIEW_MAX_SIZE = 30 * 1024 * 1024
  6. ONLYOFFICE_EDIT_FILE_EXTENSION = ('docx', 'pptx', 'xlsx', 'csv')

WebDav

https://manual.seafile.com/12.0/extension/webdav/