fix(devops): потолок логов основного стека — journald, как у trade-in (#2761) #2762
1 changed files with 67 additions and 0 deletions
|
|
@ -17,10 +17,66 @@
|
||||||
#
|
#
|
||||||
# Postgres + Redis run alongside the app on the same VM (Discovery mode).
|
# Postgres + Redis run alongside the app on the same VM (Discovery mode).
|
||||||
# Volumes are shared with docker-compose.yml so switching between files preserves data.
|
# Volumes are shared with docker-compose.yml so switching between files preserves data.
|
||||||
|
#
|
||||||
|
# ── logging: journald (#2761) ────────────────────────────────────────────────
|
||||||
|
# До этого у стека НЕ БЫЛО потолка вообще: дефолтный json-file растёт без границ
|
||||||
|
# и живёт в /var/lib/docker/containers/<id>/ (умирает вместе с контейнером).
|
||||||
|
# Тот же anchor и тот же драйвер, что у trade-in (#2758/#2741) — намеренно ОДИН
|
||||||
|
# способ на обе половины, расхождение двух стеков дороже в поддержке.
|
||||||
|
#
|
||||||
|
# Замер прод 2026-08-06 (МБ/сутки = размер json-file / возраст контейнера):
|
||||||
|
# glitchtip-worker 31.9 ← 2.59 ГБ накоплено, 81% всего роста стека
|
||||||
|
# postgres 2.2 ← 162 МБ за 74 дня
|
||||||
|
# backend 1.9 · worker 1.3 · beat 0.6 · caddy 0.5 · остальные <0.5
|
||||||
|
# ИТОГО ~39 МБ/сутки
|
||||||
|
# Бюджет journald (замер там же, сообщение самого systemd-journald):
|
||||||
|
# "System Journal ... is 2.2G, max 4.0G" — потолок 4G ЭМПИРИЧЕСКИ подтверждён
|
||||||
|
# (journald.conf пуст, все дефолты; 10% от 145G = 14.5G, но капается 4G).
|
||||||
|
# Системный поток 2.2G/103 суток ≈ 22 МБ/сутки. После этой правки
|
||||||
|
# 22 + 39 + tradein(единицы) ≈ 65 МБ/сутки → 4096/65 ≈ 60 суток глубины.
|
||||||
|
# Дисковый эффект ОТРИЦАТЕЛЬНЫЙ (в нашу пользу): 4G — это потолок с
|
||||||
|
# самовытеснением, а сегодня glitchtip-worker растёт БЕЗ потолка; плюс
|
||||||
|
# пересоздание контейнера удаляет его json-file → разово освобождает ~2.6 ГБ.
|
||||||
|
#
|
||||||
|
# КАК ЧИТАТЬ (проверено на проде 2026-08-06, ровно тем доступом, что есть):
|
||||||
|
# docker logs gendesign-backend-1 # как и раньше — только текущий контейнер
|
||||||
|
# # История через пересоздания: журнал принадлежит root:systemd-journal, а
|
||||||
|
# # deploy-юзер gendesign состоит в docker/sudo, но НЕ в adm/systemd-journal, и
|
||||||
|
# # sudo просит пароль (`sudo -n` молча падает) → голый journalctl даёт
|
||||||
|
# # "No entries". Рабочий однострочник — через docker-группу:
|
||||||
|
# docker run --rm -v /:/host:ro alpine chroot /host sh -c \
|
||||||
|
# 'TZ=UTC journalctl -t gendesign-backend-1 -o short-iso --since "2026-08-07 00:00"'
|
||||||
|
# # TZ=UTC обязателен: --since/--until разбираются в ЛОКАЛЬНОМ времени хоста
|
||||||
|
# # (+03), и флаг --utc на это НЕ влияет — он меняет только вывод (#2760).
|
||||||
|
# # По метке контейнера: CONTAINER_NAME=gendesign-backend-1 (или CONTAINER_ID=<id>
|
||||||
|
# # — так читается лог УЖЕ УДАЛЁННОГО контейнера).
|
||||||
|
# Владельцу стоит разово выдать `usermod -aG adm gendesign` — тогда journalctl
|
||||||
|
# заработает напрямую (host-config, не этот файл). До этого правка не регрессия.
|
||||||
|
#
|
||||||
|
# ⚠️ Blast radius ПЕРВОГО деплоя: log-driver — свойство создания контейнера, так
|
||||||
|
# что `compose up -d` пересоздаст ВСЁ. backend/worker/beat/caddy/forwarder и так
|
||||||
|
# force-recreate'ятся каждым деплоем (см. deploy.yml) — ИНКРЕМЕНТ этой правки:
|
||||||
|
# postgres (~10с даунтайма), redis (брокер celery), osrm + osrm-walk (перезагрузка
|
||||||
|
# MLD-графа в RAM), frontend, glitchtip-web/worker. Разово, деплоить в окно без
|
||||||
|
# ночных прогонов.
|
||||||
|
# Ceiling: journald рейт-лимитит 10000 сообщений / 30s на сервис (дефолт) — при
|
||||||
|
# флуде в журнал попадёт "Suppressed N messages". Текущий пик (glitchtip-worker
|
||||||
|
# 31.9 МБ/сутки ≈ 3 строки/с) ниже лимита на три порядка; если появится — это
|
||||||
|
# host drop-in journald.conf.d, не этот файл.
|
||||||
|
# tag: имя контейнера, а не ID — SYSLOG_IDENTIFIER стабилен между пересозданиями.
|
||||||
|
#
|
||||||
|
# ⚠️ НЕ переносить этот anchor в корневой docker-compose.yml: он для локальной
|
||||||
|
# разработки, а в Docker Desktop (macOS/Windows) journald в VM нет — контейнеры
|
||||||
|
# просто не стартуют. Ceiling для dev-логов при нужде — json-file max-size.
|
||||||
|
x-logging: &default-logging
|
||||||
|
driver: journald
|
||||||
|
options:
|
||||||
|
tag: "{{.Name}}"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: postgis/postgis:16-3.4
|
image: postgis/postgis:16-3.4
|
||||||
|
logging: *default-logging
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: ${POSTGRES_DB}
|
POSTGRES_DB: ${POSTGRES_DB}
|
||||||
|
|
@ -46,6 +102,7 @@ services:
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
image: redis:7-alpine
|
image: redis:7-alpine
|
||||||
|
logging: *default-logging
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
volumes:
|
volumes:
|
||||||
- redis_data:/data
|
- redis_data:/data
|
||||||
|
|
@ -76,6 +133,7 @@ services:
|
||||||
# отдельно (docs/osrm-routing.md).
|
# отдельно (docs/osrm-routing.md).
|
||||||
osrm:
|
osrm:
|
||||||
image: osrm/osrm-backend:latest
|
image: osrm/osrm-backend:latest
|
||||||
|
logging: *default-logging
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: osrm-routed --algorithm mld --max-table-size 8000 /data/${OSRM_REGION:-sverdlovsk}.osrm
|
command: osrm-routed --algorithm mld --max-table-size 8000 /data/${OSRM_REGION:-sverdlovsk}.osrm
|
||||||
volumes:
|
volumes:
|
||||||
|
|
@ -103,6 +161,7 @@ services:
|
||||||
# (backend не depends_on, флаг use_osrm_distances OFF). Backend ходит к http://osrm-walk:5000.
|
# (backend не depends_on, флаг use_osrm_distances OFF). Backend ходит к http://osrm-walk:5000.
|
||||||
osrm-walk:
|
osrm-walk:
|
||||||
image: osrm/osrm-backend:latest
|
image: osrm/osrm-backend:latest
|
||||||
|
logging: *default-logging
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: osrm-routed --algorithm mld --max-table-size 8000 /data/${OSRM_REGION:-sverdlovsk}-foot.osrm
|
command: osrm-routed --algorithm mld --max-table-size 8000 /data/${OSRM_REGION:-sverdlovsk}-foot.osrm
|
||||||
volumes:
|
volumes:
|
||||||
|
|
@ -118,6 +177,7 @@ services:
|
||||||
|
|
||||||
backend:
|
backend:
|
||||||
image: ghcr.io/lekss361/gendesign-backend:${IMAGE_TAG:-latest}
|
image: ghcr.io/lekss361/gendesign-backend:${IMAGE_TAG:-latest}
|
||||||
|
logging: *default-logging
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
# .env.runtime пишется deploy.yml через SSH (SENTRY_RELEASE=$IMAGE_TAG).
|
# .env.runtime пишется deploy.yml через SSH (SENTRY_RELEASE=$IMAGE_TAG).
|
||||||
# required: false — compose не падает если файла нет (первый деплой).
|
# required: false — compose не падает если файла нет (первый деплой).
|
||||||
|
|
@ -153,6 +213,7 @@ services:
|
||||||
|
|
||||||
frontend:
|
frontend:
|
||||||
image: ghcr.io/lekss361/gendesign-frontend:${IMAGE_TAG:-latest}
|
image: ghcr.io/lekss361/gendesign-frontend:${IMAGE_TAG:-latest}
|
||||||
|
logging: *default-logging
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:3000:3000"
|
- "127.0.0.1:3000:3000"
|
||||||
|
|
@ -172,6 +233,7 @@ services:
|
||||||
worker:
|
worker:
|
||||||
# Отдельный chromium-образ (+200 МБ Playwright). См. backend/Dockerfile target=runner-with-chromium.
|
# Отдельный chromium-образ (+200 МБ Playwright). См. backend/Dockerfile target=runner-with-chromium.
|
||||||
image: ghcr.io/lekss361/gendesign-worker:${IMAGE_TAG:-latest}
|
image: ghcr.io/lekss361/gendesign-worker:${IMAGE_TAG:-latest}
|
||||||
|
logging: *default-logging
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
env_file:
|
env_file:
|
||||||
- path: ./backend/.env
|
- path: ./backend/.env
|
||||||
|
|
@ -201,6 +263,7 @@ services:
|
||||||
beat:
|
beat:
|
||||||
# Lean backend-образ (без Chromium) — beat только триггерит таски в Redis.
|
# Lean backend-образ (без Chromium) — beat только триггерит таски в Redis.
|
||||||
image: ghcr.io/lekss361/gendesign-backend:${IMAGE_TAG:-latest}
|
image: ghcr.io/lekss361/gendesign-backend:${IMAGE_TAG:-latest}
|
||||||
|
logging: *default-logging
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
env_file:
|
env_file:
|
||||||
- path: ./backend/.env
|
- path: ./backend/.env
|
||||||
|
|
@ -219,6 +282,7 @@ services:
|
||||||
glitchtip-web:
|
glitchtip-web:
|
||||||
image: glitchtip/glitchtip:6.1.6
|
image: glitchtip/glitchtip:6.1.6
|
||||||
container_name: glitchtip-web
|
container_name: glitchtip-web
|
||||||
|
logging: *default-logging
|
||||||
# profiles: ["glitchtip"] keeps this service from starting on plain `compose up -d`.
|
# profiles: ["glitchtip"] keeps this service from starting on plain `compose up -d`.
|
||||||
# Bootstrap script activates the profile after DB + secrets are ready.
|
# Bootstrap script activates the profile after DB + secrets are ready.
|
||||||
# On subsequent deploys, set COMPOSE_PROFILES=glitchtip in /opt/gendesign/.env.
|
# On subsequent deploys, set COMPOSE_PROFILES=glitchtip in /opt/gendesign/.env.
|
||||||
|
|
@ -254,6 +318,7 @@ services:
|
||||||
glitchtip-worker:
|
glitchtip-worker:
|
||||||
image: glitchtip/glitchtip:6.1.6
|
image: glitchtip/glitchtip:6.1.6
|
||||||
container_name: glitchtip-worker
|
container_name: glitchtip-worker
|
||||||
|
logging: *default-logging
|
||||||
profiles: ["glitchtip"]
|
profiles: ["glitchtip"]
|
||||||
depends_on:
|
depends_on:
|
||||||
postgres:
|
postgres:
|
||||||
|
|
@ -272,6 +337,7 @@ services:
|
||||||
|
|
||||||
caddy:
|
caddy:
|
||||||
image: caddy:2
|
image: caddy:2
|
||||||
|
logging: *default-logging
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- "80:80"
|
||||||
|
|
@ -310,6 +376,7 @@ services:
|
||||||
# deploy.yml запускает: docker compose build glitchtip-auth-forwarder
|
# deploy.yml запускает: docker compose build glitchtip-auth-forwarder
|
||||||
build: ./ops/glitchtip-auth-forwarder
|
build: ./ops/glitchtip-auth-forwarder
|
||||||
container_name: gendesign-auth-forwarder
|
container_name: gendesign-auth-forwarder
|
||||||
|
logging: *default-logging
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
GLITCHTIP_DSN: ${GLITCHTIP_DSN}
|
GLITCHTIP_DSN: ${GLITCHTIP_DSN}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue