feat(relay): receive support reports on the project stand (#43)

User-Visible: no
Issue: #43
This commit is contained in:
Codex
2026-09-02 00:05:36 +00:00
committed by claude[bot]
parent 4bdd266fbb
commit f36ded7fc2
16 changed files with 1593 additions and 0 deletions
@@ -0,0 +1,19 @@
# Фрагмент для /etc/caddy/Caddyfile. Требует A-записей support и
# support-staging на адрес стенда — иначе Caddy не получит сертификат.
#
# Access-лог намеренно не настраивается: он пишет remote_ip, а сырой адрес
# источника не должен оседать на диске (§9.2 ТЗ 043).
support.houseplan.tech {
request_body {
max_size 8.7MB
}
reverse_proxy 127.0.0.1:8130
}
support-staging.houseplan.tech {
request_body {
max_size 8.7MB
}
reverse_proxy 127.0.0.1:8131
}
+14
View File
@@ -0,0 +1,14 @@
# /etc/hp-support-relay/prod.env — права 0640, владелец root:hprelay.
HP_RELAY_PORT=8130
HP_RELAY_SPOOL=/var/lib/hp-support-relay/prod
# deliver — отправлять мейнтейнеру; discard — принимать и складывать молча.
HP_RELAY_MODE=deliver
# Рубильник: 0 переводит эндпоинт в единообразный 503, ничего не принимая.
HP_RELAY_ENABLED=1
HP_RELAY_RETENTION_DAYS=30
# Секрет НЕ хранится в этом файле: только путь к файлу с токеном (права 0400,
# владелец hprelay). Так он не попадает ни в `systemctl show`, ни в `ps`.
HP_RELAY_TELEGRAM_TOKEN_FILE=/etc/hp-support-relay/telegram.token
HP_RELAY_TELEGRAM_CHAT_ID=
# Источник берётся из X-Forwarded-For, потому что перед сервисом стоит Caddy.
HP_RELAY_TRUSTED_PROXY=1
@@ -0,0 +1,14 @@
# Ретеншн: удаляет отчёты старше HP_RELAY_RETENTION_DAYS и метаданные старше суток.
[Unit]
Description=House Plan support relay retention (%i)
[Service]
Type=oneshot
User=hprelay
Group=hprelay
EnvironmentFile=/etc/hp-support-relay/%i.env
ExecStart=/usr/bin/python3 /opt/hp-support-relay/relay.py purge
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/hp-support-relay/%i
@@ -0,0 +1,10 @@
[Unit]
Description=Daily retention for House Plan support relay (%i)
[Timer]
OnCalendar=daily
RandomizedDelaySec=30m
Persistent=true
[Install]
WantedBy=timers.target
@@ -0,0 +1,35 @@
# Инстанс приёмщика: %i — имя окружения (prod | staging).
# Конфиг: /etc/hp-support-relay/%i.env, спул: /var/lib/hp-support-relay/%i
[Unit]
Description=House Plan support relay (%i)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=hprelay
Group=hprelay
EnvironmentFile=/etc/hp-support-relay/%i.env
ExecStart=/usr/bin/python3 /opt/hp-support-relay/relay.py
Restart=on-failure
RestartSec=5
# Сервис слушает только петлю, наружу ходит лишь к API доставки.
NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectSystem=strict
ProtectHome=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
RestrictAddressFamilies=AF_INET AF_INET6
RestrictNamespaces=yes
RestrictSUIDSGID=yes
LockPersonality=yes
MemoryMax=256M
TasksMax=64
ReadWritePaths=/var/lib/hp-support-relay/%i
[Install]
WantedBy=multi-user.target