Проверен полностью15 195

Облачные хранилища

Seafile

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

Обзор

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

Рецепт поднимает зафиксированный Seafile Community Edition 13.0.25 с MariaDB 10.11 и кешем Valkey. Сервер держит конфигурацию, журналы и всё хранилище объектов в одном volume; три базы хранят учётные записи, библиотеки и метаданные. Web-порт привязан к localhost, а редактор SeaDoc, сервер уведомлений и AI-модуль выключены: это отдельные контейнеры, которых в рецепте нет.

Безопасность и границы рецепта

Полный прикладной smoke-тест и практическая проверка backup и restore прошли на amd64. Публикуемый образ существует только для amd64 — сборки под ARM upstream помечает как testing, — поэтому в манифесте одна архитектура, а не обещание Raspberry Pi. Учётная запись администратора, пароль root MariaDB, пароль роли базы, пароль кеша и ключ JWT берутся из .env: поставьте файлу режим 600, держите его вне Git и шифруйте каждый архив. SEAFILE_SERVER_HOSTNAME и SEAFILE_SERVER_PROTOCOL попадают в ссылки, приглашения по почте и настройки клиентов при первом старте; смена домена позже означает правку сгенерированной конфигурации внутри volume. SAML и расширенные функции администрирования относятся к Professional Edition и в этот рецепт не входят.

Отслеживание обновлений

Это сохранённые результаты отдельных проверок, а не данные в реальном времени. Неизвестный статус означает, что проверка ещё не выполнялась.

Новые релизы

Сравнение версии рецепта с последним известным релизом upstream. Это номер версии, а не разбор изменений.

Актуальная версия 13.0.252 сент. 2026 г., 20:10 UTC

Критические уязвимости

Результат отдельного сканирования Docker-образов, а не проверки Compose.

Не провереноПроверка не выполнялась

Несовместимые обновления

Новый major находится сравнением номеров версий. Вердикт о совместимости заносится вручную после чтения release notes и порядка миграции.

Не провереноПроверка не выполнялась

compose.yaml

Изменения upstream Compose относительно проверенного рецепта.

Upstream Compose не отслеживаетсяПроверка не выполнялась

Устаревшие Docker-образы

Проверка закреплённых тегов образов на наличие новых версий.

Не провереноПроверка не выполнялась

От наблюдения к действию

План обновления

Рецепт уже закрепляет последний известный релиз. Ниже показаны сохранённые основания для этой версии.

13.0.2513.0.25
  1. Открыть основания релиза

    Для источника с ручным отслеживанием нет точной ссылки на release notes. Начните с источников проекта ниже.

  2. Проверить границу версий

    Номера версий не пересекают major-границу совместимости. Вердикт о совместимости не записан.

  3. Подготовить смену тегов образов

    Смена тегов образов сейчас не планируется.

  4. Следовать документированной схеме миграции

    Миграция, мажоры нельзя пропускать. Шаги конкретного релиза всё равно берутся из release notes и инструкции по установке.

  5. Защитить точку отката

    Смена версии сейчас не планируется. Рецепт содержит процедуру backup. Restore проверен.

  6. Проверить обновлённый рецепт

    Точная проверка уровня «Проверен полностью» для этой версии записана 2026-09-03.

Прочитать порядок обновления в инструкции по установке ↓

Характеристики

Безопасность и публикация

Уровни установки

Статус показывает, насколько опубликованный рецепт покрывает требования каждого уровня.

Частично

Для дома

Минимальная конфигурация для локальной сети или доступа через VPN.

  • Один сервер
  • Локальный доступ
  • Минимум компонентов

Нужно добавить вручную: один сервер, локальный доступ, минимум компонентов.

Частично

Для VPS

Публичная установка с защищённым доступом и резервными копиями.

  • Домен
  • HTTPS через reverse proxy
  • Backup вне сервера

Нужно добавить вручную: домен, https через reverse proxy, backup вне сервера.

Частично

Надёжная

Конфигурация для предсказуемой эксплуатации и наблюдаемости.

  • Отдельная БД
  • Healthcheck
  • Внешний мониторинг
  • Лимиты CPU и памяти

Нужно добавить вручную: внешний мониторинг, лимиты cpu и памяти.

Собрать под свой сервер

Генератор конфигурации

Ответьте на пять вопросов и скачайте готовый комплект Seafile.

Работает локально
01 Есть домен?
02 Какой reverse proxy?
03 Архитектура сервера
04 Где хранить данные?

Укажите абсолютный путь для отдельного диска, например /srv/seafile.

05 Требуется VPN-доступ?

Комплект готов к сборке

Архив создаётся в браузере. Ответы никуда не отправляются.

Скриншоты

Скриншоты ещё не добавлены.

Быстрый запуск

Сначала прочитайте полную инструкцию: в ней описаны доступ извне, backup и расположение данных.

Подготовить настройкиcp .env.example .env
Запуститьdocker compose up -d
Проверить состояниеdocker compose ps

Пошаговая инструкция

1. Проверьте сервер на Ubuntu или Debian

Подойдёт Ubuntu 22.04+ или Debian 12+ с Docker Engine и Compose v2.24+. Upstream просит минимум 2 ядра и 2 ГБ RAM; закладывайте 4 ГБ и диск под все библиотеки плюс историю версий, которую каждая библиотека хранит. Публикуемый образ есть только для amd64, поэтому ARM-плата для этого рецепта не поддерживается.

docker --version
docker compose version

2. Подготовьте рецепт и четыре независимых секрета

mkdir -p ~/services/seafile
cd ~/services/seafile
cp .env.example .env
chmod 600 .env
admin_password="$(openssl rand -hex 24)"
db_root_password="$(openssl rand -hex 32)"
db_password="$(openssl rand -hex 32)"
jwt_key="$(openssl rand -hex 32)"
cache_password="$(openssl rand -hex 32)"
sed -i "s|^SEAFILE_ADMIN_PASSWORD=.*|SEAFILE_ADMIN_PASSWORD=$admin_password|" .env
sed -i "s|^SEAFILE_DB_ROOT_PASSWORD=.*|SEAFILE_DB_ROOT_PASSWORD=$db_root_password|" .env
sed -i "s|^SEAFILE_DB_PASSWORD=.*|SEAFILE_DB_PASSWORD=$db_password|" .env
sed -i "s|^SEAFILE_JWT_PRIVATE_KEY=.*|SEAFILE_JWT_PRIVATE_KEY=$jwt_key|" .env
sed -i "s|^SEAFILE_CACHE_PASSWORD=.*|SEAFILE_CACHE_PASSWORD=$cache_password|" .env
echo "пароль администратора: $admin_password"
unset admin_password db_root_password db_password jwt_key cache_password

Ключ JWT должен быть не короче 32 символов. Все пять значений должны различаться и оставаться неизменными: сервер сохраняет сгенерированную конфигурацию внутри volume и ждёт тех же учётных данных базы и кеша при каждом старте.

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

sed -i "s|^SEAFILE_SERVER_HOSTNAME=.*|SEAFILE_SERVER_HOSTNAME=files.example.com|" .env
sed -i "s|^SEAFILE_ADMIN_EMAIL=.*|SEAFILE_ADMIN_EMAIL=you@example.com|" .env

Все переменные .env:

  • SEAFILE_PORT — локальный web-порт, по умолчанию 8000;
  • SEAFILE_SERVER_HOSTNAME — внешнее имя хоста без схемы и слеша; скрипт установки не принимает localhost;
  • SEAFILE_SERVER_PROTOCOL — схема, по которой сервис доступен снаружи; за примерами прокси это https;
  • SEAFILE_ADMIN_EMAIL и SEAFILE_ADMIN_PASSWORD создают первую учётную запись только при первом старте;
  • SEAFILE_DB_ROOT_PASSWORD — пароль root в MariaDB, нужен для установки и дампов;
  • SEAFILE_DB_PASSWORD — пароль роли seafile;
  • SEAFILE_JWT_PRIVATE_KEY подписывает внутренние служебные токены, не короче 32 символов;
  • SEAFILE_CACHE_PASSWORD защищает кеш Valkey, который наружу не публикуется;
  • SEAFILE_DB_USER — имя роли базы, меняется только до первого запуска;
  • SEAFILE_TIME_ZONE — часовой пояс IANA;
  • SEAFILE_DATA_VOLUME и SEAFILE_DB_VOLUME — имена volume с хранилищем объектов и базой;
  • SEAFILE_BACKUP_DIR — каталог резервных копий на хосте.

3. Запустите и войдите

docker compose config
docker compose pull
docker compose up -d --wait --wait-timeout 900
docker compose ps
curl --fail --silent --output /dev/null http://127.0.0.1:8000/accounts/login/

Первый запуск долгий: контейнер создаёт ccnet_db, seafile_db и seahub_db, генерирует конфигурацию в volume и только потом поднимает Seahub за собственным nginx. Войдите по внешнему адресу под SEAFILE_ADMIN_EMAIL, затем поставьте настольный или мобильный клиент и подключите его к тому же адресу.

Развёртывание на VPS

Оставьте 127.0.0.1:${SEAFILE_PORT}:80: до сервера доберётся только HTTPS-прокси на этом же хосте. У MariaDB и кеша опубликованных портов нет. В файрволе откройте SSH, HTTP и HTTPS. Задайте SEAFILE_SERVER_PROTOCOL=https и создайте DNS-запись до первого старта: значение попадает в сгенерированную конфигурацию, а клиенты, настроенные с неверной схемой, продолжат её использовать.

Доступ из доверенной локальной сети

Лучше ssh -L 8000:127.0.0.1:8000 user@server. Постоянной установке в локальной сети нужно разрешимое имя хоста — localhost скрипт установки не принимает, поэтому возьмите имя, которое отдаёт ваш локальный DNS, задайте SEAFILE_SERVER_PROTOCOL=http, замените привязку к localhost одним конкретным приватным IP и ограничьте порт файрволом. Зашифрованные на клиенте библиотеки останутся защищёнными, но всё остальное, включая сессионные cookie, пойдёт по такому маршруту открытым текстом.

Домен, HTTPS и загрузки

Задайте SEAFILE_SERVER_HOSTNAME=files.example.com и SEAFILE_SERVER_PROTOCOL=https, затем замените хост в примере для Caddy, Nginx или Traefik. Прокси не должен ограничивать тело запроса — блоки файлов идут через тот же origin, поэтому в примере для Nginx стоят client_max_body_size 0 и отключённая буферизация запроса — и должен допускать долгие передачи, так что таймауты чтения и отправки держите большими. Смена имени хоста после первого старта требует правки conf/ccnet.conf, conf/seahub_settings.py и conf/seafile.conf внутри volume.

Резервное копирование

chmod +x backup.sh restore.sh
./backup.sh

Скрипт останавливает Seafile, снимает дамп всех трёх баз через mariadb-dump, архивирует весь volume /shared с хранилищем объектов и складывает рядом .env и compose.yaml. Нужны обе половины: дамп базы без блоков восстановит индекс, который ссылается на несуществующие файлы. В архиве все файлы и все секреты — шифруйте его и увозите за пределы сервера.

Восстановление

Восстановление необратимо заменяет хранилище объектов и все три базы. Используйте те же версии Seafile и MariaDB и текущий .env:

./restore.sh ./backups/seafile-YYYYMMDDTHHMMSSZ.tar
curl --fail --silent --output /dev/null http://127.0.0.1:8000/accounts/login/

Скрипт сначала делает резервную копию заменяемого состояния, пересоздаёт оба volume, распаковывает хранилище, импортирует дамп и поднимает сервер. Настольные клиенты, синхронизировавшиеся после резервной копии, зальют свои локальные изменения заново: проверьте один клиент, прежде чем подключать остальные. Практическую проверку восстановления процедура не проходила — отрепетируйте её на отдельном сервере.

Обновление Seafile

Сначала резервная копия и upstream-заметки к конкретной паре версий. Обновление внутри одной мажорной серии — это смена тега:

./backup.sh
docker compose pull
docker compose up -d --wait --wait-timeout 900
docker compose logs --tail=200 seafile

Мажорное обновление устроено иначе: Seafile выполняет версионные скрипты обновления и требует переходить по одной мажорной версии за раз, начиная с последней минорной текущей серии. Не прыгайте с 12.x на 14.x и не меняйте MariaDB тем же шагом. Точный тег seafileltd/seafile-mc:13.0.25 заменяйте на проверенную версию, никогда на -latest или -testing.

Откат

Никогда не запускайте старый Seafile поверх баз, которые уже обновила новая версия. Верните предыдущий точный тег вместе с архивом, сделанным до обновления:

docker compose down --timeout 120
./restore.sh ./backups/seafile-BEFORE-UPDATE.tar

После неудачной смены MariaDB подключайте старый образ только к сохранённому старому volume либо импортируйте совместимый дамп в пустой volume.

Остановка и удаление

docker compose down сохраняет оба volume. После проверки резервной копии за пределами сервера удалите всё безвозвратно:

docker compose down
docker volume rm seafile-data seafile-database
rm -rf ~/services/seafile

Если имена volume изменены, подставьте фактические. Настольные клиенты держат свои локальные копии всех синхронизированных библиотек — если данные должны исчезнуть везде, удалите их отдельно.

Источники: Seafile CE в Docker, compose-файл upstream, резервное копирование и восстановление и аутентификация через OAuth.

Диагностика

Первый запуск падает с «is not a valid ip or domain»

Скрипт установки проверяет SEAFILE_SERVER_HOSTNAME и не принимает localhost и любое имя без точки. Задайте настоящее имя хоста — публичный домен или имя, которое отдаёт локальный DNS, — затем удалите наполовину инициализированный volume и запустите заново:

docker compose down --timeout 120
docker volume rm seafile-data seafile-database
docker compose up -d --wait --wait-timeout 900

Делайте это только на пустой установке: на рабочей те же команды уничтожат все библиотеки.

Контейнер несколько минут остаётся unhealthy

Первый запуск создаёт три базы, генерирует конфигурацию в volume и только потом поднимает Seahub — поэтому у проверки здоровья пятиминутный start period. Не перезапускайте, а следите за прогрессом:

docker compose logs --follow seafile
docker compose ps
docker inspect --format '{{json .State.Health}}' "$(docker compose ps -q seafile)"

502 с опубликованного порта в это время нормален: nginx поднимается раньше Seahub.

Seahub не видит базу или кеш

docker compose logs --tail=200 db cache
docker compose exec db mariadb --user=root --password="$SEAFILE_DB_ROOT_PASSWORD" -e "SHOW DATABASES;"

Учётные данные записываются в conf/seafile.conf и conf/seahub_settings.py внутри volume во время установки. Смена SEAFILE_DB_PASSWORD или SEAFILE_CACHE_PASSWORD в .env эти файлы не переписывает: либо верните старое значение, либо отредактируйте сгенерированную конфигурацию.

Ссылки, письма или клиенты указывают на неверный адрес

SEAFILE_SERVER_HOSTNAME и SEAFILE_SERVER_PROTOCOL попадают в сгенерированную конфигурацию при первом старте. Для переезда на другой домен отредактируйте conf/ccnet.conf (SERVICE_URL), conf/seahub_settings.py (FILE_SERVER_ROOT, SERVICE_URL) и conf/seafile.conf внутри volume, затем перезапустите:

docker compose exec seafile grep -R "example.com" /shared/seafile/conf
docker compose restart seafile

Загрузки обрываются на определённом размере или по таймауту

Обычно виноват прокси: в примерах стоят client_max_body_size 0, отключённая буферизация запроса и увеличенные таймауты, потому что блоки файлов идут через тот же origin. 413 приходит от прокси, а 500 через несколько минут обычно означает, что сработал таймаут во время передачи.

Запрос к /seafhttp/ возвращает 400

Это Go-файлсервер за тем же nginx, и он отвечает только по валидному токену, поэтому голый запрос с 400 — ожидаемое поведение. Настоящие ошибки видны в журналах:

docker compose exec seafile tail -n 100 /shared/logs/seafile/seafile.log
docker compose exec seafile tail -n 100 /shared/logs/seahub/seahub.log

Зашифрованная библиотека не открывается

Библиотеки с клиентским шифрованием расшифровываются паролем, который сервер не хранит. Административного восстановления нет: потерянный пароль библиотеки означает, что данные останутся зашифрованными, даже если блоки есть в резервной копии.

Обратный прокси отвечает 502

На хосте выполните curl -I http://127.0.0.1:8000/accounts/login/. Если ответ есть, прокси смотрит не туда: внутри контейнера прокси 127.0.0.1 — это он сам, поэтому используйте адрес host gateway или общую сеть Docker. Если ответа нет, начните с раздела про проверку здоровья.

Официальные источники

Последний релиз: 2026-07-13 · GitHub Stars: 15 195 · данные проверены 2 сент. 2026 г., 20:10 UTC

Отказ от ответственности

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

Публикация карточки или статус проверки не являются требованием, навязыванием либо персональной рекомендацией использовать приложение. Вы самостоятельно решаете, подходит ли оно вам, и используете его на свой риск. Мы не гарантируем безопасность, доступность или пригодность приложения и, в пределах, допускаемых законом, не отвечаем за вызванные им потери или ущерб. До установки проверьте лицензию, настройки безопасности, обработку данных и резервное копирование.