No description
|
|
||
|---|---|---|
| .forgejo/workflows | ||
| .vs | ||
| bin/Debug/net9.0 | ||
| obj | ||
| Pages | ||
| Properties | ||
| wwwroot | ||
| .gitignore | ||
| appsettings.Development.json | ||
| appsettings.json | ||
| MinApp.csproj | ||
| MinApp.csproj.user | ||
| MinApp.sln | ||
| Program.cs | ||
| README.md | ||
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
pushtilmain→ build + test + deploy til TESTworkflow_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
rsyncover 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