You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#102 built the tooling (release automation, vaults//targets/ manifests, ansible/deploy.yml) to deploy Rybbit for rubykatzen.com on hawkeye
through flightdeck's own pipeline, but it never got to a live deploy — the
PR's own Verification checklist left these unchecked:
Publish the first real Hawkeye env asset after external prerequisites
are configured
Run the first real Hawkeye deployment
Nothing has run against production yet, and the prerequisites listed in #102's PR description haven't been confirmed as actually configured.
Prerequisites to configure (from #102's PR description)
GitHub Variable TAILSCALE_OAUTH_CLIENT_ID and Secret TAILSCALE_OAUTH_SECRET (if Tailscale is used to reach hawkeye)
Every GitHub Secret/Variable referenced by vaults/hawkeye-traefik.yml's
and vaults/hawkeye-rybbit.yml's env: mappings: RUBYKATZEN_COM_DOMAIN, RUBYKATZEN_COM_ADMIN_MAIL, RUBYKATZEN_COM_CERT_RESOLVER, RUBYKATZEN_COM_CLOUDFLARE_TOKEN, RUBYKATZEN_COM_DATABASE_PASSWORD, RUBYKATZEN_COM_KEY_HEX_32, RUBYKATZEN_COM_TRAEFIK_HTTP_PORT, RUBYKATZEN_COM_TRAEFIK_HTTPS_PORT
Server-side rubykatzen-com user on hawkeye, with SSH access matching DEPLOY_SSH_PRIVATE_KEY. No longer needed on the server: the age
private key, sops, gh — all moved to the CI runner side (Consider decrypting vaults on the CI runner instead of server-side #116).
Docker and Docker Compose are the only remaining host dependencies.
External Cloudflare Tunnel configuration for rubykatzen.com
Separate open question, not blocking: apps/traefik/docker-compose.yml
carries the Watchtower label, but hawkeye's apps doesn't include a watchtower app — as implemented, the automated deploy path would
never actually run docker compose up for traefik. Needs its own
decision (add watchtower to hawkeye's apps, or drop the label)
before the first real deploy.
Once prerequisites are in place
Publish the first real hawkeye.sops.env asset (via a real release,
or by manually running the encrypt-vaults/encrypt jobs)
Run the first real deployment to hawkeye (deploy.yml workflow_dispatch, or let it ride the next real release)
Confirm traefik + rybbit actually come up and rubykatzen.com
resolves correctly end to end
Separately: triage currently failing/blocked workflow runs on main
Found while checking the post-merge state of #102.
Release — action_required, zero jobs ran, on every push to main
through 1f6117d. Root cause confirmed: repo Settings → Actions →
General → Workflow permissions was set to "Read repository contents
and packages permissions" — a hard cap that release.yml's own
explicit permissions: contents: write / issues: write / pull-requests: write block could not exceed (proven by the fact it
stayed blocked despite already declaring those permissions itself).
Fixed by switching to "Read and write permissions" + "Allow GitHub
Actions to create and approve pull requests" (needed separately for
release-please's own release PR creation). Confirmed via API
(default_workflow_permissions: "write", can_approve_pull_request_reviews: true). Couldn't force a live
re-run (gh run rerun refuses runs that never started any jobs, and release.yml has no workflow_dispatch) — will get a real
confirmation on the next push to main / next release-please cycle.
Notify Telegram PR — startup_failure on every single run
(push, PR, and daily schedule) back through history. Same root
cause: the GitHub error banner named it exactly — nested job notify requesting pull-requests: read while the repo only
allowed pull-requests: none. Fixed by the same Settings change. Confirmed live via manual workflow_dispatch after the fix —
run succeeded.
Dependabot update-check runs ("pip in /.", "bundler in /.") on 58d431e — both failure. Not yet investigated; may or may not be
the same permissions root cause (worth a quick check next).
Problem
#102 built the tooling (release automation,
vaults//targets/manifests,ansible/deploy.yml) to deploy Rybbit forrubykatzen.comonhawkeyethrough flightdeck's own pipeline, but it never got to a live deploy — the
PR's own Verification checklist left these unchecked:
are configured
Nothing has run against production yet, and the prerequisites listed in
#102's PR description haven't been confirmed as actually configured.
Prerequisites to configure (from #102's PR description)
DEPLOY_SSH_PRIVATE_KEYHAWKEYE_AGE_PRIVATE_KEY— new prerequisite, addedwhen decryption and config rendering moved from hawkeye itself to the
CI runner (Consider decrypting vaults on the CI runner instead of server-side #116, done alongside Consider migrating ansible/deploy.yml to Fabric (Python) #111/One vault per app: drop the APPS_/{app}_ prefix convention for vault-sourced env #114). Content is the private
key matching
keys/hawkeye.pub(previously only ever neededserver-side, in
~/.config/sops/age/keys.txt; now needed hereinstead, not there).
TAILSCALE_OAUTH_CLIENT_IDand SecretTAILSCALE_OAUTH_SECRET(if Tailscale is used to reach hawkeye)vaults/hawkeye-traefik.yml'sand
vaults/hawkeye-rybbit.yml'senv:mappings:RUBYKATZEN_COM_DOMAIN,RUBYKATZEN_COM_ADMIN_MAIL,RUBYKATZEN_COM_CERT_RESOLVER,RUBYKATZEN_COM_CLOUDFLARE_TOKEN,RUBYKATZEN_COM_DATABASE_PASSWORD,RUBYKATZEN_COM_KEY_HEX_32,RUBYKATZEN_COM_TRAEFIK_HTTP_PORT,RUBYKATZEN_COM_TRAEFIK_HTTPS_PORTrubykatzen-comuser on hawkeye, with SSH access matchingDEPLOY_SSH_PRIVATE_KEY. No longer needed on the server: the ageprivate key,
sops,gh— all moved to the CI runner side (Consider decrypting vaults on the CI runner instead of server-side #116).Docker and Docker Compose are the only remaining host dependencies.
rubykatzen.comapps/traefik/docker-compose.ymlcarries the Watchtower label, but hawkeye's
appsdoesn't include awatchtowerapp — as implemented, the automated deploy path wouldnever actually run
docker compose upfor traefik. Needs its owndecision (add
watchtowerto hawkeye'sapps, or drop the label)before the first real deploy.
Once prerequisites are in place
hawkeye.sops.envasset (via a real release,or by manually running the
encrypt-vaults/encryptjobs)deploy.ymlworkflow_dispatch, or let it ride the next real release)rubykatzen.comresolves correctly end to end
Separately: triage currently failing/blocked workflow runs on main
Found while checking the post-merge state of #102.
Release—action_required, zero jobs ran, on every push tomainthrough
1f6117d. Root cause confirmed: repo Settings → Actions →General → Workflow permissions was set to "Read repository contents
and packages permissions" — a hard cap that
release.yml's ownexplicit
permissions: contents: write / issues: write / pull-requests: writeblock could not exceed (proven by the fact itstayed blocked despite already declaring those permissions itself).
Fixed by switching to "Read and write permissions" + "Allow GitHub
Actions to create and approve pull requests" (needed separately for
release-please's own release PR creation). Confirmed via API
(
default_workflow_permissions: "write",can_approve_pull_request_reviews: true). Couldn't force a livere-run (
gh run rerunrefuses runs that never started any jobs, andrelease.ymlhas noworkflow_dispatch) — will get a realconfirmation on the next push to
main/ next release-please cycle.Notify Telegram PR—startup_failureon every single run(push, PR, and daily
schedule) back through history. Same rootcause: the GitHub error banner named it exactly — nested job
notifyrequestingpull-requests: readwhile the repo onlyallowed
pull-requests: none. Fixed by the same Settings change.Confirmed live via manual
workflow_dispatchafter the fix —run succeeded.
58d431e— bothfailure. Not yet investigated; may or may not bethe same permissions root cause (worth a quick check next).
Related
Follow-up from #102.