minapp/README.md
Janus C. H. Knudsen 50c1024276
All checks were successful
cicd / build_test_publish_deploy_test (push) Successful in 1m53s
cicd / deploy_prod_manual (push) Has been skipped
Adddds readdme
2026-01-29 23:30:02 +01:00

4 KiB
Raw Blame History

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

Appen 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:

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

[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

http://test.jarjarbinks {
    reverse_proxy 127.0.0.1:5001
}

http://app.jarjarbinks {
    reverse_proxy 127.0.0.1:5000
}

🧪 Lokale tests på serveren

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

git push origin main

Deploy til PROD

  • Forgejo → Actions
  • Vælg workflow
  • Run workflow

🛠️ Fejlfinding

Service status

sudo systemctl status minapp-test
sudo journalctl -u minapp-test -n 100

Runner status

sudo systemctl status forgejo-runner
sudo journalctl -u forgejo-runner -n 100

Ports

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