fix(ci): switch deploy to .forgejo/workflows + shell GHCR login #192

Merged
lekss361 merged 1 commit from fix/forgejo-ghcr-login into main 2026-05-16 05:25:00 +00:00
Owner

After Forgejo migration .github/workflows/deploy.yml использовал secrets.GITHUB_TOKEN (Forgejo auto-token БЕЗ ghcr.io permissions) → все main deploys failed denied: denied.

Fix

  • Delete .github/workflows/deploy.yml — Forgejo reads .github/ as fallback if .forgejo/ not present
  • Add .forgejo/workflows/deploy.yml (port из GHA):
    • password: secrets.GHCR_PAT (наш PAT с write:packages)
    • shell-based echo $PAT | docker login (docker/login-action@v3 unreliable под act framework)
    • type=registry buildcache (Forgejo no GHA cache service)

After merge — main deploy должен finally работать.

After Forgejo migration `.github/workflows/deploy.yml` использовал `secrets.GITHUB_TOKEN` (Forgejo auto-token БЕЗ ghcr.io permissions) → все main deploys failed `denied: denied`. ## Fix - Delete `.github/workflows/deploy.yml` — Forgejo reads `.github/` as fallback if `.forgejo/` not present - Add `.forgejo/workflows/deploy.yml` (port из GHA): - `password: secrets.GHCR_PAT` (наш PAT с `write:packages`) - shell-based `echo $PAT | docker login` (docker/login-action@v3 unreliable под act framework) - `type=registry` buildcache (Forgejo no GHA cache service) After merge — main deploy должен finally работать.
lekss361 added 1 commit 2026-05-15 22:28:44 +00:00
После Forgejo migration .github/workflows/deploy.yml использовал
secrets.GITHUB_TOKEN (Forgejo auto-token БЕЗ ghcr.io permissions) →
все builds failed с 'denied: denied'.

Changes:
- Delete .github/workflows/deploy.yml (Forgejo читает .github/ как fallback —
  убираем чтобы не было конфликта с .forgejo/ версией)
- Add .forgejo/workflows/deploy.yml (port из GHA версии):
  * password: secrets.GHCR_PAT (наш PAT с write:packages scope)
  * username: hardcoded 'lekss361'
  * type=registry buildcache (Forgejo не имеет GHA cache service)
- Replace docker/login-action@v3 на shell echo PAT | docker login
  (action под Forgejo Actions act framework ловит 'denied: denied'
  даже с правильным PAT — direct CLI работает)

После merge — main deploy должен наконец отработать без денайдов.
Author
Owner

Auto-review — verdict: approve

CI: 0 checks (expected — workflow file PR, триггер на push: branches: [main], не на PR).
mergeable: True

Secret safety: CONFIRMED SAFE

  • env: GHCR_PAT: ${{ secrets.GHCR_PAT }} + echo "$GHCR_PAT" | docker login ... --password-stdin — correct pattern, no -p leak в ps
  • Re-login на VPS внутри SSH script тоже via stdin, GHCR_PAT передан через envs:
  • SSH key через appleboy/ssh-action с key: ${{ secrets.DEPLOY_SSH_KEY }} — не пишется в temp file

Findings

  1. DEPLOY_PORT fallback removed — было ${{ secrets.DEPLOY_PORT || 22 }}, стало просто secrets.DEPLOY_PORT. Low risk — secret уже configured per vault. Можно вернуть || 22 для resilience, не блокирующее.

  2. permissions: blocks removed — OK для Forgejo (нет GHA-style GITHUB_TOKEN scope granularity).

  3. type=ghatype=registry buildcache — correct fallback (Forgejo runners без GHA cache service).

  4. data/sql/** добавлен в backend filter — positive side-effect: SQL migrations теперь correctly триггерят backend/worker redeploy.

Special note: ci_state=none

CI checks не запустятся на PR — workflow триггерится на push: branches: [main], активируется только ПОСЛЕ merge. Loop strict rule (auto-merge только если ci=success) → не мерджит сам. Эскалировано человеку.

Manual merge appropriate здесь. После merge: watch первый Forgejo Actions run на main — verify docker login ghcr.io success + compose pull без denied: denied.


## Auto-review — verdict: approve ✅ CI: 0 checks (expected — workflow file PR, триггер на `push: branches: [main]`, не на PR). mergeable: True ### Secret safety: CONFIRMED SAFE - `env: GHCR_PAT: ${{ secrets.GHCR_PAT }}` + `echo "$GHCR_PAT" | docker login ... --password-stdin` — correct pattern, no `-p` leak в ps - Re-login на VPS внутри SSH script тоже via stdin, GHCR_PAT передан через `envs:` - SSH key через `appleboy/ssh-action` с `key: ${{ secrets.DEPLOY_SSH_KEY }}` — не пишется в temp file ### Findings 1. **DEPLOY_PORT fallback removed** — было `${{ secrets.DEPLOY_PORT || 22 }}`, стало просто `secrets.DEPLOY_PORT`. Low risk — secret уже configured per vault. Можно вернуть `|| 22` для resilience, не блокирующее. 2. **`permissions:` blocks removed** — OK для Forgejo (нет GHA-style GITHUB_TOKEN scope granularity). 3. **`type=gha` → `type=registry` buildcache** — correct fallback (Forgejo runners без GHA cache service). 4. **`data/sql/**` добавлен в backend filter** — positive side-effect: SQL migrations теперь correctly триггерят backend/worker redeploy. ### Special note: ci_state=none CI checks не запустятся на PR — workflow триггерится на `push: branches: [main]`, активируется только ПОСЛЕ merge. **Loop strict rule** (`auto-merge только если ci=success`) → **не мерджит сам**. Эскалировано человеку. ### Recommended action **Manual merge** appropriate здесь. После merge: watch первый Forgejo Actions run на main — verify `docker login ghcr.io` success + `compose pull` без `denied: denied`. --- <!-- gendesign-review-bot: sha=a2a2877 verdict=approve ci=none -->
lekss361 merged commit e97f96afa7 into main 2026-05-16 05:25:00 +00:00
lekss361 deleted branch fix/forgejo-ghcr-login 2026-05-16 05:25:01 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#192
No description provided.