Files
klz-cables.com/docs/PLATFORM.md
2026-01-17 15:44:22 +01:00

3.0 KiB

Mintel Alpha Platform — Developer Cheat Sheet

This platform runs real customer websites on their own domains
(e.g. klz-cables.com, marisas.world, shop.customer.de).

You do not manage servers.
You ship Docker containers.
Mintel runs the platform.


Control Plane (Infra)

Internal services (developers only):

Git (Gitea)
https://git.infra.mintel.me

CI (Gitea Actions)
https://git.infra.mintel.me/actions

Container Registry
https://registry.infra.mintel.me

Error Tracking (GlitchTip)
https://errors.infra.mintel.me

Analytics (Umami)
https://analytics.infra.mintel.me

Uptime
https://status.infra.mintel.me

Logs (Dozzle)
https://logs.infra.mintel.me


Production Platform (Alpha)

Alpha runs all customer websites and is publicly reachable.

  • Listens on ports 80 / 443
  • Runs Traefik
  • Routes real domains
  • Is isolated from Infra

Customer DNS A records point to the Alpha server IP.


Routing (Traefik)

Routing is host-based.

Each service declares its domains via labels:

labels:

  • traefik.enable=true
  • traefik.http.routers.app.rule=Host(example.com,www.example.com)
  • traefik.http.routers.app.entrypoints=websecure
  • traefik.http.routers.app.tls.certresolver=le
  • traefik.http.services.app.loadbalancer.server.port=3000

Traefik:

  • terminates TLS
  • auto-issues certificates
  • supports zero-downtime deploys

Directory layout on Alpha

Each app lives in:

/opt/alpha/sites/APP_NAME

Contains:

docker-compose.yml
.env (optional)
content/
db/


Container Images

All production images are built by CI and pushed to the Mintel Registry.

Registry: registry.infra.mintel.me

Naming: registry.infra.mintel.me/ORG/APP_NAME:TAG

Example: registry.infra.mintel.me/mintel/mb-grid-solutions:latest


Databases

Postgres (shared)

One Postgres server, many databases.

Connection format: postgres://infra:infra@postgres:5432/APP_DB

Each app must use its own database.


Redis (shared)

One Redis instance, multiple DB indexes.

redis://redis:6379/1
redis://redis:6379/2

Each app must use its own DB number.


Health checks (required)

Every public service must expose:

GET /health → 200 OK when ready

Used by Traefik for zero-downtime routing.


Error Tracking (GlitchTip)

Each app gets a DSN:

https://PUBLIC_KEY@errors.infra.mintel.me/PROJECT_ID

Set as: SENTRY_DSN


Analytics (Umami)

Each site gets a website ID.

Include:

https://analytics.infra.mintel.me/script.js
data-website-id=YOUR_ID


Deployment (Gitea Actions)

Flow:

  • Push to main
  • CI builds image
  • Image pushed to registry
  • Alpha pulls and runs
  • Traefik routes traffic

Deploy target: deploy@alpha.mintel.me


Monitoring

Errors → GlitchTip
Traffic → Umami
Logs → Dozzle
Uptime → Uptime-Kuma

Infra monitors everything.


Summary

You push code
CI builds images
Registry stores images
Alpha runs containers
Traefik routes domains
Databases are shared but isolated
Deploys are zero-downtime
Everything is monitored

This is a real production platform.