Skip to content

Эксплуатация ​

Для установки в /opt/l1-support команды Docker Compose и работу с .env выполняйте от root, так как рабочий каталог принадлежит ему.

Проверка состояния ​

bash
sudo -i
cd /opt/l1-support
docker compose ps -a
docker compose logs --tail=200

Постоянные сервисы postgres, redis, garage, backend и frontend должны быть Up и healthy. Состояние Exited (0) для одноразовых сервисов migrate и garage-init является штатным.

Проверка локальных endpoint:

bash
curl -f http://127.0.0.1:9100/api/v1/system/bootstrap/status
curl -fI http://127.0.0.1:9090
curl -f http://127.0.0.1:9103/health

Если система опубликована через HTTPS, дополнительно проверьте публичные endpoint и продление сертификата:

bash
curl -fI https://l1.example.org
curl -sS -o /dev/null -w '%{http_code}\n' https://l1.example.org:9443/
sudo certbot renew --dry-run

Замените адреса в примере на фактические значения FRONTEND_PUBLIC_URL и S3_PUBLIC_ENDPOINT из .env. Для неподписанного запроса к публичному S3 endpoint ожидается код 403: это подтверждает доступность Garage и запрет анонимного доступа.

Журналы ​

bash
docker compose logs --tail=200
docker compose logs -f backend
docker compose logs -f postgres redis garage
docker compose logs --since=30m backend

Не передавайте .env, токены, cookies, пароли и полные диагностические архивы третьим лицам без проверки содержимого.

Остановка и запуск ​

Остановить и запустить существующие контейнеры:

bash
docker compose stop
docker compose start

Применить изменённую конфигурацию или пересоздать необходимые контейнеры:

bash
ENVFILE=.env docker compose --env-file .env config --quiet
docker compose up -d

Не используйте docker compose down -v: параметр -v удаляет volumes PostgreSQL, Garage, конфигурации и журналов backend вместе с данными.

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

В резервную копию должны входить:

  • дамп PostgreSQL;
  • содержимое бакета Garage;
  • .env и неизменяемый APP_SECRETS_KEY;
  • содержимое volume l1-support-backend-config;
  • номера версий backend и frontend.

Redis содержит временные данные и отдельно не резервируется.

PostgreSQL ​

bash
docker compose exec -T postgres sh -c \
  'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" --format=custom' \
  > l1-support-postgres-$(date +%F-%H%M%S).dump

Команда должна завершиться с кодом 0, а полученный файл — иметь ненулевой размер.

Garage ​

Метаданные и блоки объектов находятся в volumes garage_meta и garage_data. Настройте регулярное копирование бакета во внешнее S3-совместимое или файловое хранилище, например средствами rclone copy либо корпоративной системы резервного копирования.

Не ограничивайтесь копированием файлов активных Docker volumes без остановки Garage: такая копия может быть несогласованной.

Требования к резервным копиям ​

  • PostgreSQL и Garage должны относиться к одному согласованному периоду.
  • Копии должны храниться за пределами Docker-сервера.
  • Доступ к .env и APP_SECRETS_KEY должен быть ограничен.
  • Срок хранения и допустимая потеря данных должны соответствовать принятым RPO/RTO.
  • Восстановление необходимо регулярно проверять на отдельном стенде.

Для строгой согласованности остановите запись данных на время создания обеих копий:

bash
docker compose stop backend frontend
# Создайте дамп PostgreSQL и копию бакета Garage.
docker compose start backend frontend

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

Перед восстановлением сохраните текущее состояние и убедитесь, что выбраны согласованные копии PostgreSQL и Garage.

Остановите приложение:

bash
docker compose stop backend frontend

Восстановите PostgreSQL:

bash
docker compose exec -T postgres sh -c \
  'pg_restore -U "$POSTGRES_USER" -d "$POSTGRES_DB" --clean --if-exists' \
  < l1-support-postgres-YYYY-MM-DD-HHMMSS.dump

Восстановите бакет Garage из соответствующей копии принятой в организации процедурой, затем запустите и проверьте систему:

bash
docker compose start backend frontend
docker compose ps -a

Проверьте API, веб-интерфейс, открытие существующего вложения и загрузку нового файла.

Обновление ​

Перед обновлением:

  1. Зафиксируйте текущие BACKEND_VERSION и FRONTEND_VERSION.
  2. Создайте согласованные резервные копии PostgreSQL и Garage.
  3. Сравните новый .env.example с действующим .env.
  4. Проверьте примечания к релизу и совместимость отката схемы БД.

После переноса новых файлов поставки:

bash
cd /opt/l1-support
ENVFILE=.env docker compose --env-file .env config --quiet

В контуре с registry загрузите новые образы:

bash
docker compose pull backend frontend migrate

В закрытом контуре вместо pull загрузите отдельно запрошенные у поставщика архивы образов через docker load и проверьте теги командой docker compose config --images.

Примените обновление:

bash
docker compose up -d
docker compose ps -a

Compose применит миграции до запуска новой версии backend. После обновления проверьте API, веб-интерфейс, загрузку и скачивание файлов, почтовые обработчики и используемые провайдеры аутентификации.

Откат ​

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

Если схема совместима, верните предыдущие версии в .env, обеспечьте наличие образов на сервере и выполните:

bash
docker compose up -d --no-deps backend frontend
docker compose ps -a

В контуре с registry отсутствующие предыдущие образы можно предварительно получить командой docker compose pull backend frontend.

Если предыдущая версия несовместима с новой схемой, остановите приложение и восстановите согласованные резервные копии PostgreSQL и Garage. Не запускайте down-миграции без явно предусмотренной для релиза процедуры.

Диагностика ​

ПроблемаЧто проверитьКоманда или действие
pull access denied или manifest unknownПуть к образу, точную версию и авторизацию в registry.docker compose config --images, docker login <registry>.
В закрытом контуре выполняется обращение к registryНа сервер загружены не все образы или не совпадают теги.docker image ls, docker compose config --images.
migrate завершился с Exited (1)Параметры PostgreSQL, готовность БД и журнал миграций.docker compose logs --tail=200 migrate postgres.
Изменения .env не применилисьКонфигурацию Compose и состояние контейнеров.Проверить и применить изменённую конфигурацию.
Backend имеет состояние unhealthyPostgreSQL, Redis, Garage, завершение миграций и значения .env.docker compose ps -a, docker compose logs --tail=200 backend.
garage-init завершился с ошибкойS3-ключи, бакет, FRONTEND_PUBLIC_URL и журнал настройки CORS.docker compose logs --tail=200 garage-init garage.
Интерфейс работает, файлы не загружаютсяS3_PUBLIC_ENDPOINT, CORS, DNS, TLS, лимит reverse proxy и доступ к S3.Проверить OPTIONS/PUT в DevTools и журналы garage.
WebSocket notifications/live возвращает 401Передачу Upgrade, Connection и Sec-WebSocket-Protocol через все proxy.Проверить запрос в DevTools и access log reverse proxy; ожидается 101.
WebSocket возвращает 400, 426 или 502HTTP/1.1, WebSocket upgrade и доступ reverse proxy к backend 127.0.0.1:9100.Сверить Nginx с разделом публикации через HTTPS.
Система работает локально, но недоступна пользователямDNS, firewall, reverse proxy и совпадение публичных URL.Сравнить .env с конфигурацией reverse proxy.
LDAP не подключаетсяКорпоративный DNS, маршрутизацию, сертификат и порты 389/636.Проверить разрешение имени и TCP-доступ из сети Docker-сервера.
Письма не приходят или не отправляютсяIMAP/SMTP, DNS, TLS и журналы почтовых обработчиков.docker compose logs --since=30m backend.
После перезагрузки сервисы не запустилисьАвтозапуск Docker и состояние контейнеров.systemctl status docker, docker compose ps -a.
На диске заканчивается местоDocker Root Dir, volumes, журналы и незавершённые загрузки.df -h, docker system df, docker volume inspect ....

Если проблема сохраняется, соберите версии образов, вывод docker compose ps -a, относящийся к ошибке фрагмент журналов и время возникновения. Перед передачей материалов удалите секреты и персональные данные.

Обратиться в техническую поддержку можно по адресу 1ltp.dev@legionsecurity.ru.

Логотип ЛЕГИОНЛЕГИОН