No description
  • Jinja 62.1%
  • Just 37.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
egoreast 8f3b1b05ab feat(forgejo_pages): ждать готовности Forgejo API перед стартом
После ребута сервера forgejo-pages мог стартовать раньше Forgejo:
получал 404 от Traefik (Forgejo ещё не зарегистрирован) и кэшировал
их навсегда, из-за чего страницы не открывались до ручного
перезапуска.

Исправления:
- Новый ExecStartPre ждёт готовности Forgejo API (curl
  /api/v1/version) до запуска контейнера. URL вставляется через
  Jinja напрямую (без sh-переменной $url), чтобы в строке не
  осталось ни одного $NAME-токена, который systemd мог бы
  развернуть. Управляется переменной forgejo_pages_forgejo_wait_timeout
  (0 = не ждать).
- TimeoutStartSec поднят до 420s, чтобы worst-case ожидания
  (две пробы) не превышал таймаут старта.
- forgejo_pages_systemd_after_services задаёт порядок старта после
  traefik и forgejo (After=).
- Новый рецепт just restart — лечение застрявшего кэша 404 после
  ребута.

Файлы:
- roles/forgejo_pages/templates/forgejo-pages.service.j2
- roles/forgejo_pages/defaults/main.yml
- justfile
2026-08-24 11:03:31 +03:00
examples feat: optional Cache-Control via Traefik middleware 2026-07-16 20:41:31 +03:00
roles/forgejo_pages feat(forgejo_pages): ждать готовности Forgejo API перед стартом 2026-08-24 11:03:31 +03:00
.gitignore update gitignore 2026-08-12 09:54:28 +03:00
ansible.cfg add justfile 2026-06-15 13:30:26 +03:00
justfile feat(forgejo_pages): ждать готовности Forgejo API перед стартом 2026-08-24 11:03:31 +03:00
playbook.yml create role and playbook with claude 2026-06-14 23:24:32 +03:00
README.md add justfile 2026-06-15 13:30:26 +03:00
requirements.yml create role and playbook with claude 2026-06-14 23:24:32 +03:00

ansible-forgejo-pages

Переиспользуемая Ansible-роль для развёртывания pages-сервера Forgejo (ronmi/forgejo-pages) за реверс-прокси (по умолчанию Traefik). Раздаёт ветку репозитория как статический сайт: https://<hostname>/<user>/<repo>/.

Роль универсальная — ничего не захардкожено. Инвентори организован папкой, как в mash/MDAD: шаблоны лежат в examples/, их копируют в inventory/ и заполняют под себя.

Структура

ansible-forgejo-pages/
├── ansible.cfg                 # inventory = inventory/, roles_path = roles
├── justfile                    # рецепты just (roles / install-all / check / ...)
├── playbook.yml                # применяет роль к группе [pages]
├── requirements.yml            # community.docker
├── examples/                   # ШАБЛОНЫ — скопировать в inventory/
│   ├── hosts
│   └── host_vars/
│       └── myserver.example.com/
│           └── vars.yml
├── inventory/                  # ТВОЙ инвентори (создаётся копированием из examples/)
│   └── .gitkeep
└── roles/
    └── forgejo_pages/
        ├── defaults/main.yml   # все переменные + дефолты
        ├── tasks/main.yml      # проверки + деплой
        ├── templates/…         # docker-compose шаблон
        ├── meta/main.yml       # Galaxy-метаданные
        └── README.md           # справка по роли

Быстрый старт

# 1. зависимости на контроллере
just roles       # = ansible-galaxy collection install -r requirements.yml

# 2. СКОПИРОВАТЬ примеры в inventory/
cp examples/hosts inventory/hosts
cp -r examples/host_vars/myserver.example.com inventory/host_vars/<твой-host>

# 3. отредактировать под себя
$EDITOR inventory/hosts                              # сервер; имя хоста = имя папки в host_vars/
$EDITOR inventory/host_vars/<твой-host>/vars.yml     # hostname / forgejo_url / token
#    токен лучше зашифровать:
just encrypt-token 'ТВОЙ_ТОКЕН'

# 4. запуск — нужна vault-аутентификация (см. ниже)
just install-all --ask-vault-pass

Vault: токен зашифрован, поэтому при запуске нужен доступ к vault-паролю. Способы: передать --ask-vault-pass (как выше) либо --vault-password-file ~/.ansible-vault-pass; или — удобнее — раскомментировать vault_password_file в ansible.cfg, и тогда хватит just install-all. Не комбинируй --ask-vault-pass и --vault-password-file одновременно — ansible это запрещает.

Список рецептов — just без аргументов (roles, install-all, check, ping, encrypt-token). Синонимы: deps = roles; install = setup-all = install-all.

Имя хоста в inventory/hosts и имя папки в inventory/host_vars/ должны совпадать — это связывает сервер с его переменными (как в mash/MDAD).

Что нужно один раз на стороне Forgejo/DNS

  1. Токен Forgejo со scope read:repository.
  2. DNS-запись <hostname> → IP сервера.
  3. Реверс-прокси (Traefik) уже работает на сервере.

Обязательные переменные (в host_vars//vars.yml)

  • forgejo_pages_hostname — web-хост раздачи.
  • forgejo_pages_forgejo_url — URL Forgejo.
  • forgejo_pages_token — API-токен (read:repository).

Остальное — с дефолтами, см. roles/forgejo_pages/defaults/main.yml и roles/forgejo_pages/README.md. Если Traefik с другими именами сети/entrypoint/резолвера — подсмотри их docker inspect-ом (в README роли) и переопредели forgejo_pages_traefik_* в vars.yml.

Несколько серверов

Добавляй хосты в inventory/hosts и заводи для каждого свою папку inventory/host_vars/<host>/vars.yml — роль применится к каждому со своими значениями.

Без Traefik

forgejo_pages_traefik_enabled: false (+ при желании forgejo_pages_published_port) — и подключай свой прокси.

Проверка

В любом репозитории создай ветку static-pages с index.html, открой https://<hostname>/<user>/<repo>/index.html.