This is my personal website project. It is built using Astro and hosted as a monolithic container on Scaleway Cloud. Go and check it out at https://clowa.dev.
swa/— Frontend code of the website (Astro)api/— Go backend service (serves/api/*, e.g.GET /api/quote)docker/- Configuration of the monolithic docker container
To run the project locally, make sure you have Node.js installed — or simply use the provided DevContainer.
For simplicity you can use the provided Taskfile to run common tasks.
task init-devcontainer
- Sets up the project by setting permissions and installing dependencies
- Should be run once after starting a new devcontainer or codespaces instance
task dev
- Starts Astro's development server with live reloading
- Available at
http://localhost:4321
task build
- Builds the static site to
swa/dist/
The project ships as a single container image whose two content-serving technical components together deliver three logical components, alongside a supporting OpenTelemetry Collector for observability.
Logical components — what the site is made of:
| # | Component | What it is | Lives in |
|---|---|---|---|
| 1 | Static website | The Astro site (pages, assets), pre-built to static files | swa/ |
| 2 | REST API | A Gin + Go service serving dynamic content (GET /api/quote) |
api/ |
| 3 | Redirects | Domain → domain 301 rules (one file per source host) | docker/caddy/redirects/ |
Technical components — the processes that run inside the container:
- Caddy — the web server. Serves the static files, reverse-proxies the API, and performs the redirects. It runs as the container's primary process.
- Go REST API — a single static binary that serves the dynamic content. It is served through caddy.
- OpenTelemetry Collector — a supporting process that gathers traces, metrics, and logs from the other two and forwards them to Middleware. See
AGENTS.md→ Observability.
See LESSONS_LEARNED.md.