Тема
Эксплуатация
Для установки в /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, веб-интерфейс, открытие существующего вложения и загрузку нового файла.
Обновление
Перед обновлением:
- Зафиксируйте текущие
BACKEND_VERSIONиFRONTEND_VERSION. - Создайте согласованные резервные копии PostgreSQL и Garage.
- Сравните новый
.env.exampleс действующим.env. - Проверьте примечания к релизу и совместимость отката схемы БД.
После переноса новых файлов поставки:
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 -aCompose применит миграции до запуска новой версии 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 имеет состояние unhealthy | PostgreSQL, 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 или 502 | HTTP/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.