Just another tasks/todo app. Public-facing Blazor Server, shipped as a Docker image, auto-deployed to Megaton via GHCR + WUD.
- .NET 11 + Blazor Server (InteractiveServer)
- MudBlazor 9.2.0 UI
- CheapHelpers 3.4.3 (Blazor / EF / Models)
- EF Core 10 — SQLite for dev, PostgreSQL (VAULT-TEC) for prod
- Serilog → Seq (
192.168.1.15:5341) - Docker — single image on GHCR
CheapTasks/
├── CheapTasks.slnx
├── CheapTasks.csproj # project in root, no src/
├── Program.cs
├── appsettings*.json
├── Components/
│ ├── App.razor
│ ├── Routes.razor
│ ├── Layout/MainLayout.razor
│ └── Pages/Home.razor
├── wwwroot/
├── Dockerfile
├── docker-compose.yml # Megaton runtime
├── .gitea/workflows/ # build + claude PR review (primary)
└── .github/workflows/ # mirror — CI + GHCR publish on tag
dotnet run --project CheapTasks.csprojApp listens on http://localhost:5273 (dev SQLite, no auth wired yet).
- Push to
main(Gitea, primary) → CI builds + tests - Tag
v*.*.*→ GitHub mirror picks it up →publish.ymlbuilds Docker image, pushes to GHCR (ghcr.io/cheapnud/cheaptasks:latest+ tagged version) - WUD on Megaton detects the new image (label
wud.watch=true) → pulls, recreates container, prunes old image
No SSH, no manual step. Same pattern as CheapNights / CheapManga.
- Primary git: Gitea (Sierra-Madre,
192.168.1.15:3000) - Mirror: GitHub (CheapNud)
- Image registry: GHCR (
ghcr.io/cheapnud/cheaptasks) - Runtime: Megaton VM (
/opt/blazor-apps/cheaptasks/, port5040:5000) - Database: VAULT-TEC PostgreSQL (
192.168.1.14:5432, dbcheaptasks)