chore: full project cleanup + documentation
Some checks failed
CI/CD / syntax-check (push) Successful in 1m31s
CI/CD / deploy (push) Has been cancelled

Syncthing removal (was already decided, now fully removed):
- roles/base/tasks/firewall.yml: remove 3 UFW rules (ports 22000/21027)
- inventory/group_vars/all/main.yml: remove domain_sync, domain_mon, syncthing_basic_auth_htpasswd
- roles/services/templates/env.j2: remove DOMAIN_SYNC
- roles/services/templates/authelia/configuration.yml.j2: remove Syncthing 2FA rule
- roles/services/tasks/directories.yml: remove syncthing/config and syncthing/data dirs
- roles/services/defaults/main.yml: remove syncthing_image
- roles/services/tasks/main.yml: remove syncthing image pull

Security hardening:
- inventory/group_vars/all/main.yml: move cloudflare_zone_id to vault
- inventory/group_vars/all/vault.yml: add vault_cloudflare_zone_id

.gitignore improvements:
- add *.env, acme.json, *.log, editor dirs, venv, temp files

Documentation (new):
- docs/STATUS.md: all services, servers, known issues
- docs/BACKLOG.md: prioritized task list, done/todo
- docs/DECISIONS.md: architecture decisions and rationale
- CLAUDE.md: rewritten with read-first docs, rules, full arch reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
jack 2026-03-22 19:58:12 +07:00
parent cd562da4d2
commit 66b70827df
13 changed files with 542 additions and 191 deletions

35
.gitignore vendored
View file

@ -1,6 +1,39 @@
# Ansible
.vault-password-file
*.vault-password
*.retry
.ansible_cache/
*.fact
# Python
__pycache__/
*.pyc
*.pyo
.venv/
venv/
# OS
.DS_Store
.ansible_cache/
Thumbs.db
# Editor
.idea/
.vscode/
*.swp
*.swo
*~
# Secrets (never commit these even by accident)
*.env
.env.*
acme.json
secrets.yml
credentials.yml
# Logs
*.log
# Temp
/tmp/
*.tmp
*.bak

100
CLAUDE.md
View file

@ -2,60 +2,110 @@
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Commands
## ⚠️ ЧИТАЙ СНАЧАЛА
Перед любой работой прочитай эти файлы:
- **`docs/STATUS.md`** — текущее состояние всех сервисов, известные проблемы
- **`docs/BACKLOG.md`** — что нужно сделать (приоритеты), что уже сделано
- **`docs/DECISIONS.md`** — почему всё устроено именно так
После завершения работы **обнови** соответствующий документ.
---
## Правила работы
1. **Только через CI/CD** — никогда не фикси что-либо вручную на сервере. Внеси изменение, закоммить, запуши → CI/CD сам задеплоит. Потом проверь результат.
2. **Syncthing удалён** — не предлагай его вернуть, не упоминай как отсутствующий сервис.
3. **Секреты** — все в `inventory/group_vars/all/vault.yml` с префиксом `vault_`. В `main.yml` только алиасы `"{{ vault_* }}"`. Никаких plaintext секретов.
4. **Синтаксис-чек перед коммитом**`ansible-playbook playbooks/deploy.yml --syntax-check`.
---
## Команды
```bash
# Prerequisites (once, on operator machine)
# Prerequisites (один раз, на машине оператора)
ansible-galaxy collection install community.general community.docker ansible.posix
echo "yourpassword" > ~/.vault-password-file && chmod 600 ~/.vault-password-file
# First-time server setup (run as root)
# Первичная настройка сервера (от root)
ansible-playbook playbooks/bootstrap.yml -u root
# Idempotent deploy (all subsequent runs)
# Деплой основного сервера
ansible-playbook playbooks/deploy.yml
# Edit secrets
ansible-vault edit inventory/group_vars/all.vault.yml
# Деплой tools-сервера
ansible-playbook playbooks/tools.yml
# Check syntax without connecting
# Деплой всего сразу
ansible-playbook playbooks/site.yml
# Редактировать секреты
ansible-vault edit inventory/group_vars/all/vault.yml
# Проверка синтаксиса (без подключения к серверу)
ansible-playbook playbooks/deploy.yml --syntax-check
ansible-playbook playbooks/tools.yml --syntax-check
# Dry run
ansible-playbook playbooks/deploy.yml --check
# Run only specific role
# Только конкретная роль
ansible-playbook playbooks/deploy.yml --tags base
ansible-playbook playbooks/deploy.yml --tags docker
ansible-playbook playbooks/deploy.yml --tags services
ansible-playbook playbooks/deploy.yml --tags backup
```
## Architecture
---
**Traffic flow:** Internet → Traefik (ports 80/443, TLS via Let's Encrypt ACME) → services. Ports 80 and 443 are open on the server.
## Архитектура
**Secrets:** All secrets live in `inventory/group_vars/all.vault.yml` (Ansible Vault, AES-256). The file `all.yml` references them via `"{{ vault_* }}"` aliases. The vault password must exist at `~/.vault-password-file` on the operator machine — this path is in `.gitignore` and never committed.
**Серверы:**
- `main` (87.249.49.32) — Traefik, Forgejo, Plane, Vaultwarden, Мониторинг, CI/CD runner
- `tools` (85.193.83.9) — Outline wiki, n8n, docker-mailserver, SnappyMail
**Roles:**
- `base` — OS hardening: UFW (allow SSH + 80 + 443), fail2ban, sshd config, deploy user
- `docker` — Docker CE + Compose plugin via official apt repo
- `services` — renders Jinja2 templates → `/opt/services/`, then runs `docker compose up`
**Трафик:** Internet → Cloudflare proxy → Traefik (80/443) → сервисы.
Порты 80/443 открыты только для IP-адресов Cloudflare (UFW whitelist).
**Templates → server files:**
**Секреты:** `inventory/group_vars/all/vault.yml` (Ansible Vault AES-256).
Пароль vault: `~/.vault-password-file``.gitignore`, никогда не коммитить).
**TLS:** Wildcard сертификат `*.csrx.ru` через Cloudflare DNS-01 (Traefik certresolver).
**Роли:**
- `base` — UFW, fail2ban, sshd, deploy user
- `docker` — Docker CE + Compose plugin
- `services` — основной стек (templates → `/opt/services/`, docker compose up)
- `tools` — tools-стек (templates → `/opt/tools/`, docker compose up)
- `backup` — hourly backup script → S3 cold (`visual-backup/data/`)
**Шаблоны → файлы на сервере:**
- `roles/services/templates/docker-compose.yml.j2``/opt/services/docker-compose.yml`
- `roles/services/templates/env.j2``/opt/services/.env` (mode 0600)
- `roles/services/templates/traefik/traefik.yml.j2``/opt/services/traefik/traefik.yml`
- `acme.json` created at `/opt/services/traefik/acme.json` (mode 0600, mounted into Traefik)
- `roles/services/templates/traefik/dynamic/routes.yml.j2` → `/opt/services/traefik/dynamic/routes.yml`
**Docker networks:**
- `backend` (internal) — traefik ↔ user-facing services
- `forgejo-db` (internal) — forgejo ↔ its postgres
- `plane-internal` (internal) — all plane components (api, worker, beat, db, redis, minio)
**Добавление нового сервиса на main:**
1. Добавить контейнер в `docker-compose.yml.j2` в сеть `backend`
2. Добавить роутер в `routes.yml.j2` (НЕ docker labels — используется file provider)
3. Добавить домен в `inventory/group_vars/all/main.yml`
4. Добавить DNS A-запись в Cloudflare
**Adding a new service:** add container to `docker-compose.yml.j2` on the `backend` network with `traefik.enable=true` and `traefik.http.routers.X.tls.certresolver=letsencrypt` labels, add its domain variable to `all.yml`.
**Добавление сервиса на tools:**
1. Добавить контейнер в `roles/tools/templates/docker-compose.yml.j2`
2. Добавить роутер в `routes.yml.j2` с `url: "http://{{ ip_tools }}:PORT"`
3. Открыть порт в UFW (задача в `roles/tools/tasks/main.yml`)
## Deployment
---
DNS: add A-records for each subdomain → server IP (or wildcard `*` → IP).
## CI/CD
Fill `all.vault.yml` → set `domain_base` in `all.yml` → run bootstrap + deploy. Traefik obtains TLS certificates automatically on first request to each domain.
Push в `master` → Forgejo Actions запускает:
```
ansible-playbook playbooks/deploy.yml
ansible-playbook playbooks/tools.yml
```
Workflow: `.forgejo/workflows/deploy.yml`

94
docs/BACKLOG.md Normal file
View file

@ -0,0 +1,94 @@
# Бэклог задач
> Задачи по приоритету. Обновляй этот файл при добавлении/завершении задач.
> Последнее обновление: 2026-03-22
---
## 🔴 Критично (сделать как можно скорее)
- [ ] **Добавить DNS-запись `dash.csrx.ru`** в Cloudflare
A `dash``87.249.49.32` (proxied). Grafana сейчас недоступна по домену.
- [ ] **Бэкап tools-сервера**
Добавить в `roles/backup/` или создать отдельный скрипт для tools-сервера:
- outline-db (PostgreSQL dump)
- n8n_data (Docker volume)
- mailserver/config (DKIM ключи, аккаунты)
- snappymail/data
- [ ] **plane-minio не бэкапится**
Вложения и файлы из Plane не входят в текущий бэкап. Нужен dump MinIO bucket `uploads`.
---
## 🟡 Высокий приоритет
- [ ] **Мониторинг tools-сервера**
Добавить node-exporter на tools-сервер и scrape-конфиг в Prometheus.
- [ ] **mem_limit для plane-worker и plane-beat**
Сейчас без ограничений памяти, риск OOM. Добавить `mem_limit: 256m`.
- [ ] **Проверить работу swap**
`roles/base/tasks/swap.yml` должен создавать 2GB swap. Проверить что он реально создан на сервере.
- [ ] **Верификация бэкапов**
Добавить еженедельную проверку: скачать последний бэкап из S3, сделать test restore в Docker.
---
## 🟢 Обычный приоритет
- [ ] **Алерты на сбой бэкапа**
Если `backup-services` завершился с ошибкой — отправить алерт в Telegram.
- [ ] **Алерты на истечение TLS-сертификатов**
Добавить Prometheus правило: предупреждение за 7 дней до истечения сертификата.
- [ ] **Prometheus → tools-сервер**
Настроить federated scraping или remote_write для получения метрик tools-сервера.
- [ ] **Бакет S3 `visual-backup`**
Убедиться что бакет создан в Timeweb как "холодное хранилище" (тип: COLD).
---
## 📋 Бэклог (без срока)
- [ ] **Обновление образов**
Регулярно проверять новые версии (образы запинены в `defaults/main.yml`):
- Forgejo (сейчас `:9`)
- Traefik (сейчас `v3.3`)
- Plane (сейчас `:stable`)
- Authelia (сейчас `4.38`)
- [ ] **Автоматическое обновление Cloudflare IP-списков**
UFW разрешает только Cloudflare IPs. Список захардкожен — нужен cron для обновления.
- [ ] **Логи mail-сервера в Loki**
Добавить promtail pipeline для сбора логов mailserver с tools-сервера.
- [ ] **Двухфакторная аутентификация для n8n**
n8n сейчас доступен только с rate-limit middleware, без 2FA через Authelia.
---
## ✅ Сделано
- [x] Traefik с wildcard TLS через Cloudflare DNS-01
- [x] Vaultwarden (менеджер паролей)
- [x] Forgejo + CI/CD через Forgejo Actions
- [x] Plane (управление проектами)
- [x] Outline wiki с email magic link авторизацией
- [x] n8n автоматизация
- [x] docker-mailserver (Postfix + Dovecot), аккаунты: noreply, admin, jack
- [x] SnappyMail вебмейл на webmail.csrx.ru
- [x] DKIM/SPF/DMARC DNS-записи для почты
- [x] Мониторинг (Prometheus + Grafana + Loki + AlertManager)
- [x] CrowdSec IDS + fail2ban
- [x] Authelia 2FA SSO
- [x] Uptime Kuma статус-страница
- [x] Бэкап каждый час → S3 cold `data/`, 7 дней хранения
- [x] Удаление Syncthing (домен, firewall правила, образ, переменные)
- [x] cloudflare_zone_id перенесён из main.yml в vault

106
docs/DECISIONS.md Normal file
View file

@ -0,0 +1,106 @@
# Журнал архитектурных решений
> Фиксируй здесь: что решили, почему, какие альтернативы отвергли.
> Формат: дата | решение | причина | альтернативы
---
## Инфраструктура
### Два сервера (main + tools)
**Дата:** начало проекта
**Решение:** Разделить сервисы на два VPS: main для ядра, tools для вспомогательных.
**Причина:** main (1 vCPU / 2 GB RAM) перегружен — Plane + Forgejo + мониторинг занимают почти всю память. tools позволяет разгрузить.
**Итог:** Outline, n8n, mail работают на tools. Traefik на main проксирует к tools через IP:PORT.
### Traefik вместо nginx/caddy
**Дата:** начало проекта
**Решение:** Traefik v3 как единственный точка входа.
**Причина:** Автоматический TLS через Let's Encrypt, file provider для маршрутов, удобная интеграция с Docker.
**Альтернативы:** nginx + certbot (ручной renewal), Caddy (проще но меньше гибкости).
### Cloudflare proxy + UFW whitelist
**Дата:** начало проекта
**Решение:** Порты 80/443 открыты только для IP Cloudflare.
**Причина:** Скрывает реальный IP сервера, защита от DDoS на уровне Cloudflare, бесплатный WAF.
**Важно:** Некоторые сервисы (wiki, vault, webmail) должны быть DNS-only (оранжевое облако off) — когда Cloudflare не поддерживает нужные порты или протоколы.
### Wildcard TLS через DNS-01
**Дата:** начало проекта
**Решение:** Один сертификат `*.csrx.ru` вместо отдельных на каждый поддомен.
**Причина:** Новый сервис — ноль ожидания сертификата. Cloudflare DNS-01 работает без HTTP-challenge.
**Конфиг:** `roles/services/templates/traefik/traefik.yml.j2` — certresolver `letsencrypt`.
---
## Безопасность
### Authelia для 2FA
**Дата:** начало проекта
**Решение:** Authelia + TOTP защищает admin-панели (Traefik dashboard, Plane god-mode).
**Причина:** Одна точка SSO, не нужно настраивать auth в каждом сервисе.
**Альтернативы:** Keycloak (тяжелее, требует больше ресурсов), Authentik (сложнее).
### CrowdSec community edition
**Дата:** начало проекта
**Решение:** CrowdSec без платного API ключа.
**Причина:** Бесплатная tier достаточна. Анализирует логи Traefik + auth.log.
**Ограничение:** Нет расширенных threat feeds — только community reputation.
### Syncthing — удалён
**Дата:** 2026-03
**Решение:** Удалить Syncthing полностью из инфраструктуры.
**Причина:** Не используется. Открытые порты (22000, 21027) без сервиса — лишняя attack surface.
**Что убрали:** UFW rules, docker image, domain_sync, переменную vault, Authelia правило.
---
## Сервисы
### Outline wiki — email magic link
**Дата:** 2026-02
**Решение:** Авторизация через email magic link (SMTP → docker-mailserver).
**Причина:** Outline не поддерживает простую login/password аутентификацию без SSO.
**Проблемы решённые:**
- `guestSignin=true` в БД обязателен для email auth
- `jwtSecret` в БД хранится в зашифрованном виде — при смене `SECRET_KEY` нужно пересоздать
### docker-mailserver вместо внешнего SMTP
**Дата:** 2026-03
**Решение:** Self-hosted Postfix + Dovecot на tools-сервере.
**Причина:** Полный контроль, аккаунты @csrx.ru для приёма и отправки, нет зависимости от внешних SMTP.
**Конфиг:** SSL_TYPE=letsencrypt через certbot с Cloudflare DNS-01. DKIM через opendkim.
**Альтернативы:** Mailgun/SendGrid (только отправка, без приёма), Maddy (менее зрелый).
### Бэкап в Timeweb S3 cold
**Дата:** 2026-03
**Решение:** Hourly backup → S3 cold storage `visual-backup/data/`, 7 дней хранения.
**Причина:** Дешевле горячего хранилища, бэкапы не нужны быстро — приемлемая задержка восстановления.
**Команда:** `aws s3 cp ... --storage-class COLD`
### SnappyMail вместо Roundcube
**Дата:** 2026-03
**Решение:** djmaze/snappymail как веб-клиент почты.
**Причина:** Лёгкий, современный UI, простой Docker образ.
**Альтернативы:** Roundcube (тяжелее, требует MySQL), Rainloop (заброшен).
---
## CI/CD
### Forgejo Actions
**Дата:** начало проекта
**Решение:** Forgejo Actions + act_runner для CI/CD деплоя.
**Причина:** Self-hosted, интегрировано с Forgejo, совместимо с GitHub Actions синтаксисом.
**Принцип:** Push в master → `ansible-playbook deploy.yml` + `tools.yml`. Никаких ручных правок на сервере.
---
## Известные компромиссы
| Компромисс | Почему так | Что улучшить |
|-----------|-----------|-------------|
| act_runner монтирует `/var/run/docker.sock` | Нужен для запуска job-контейнеров | Rootless Docker или ограниченный API |
| Plane использует `:stable` тег | Plane не публикует версионные теги | Мониторить GitHub releases |
| Мониторинг на main (не на отдельном сервере) | mon-сервер пока не задеплоен | Создать `playbooks/mon.yml` |
| Нет бэкапа tools-сервера | Бэкап роль подключена только к main | Добавить в `tools.yml` |

99
docs/STATUS.md Normal file
View file

@ -0,0 +1,99 @@
# Статус инфраструктуры
> Обновляй этот файл при каждом значимом изменении.
> Последнее обновление: 2026-03-22
---
## Серверы
| Сервер | IP | Роль | Состояние |
|--------|----|------|-----------|
| **main** | 87.249.49.32 | Основные сервисы + мониторинг | ✅ Работает |
| **tools** | 85.193.83.9 | Wiki + автоматизация + почта | ✅ Работает |
---
## Сервисы
### Основной сервер (main, 87.249.49.32)
| Сервис | Домен | Статус | Заметки |
|--------|-------|--------|---------|
| Traefik | — | ✅ | Реверс-прокси, TLS wildcard `*.csrx.ru` через Cloudflare DNS-01 |
| Vaultwarden | vault.csrx.ru | ✅ | Менеджер паролей |
| Forgejo | git.csrx.ru | ✅ | Git-сервер, SSH на порту 2222 |
| Forgejo Actions | — | ✅ | CI/CD runner, деплой через push в master |
| Plane | plane.csrx.ru | ✅ | Управление проектами |
| Grafana | dash.csrx.ru | ✅ | Дашборды мониторинга (нет DNS-записи — нужно добавить A→87.249.49.32) |
| Prometheus | — | ✅ | Сбор метрик, 30 дней хранения |
| Loki + Promtail | — | ✅ | Сбор логов |
| AlertManager | — | ✅ | Алерты в Telegram |
| CrowdSec | — | ✅ | IDS, банит злоумышленников |
| Authelia | auth.csrx.ru | ✅ | 2FA SSO, защищает traefik dashboard и plane/god-mode |
| Uptime Kuma | status.csrx.ru | ✅ | Публичная страница статуса |
| Бэкап | — | ✅ | Каждый час → S3 cold `visual-backup/data/` |
### Tools-сервер (tools, 85.193.83.9)
| Сервис | Домен | Статус | Заметки |
|--------|-------|--------|---------|
| Outline | wiki.csrx.ru | ✅ | Wiki, аутентификация через email magic link |
| n8n | n8n.csrx.ru | ✅ | Автоматизация workflow |
| docker-mailserver | mail.csrx.ru | ✅ | Postfix + Dovecot, порты 25/465/587/993 |
| SnappyMail | webmail.csrx.ru | ✅ | Веб-клиент почты |
### Почта (@csrx.ru)
| Аккаунт | Назначение |
|---------|-----------|
| noreply@csrx.ru | Системные письма (Outline magic link) |
| admin@csrx.ru | Администратор |
| jack@csrx.ru | Личный |
**DNS-записи для почты:**
- A `mail.csrx.ru` → 85.193.83.9
- MX `csrx.ru``mail.csrx.ru` (priority 10)
- TXT `csrx.ru``v=spf1 mx ~all`
- TXT `_dmarc.csrx.ru``v=DMARC1; p=quarantine; rua=mailto:admin@csrx.ru`
- TXT `mail._domainkey.csrx.ru` → DKIM-ключ (генерируется автоматически при первом деплое)
---
## CI/CD
- Репозиторий: `git.csrx.ru/jack/infra`
- Триггер: push в `master` запускает `ansible-playbook playbooks/deploy.yml` + `playbooks/tools.yml`
- Runner: `act_runner` на основном сервере
- **Правило**: все изменения только через git, никаких ручных правок на сервере
---
## Известные проблемы
| Проблема | Статус |
|----------|--------|
| Нет DNS-записи для `dash.csrx.ru` | ⚠️ Нужно добавить в Cloudflare вручную: A `dash` → 87.249.49.32 |
| Tools-сервер не бэкапится | ⚠️ outline-db и n8n не входят в скрипт бэкапа |
| Tools-сервер вне мониторинга | ⚠️ Prometheus не скрейпит tools-сервер |
---
## Сети Docker
### Основной сервер
- `proxy` — публичная, только для Traefik (нужна для ACME)
- `backend` — internal, Traefik ↔ сервисы
- `forgejo-db` — internal, Forgejo ↔ PostgreSQL
- `forgejo-ssh` — публичная, для SSH-клиентов
- `plane-internal` — internal, все компоненты Plane
- `runner-jobs` — публичная, для job-контейнеров CI/CD
- `monitoring` — internal, стек мониторинга
- `authelia-internal` — internal, Authelia ↔ Redis
### Tools-сервер
- `front` — публичная, для port binding хоста
- `outline-internal` — internal, Outline ↔ DB ↔ Redis
- `n8n-internal` — internal, n8n изоляция
- `mail-internal` — internal, Outline → mailserver (SMTP без auth)
- `webmail-internal` — internal, SnappyMail изоляция

View file

@ -6,7 +6,6 @@ domain_base: "csrx.ru"
domain_vault: "vault.{{ domain_base }}"
domain_git: "git.{{ domain_base }}"
domain_plane: "plane.{{ domain_base }}"
domain_sync: "sync.{{ domain_base }}"
domain_traefik: "traefik.{{ domain_base }}"
domain_dashboard: "dash.{{ domain_base }}"
domain_auth: "auth.{{ domain_base }}"
@ -14,7 +13,6 @@ domain_status: "status.{{ domain_base }}"
domain_wiki: "wiki.{{ domain_base }}"
domain_n8n: "n8n.{{ domain_base }}"
domain_webmail: "webmail.{{ domain_base }}"
domain_mon: "mon.{{ domain_base }}"
# Service paths
services_root: /opt/services
@ -29,7 +27,6 @@ plane_db_password: "{{ vault_plane_db_password }}"
plane_secret_key: "{{ vault_plane_secret_key }}"
plane_minio_password: "{{ vault_plane_minio_password }}"
traefik_dashboard_htpasswd: "{{ vault_traefik_dashboard_htpasswd }}"
syncthing_basic_auth_htpasswd: "{{ vault_syncthing_basic_auth_htpasswd }}"
forgejo_runner_token: "{{ vault_forgejo_runner_token }}"
grafana_admin_password: "{{ vault_grafana_admin_password }}"
alertmanager_telegram_token: "{{ vault_alertmanager_telegram_token }}"
@ -42,7 +39,7 @@ crowdsec_bouncer_key: "{{ vault_crowdsec_bouncer_key }}"
s3_access_key: "{{ vault_s3_access_key }}"
s3_secret_key: "{{ vault_s3_secret_key }}"
cloudflare_dns_api_token: "{{ vault_cloudflare_dns_api_token }}"
cloudflare_zone_id: "0935215d596a24a10866a81409ed8332"
cloudflare_zone_id: "{{ vault_cloudflare_zone_id }}"
outline_secret_key: "{{ vault_outline_secret_key }}"
outline_utils_secret: "{{ vault_outline_utils_secret }}"
outline_db_password: "{{ vault_outline_db_password }}"
@ -52,10 +49,10 @@ mailserver_noreply_password: "{{ vault_mailserver_noreply_password }}"
snappymail_admin_password: "{{ vault_snappymail_admin_password }}"
mailserver_admin_password: "{{ vault_mailserver_admin_password }}"
mailserver_jack_password: "{{ vault_mailserver_jack_password }}"
# Server IPs (used for cross-server Traefik routing)
ip_main: "87.249.49.32"
ip_tools: "85.193.83.9"
ip_mon: "188.225.79.34"
# CI/CD deploy key (public key — not a secret)
ci_deploy_pubkey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHdr9mRSSUqt7Ym4wA5RpVyz76wEXSOtVfh2/yCSMIbg ci-deploy@forgejo-runner"

View file

@ -1,119 +1,122 @@
$ANSIBLE_VAULT;1.1;AES256
30623734613733353435313365666533643366646439316363646561363135393030346536643133
6265366262313032653361653330303038353738316135350a353735313436613034393962326233
34373638656233386161373333656338386332306332616464316632653533343635666239363033
3663653663316331610a326231316561333637356163343238616363383439613333333635633039
30376463343366373431383162656139393362363763353438636662396439623836316561313663
61363665623839656662663435306435656137666632353866393431636532656234653838343562
62646634343430363939323632386332303465616361636438396231383130653531653839626364
34663836656237613134366436323566383133613664356164633631343436336339346330636234
66616536363163633365336438326464363839343033643063306430396366303564306332346338
65396163343561626466303634626137323139666531393463346338646462393535356433643262
32343265626339346631376662313432356535396539616361393233626365653431343134663539
36313138653534323634313133353136663539653435313733636230396166343762306435633166
33303130363161306538636331356266353036373139373163336265333037656433653464356262
35646432646539333136643565323038303565643436363231386264373537613865636232393930
38636261373364613962323431363037623636373932376439633136376437326432626562333135
61373831626134353638666338396532626262343263653737616565366630323664636664366634
61633064386463633631393263626166383335333463613563343031633363363735333839633562
38386330383035393463313832323761613831666333383831316530663564373234393964643333
32613938313365656331353537643038313138663461333639373062336531613465366431306430
35386262393331396564646334643135623561396562666465666432396466636431343132313733
38333236623163643536653233643839373238383061623339343935393139386164663736633137
65386331303339656631376238333361666532346266316362353636653235646361663731393933
66393133613337623965333763336230386232363434326438383462393933336133616333353863
34636634393738373963353034616464656338633232303266353065636130636232396235376432
62333530626331646638373339663831333866613463646332386630656535393836656163643763
37303231643665323234383834393634343637383661636262653339636562616139343238653361
39393430663436653433636434336561663632353539383437346531633836366237626331653966
37306638333737653131303133343231373561323432386162326537353232613236396338303731
33373635646131393832386435343463356331356537366437356666633136653164386133316462
38636566636539666332393334613064323739353234393364663836343661636330336162363633
63336135613536653662333839613736373833303464326637623561633561313561303731636437
33626562626132323339363565306436656438383564333033633533363635663339363635393763
61643231323065346533333538316161343563653062396165313463383633646366666563376539
65333634623238326536393964303365383438666530326438353863616664366438373861666662
64396635663631383339313939643032353336373834646566306337666239313761663938313337
64633834386138356462343664323833333734666634343730356461383833656430336233636439
36393030373438656161656362323764663432383139383661303630633461393135633861663664
37393933613834303563303937633364646434643233656462333438623337363062663938653331
34373035393263393730353332383836333438653566333561623362303962613337386537366662
36393963353966303232323038386131303937383932663331313134323632613732313165363765
64366666666538626261326132666365336634323661323436633336383032383662633565663437
39373235393230626236346466363436616333363334636330356531393736623266636665396235
30386265373031646638393032353233353936626637303436366633643164613064373436633463
33386566363337663332323235633139326263633131323362633637383838613830313439373633
33346532626163633333623539653438623866363262623932386631336336666138303764643232
30396261383336306330656635626136383061376138666339383030653165336434383939313731
63613463616166303761326537613835353063393762653365373939623639653531663638646264
61643633656531346438376439636262646137643365333136353231333065393231633761373835
38383638373439393334366665616532303730646266383331306463633132613563306330313731
66303330623231653430333334346463313134373965366463366266636333343461356337366161
37353733616562393262353935336666376530323464313635626336386238626564383561336536
62356135316437643462326461383032613633623038636638393861396639373165396633613465
64646631616437656631393030343637613035343734623633333964626334313763636536623762
30393733636632363031613263653732383066663539396230386261653864356132333164666238
38313531316532323934656239663634383938313763373038623062323765363431383635636666
31343236333461663135313639643433663061396531313262626637343130613534646438616436
64346163616439336239363862616139353635333036646530376137616333376130353962373732
37356336326136326536376265383839633063626137313137313736343961346239646339303337
39313730613434363764636561656435623961646536623334326561383230383037383364653739
30313065393734623039663138663664653465393532386361346130366532623233343833303062
37633164316136633535663665363731623638633462346434363930383661656561646531326464
31653830393837353737626431303562386465353036653934353831613333373932663163653235
63656466376565643431643463623139343664383763336464393431366463356163633734653435
32303463363335633739313535383761666131663432313963633834663231386365623736356430
61666638633137333231316431356466623738643339383262323939636334303865633739623661
35376666353934633963623961323137613264373166363339653830383538633565363239626133
64393533323835346665613933643638346233326330663761616130303631663238313730353661
36323931333062663466333431333338303337656562373036616565663338643234643536383161
37363739303162643561646237646134316538633465303936646231636235373163306534633963
34393130666232383865326162303935663638616136333465646230663131373930363339353233
37656636366339616333333730313837303137386539333162386238326337656433353236303935
65623233626561333962333362356430336131303936643462633938393661623466363830393366
32343264396537636663313834373664383137646438326434636366376536626332333036373134
38353432383765326162663632383662363361643362656562333537633932653963646634383139
36306634373632356566383232386566396163656664333431383032303236346362393033363264
34653139366663356530356265346466643138303030363536653339303664613661383735373330
37373363663863376139313835643434643966656366626139386433303764646663623261663461
31386531616663653739656334616663353861646439636665383837363161656535323932396239
38663163396661626161346539356561636666626238303936303932303638616666616430613039
32326139383138666237623961626633353337643431313966653038373933393132363563613834
62393839326661366533626535356261353033333933376532386234626364366566333736613063
61336638363938303830353937353161303037303861356664643235653561343864376366393561
31313562643936613631303365653031616131336161663037376438666233373830303265643534
32373936396238366333343763376633303639626237313438323237353635396366343963346539
30623566636561303632643334333937343732626430616562356133356338393561663061633966
31373033316564373864623438323165383435623430343032663033313334393239353732373935
33646664643337643335613438396632333638663864363034663639343137643565303863383464
32383365396465376130613063626664343962343035363239636638373361653730656437323432
39326131306538396338353461653938336235343937343866313863376337313761363633626161
62316437333631616564653835336435303663626136383761663330366637323062643338313234
65633730343739323636333332383730626537633966613965663032626130663562663134306239
38313861626231313836356662623033633066626137643033323065383938616166633232623733
63343632653131623366393066623162626234643131663163366564333165326165653039613963
62373565323661356261643563353561343037323531373562626561656232373933393537333333
31343034653464653263306264313038316266363834353365636664316164636631353266613362
36363738633034386462653431363261323631666132643333656265643334663861326632373232
62633337316263336231326534663462623332653236353938623239633862636236383538313732
32613837653066663936313164326634356265613063623466316161336439663633306166616263
66353061353863663339396632383262366562643366633233363036653738376461616233376266
64306163626361616365326561336465303664663031363134313433623834396266653034303964
33336536316166653731313363396462613566313434326566346535386237343262316662376130
33383763643934623839326639353663316635306134356163383635313566643162633365613231
64356533313061666565376165303739353531666336633761393064376531383064393934323638
33623533653931636138373335373561313638656338613935333366643834646130373137663262
36353436363532346364333134346339653539343662316632336163616238336635326133323735
65643063303139616166313362323932343037643862656133663163616131613533653263613363
39373664363164643865656165643936616432396334396561646362666333633962353432636635
36643138613738643134343635353334306564393836636537303334383764666533646466626231
32623866333461613535336132323964623266636635323363333065343532613862383430366562
30613734316630623939366461316262343766383138633461363437383563616233616661373066
63396462306266306638303463376431653561363563633463333763343434646639613539383736
35363465323862333930306636376565623333323064333464393932653665343136363036646461
65633963343732613237393066356634666238633233613264623936616434353934626664623630
37666262343231313764333262616237623337663764323737336431326438386339386235313934
36626330643931303534343433333231373230343363356337613663336561373034333834393031
30363233303862633663356561303763626164356165623961363339326664633566653966323434
61383833343465646361303035383465666131393933663164343935363639623435363334303339
3736373365623164383034663836653165356564353563656265
38623734633034386664333334383830336637343861383134323961363536333136346436363838
3836343032363036633735316362646165623030613161320a663961653037633132376166303635
30653738383130393738383931323535633631303434343233663463346635376561313662336664
6434633432643536330a336635616262306632616332616361313738383239316135393735643063
39336634306164363632373066313866366462653536313537396539363235626339303334353031
65663866626361383663343834333466376339383463366235343166323361366131643534383665
64663038316634376161633161366663376232636535356239333733303933396561373235363863
35366335313066343835663362313434363438313137643766323835393531306536346163313933
31343930316637623830623666633164343765663434396365366134306439336164333466316133
33346364613731623633346136313033333461623762313930323565313633346633396330646565
33386264663561666330356662366430383532316639373536356166383365343035623564623832
37353565303732316665363862363266343836393839663836666434333237326530613936376231
33613439633265626166383162646530653339313530353136643338666633393036663665663539
30333932343464636231323231353235623264316536386233353563623235373932316236356563
65653533383064646130366236303064396662623664326662353737623437653730363463646139
32333861663339343361383234383332623737626233323666343730626663363738333932643334
64353365643334323735623937396664393561333434663139363739613532386265656366316136
33303232663939353566376163366131393066646233333035396135653861643566633032656264
65353338373661663466613263343866643664353063656333346363373065303263373863326163
31386565396364353634636231306166393862326364373463393930373036373531323830346163
34333262333734356436313032356337356336343138643463343635643234653639346337336138
30333764333466356230626462353463316636636330383333646530623039316330313336656266
38366338346562613864663961633439656234313662663661303665303466393863623164346464
36333136303430313034653365343437343166643263356635636433613361663462396233336163
64316530633063666465396331393030313666333265626634313635613335383037363366353638
36366132356661316362643533336366326437326561393464366533656134633366643433653061
38343839643935376430323563373733623334323562653666356333613130336537643864393737
33353839313438306164666238313131353166316632623633326261393961613333336331643831
33356636626161613263366261653262633661613766323835366562333062343462623439663462
64306238386264626364303963376164626531356436353731383965306365386431356166336238
61323235373033323433306161663832366330646339303235386133323630363064383930336233
30636338656439376138363238323965653734336538363761633033626464313535653262363638
39663763623637636635396430623539666162373439643832303766323061383133343865366466
61653133343061366334343933623330313764666639313931636662383161613432366239613238
30373034343864383630316233616434646131643337303132313362323935313333323534343032
32666633616237353161363265376232346663343937393965343665396338613932363864303366
33613062383531666437306436636364636535323631626163636437396165313663366432343938
36306332353739636439343130353464646432313761326231643962616166366536656139643963
36623134663364376237323639643930393664313866393338316135306666653733663930333266
33396662396339623839643936626465666665396137623731333265363931343137643237623435
39623132613435346231373632333135303666336533303363393530306533666566633565326466
35356362646335323861343634386531633035393730646463623337333435663365616163333863
37666132356463613064326438316132613564383234363134313739356134323236633636633237
39343236663039383230336463316663363564383638343736613665343238613736646234663366
35613364643164626364643034323766666266313561386539336437646337353730343363383434
61346361613637656336346131363830366539653264376330356661363464316139303963663833
63613632623934313366333965356630646237376636383138393731363564356131333838336538
36666362336239633665613734323536393630653433643337666166306230623161666366356336
32326161313432646465393365396265363634633633343065623762653438353139313839396163
30633764656636303965616434373235643231633336626133356363386333623339373234646664
66663066333063303465336338623165666164303531303332663964366461643931303863643061
30336461643662393036356536663335643536613335323664326234623834383932653263633733
36303864316361643766353439366230363532616562333062653632623737313931343064366433
36626634323135333764343339313634323734613765343264386632373733326430363137303030
66356637353930353539303062386564346166343237633239653037333561306365316635356131
38613331383131303233646331623035626661313233346561383938323164356536306332623136
38333765323836366535396464616332313665663166663161653330613764306630643665643739
31663866653666333130316136393861666236343935396133636538323938376330346339366162
62663137326339376136343230396462333966396235383331313566386664396137303663353437
35363139666263666232346661643766656362343339396539346631393330346236633163393633
36396165646231343364333662633639353437303634343065656461386563373531343234356131
63653865623039626130633731306439613435353265306262386564373765306539623939666361
38383131323061613362386438633866653131666261333838363134336138613462303939373062
34396532316535666331336330306463643662346339646565303532653364383730383239616237
62333832643038613837316538303931303537326663616564343531326461363536663033303133
31353238656537396234636133616666333364383730653733396631373038313966663631356238
33363636616336636166306234393538633133343535303166343766623136356162333163616135
64386635656438643132623430616435353636313739373634653530386461643136333533396633
34633561333963653036623632326131323664323938343735666138623534303136333165313763
34633565383935643738666335633633353534386166306631613536373830663733363063306138
34373637303438633330393037306665386131633964393137373963623438336232643439333261
35633831376533376333336235326234633231643036363430646364653330313461333534623065
31666131656366663962353230643839646661623165653530653533306563633166653839316633
35356138636134323333323961393961366231353736383463626132643031613165623630346334
32663464613230343839643166663538303734373263663061383031643538633634636632346531
39663464373439663264376162613464346666326137386163306132383763343337653062366162
33333431333133633438636633663133613138633732623833313264313766643131366634303234
65323831643661396330393439306437333438646130326462303964376632306139363661636336
36323738303436386431643332303862356634643464326130386662643833613835633335313635
33643365326138326638343539303437643933643733383930633236663839306636333332316132
65346531663265663439616332663964363639353061666531616164613139303265323137343062
36653332326338633661323463303637393338613534343835323638376231656334333530323034
34663036383261303463353232313431383837313162313061363265343431396337633731343365
64333661333637343564343432353031303538303165383566656537383863643564333336646535
34376533383766363131363664646635386133636263613532383137376233373130303264653231
61326363313365396631346565306166366164653530636434346132666537653637363133313866
34643130346539353736353936656139616230646637396264333839626339653638623839323361
39303639373732616338383930663236333464386638646664306430656333366531623466353866
36306333643336373330333661376333663964363964633364633731363831333536393064313566
37313439386664623832656230376334643535343336663261363230323662306134663961323131
37373630343164323839656237343861363633323865363532666438373936386531313532623938
36326631373635323664353463396438643264613135626463653037303739633762636537653661
64336236383631353766623536383063336636333566643434333237363635656634643437383838
34653166646332336135303732373365636366343236393633326430326339646239656561336136
38626162626236346162373335643964333136386438636234333238306264373663643963613339
33333831353263393739653964313837636161373231663830383538363163393833623837633832
35303061336632373630653634393633623533313561326639343934306231363265316163313137
34633962613165616239333061613332613531326564613963346634356561626639643735623836
63636333356536373239623034613331666230626638373233663937353036633936313333666164
66343933373164653937326635356436306165363761393330353334633765333633383639303133
32646534633762303232383332373932653866663035323666363039386632643062346562373035
31353737383538313036656333623630363234356136343533333539356533623566336430373961
65323738393466633930623334386365656163313836316165656138313936303364623763666266
32383130346139623966303061303765363537303664383433633638643032333031326232633538
34636636643031366335623362323062356534356163326663656530663835636165366430616564
37343462663230653830613862373732636636346262353436323037656535343436356133663464
62316635353064646564626366396565326233376465343264356165323664623834373562323664
33333636373834346635386331383037623933643036653364383932373637383766393738353762
36356233383139366431363637376265383639323738643133653764663734666638363537303763
65356535323365326337626464316138386464373566383866356639613961353130356233306630
32306633393961336363346561376636346466613161643236353038313665626161383830313839
35336632646462366235656236303362326262373130623166303833666430653563623764323230
34616134386339373339386264626435666239363264356631653438323666613765626134353830
37363930353833336337633861623264653163616565393962323839613063363537653634666439
32663736333131663166303563376263353333303537346635383361306665653634653631626262
65663165313036393437343332353937633538363533363165396136383261363234386236393962
63333664656562623466366134373263366165623739326334386332653861353964343363386163
33656365363131313535316262366666393936303366636439623032636131343537333438336562
33336663373331643037306439363533643933313937346432636236633663393166386234333931
32393166306461323631626561383630363561643830646239656330643837326635663438353665
66363534356265386664376633363739373231663037643930653766373931333633

View file

@ -83,27 +83,6 @@
- "172.64.0.0/13"
- "131.0.72.0/22"
- name: Allow Syncthing sync TCP
community.general.ufw:
rule: allow
port: "22000"
proto: tcp
comment: "Syncthing sync"
- name: Allow Syncthing sync UDP
community.general.ufw:
rule: allow
port: "22000"
proto: udp
comment: "Syncthing sync"
- name: Allow Syncthing discovery UDP
community.general.ufw:
rule: allow
port: "21027"
proto: udp
comment: "Syncthing discovery"
- name: Set UFW default deny incoming
community.general.ufw:
direction: incoming

View file

@ -18,7 +18,6 @@ plane_redis_image: "redis:7-alpine"
# Последний стабильный тег на Docker Hub: RELEASE.2025-04-22T22-12-26Z
# Рекомендуется перейти на alpine/minio или собирать из исходников.
plane_minio_image: "minio/minio:RELEASE.2025-04-22T22-12-26Z" # https://hub.docker.com/r/minio/minio/tags
syncthing_image: "syncthing/syncthing:1.27" # https://hub.docker.com/r/syncthing/syncthing/tags
act_runner_image: "gitea/act_runner:0.3.0" # https://hub.docker.com/r/gitea/act_runner/tags
prometheus_image: "prom/prometheus:v3.4.0" # https://hub.docker.com/r/prom/prometheus/tags
node_exporter_image: "prom/node-exporter:v1.9.1" # https://hub.docker.com/r/prom/node-exporter/tags

View file

@ -22,8 +22,6 @@
- forgejo/db
- plane/pgdata
- plane/media
- syncthing/config
- syncthing/data
- act_runner
- prometheus
- grafana/provisioning/datasources

View file

@ -16,7 +16,6 @@
- "{{ plane_db_image }}"
- "{{ plane_redis_image }}"
- "{{ plane_minio_image }}"
- "{{ syncthing_image }}"
- "{{ act_runner_image }}"
- "{{ prometheus_image }}"
- "{{ node_exporter_image }}"

View file

@ -64,11 +64,6 @@ access_control:
policy: two_factor
subject: "group:admins"
# Syncthing — только admin, требует 2FA
- domain: "{{ domain_sync }}"
policy: two_factor
subject: "group:admins"
# Plane god-mode — только admin, требует 2FA
- domain: "{{ domain_plane }}"
resources:

View file

@ -8,7 +8,6 @@ DOMAIN_BASE={{ domain_base }}
DOMAIN_VAULT={{ domain_vault }}
DOMAIN_GIT={{ domain_git }}
DOMAIN_PLANE={{ domain_plane }}
DOMAIN_SYNC={{ domain_sync }}
DOMAIN_TRAEFIK={{ domain_traefik }}
FORGEJO_RUNNER_TOKEN={{ forgejo_runner_token }}
GRAFANA_ADMIN_PASSWORD={{ grafana_admin_password }}