Два образи замість пʼяти: серверні команди їдуть з одного модуля й мусять ходити в схему БД однією версією, а зонд лишається окремо — у чужій мережі йому не місце з DSN і ключами шифрування. Стек піднімає БД, кеш, міграції, API, колектор і Caddy з автоматичним TLS. Міграції окремою службою, бо API піднімається в кількох примірниках і гонка за схему нікому не потрібна. deploy/README.md описує бекап як три речі: дамп, DEK і JWT-ключ. Без DEK дамп не відновлюється — у БД лише шифротекст. Дорогою виправлено .gitignore: голі "netpulse-agent" і "netpulse-server" ігнорували ще й каталоги cmd/ з кодом команд. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
57 lines
2.1 KiB
Caddyfile
57 lines
2.1 KiB
Caddyfile
# Зворотний проксі NetPulse.
|
||
#
|
||
# Caddy бере на себе сертифікати Let's Encrypt і оновлює їх сам. Це
|
||
# знімає з розгортання найчастішу причину нічного дзвінка — прострочений
|
||
# сертифікат на системі, яка сама має повідомляти про проблеми.
|
||
{
|
||
email {$ACME_EMAIL}
|
||
}
|
||
|
||
# --- інтерфейс і API -------------------------------------------------
|
||
{$NETPULSE_DOMAIN} {
|
||
encode zstd gzip
|
||
|
||
# WebSocket живих оновлень. Окремим блоком, бо йому не можна
|
||
# ставити таймаут на відповідь: зʼєднання висить годинами й
|
||
# мовчить, поки на мапі нічого не змінюється.
|
||
@ws path /api/v1/ws
|
||
reverse_proxy @ws api:8080 {
|
||
flush_interval -1
|
||
}
|
||
|
||
# API і вшитий у бінарник інтерфейс — за однією адресою, тож
|
||
# розділяти їх не потрібно: SPA віддає той самий процес.
|
||
reverse_proxy api:8080
|
||
|
||
header {
|
||
Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
||
X-Content-Type-Options "nosniff"
|
||
X-Frame-Options "DENY"
|
||
Referrer-Policy "strict-origin-when-cross-origin"
|
||
-Server
|
||
}
|
||
|
||
log {
|
||
output stdout
|
||
format console
|
||
}
|
||
}
|
||
|
||
# --- колектор зондів -------------------------------------------------
|
||
#
|
||
# Зонди говорять gRPC поверх HTTP/2. Усередині мережі — h2c без TLS:
|
||
# сертифікат живе тут, а не в кожному примірнику колектора.
|
||
{$NETPULSE_DOMAIN}:9443 {
|
||
reverse_proxy h2c://collector:9443 {
|
||
# Потік Control двонаправлений і довгий: агент тримає його
|
||
# відкритим, доки живий. Буферизація тут ламає саме те, заради
|
||
# чого потік існує — миттєву доставку команд.
|
||
flush_interval -1
|
||
}
|
||
|
||
log {
|
||
output stdout
|
||
format console
|
||
}
|
||
}
|