Tech-Research WIKI

технологичные раскопки

Инструменты пользователя

Инструменты сайта


docs:docker:containers:seafile

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 - пароль

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

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

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

  • Нужно перенести базу данных из контейнера на основной сервак (который централизованно бекапится).
  • Нужно настроить nginx проксирование и сертификат, чтобы всё было доступно из инета и шифровалось.
  • Нужно прикрутить onlyoffice или поднастроить seadoc, чтобы он работал (но это потом)

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

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

В 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 - чистая база

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

  • точно также комментируем контейнер БД и меняем в файле .env адрес подключения на шлюз нашей подсети
  • убираем зависимости от db в compose
  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')
Последнее изменение: 2026/03/15 17:17

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki