CI/CD + deploy: Gitea Actions -> registry -> Dockge -> NPM (rcai.brasse-pc.eu)
Some checks failed
build-and-push / build (push) Has been cancelled

Server:
- serverar byggd web-frontend statiskt + SPA-fallback (WEB_DIST)
- host-mountad persistent katalog via DATA_DIR (/srv/docker/agent-helm -> /app/data),
  förberedd för framtida db/auth enligt övriga appars konvention
- esbuild-bundle -> dist/server.cjs (en fil, inga node_modules i runtime)
Web:
- WS-URL defaultar till samma origin i prod (wss://rcai.brasse-pc.eu), localhost i dev

Deploy-artefakter:
- Dockerfile: multi-stage, bygger web + bundlar server; --filter utesluter daemon
  (ingen node-pty-kompilering); kör som uid 1000 (= brasse på host)
- .gitea/workflows/build.yaml: push master -> bygg arm64 -> push localhost:5000
- deploy/act-runner.{compose,config}.yaml: Gitea Actions-runner i Docker (docker.sock,
  job-containrar får värdens docker for build/push)
- deploy/agent-helm.compose.yaml: Dockge-stack (srv_default, expose 8787, data-mount,
  x-dockge.urls)
- deploy/DEPLOY.md: full runbook (runner, bygge, stack, NPM, uppdatering, felsökning)

Verifierat lokalt: typecheck rent, server-bundle serverar UI+health+assets+SPA-fallback,
data-dir skapas. Docker-bygget validerat så långt daemonen är nere (filter bekräftat).
This commit is contained in:
2026-06-28 16:03:14 +02:00
parent 09f1168c17
commit 062e02b417
11 changed files with 358 additions and 1 deletions

133
deploy/DEPLOY.md Normal file
View File

@@ -0,0 +1,133 @@
# Deploy: agent-helm på Pi5 via Gitea Actions → registry → Dockge → NPM
Flödet: `git push master`**Gitea Actions-runnern på Pi5** bygger arm64-image:n
→ pushar till `localhost:5000/agent-helm-server:latest`**Dockge** kör stacken →
**NPM** exponerar `https://rcai.brasse-pc.eu`. Uppdatering = push + klicka *Update* i Dockge.
```
push master ──► gitea-act-runner (bygg arm64) ──► localhost:5000/agent-helm-server:latest
Dockge: Update (pull + up -d)
container "agent-helm" :8787 (srv_default)
NPM: rcai.brasse-pc.eu ─┘ (Websockets ON, TLS)
```
Förutsättningar som redan är på plats: DNS `rcai.brasse-pc.eu → 155.4.72.51` (✓),
`srv_default`-nätet, `docker-registry` och `npm` körs (✓). Gitea 1.24 har Actions
påslaget som default.
---
## Steg 1 — Registrera Gitea Actions-runnern (engång)
1. **Hämta registrerings-token** i Gitea:
`Site Administration → Actions → Runners → Create new runner` → kopiera token.
(Eller repo-nivå: `brasse/agent-helm → Settings → Actions → Runners`.)
2. **Skapa stacken i Dockge** (`dockge.brasse-pc.eu`):
- Ny stack, namn `act-runner`.
- Klistra in `deploy/act-runner.compose.yaml`.
- Lägg `deploy/act-runner.config.yaml` som filen `config.yaml` i stacken
(Dockge låter dig skapa extra filer i stack-mappen, dvs
`/srv/dockge-staks/act-runner/config.yaml`).
- I stackens **env**: `GITEA_RUNNER_REGISTRATION_TOKEN=<din-token>`.
- Deploy.
3. **Verifiera**: i Gitea `Site Administration → Actions → Runners` ska
`pi5-docker-runner` dyka upp som *Idle*. Loggen: `docker logs gitea-act-runner`.
> Runnern monterar värdens `docker.sock` och bygger med Pi5:ans egen Docker →
> arm64 nativt, och `localhost:5000` (registryn) trustas automatiskt.
---
## Steg 2 — Första bygget
`.gitea/workflows/build.yaml` triggas på push till `master`/`main`. Trigga det:
- Pusha en commit till `master`, **eller**
- Gitea repo → `Actions` → välj workflowen → `Run workflow` (manuell dispatch).
Följ körningen under repo:ts **Actions**-flik. När den är grön finns
`localhost:5000/agent-helm-server:latest` i registryn.
Snabbkoll (på Pi5, eller via `claude-docker`):
```bash
curl -s http://localhost:5000/v2/agent-helm-server/tags/list
# -> {"name":"agent-helm-server","tags":["latest","<sha>"]}
```
---
## Steg 3 — Kör stacken i Dockge
1. **Skapa host-katalogen för config/data** (som `brasse`, uid 1000):
`mkdir -p /srv/docker/agent-helm`
Den bind-mountas till `/app/data` i containern (där framtida db/auth hamnar);
containern kör som uid 1000 = `brasse` så filerna blir korrekt ägda.
2. Ny stack i Dockge, namn `agent-helm`.
3. Klistra in `deploy/agent-helm.compose.yaml`.
4. I stackens **env**: `AGENT_HELM_TOKEN=<lång-slumpad-hemlighet>`
(generera t.ex. `openssl rand -hex 32`).
5. Deploy. Kolla i Dockge att containern `agent-helm` är *running*.
---
## Steg 4 — NPM proxy host (manuellt i NPM-UI:t)
I `Proxy.brasse-pc.eu`**Proxy Hosts → Add Proxy Host**:
| Fält | Värde |
|---------------------|-----------------------------|
| Domain Names | `rcai.brasse-pc.eu` |
| Scheme | `http` |
| Forward Hostname | `agent-helm` |
| Forward Port | `8787` |
| **Websockets Support** | **PÅ** (viktigt — WS-kanalen) |
| Block Common Exploits | valfritt |
Under **SSL**: Request a new SSL Certificate (Let's Encrypt) + Force SSL + HTTP/2.
Spara. Öppna `https://rcai.brasse-pc.eu` → logga in med `AGENT_HELM_TOKEN`.
---
## Steg 5 — Anslut en daemon (annars finns inga sessioner)
Servern är bara control-plane. En **daemon** kör agenten och ansluter till servern.
Kör den var du vill (workstation, eller som egen container senare):
```bash
# på workstationen, i agent-helm-repot
AGENT_HELM_TOKEN=<samma-token> \
SERVER_URL=wss://rcai.brasse-pc.eu \
AGENT_CMD=gemini \
pnpm dev:daemon
```
Daemonen dyker upp som en session i web-UI:t. (Kräver att NPM:s Websockets är på.)
---
## Uppdatera till senaste
1. `git push master` → runnern bygger + pushar `:latest`.
2. Dockge → stacken `agent-helm`**Update** (kör `docker compose pull && up -d`).
Det var det — senaste image:n körs.
---
## Felsökning
| Symptom | Trolig orsak / åtgärd |
|---|---|
| Runnern syns inte i Gitea | Fel/förbrukad token. Skapa ny, uppdatera env, redeploy `act-runner`. |
| Workflow fastnar på `actions/checkout` | Runnern når inte github för att hämta action:en, eller inte `gitea-d:3000`. Kolla att runnern är på `srv_default`. |
| `docker: command not found` i jobbet | Fel job-image. Labeln ska peka på `catthehacker/ubuntu:act-latest`. |
| `push` nekas / `http: server gave HTTP response to HTTPS client` | Pusha till `localhost:5000` (inte `192.168.0.19:5000`) från Pi-runnern — localhost trustas som insecure automatiskt. |
| `rcai` ger 502 | `agent-helm`-containern nere, eller fel forward-namn/port i NPM. |
| WS ansluter inte (UI loggar in men sessioner laddar ej) | Websockets Support av i NPM-hosten. Slå på. |
| Bygget kompilerar node-pty och failar | Ska inte hända — Dockerfilen filtrerar bort `daemon`. Om det sker: kontrollera `--filter`-raderna. |

View File

@@ -0,0 +1,28 @@
# Gitea Actions-runner (Docker) för Pi5 — bygger arm64-images nativt.
#
# Engångsregistrering: hämta en registrerings-token i Gitea
# Site Administration -> Actions -> Runners -> "Create new runner"
# och lägg den i en .env bredvid denna fil (Dockge: stackens env-flik):
# GITEA_RUNNER_REGISTRATION_TOKEN=xxxxxxxx
#
# Lägg denna fil + config.yaml i /srv/dockge-staks/act-runner/ och starta i Dockge.
services:
act-runner:
image: gitea/act_runner:latest
container_name: gitea-act-runner
restart: unless-stopped
networks:
- srv_default
environment:
GITEA_INSTANCE_URL: http://gitea-d:3000 # intern adress på srv_default
GITEA_RUNNER_REGISTRATION_TOKEN: ${GITEA_RUNNER_REGISTRATION_TOKEN}
GITEA_RUNNER_NAME: pi5-docker-runner
CONFIG_FILE: /config.yaml
volumes:
- /srv/docker/act-runner:/data # runner-state (persistent)
- /var/run/docker.sock:/var/run/docker.sock # bygg via värdens Docker
- ./config.yaml:/config.yaml:ro
networks:
srv_default:
external: true

View File

@@ -0,0 +1,20 @@
# act_runner-config. Nyckeln: job-containrar får värdens docker.sock så att
# `docker build` / `docker push` i workflowen kör mot Pi5:ans Docker-daemon,
# och localhost:5000 (registryn) trustas automatiskt.
log:
level: info
runner:
capacity: 1
# Label -> image som jobben körs i. catthehacker-imagen har node + docker-CLI.
labels:
- "ubuntu-latest:docker://catthehacker/ubuntu:act-latest"
- "ubuntu-22.04:docker://catthehacker/ubuntu:act-22.04"
container:
# Montera värdens docker.sock i varje job-container (för docker build/push).
options: "-v /var/run/docker.sock:/var/run/docker.sock"
valid_volumes:
- /var/run/docker.sock
# Job-containrar på srv_default så checkout når gitea-d:3000 internt.
network: srv_default

View File

@@ -0,0 +1,33 @@
# agent-helm control-plane + web-UI.
# Image byggs av Gitea Actions och hämtas från den lokala registryn.
# Uppdatera till senaste: Dockge -> denna stack -> "Update" (pull + recreate).
#
# Lägg i /srv/dockge-staks/agent-helm/ och starta i Dockge.
# Sätt en stark token i stackens .env (Dockge: env-flik):
# AGENT_HELM_TOKEN=<lång-slumpad-hemlighet>
x-dockge:
urls:
- https://rcai.brasse-pc.eu
services:
agent-helm:
image: localhost:5000/agent-helm-server:latest
container_name: agent-helm
restart: unless-stopped
expose:
- "8787" # NPM binder publikt; ingen host-port behövs
environment:
AGENT_HELM_TOKEN: ${AGENT_HELM_TOKEN}
PORT: "8787"
DATA_DIR: /app/data
volumes:
# Host-mountad config/data enligt övriga appars konvention (/srv/docker/<stack>).
# Containern kör som uid 1000 (node) = brasse på host, så filer blir brasse-ägda.
# Skapa katalogen först: mkdir -p /srv/docker/agent-helm
- /srv/docker/agent-helm:/app/data
networks:
- srv_default # så NPM kan nå containern på namn
networks:
srv_default:
external: true