234 lines
4 KiB
Markdown
234 lines
4 KiB
Markdown
# 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
|
||
|
||
|