Укрепление эксплуатации: healthcheck'и, лимиты ресурсов, логи, self-hosted шрифты, smoke-проверка в CI
Deploy / deploy (push) Failing after 0s

This commit is contained in:
2026-11-10 00:59:14 +05:00
parent 6746d89233
commit c47391b6db
32 changed files with 375 additions and 18 deletions
+77
View File
@@ -0,0 +1,77 @@
# cactoz.su
Личный сайт-визитка на `cactoz.su` в Matrix-стилистике: резюме, проекты и
браузерные игры. Три страницы статики + мультиплеерный сервер для `./tanks`.
Исходный замысел и игровой протокол — в [TZ.md](TZ.md) (⚠️ местами устарел).
## Архитектура
```
┌────────── homelab (cacto-homelab) ──────────┐
push в main │ │
в Gitea ────────────► │ gitea-actions runner (docker.sock хоста) │
git.cactoz.su │ │ клонирует, синкает, собирает │
│ ▼ │
│ /data/docker/compose/cactoz │
│ docker compose -f docker-compose.prod.yml │
│ ├── nginx (статика + прокси /ws) │
│ └── gameserver (C++/uWebSockets, :9001) │
│ │ │
│ ▼ (external docker-сеть proxy) │
│ Caddy-стек (TLS-терминация 80/443) │
└──────────────────────────────────────────────┘
```
- **Деплой**: push в `main` → workflow `.gitea/workflows/deploy.yml` → build +
`up -d` + smoke-проверка по healthcheck'ам. Отката нет: если сборка/подъём
падают, шлётся уведомление, старые контейнеры продолжают работать.
- **TLS** терминирует отдельный Caddy-стек, сеть `proxy` создаётся там
(`external: true`) — на этом хосте только подключаемся.
- Gameserver изнутри доступен только по docker-сети `internal`; наружу
смотрит только nginx (через Caddy).
## Локальный запуск
```bash
docker compose up --build # http://localhost, /ws на ws://localhost/ws
```
Сборка gameserver тянет зависимости через CMake FetchContent (uWebSockets,
uSockets, nlohmann/json) — первый билд долгий, дальше кэшируется слоями Docker.
## Структура
```
frontend/ чистый HTML/CSS/JS, без сборки
vendor/fonts/ self-hosted JetBrains Mono (OFL), 4 сабсета × 4 насыщенности
js/game/ клиент ./tanks: network (WS + ping 25с), lobby, battle
js/blocks.js, js/invaders.js одиночные мини-игры (canvas, без сервера)
gameserver/
src/main.cpp uWS::App, /ws, лимиты фреймов/таймауты
src/Lobby.* лобби: комнаты, broadcast, ping/pong, события в stdout
src/Game.* авторитетная симуляция (20 Гц), pvp и coop с AI
nginx/ статика + проксирование /ws (rate-limit на соединения)
```
## Runbook
```bash
# на homelab:
cd /data/docker/compose/cactoz
docker compose -f docker-compose.prod.yml ps # статус + healthcheck'и
docker logs -f cactoz-gameserver-... 2>&1 | less # события лобби/игр
docker compose -f docker-compose.prod.yml up -d --build # ручной перезапуск
```
- Логи ротируются (`max-size 10m × 3`), лимиты ресурсов: nginx 128M/0.5cpu,
gameserver 256M/1cpu.
- Gameserver не умеет graceful shutdown — при рестарте активные матчи обрываются
(комнаты сами поднимаются заново).
- Статика без хешей в именах: js/css отдаются с `no-cache`, `/assets/` — час.
## Доступ и безопасность
- SSH на homelab: ключи, вход только с доверенных сетей; sudo — по необходимости.
- Gitea (`git.cactoz.su`) — источник истины для кода; секретов в репо нет.
- За пределами compose на хосте живут Caddy-стек, Gitea и её runner — их
конфиги не входят в этот репозиторий и бэкапятся отдельно.