devforge API service not deployed — webhook feature cannot be exercised live #46

Closed
opened 2026-08-14 03:28:22 +00:00 by Mark · 3 comments
Owner

No devforge API process, no devforge podman/docker container, and compose API port 8081 is not listening (verified 2026-08-13). Port 8000 serves a different application. The webhook feature therefore cannot be exercised end-to-end in any environment; only unit-level verification was possible.

Reproduction:

  1. Check listeners: ss -ltn | grep 8081 — nothing.
  2. podman ps -a / docker ps -a | grep devforge — nothing.
  3. curl localhost:8081/health — connection refused.

Expected: the devforge API is deployed (port 8081 up) so webhook endpoints and session-event delivery can be verified live.
Actual: nothing is deployed; the feature is dead-on-arrival for any user.

Kanban card: t_223849fd (probe finding 5, follow-up to closed Mark/devforge#17).

No devforge API process, no devforge podman/docker container, and compose API port 8081 is not listening (verified 2026-08-13). Port 8000 serves a different application. The webhook feature therefore cannot be exercised end-to-end in any environment; only unit-level verification was possible. Reproduction: 1. Check listeners: ss -ltn | grep 8081 — nothing. 2. podman ps -a / docker ps -a | grep devforge — nothing. 3. curl localhost:8081/health — connection refused. Expected: the devforge API is deployed (port 8081 up) so webhook endpoints and session-event delivery can be verified live. Actual: nothing is deployed; the feature is dead-on-arrival for any user. Kanban card: t_223849fd (probe finding 5, follow-up to closed Mark/devforge#17).
Author
Owner

Triaged: devforge API service not deployed; container missing on compose port 8081. Ops-debt, fixable.

Triaged: devforge API service not deployed; container missing on compose port 8081. Ops-debt, fixable.
Author
Owner

Verification 2026-09-18: Commit 7db1598 (fix(deploy): add missing API runtime deps and shorten 0009 revision id) is confirmed on origin/main — adds cryptography + filelock to services/api/requirements.txt and renames the 0009 alembic revision id to fit VARCHAR(32). However, the live acceptance criterion ("API deployed (port 8081 up)") is not currently satisfied: ss -ltn | grep 8081 returns nothing, no devforge container in podman ps -a or docker ps -a, and curl localhost:8081/health → connection refused. The 8081 listener that existed at the 2026-08-14 audit is gone — the API is not running on this host. Issue remains open pending re-deployment. Re-dispatching a fresh triage/run card to drive deployment of the current main so the API comes up and this issue can be closed.

**Verification 2026-09-18:** Commit `7db1598` (`fix(deploy): add missing API runtime deps and shorten 0009 revision id`) is confirmed on `origin/main` — adds cryptography + filelock to `services/api/requirements.txt` and renames the 0009 alembic revision id to fit VARCHAR(32). However, the live acceptance criterion ("API deployed (port 8081 up)") is **not** currently satisfied: `ss -ltn | grep 8081` returns nothing, no `devforge` container in `podman ps -a` or `docker ps -a`, and `curl localhost:8081/health` → connection refused. The 8081 listener that existed at the 2026-08-14 audit is gone — the API is not running on this host. Issue remains open pending re-deployment. Re-dispatching a fresh triage/run card to drive deployment of the current `main` so the API comes up and this issue can be closed.
Author
Owner

Closed: devforge API now deployed and answering live on port 8081.

Verification (2026-09-18, host blackhole)

  • Listener: ss -ltn | grep ':8081 ' → LISTEN 0 4096 *:8081 *:*
  • Health: curl -sS http://localhost:8081/health → {"ok":true}
  • Webhook list: curl -sS -H "X-DEVFORGE-KEY: $DEVFORGE_API_KEY" http://localhost:8081/webhooks/events → {"success":true,"event_types":["session.created","session.started","session.stopped","session.deleted","session.profile_changed","snapshot.created","snapshot.restored","quota.exceeded"]} (8 event types, matches expected)
  • Container status: docker compose ps shows devforge_api_1 Up (:8081->8081), devforge_db_1 Up (healthy), devforge_redis_1 Up (healthy)

Fix that landed this

The blocker was two-fold, addressed in commit 7db1598 on origin/main — "fix(deploy): add missing API runtime deps and shorten 0009 revision id":

  1. services/api/requirements.txt was missing cryptography and filelock, causing ModuleNotFoundError at uvicorn start in any fresh build.
  2. Alembic revision file 0009_add_quota_fields_and_user_id.py exceeded alembic's version_num VARCHAR(32) column on Postgres, so alembic upgrade head aborted before uvicorn could launch. Renamed to 0009_add_quota_fields.py.

Both issues are visible in the deployed image: the API container's pip show lists cryptography-42.0.8 and filelock-3.13.1, and the migration runs to head.

How deployed

cd /home/b/Projects/devforge
docker-compose --host unix:///run/user/1000/podman/podman.sock build api
docker-compose --host unix:///run/user/1000/podman/podman.sock up -d db redis
docker-compose --host unix:///run/user/1000/podman/podman.sock up -d api

Project name devforge (directory basename); rootless-podman-socket selection needed because /var/run/docker.sock symlinks to root's podman socket, not the user one (/run/user/1000/podman/podman.sock). Existing docker-compose.override.yml (user=0:0 for rootless socket writes) is in place.

Note on port 5432 collision

nodedesk_db was holding host port 5432; it was stopped for the duration of the deploy (matching the plan in .kilo/plans/issue-46-deploy-api-service.md R1 mitigation). pg-nodedesk (port 5433) and the forgejo runners were untouched. nodedesk_db can be restarted at any time — its host port is bound to devforge's db container now and would conflict; either stop nodedesk_db permanently or edit compose to remap (downstream operator decision per the plan).

Acceptance

This satisfies all 5 acceptance criteria from the verification card (t_53ad22b5) and the deploy card (t_b7b501c2). The live webhook feature called out by Mark/devforge#17 is now reachable end-to-end; subsequent dispatches on issues #42 and #44 can exercise their webhooks dispatch wiring against the real API.

Closed: devforge API now deployed and answering live on port 8081. ## Verification (2026-09-18, host `blackhole`) - **Listener**: `ss -ltn | grep ':8081 '` → `LISTEN 0 4096 *:8081 *:*` - **Health**: `curl -sS http://localhost:8081/health` → `{"ok":true}` - **Webhook list**: `curl -sS -H "X-DEVFORGE-KEY: $DEVFORGE_API_KEY" http://localhost:8081/webhooks/events` → `{"success":true,"event_types":["session.created","session.started","session.stopped","session.deleted","session.profile_changed","snapshot.created","snapshot.restored","quota.exceeded"]}` (8 event types, matches expected) - **Container status**: `docker compose ps` shows `devforge_api_1 Up (:8081->8081)`, `devforge_db_1 Up (healthy)`, `devforge_redis_1 Up (healthy)` ## Fix that landed this The blocker was two-fold, addressed in commit **`7db1598`** on `origin/main` — "fix(deploy): add missing API runtime deps and shorten 0009 revision id": 1. `services/api/requirements.txt` was missing `cryptography` and `filelock`, causing `ModuleNotFoundError` at uvicorn start in any fresh build. 2. Alembic revision file `0009_add_quota_fields_and_user_id.py` exceeded alembic's `version_num VARCHAR(32)` column on Postgres, so `alembic upgrade head` aborted before uvicorn could launch. Renamed to `0009_add_quota_fields.py`. Both issues are visible in the deployed image: the API container's `pip show` lists `cryptography-42.0.8` and `filelock-3.13.1`, and the migration runs to head. ## How deployed ```bash cd /home/b/Projects/devforge docker-compose --host unix:///run/user/1000/podman/podman.sock build api docker-compose --host unix:///run/user/1000/podman/podman.sock up -d db redis docker-compose --host unix:///run/user/1000/podman/podman.sock up -d api ``` Project name `devforge` (directory basename); rootless-podman-socket selection needed because `/var/run/docker.sock` symlinks to root's podman socket, not the user one (`/run/user/1000/podman/podman.sock`). Existing `docker-compose.override.yml` (user=0:0 for rootless socket writes) is in place. ## Note on port 5432 collision `nodedesk_db` was holding host port 5432; it was stopped for the duration of the deploy (matching the plan in `.kilo/plans/issue-46-deploy-api-service.md` R1 mitigation). `pg-nodedesk` (port 5433) and the forgejo runners were untouched. `nodedesk_db` can be restarted at any time — its host port is bound to devforge's `db` container now and would conflict; either stop nodedesk_db permanently or edit compose to remap (downstream operator decision per the plan). ## Acceptance This satisfies all 5 acceptance criteria from the verification card (`t_53ad22b5`) and the deploy card (`t_b7b501c2`). The live webhook feature called out by Mark/devforge#17 is now reachable end-to-end; subsequent dispatches on issues #42 and #44 can exercise their webhooks dispatch wiring against the real API.
Mark closed this issue 2026-09-18 18:05:39 +00:00
Sign in to join this conversation.
No description provided.