Platform architecture¶
Forgejo organizations¶
| Org / namespace | Repos | Purpose |
|---|---|---|
infra |
devops |
VPS platform (Traefik, Forgejo, Woodpecker, Plane, Uptime Kuma, Netdata, DefectDojo) |
rafael.gonzalez.albes |
portfolio |
Principal site — rafaelgonzalezalbes.com |
bioscan |
bioscancheck (paused — not deployed) |
Legacy product org; repo may exist, not in active CI/monitoring |
Git source of truth: Forgejo only (git.rafaelgonzalezalbes.com).
Servers¶
| Server | IP | Role |
|---|---|---|
| Infra VPS | 85.215.32.166 |
Platform only (Forgejo, Woodpecker server, Uptime Kuma, Netdata, DefectDojo, docs) |
| Apps VPS | 82.165.177.110 |
Application runtime (WearLab live; DroneColonies, cat tree planned) — Traefik + /opt/apps |
| IONOS web hosting | — | Static frontends (portfolio SFTP) + apex/www |
SSH aliases after local setup: bioscan-vps (infra — legacy alias name), apps-vps (apps). Details: Apps VPS.
Future hosting (not started)
Planned move off IONOS compute + web hosting to Hetzner dual VPS, Cloudflare DNS, and portfolio on infra: Migrate VPS off IONOS. Cost notes: Products, domains & legal.
Product portfolio, subdomain vs branded-domain strategy, and legal phases: Products, domains & legal.
Planned platform capability — idea intake → approve → ticket → PR → CI → ship: Idea → Done conductor · Implementation Blueprint.
Idea → Done Conductor (ship.*)
Central orchestrator status: Architecture & Blueprint v1.1.0 complete. Phase 1 Golden-Path dry-run verified. Target host: ship.rafaelgonzalezalbes.com.
Plane stack
Plane UI (pm.*), bridge (bridge.*), and MCP (mcp.*) DNS still point at the infra VPS, but deploy-platform.sh skips the Plane stack by default (ENABLE_PLANE_STACK=false). Re-enable when ready: ENABLE_PLANE_STACK=true bash scripts/deploy-platform.sh on the infra VPS.
HTTPS versions (TLS / HTTP/2 / HTTP/3): TLS and HTTP versions.
DNS (IONOS)¶
Infra VPS — 85.215.32.166¶
| Host | Target | Service |
|---|---|---|
git |
Infra VPS | Forgejo |
ci |
Infra VPS | Woodpecker UI |
ci-grpc |
Infra VPS | Woodpecker gRPC for remote agents (optional; tunnel mode works without DNS) |
pm |
Infra VPS | Plane |
mcp |
Infra VPS | Plane MCP server (Cursor) |
bridge |
Infra VPS | plane-forge-bridge (Forgejo ↔ Plane) |
status |
Infra VPS | Uptime Kuma |
metrics |
Infra VPS | Netdata (host + Docker metrics) |
security |
Infra VPS | DefectDojo |
secrets |
Infra VPS | Infisical (secrets manager) |
docs |
Infra VPS | MkDocs static site |
apex / www |
IONOS | Portfolio (and other static sites) |
Apps VPS — 82.165.177.110¶
| Host | Target | Service |
|---|---|---|
wearlab |
Apps VPS | WearLab (alex/wearlab-main) — live |
bioscan |
— | BioScanCheck — not deployed (do not point DNS) |
dronecolonies |
Apps VPS | DroneColonies (planned) |
cats |
Apps VPS | Cat tree (planned) |
Full IONOS click-through steps: DNS.
VPS paths¶
| Path | Source repo |
|---|---|
/opt/devops |
infra/devops (infra VPS) |
/opt/devops/site |
MkDocs build output (nginx on infra VPS) |
/opt/apps/{app} |
Per-app deploy/ on apps VPS |
CI/CD flows¶
Woodpecker server stays on the infra VPS; agents are split by workflow labels (infra-vps vs apps-vps). See Woodpecker agents.
Static site (portfolio)¶
flowchart LR
Push[push main] --> WP[Woodpecker]
WP --> Build[npm build]
Build --> SFTP[SFTP upload]
SFTP --> IONOS[IONOS dist]
IONOS --> Site[rafaelgonzalezalbes.com]
Woodpecker does not deploy through the VPS filesystem for static sites — it SFTPs directly to IONOS.
Full-stack (wearlab)¶
flowchart LR
Push[push main] --> WP[Woodpecker apps-vps agent]
WP --> Test[npm test / docker build]
Test --> FE[SFTP frontend dist optional]
Test --> Docker[build-push image]
Docker --> SSH[SSH docker compose pull]
SSH --> Apps[/opt/apps on apps VPS]
Woodpecker build steps run on the apps VPS agent (labels: location: apps-vps). Deploy uses SSH to deploy@82.165.177.110.
Observability (centralized)¶
Do not run duplicate status.*, metrics.*, or security.* on the apps VPS or IONOS. One stack on the infra VPS covers both servers:
| Tool | URL | Host | Covers |
|---|---|---|---|
| Uptime Kuma | status.* |
Infra VPS | HTTP/ping/TCP for platform + both VPSes + app URLs |
| Netdata | metrics.* |
Infra VPS (parent) | Host + Docker metrics; apps VPS streams as child |
| DefectDojo | security.* |
Infra VPS | CI scan findings from all repos (infra + apps agents) |
IONOS hosts static sites only (portfolio SFTP) — it cannot run these tools.
flowchart LR
subgraph infra [Infra VPS]
Kuma[status.*]
Netdata[metrics.* parent]
DD[security.*]
end
subgraph apps [Apps VPS]
AppsStacks[wearlab bioscan …]
NDChild[Netdata child]
end
Kuma -->|probes| infra
Kuma -->|probes| apps
NDChild -->|stream :19999| Netdata
Woodpecker[Woodpecker CI] -->|upload scans| DD
Runbooks: Monitoring · Metrics · Security scanning
Platform (infra/devops)¶
flowchart LR
Push[push main] --> WP[Woodpecker]
WP --> Docs[mkdocs build]
Docs --> Rsync[rsync to VPS]
Rsync --> Deploy[deploy-platform.sh]
Deploy --> Stack[Traefik Forgejo Woodpecker Kuma Netdata DefectDojo bridge MCP docs]
Public discoverability¶
| Asset | Hosted on | Search engines |
|---|---|---|
| Portfolio website | IONOS | Allowed — index, follow, sitemap |
Platform tools (git, ci, pm, status, metrics, security, mcp, bridge, docs) |
VPS | Blocked — Traefik noindex middleware |
| Portfolio git repo | Forgejo | Public — browsable without login |
Other git repos (bioscan/*, infra/*) |
Forgejo | Private — login required |
Portfolio git repo is public on Forgejo; the built site on IONOS is also public.