diff --git a/AGENTS.md b/AGENTS.md index 3a5f898..dfdfc15 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,69 +1,135 @@ # AGENTS GUIDE -## Overview -Ansible-based server automation for personal services. Playbooks provision Dockerized apps (e.g., gitea, authelia, homepage, miniflux, wakapi, memos) via per-app users, Caddy proxy, and Yandex Docker Registry. Secrets are managed with Ansible Vault. +## Обзор -## Project Layout -- Playbooks: `playbook-*.yml` (per service), `playbook-all-*.yml` for grouped actions. -- Inventory: `production.yml` (ungrouped host `server`). -- Variables: `vars/*.yml` (app configs, images), secrets in `vars/secrets.yml` (vault-encrypted). -- Roles: custom roles under `roles/` (e.g., `eget`, `owner`, `secrets`) plus galaxy roles fetched to `galaxy.roles/`. -- Files/templates: service docker-compose and backup templates under `files/`, shared templates under `templates/`. -- Scripts: helper Python scripts in `scripts/` (SMTP utilities) and `files/backups/backup-all.py`. -- CI: `.gitea/workflows/lint.yml` runs yamllint and ansible-lint. -- Hooks: `lefthook.yml` references local hooks in `/home/av/projects/private/git-hooks` (gitleaks, vault check). -- Formatting: `.editorconfig` enforces LF, trailing newline, 4-space indent; YAML/Jinja use 2-space indent. +Ansible-проект для автоматизации личного сервера. Плейбуки разворачивают докеризированные приложения (gitea, authelia, miniflux, wakapi, memos, outline, gramps, calibre, wanderer, remembos, transcriber и др.) через выделенных системных пользователей, Caddy-прокси и Yandex Docker Registry. Секреты управляются через Ansible Vault. -## Setup -- Copy vault password sample: `cp ansible-vault-password-file.dist ansible-vault-password-file` (needed for ansible and CI). -- Install galaxy roles: `ansible-galaxy role install --role-file requirements.yml --force` (or `task install-roles`). -- Ensure `yq`, `task`, `ansible` installed per README requirements. +## Структура проекта -## Tasks (taskfile) -- `task install-roles` — install galaxy roles into `galaxy.roles/`. -- `task ssh` — SSH to target using inventory (`production.yml`). -- `task btop` — run `btop` on remote. -- `task encrypt|decrypt -- ` — ansible-vault helpers. -- Authelia helpers: - - `task authelia-cli -- ` — run authelia CLI in docker. - - `task authelia-validate-config` — render `files/authelia/configuration.template.yml` with secrets and validate via authelia docker image. - - `task authelia-gen-random-string LEN=64` — generate random string. - - `task authelia-gen-secret-and-hash LEN=72` — generate hashed secret. -- `task format-py-files` — run Black via docker (pyfound/black). +- `playbook-*.yml` — плейбуки по одному на сервис, `playbook-all-*.yml` для групповых запусков. +- `production.yml` — инвентарь с единственным хостом `server`. +- `vars/*.yml` — переменные приложений и образов, `vars/secrets.yml` — зашифрованные секреты (vault). +- `roles/` — кастомные роли (`eget`, `owner`, `secrets`), галактические роли в `galaxy.roles/`. +- `files//` — docker-compose шаблоны, конфиги, скрипты бэкапов для каждого сервиса. +- `templates/` — общие шаблоны (например `env.j2`). +- `scripts/` — вспомогательные Python-скрипты (SMTP-утилиты для Yandex Cloud Postbox). +- `.gitea/workflows/lint.yml` — CI: yamllint + ansible-lint. +- `lefthook.yml` — pre-commit хуки (ruff, mypy, yamllint, ansible-lint, gitleaks, проверка vault). +- `tasks.py` — задачи через invoke (`inv `). +- `pyproject.toml` — зависимости Python, управляются через `uv`. -## Ansible Usage -- Inventory: `production.yml` with `server` host. `ansible.cfg` points to `./ansible-vault-password-file` and `./galaxy.roles` for roles path. -- Typical deploy example (from README): `ansible-playbook -i production.yml --diff playbook-gitea.yml`. -- Per-app playbooks: `playbook-.yml`; grouped runs: `playbook-all-setup.yml`, `playbook-all-applications.yml`, `playbook-upgrade.yml`, etc. -- Secrets: encrypted `vars/secrets.yml`; additional `files//secrets.yml` used for templating (e.g., Authelia). Respect `.crushignore` ignoring vault files. -- Templates: many `docker-compose.template.yml` and `*.template.sh` files under `files/*` plus shared `templates/env.j2`. Use `vars/*.yml` to supply values. -- Custom roles: - - `roles/eget`: installs `eget` tool; see defaults/vars for version/source. - - `roles/owner`: manages user/group and env template. - - `roles/secrets`: manages vault-related items. +## Настройка окружения -## Linting & CI -- Local lint configs: `.yamllint.yml`, `.ansible-lint.yml` (excludes `.ansible/`, `.gitea/`, `galaxy.roles/`, `Taskfile.yml`). -- CI (.gitea/workflows/lint.yml) installs `yamllint` and `ansible-lint` and runs `yamllint .` then `ansible-lint .`; creates dummy vault file if missing. -- Pre-commit via lefthook (local hooks path): runs `gitleaks git --staged` and secret-file vault check script. +```bash +uv sync +cp ansible-vault-password-file.dist ansible-vault-password-file +uv run ansible-galaxy install --role-file requirements.yml +``` -## Coding/Templating Conventions -- Indentation: 2 spaces for YAML/Jinja (`.editorconfig`), 4 spaces default elsewhere. -- End-of-line: LF; ensure final newline. -- Template suffixes `.template.yml`, `.yml.j2`, `.template.sh` are rendered via Ansible `template` module. -- Avoid committing real secrets; `.crushignore` excludes `ansible-vault-password-file` and `*secrets.yml`. -- Service directories under `files/` hold docker-compose and backup templates; ensure per-app users and registry settings align with `vars/*.yml`. +Требуется: `uv`, `ansible`, `yq`. -## Testing/Validation -- YAML lint: `yamllint .` (CI default). -- Ansible lint: `ansible-lint .` (CI default). -- Authelia config validation: `task authelia-validate-config` (renders with secrets then validates via docker). -- Black formatting for Python helpers: `task format-py-files`. -- Python types validation with mypy: `mypy `. +## Задачи (invoke) -## Operational Notes -- Deployments rely on `production.yml` inventory and per-app playbooks; run with `--diff` for visibility. -- Yandex Docker Registry auth helper: `files/yandex-docker-registry-auth.sh`. -- Backups: templates and scripts under `files/backups/` per service; `backup-all.py` orchestrates. -- Home network/DNS reference in README (Yandex domains). -- Ensure `ansible-vault-password-file` present for vault operations and CI. +Таск-раннер — `invoke` (файл `tasks.py`), вызывается через `inv`: + +- `inv pl -- [app2 ...]` — запуск плейбука (`ansible-playbook -i production.yml --diff`). +- `inv install-roles` — установка галактических ролей. +- `inv ssh` — SSH на сервер. +- `inv zj` — zellij на удалённом сервере. +- `inv btop` — btop на удалённом сервере. +- `inv encrypt -- ` / `inv decrypt -- ` — шифрование/дешифрование через ansible-vault. +- `inv authelia-cli -- ` — запуск Authelia CLI в docker. +- `inv authelia-validate-config` — рендер и валидация конфига Authelia через docker. +- `inv authelia-gen-random-string LEN=10` — генерация случайной строки. +- `inv authelia-gen-secret-and-hash LEN=72` — генерация секрета и его хэша (pbkdf2-sha512). +- `inv format-py-files` — форматирование Python-файлов через Black (docker). + +## Плейбуки + +### Системные + +- `playbook-system.yml` — базовая настройка системы (apt-пакеты, безопасность, fail2ban, монтирование хранилища). +- `playbook-docker.yml` — установка Docker CE, создание сетей (web_proxy_network, monitoring_network), cron очистки образов. +- `playbook-eget.yml` — установка eget и инструментов через него (rclone, restic, resticprofile, btop, gobackup, task, dust, zellij). +- `playbook-ufw.yml` — настройка файрвола UFW (SSH/22, Gitea SSH/2222, HTTP/80, HTTPS/443). +- `playbook-upgrade.yml` — обновление системных пакетов, очистка Docker. +- `playbook-backups.yml` — настройка restic-бэкапов и оркестратора backup-all.py с cron-расписанием. +- `playbook-caddyproxy.yml` — Caddy reverse proxy. + +### Приложения + +- `playbook-gitea.yml` — Git-сервер. +- `playbook-authelia.yml` — аутентификация/SSO. +- `playbook-miniflux.yml` — RSS-ридер. +- `playbook-wakapi.yml` — трекинг времени. +- `playbook-memos.yml` — заметки. +- `playbook-outline.yml` — вики/база знаний. +- `playbook-homepage.yml` — дашборд (образ из Yandex Registry). +- `playbook-rssbridge.yml` — RSS-агрегатор. +- `playbook-netdata.yml` — мониторинг. +- `playbook-dozzle.yml` — просмотр Docker-логов. +- `playbook-gramps.yml` — генеалогия. +- `playbook-calibre.yml` — управление электронными книгами. +- `playbook-transcriber.yml` — транскрибация (образ из Yandex Registry). +- `playbook-wanderer.yml` — пешие маршруты. +- `playbook-remembos.yml` — интервальное повторение. + +### Агрегатные и служебные + +- `playbook-all-setup.yml` — системная настройка целиком (system + docker + eget + backups). +- `playbook-all-applications.yml` — деплой всех приложений. +- `playbook-homepage-registry.yml` / `playbook-transcriber-registry.yml` — загрузка образов в Yandex Registry. +- `playbook-remove-user-and-app.yml` — удаление пользователя и приложения (`--extra-vars user_name=`). + +## Роли + +- `roles/owner` — создаёт системного пользователя/группу для приложения, настраивает SSH-ключи, переменные окружения (~/.env, ~/.bashrc). +- `roles/eget` — скачивает и устанавливает утилиту eget. +- `roles/secrets` — управляет vault-зашифрованными файлами секретов для приложений. + +Галактические роли (`galaxy.roles/`): `geerlingguy.security`, `geerlingguy.docker`, `yatesr.timezone`. + +## Шаблоны и переменные + +- Суффиксы шаблонов: `.template.yml`, `.yml.j2`, `.template.sh` — рендерятся Ansible модулем `template`. +- Большинство приложений определяют переменные inline в плейбуке. Отдельные файлы переменных только у homepage и transcriber (`vars/homepage.yml`, `vars/transcriber.yml` + `*.images.yml`). +- Общие переменные из `vars/secrets.yml`: `application_dir`, `bin_prefix`, `primary_user` и др. +- Каждое приложение: `app_name`, `app_user`, `app_owner_uid`, `app_owner_gid`, `base_dir`, `data_dir`. + +## Линтинг и CI + +- CI (`.gitea/workflows/lint.yml`): два параллельных job — yamllint и ansible-lint. +- Конфиги: `.yamllint.yml` (макс. длина строки 120), `.ansible-lint.yml` (профиль production, offline). +- Pre-commit хуки через lefthook: + - `ruff format` + `ruff check` — форматирование и линтинг Python. + - `mypy` — проверка типов Python. + - `yamllint` — линтинг YAML. + - `ansible-lint` — линтинг Ansible (профиль production). + - `gitleaks` — поиск секретов в staged-файлах. + - Проверка что секретные файлы зашифрованы vault. + +## Соглашения по коду + +- Отступы: 2 пробела для YAML/Jinja, 4 пробела в остальных файлах (`.editorconfig`). +- Окончания строк: LF, завершающий перевод строки обязателен. +- Не коммитить незашифрованные секреты; `.crushignore` исключает `ansible-vault-password-file` и `*secrets.yml`. +- Директории в `files//` содержат docker-compose и шаблоны бэкапов; пользователи и настройки реестра должны соответствовать `vars/*.yml`. + +## Деплой + +```bash +# Один сервис +inv pl -- gitea + +# Несколько сервисов +inv pl -- gitea miniflux wakapi + +# Напрямую через ansible-playbook +ansible-playbook -i production.yml --diff playbook-gitea.yml +``` + +## Бэкапы + +- Шаблоны скриптов бэкапов в `files//` (backup.template.sh, gobackup.template.yml и др.). +- `files/backups/backup-all.py` — оркестратор, запускает все бэкапы через restic. +- Cron-расписание настраивается в `playbook-backups.yml`.