gsz-mail
postfix
/var/log/maillognginx-lb (K8S Load Balancer)
nginx
/var/log/nginx/access.log/var/log/nginx/default_error.log/var/log/nginx/error.log/var/log/nginx/api_backend_dev_de_access_1.log/var/log/nginx/api_backend_dev_de_error_1.log/var/log/nginx/ftp_stream_prod_access.log/var/log/nginx/ftp_stream_prod_error.log/var/log/nginx/mercur_access.log/var/log/nginx/mercure_error.log/var/log/nginx/oauth-access.spinic.log/var/log/nginx/oauth-error.spinic.logsy-live
MongoDB
nginx
/var/log/mongodb/*log/sy/log/nginx/symfio_81_dealers/access/*log/sy/log/nginx/symfio_81_dealers/errors/*log/sy/current/app/logs/*.logsy-mail
MongoDB
postfix
/var/log/mongodb/*log/var/log/maillogsy-mongo
MongoDB
/var/log/mongodb/*log Настроено, но не сбрасывается по причине выхода бинарных логов, нужно бинарные отключить и пользоваться Loki без лишних скриптов и прочих костылейlogs.symfio.net (TLS, единственная точка входа) → nginx на sy-logs:
POST /loki/api/v1/push — basic_auth ingest → Loki 127.0.0.1:3100 (ingest, отдельный /var/log/nginx/ingest_access.log для аудита).127.0.0.1:3000 (X-USER-TOKEN → Bearer).Loki: retention 2160h (90 дней), мультитенант не используется (auth_enabled: false, тенант fake). На переходный период 3100/tcp ещё открыт на eth0 для агентов, которые не успели переехать на ingest-URL — фильтрация по source IP через rich rules firewalld. После завершения миграции — Loki переедет на 127.0.0.1:3100, allow-list снимается.
⚠️ IP allow-list — временный костыль, фильтрация по IP в Hetzner Cloud нестабильна (egress нод меняется при пересоздании). Правильный фильтр — basic_auth, ради него и был добавлен ingest-vhost.
Push c авторизацией (smoke-test)
PASS='<пароль ingest из Vaultwarden>'
TS=$(date +%s%N)
curl -i -u "ingest:$PASS" \
-H 'Content-Type: application/json' \
-X POST https://logs.symfio.net/loki/api/v1/push \
--data-binary "{\"streams\":[{\"stream\":{\"job\":\"smoke_test\"},\"values\":[[\"$TS\",\"hello\"]]}]}"
# 204 No Content = принято
# 401 = без auth / неверный пароль
# 405 = limit_except POST (GET и др. блокируются)
Запросы к Loki (изнутри sy-logs)
# уникальные значения label
curl -s http://127.0.0.1:3100/loki/api/v1/label/cluster/values
# выборка логов за 30 минут
START=$(($(date +%s)-1800))
curl -s -G 'http://127.0.0.1:3100/loki/api/v1/query_range' \
--data-urlencode 'query={job="smoke_test"}' \
--data-urlencode "start=${START}000000000" \
--data-urlencode "end=$(date +%s)000000000" \
| python3 -m json.tool
Аудит push-источников
# поток в реальном времени
tail -f /var/log/nginx/ingest_access.log
# топ-N IP за последнюю минуту
awk -v since="$(date -d '1 min ago' '+%d/%b/%Y:%H:%M:%S')" '{ts=$4; sub(/^\[/,"",ts); if (ts >= since) print $1}' \
/var/log/nginx/ingest_access.log | sort | uniq -c | sort -rn
# ротация: /etc/logrotate.d/nginx — daily, rotate 30 (30 дней истории для будущего аудита)
Firewall: allow-list 3100/tcp (переходное состояние)
# добавить IP в allow
firewall-cmd --permanent --zone=public \
--add-rich-rule='rule family="ipv4" source address="<IP>" port port="3100" protocol="tcp" accept'
# убрать IP из allow
firewall-cmd --permanent --zone=public \
--remove-rich-rule='rule family="ipv4" source address="<IP>" port port="3100" protocol="tcp" accept'
# список правил и применение
firewall-cmd --list-rich-rules --zone=public
firewall-cmd --reload
# дропнуть существующий keepalive, не дожидаясь TCP timeout
ss -K dst <IP>
basic_auth: хеш пароля для htpasswd
# можно делать на любой машине с httpd-tools — htpasswd stateless
htpasswd -nbB ingest '<открытый пароль>'
# → ingest:$2y$05$...
# скопировать строку в /etc/nginx/ingest.htpasswd на sy-logs
# права: chown root:nginx, chmod 640 (иначе worker'ы под user nginx не прочитают)
⚠️ На sy-logs dnf install httpd-tools падает из-за битого ключа репо grafana. Обход: dnf install -y --disablerepo=grafana httpd-tools.
Loki retention
# /etc/loki/loki-local-config.yaml — поменять все четыре значения синхронно
limits_config:
reject_old_samples_max_age: 2160h
retention_period: 2160h
max_query_lookback: 2160h
table_manager:
retention_period: 2160h
systemctl restart loki # 10-15 сек ingest пауза, агенты буферизуют
curl -s http://127.0.0.1:3100/metrics | grep retention_hours
# → loki_distributor_bytes_received_total{retention_hours="2160", tenant="fake"}
/etc/nginx/conf.d/srv_loki.conf — внутри блока server { server_name logs.symfio.net; ... } перед location / {:
location = /loki/api/v1/push {
auth_basic "loki-ingest";
auth_basic_user_file /etc/nginx/ingest.htpasswd;
limit_except POST { deny all; }
client_max_body_size 32m;
proxy_pass http://127.0.0.1:3100;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300;
access_log /var/log/nginx/ingest_access.log combined;
}
✅ После: внешний curl http://5.75.229.2:3100/ready → connection refused; curl https://logs.symfio.net/loki/api/v1/push без auth → 401; с auth + валидным payload → 204.
В /etc/promtail/promtail.yaml секция clients::
clients:
- url: https://logs.symfio.net/loki/api/v1/push
basic_auth:
username: ingest
password_file: /etc/promtail/ingest.pass
/etc/promtail/ingest.pass — открытый пароль, chmod 600, chown root:root (promtail на всех bare-metal живёт под root). systemctl restart promtail — рестарт чистый, если outgoing IP бьётся с allow-list. Иначе старый процесс висит ~90 сек, пытаясь сбросить буфер на закрытый :3100, после чего systemd шлёт SIGKILL и стартует новый. Потерь логов нет.
⚠️ Outgoing IP может не совпадать с inbound IP из hosts.yaml. Пример: sa-live → inbound 159.69.103.38, outbound через NAT 167.235.224.76. Видно через ss -tnpH '( dst :3100 or dst :443 )' на агентном хосте. Это причина, по которой IP-фильтр в принципе ненадёжен.