diff --git a/README.md b/README.md index a8a12b7..48dfad8 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ uv run ansible-galaxy install --role-file requirements.yml Деплой приложения через ansible: ```bash -uv run ansible-playbook ansible-playbook -i timeweb.yml --diff playbook-gitea.yml +uv run ansible-playbook -i production.yml --diff playbook-gitea.yml ``` Или через таску invoke: @@ -55,5 +55,5 @@ uv run ansible-playbook ansible-playbook -i timeweb.yml --diff playbook-gitea.ym ## Удаление приложения ```bash -uv run ansible-playbook -i timeweb.yml --diff playbook-remove-user-and-app.yml --extra-vars user_name= +uv run ansible-playbook -i production.yml --diff playbook-remove-user-and-app.yml --extra-vars user_name= ``` diff --git a/ansible.cfg b/ansible.cfg index 6170948..7e49fc7 100644 --- a/ansible.cfg +++ b/ansible.cfg @@ -1,4 +1,5 @@ [defaults] +inventory = ./production.yml host_key_checking = True vault_password_file = ./ansible-vault-password-file roles_path = ./galaxy.roles diff --git a/docs/backlog/README.md b/docs/backlog/README.md index ebe62b2..de1747c 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -31,7 +31,6 @@ _(sec-ревью)_ — три независимых security-ревью на м - [Понизить log level Authelia до info](authelia-log-level.md) — `debug` в проде утекает детали аутентификации и OIDC через `docker logs`/dozzle _(sec-ревью)_ - [Включить автообновления безопасности](security-autoupdates.md) — патчи openssh/libssl только вручную; окна в недели между CVE и фиксом _(sec-ревью)_ - [Запретить SSH-вход под root](ssh-disable-root-login.md) — `PermitRootLogin yes` пускает root по ключу; наименьшие привилегии + defense-in-depth (пароль уже off) _(sec-ревью)_ -- [Убрать устаревший инвентарь после миграции](stale-inventory-cleanup.md) — `production.yml` указывает на мёртвый YC-хост, живой — `timeweb.yml`; имена инвертированы - [Gitea runner on-demand в Yandex Cloud](gitea-runner-on-demand.md) — раннер активен только во время сборки; webhook→Cloud Function стартует ВМ, probe/decide гасят по idle; экономия ~95% - [Синхронизация общих Ansible-ролей](shared-roles-sync.md) — `owner`/`eget`/`secrets` дублируются между репозиториями и дрейфуют; канон в ansible-shared + rsync-таски invoke - [Уведомления о размере приложений и диске](disk-usage-alerts.md) — алерты на заполнение диска и аномальный рост data-томов; сервер ресурсно ограничен _(tududi)_ diff --git a/docs/backlog/ansible-inventory-hostvars.md b/docs/backlog/ansible-inventory-hostvars.md index 35afe8b..ee9558d 100644 --- a/docs/backlog/ansible-inventory-hostvars.md +++ b/docs/backlog/ansible-inventory-hostvars.md @@ -2,17 +2,14 @@ **Приоритет:** низкий -- **`production.yml` и `timeweb.yml`** оба объявляют хост `server` под - `ungrouped:`, хост-специфичные данные (`application_dir`, - `mount_external_storage`, `ansible_host`, `ansible_user`) вписаны инлайн. - Конвенциональнее — `host_vars/server.yml` и хост в именованной группе. Два - инвентаря с одинаковым именем хоста + `hosts: all` — ошибка `-i` молча уедет не - туда. (`timeweb.yml` — артефакт завершённой миграции, заодно решить, нужен ли - он ещё.) +- **`production.yml`** объявляет хост `server` под `ungrouped:`, + хост-специфичные данные (`ansible_host`, `ansible_user`, `ansible_become`) + вписаны инлайн. Конвенциональнее — `host_vars/server.yml` и хост в именованной + группе, а не в `ungrouped`. - `ansible_become: true` глобально — всё бежит под root. Для личного сервера прагматично; точечный `become`/`become_user` ближе к наименьшим привилегиям, но это низкий приоритет. Контекст: [docs/drafts/ansible-review.md](../drafts/ansible-review.md) §6. -Связано: production.yml, timeweb.yml. +Связано: production.yml. diff --git a/docs/backlog/ssh-disable-root-login.md b/docs/backlog/ssh-disable-root-login.md index 339fbf8..f73acf2 100644 --- a/docs/backlog/ssh-disable-root-login.md +++ b/docs/backlog/ssh-disable-root-login.md @@ -12,7 +12,7 @@ Почему всё равно стоит закрыть: - **Наименьшие привилегии.** Ansible ходит под непривилегированным `major` с - `become` (`production.yml`/`timeweb.yml`), root-логин для деплоя не нужен вовсе. + `become` (`production.yml`), root-логин для деплоя не нужен вовсе. - **Defense-in-depth.** Если `PasswordAuthentication` когда-нибудь вернётся в `yes` (правка, `Match`-блок, чужая роль), `PermitRootLogin yes` тут же откроет root по паролю. `prohibit-password` держит root key-only независимо. @@ -22,5 +22,5 @@ Из sec-ревью (fable, 2026-07-13); мотивировка уточнена после проверки конфига. -Связано: playbook-system.yml, production.yml, timeweb.yml, +Связано: playbook-system.yml, production.yml, galaxy.roles/geerlingguy.security. diff --git a/docs/backlog/stale-inventory-cleanup.md b/docs/backlog/stale-inventory-cleanup.md deleted file mode 100644 index 3f26fc5..0000000 --- a/docs/backlog/stale-inventory-cleanup.md +++ /dev/null @@ -1,25 +0,0 @@ -# Убрать устаревший инвентарь после миграции на Timeweb - -**Приоритет:** средний - -После переезда на Timeweb (cutover 2026-05-23) имена инвентарей инвертировались: - -- `timeweb.yml` → `92.53.105.41` — **живой** хост, именно его использует `inv pl` - (`tasks.py:12` `HOSTS_FILE = "timeweb.yml"`). -- `production.yml` → `158.160.46.255` — **мёртвый** старый YC-хост (ВМ - остановлена). При этом AGENTS.md всё ещё называет `production.yml` рабочим - инвентарём. - -Ловушка: любой прямой запуск `ansible-playbook -i production.yml ...` (как в -примерах AGENTS.md) уедет на несуществующий/чужой хост. Плюс `production.yml` -содержит `application_dir`/`mount_external_storage`, которых нет в `timeweb.yml` — -простой заменой файла эти переменные потеряются. - -Сделать: сделать `production.yml` актуальным инвентарём Timeweb-хоста (перенести -недостающие host-vars), удалить `timeweb.yml`, поправить `HOSTS_FILE` в `tasks.py` -и примеры в AGENTS.md. Согласуется с задачей -[ansible-inventory-hostvars](ansible-inventory-hostvars.md) (host-специфику в -`host_vars/server.yml`, хост в именованную группу) — логично делать вместе. - -Связано: production.yml, timeweb.yml, tasks.py, AGENTS.md, -docs/drafts/timeweb-migration-log.md, ansible-inventory-hostvars. diff --git a/production.yml b/production.yml index d901e84..7fff706 100644 --- a/production.yml +++ b/production.yml @@ -2,8 +2,6 @@ ungrouped: hosts: server: - ansible_host: "158.160.46.255" + ansible_host: "92.53.105.41" ansible_user: "major" ansible_become: true - application_dir: "/mnt/applications" - mount_external_storage: true diff --git a/tasks.py b/tasks.py index 957c420..d4cba53 100644 --- a/tasks.py +++ b/tasks.py @@ -9,7 +9,7 @@ from invoke.context import Context from invoke.exceptions import Exit from invoke.tasks import task -HOSTS_FILE = "timeweb.yml" +HOSTS_FILE = "production.yml" VARS_FILE = "group_vars/all/main.yml" AUTHELIA_DOCKER = "docker run --rm -v $PWD:/data authelia/authelia:4.39.4 authelia" diff --git a/timeweb.yml b/timeweb.yml deleted file mode 100644 index 7fff706..0000000 --- a/timeweb.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -ungrouped: - hosts: - server: - ansible_host: "92.53.105.41" - ansible_user: "major" - ansible_become: true