Netpulse_SasS/deploy/docker-compose.journald.yml
byrsapty 04e1242c52
All checks were successful
CI / hygiene (push) Successful in 8s
CI / web (push) Successful in 1m10s
CI / server (push) Successful in 1m41s
CI / agent (push) Successful in 59s
Журнали файлами, тонший штрих мінікарти
ФАЙЛИ В /var/log/netpulse. rsyslog читає journald і розкладає по файлах
на службу. Драйвер docker лишається journald, а не syslog: syslog
віддав би рядки назовні й нічого не лишив докеру, тож `docker logs`
замовк би назавжди — і мовчання виглядало б як «служба нічого не пише».
Тепер працюють усі три шляхи: docker logs, journalctl, файли.

Дорогою три власні помилки, кожна виглядала як «rsyslog не працює»:

  1. Умова матчила $!CONTAINER_NAME — метадані журналу. journalctl їх
     бачить, а до правил rsyslog вони доходять не завжди. Каталог
     створювався й лишався порожнім.
  2. Тег «netpulse/{{.Name}}» здавався охайнішим, але rsyslog обриває
     programname на скісній: для ВСІХ контейнерів вона ставала просто
     «netpulse». Тег тепер — саме ім'я контейнера, воно й так має
     префікс проєкту.
  3. Шаблон `%msg:::sp-if-no-1st-sp,drop-last-lf%` давав ПОРОЖНІЙ
     текст: файли були, рядки були, слів не було. Журнал виглядав
     робочим і не містив нічого — найгірший різновид поломки.

Конфігурації в deploy/, щоб їхали клієнтам, а не лишались разовим
налаштуванням одного сервера.

МІНІКАРТА. Штрих рядка був 2 px при 3 px на рядок — просвіт в один
піксель. На дробовому масштабі екрана (1.25, 1.5 — тобто на більшості
ноутбуків) він губився при округленні, і рядки злипались у суцільну
пляму: мінікарта показувала не форму конфігу, а сірий прямокутник.

Тепер штрих 1 px, просвіт удвічі товщий за нього й переживає будь-яке
округлення. Малюнок став блідішим — це правильний бік розміну: на
мінікарту дивляться, щоб побачити структуру, а не прочитати текст.
2026-08-27 22:55:29 +03:00

78 lines
4 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Журнали в journald замість файлів докера.
#
# docker compose -f docker-compose.yml -f deploy/docker-compose.journald.yml up -d
#
# ЩО ЦЕ ДАЄ
#
# * `docker logs` ПРОДОВЖУЄ працювати. Це головна причина обрати
# journald, а не syslog: драйвер syslog віддає рядки назовні й
# нічого не лишає докеру, тож `docker logs` після нього мовчить —
# і людина, яка про це не знає, вирішує, що служба нічого не пише.
# * Історія переживає перестворення контейнера. Типовий json-file
# живе всередині контейнера: `docker compose up -d` після оновлення
# стирає весь журнал рівно тоді, коли він потрібен — щоб порівняти
# «до» і «після».
# * Ротацію робить systemd, а не ми. Одним місцем менше.
#
# ЧОГО НЕ ДАЄ
#
# Простих текстових файлів у /var/log/netpulse. journald тримає свій
# формат, і читають його journalctl-ом:
#
# journalctl CONTAINER_NAME=netpulse-api-1 -f
# journalctl CONTAINER_NAME=netpulse-collector-1 --since "2 hours ago"
# journalctl CONTAINER_NAME=netpulse-api-1 -p err --since today
#
# Це той самий tail і grep, лише іншою командою. Кому потрібні саме
# файли — ставить rsyslog і додає одне правило; ми цього не робимо за
# замовчуванням, бо пакет на чужому сервері ставить власник, а не
# продукт.
#
# ЧОМУ ОКРЕМИЙ ФАЙЛ, А НЕ ЗМІННА
#
# Опції max-size і max-file існують ЛИШЕ в json-file. Передати їх
# journald означає «unknown log opt» і контейнер, який не стартує.
# Прибрати ключ умовно compose не вміє, тож перемикач змінною тут
# зробив би нерозв'язний стан: драйвер новий, опції старі.
#
# СТЕЛЯ МІСЦЯ задається не тут, а в journald (він спільний для машини):
#
# /etc/systemd/journald.conf → SystemMaxUse=1G
# systemctl restart systemd-journald
#
# Типово journald бере до 10% файлової системи — на диску 30 ГБ це
# 3 ГБ, що більше, ніж потрібно, і саме тому варто задати явно.
x-journald: &journald
driver: journald
options:
# Тег — саме ІМ'Я контейнера, без префікса зі скісною.
#
# Спершу стояло "netpulse/{{.Name}}", і це виглядало охайніше. Але
# rsyslog обриває властивість programname на скісній: для всіх
# контейнерів вона ставала просто "netpulse", а ім'я служби лишалось
# усередині syslogtag. Правило «писати кожній службі свій файл» через
# це не спрацьовувало жодного разу — каталог створювався й лишався
# порожнім, тобто поломка виглядала як «rsyslog не працює».
#
# Імена контейнерів і так починаються з імені проєкту (netpulse-api-1),
# тож префікс нічого не додавав, окрім цієї халепи.
tag: "{{.Name}}"
services:
db:
logging: *journald
cache:
logging: *journald
migrate:
logging: *journald
cli:
logging: *journald
api:
logging: *journald
collector:
logging: *journald
proxy:
logging: *journald
agent:
logging: *journald