# MinApp – Self-hosted .NET Web App (Forgejo CI/CD) Dette repository indeholder **MinApp**, en ASP.NET Core webapplikation, deployet **DevOps-style** til en Ubuntu-server ved hjælp af: - Forgejo (Git hosting + CI) - Forgejo Runner (Docker) - Caddy (reverse proxy) - systemd (services) - **Self-contained .NET publish** (ingen runtime på serveren) Målet er: > Push → build → test → deploy til TEST > Manuel trigger → deploy til PROD Uden IIS, uden Azure DevOps, uden runtime-rod. --- ## 🧱 Arkitektur (overblik) ``` Developer PC │ │ git push ▼ Forgejo (192.168.1.63:3000) │ │ Actions workflow ▼ Forgejo Runner (Docker) │ │ dotnet publish (self-contained) │ rsync + ssh ▼ Ubuntu Webserver (24.04) ├─ systemd service (minapp / minapp-test) ├─ Kestrel (127.0.0.1:5000 / 5001) └─ Caddy → [http://app.jarjarbinks](http://app.jarjarbinks) / [http://test.jarjarbinks](http://test.jarjarbinks) ```` --- ## 🖥️ Server-setup (kort) ### OS - Ubuntu **24.04 LTS** - Arkitektur: **x86_64 / linux-x64** ### Reverse proxy - **Caddy** - Port 80/443 → reverse proxy til Kestrel ### App services - `/opt/minapp/app` (prod) - `/opt/minapp-test/app` (test) - Kører som bruger: `minapp` - Styres via `systemd` ### Vigtigt designvalg App’en deployes som **self-contained**: - Ingen .NET runtime installeres på serveren - CI bygger en Linux-x64 binary - OS og .NET-versioner er fuldstændig afkoblet --- ## 🔁 CI/CD Flow (Forgejo Actions) ### Trigger - `push` til `main` → build + test + deploy til **TEST** - `workflow_dispatch` → manuel deploy til **PROD** ### Runner - Kører som Docker runner - Base image: `node:20-bookworm` - kræves af Forgejo/GitHub actions (Node) --- ## ⚙️ Workflow (`.forgejo/workflows/cicd.yml`) Nøglepunkter: ```yaml dotnet publish -c Release \ -r linux-x64 \ --self-contained true \ -o out ```` * Output indeholder en executable: `MinApp` * Filer kopieres via `rsync` over SSH * systemd service genstartes efter deploy --- ## 🔐 Secrets (Forgejo) Repo → **Settings → Actions → Secrets** | Navn | Beskrivelse | | ---------------- | -------------------------------- | | `DEPLOY_HOST` | Webserver IP (fx `192.168.1.43`) | | `DEPLOY_USER` | `deploy` | | `DEPLOY_SSH_KEY` | Private SSH key til deploy | --- ## 🧑‍💻 systemd services ### Test `/etc/systemd/system/minapp-test.service` ```ini [Service] WorkingDirectory=/opt/minapp-test/app ExecStart=/opt/minapp-test/app/MinApp Environment=ASPNETCORE_URLS=http://127.0.0.1:5001 Environment=ASPNETCORE_ENVIRONMENT=Staging User=minapp Restart=always ``` ### Prod Samme opsætning, men: * Port `5000` * `Production` * `/opt/minapp/app` --- ## 🌐 Caddy config ```caddy http://test.jarjarbinks { reverse_proxy 127.0.0.1:5001 } http://app.jarjarbinks { reverse_proxy 127.0.0.1:5000 } ``` --- ## 🧪 Lokale tests på serveren ```bash curl http://127.0.0.1:5001 curl http://127.0.0.1:5000 ``` Hvis disse virker, vil Caddy også virke. --- ## 🚀 Deploy-guide ### Deploy til TEST ```bash git push origin main ``` ### Deploy til PROD * Forgejo → Actions * Vælg workflow * **Run workflow** --- ## 🛠️ Fejlfinding ### Service status ```bash sudo systemctl status minapp-test sudo journalctl -u minapp-test -n 100 ``` ### Runner status ```bash sudo systemctl status forgejo-runner sudo journalctl -u forgejo-runner -n 100 ``` ### Ports ```bash ss -lntp | grep 500 ``` --- ## 🧠 Design rationale (why this setup) * **Self-contained publish** → ingen runtime-helvede, nem OS-opgradering * **systemd fremfor Docker i prod** → simpelt, stabilt, nem debugging * **Caddy fremfor Nginx** → minimal config, automatisk TLS senere * **Forgejo fremfor Azure DevOps** → fuld kontrol, ingen cloud-afhængighed --- ## 📌 Næste mulige skridt * HTTPS med rigtigt domæne * Blue/green deploy * Health checks * Logs → Loki / Grafana * Secrets via environment variables --- ## 👤 Author Janus Homelab / self-hosted DevOps setup