Resolver - Resolver.resolve_range/3: returns the contiguous on-call segments for a schedule across [start_at, end_at). Walks layer handoffs + override boundaries, drops gap segments, and merges adjacent same-user segments. UserColor module - New Towerops.OnCall.UserColor with deterministic id -> color mapping (Tailwind class + matching #RRGGBB hex). Refactored ScheduleLive.Show to use it instead of its own per-page index palette so the same person gets the same color across the schedules list and detail pages. ScheduleLive.Index - Date navigation: Today / prev / next + 1/2/4-week range selector. - URL-driven: ?start=YYYY-MM-DD&range=N for shareable views; falls back to defaults on malformed values. - Per-row card: schedule name link, on-call-now avatar swatch, day-of-week header strip, gantt strip rendered as a CSS grid with one column per day, Today marker overlay. Tests: 5 new resolver tests, 9 new UserColor tests, 5 new ScheduleLive integration tests. Full suite: 10,210 / 0 failures. Format/dialyzer clean. Also: cleaned up two stale inline comments in k8s/deployment.yaml that disagreed with the values they sat next to (replicas/maxSurge). |
||
|---|---|---|
| .. | ||
| base-image | ||
| certificate.yaml | ||
| deployment.yaml | ||
| Dockerfile | ||
| flux.yaml | ||
| ingressroute.yaml | ||
| kustomization.yaml | ||
| namespace.yaml | ||
| poddisruptionbudget.yaml | ||
| README.md | ||
| service-headless.yaml | ||
| service.yaml | ||
| traefik-security-headers-middleware.yaml | ||
Kubernetes Deployment
Secrets Management
Secrets are managed directly in the cluster and must be created before deploying the application.
Required secrets in the towerops namespace:
gitlab-registry- Docker registry credentials for pulling imagestowerops-secrets- Application secrets (RELEASE_COOKIE, SECRET_KEY_BASE)towerops-db- Database connection credentialstowerops-aws- AWS credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION)
For local development, the project root .envrc is used by direnv.
Deployment Timestamp
The application footer displays the deployment timestamp to track when the current version was deployed. This is automatically set by GitLab CI during deployment:
# GitLab CI sets this during deploy
- kubectl set env deployment/towerops DEPLOY_TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -n towerops
All pods in the deployment share the same timestamp (when the deployment was initiated), regardless of when individual pods were created. This is displayed in the footer as "Last deployed X ago · YYYY-MM-DD HH:MM:SS UTC".
For manual deployments without GitLab CI, set the timestamp:
kubectl set env deployment/towerops DEPLOY_TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ") -n towerops
Deploying
Apply all resources using kustomize:
kubectl apply -k k8s/
Or individually:
kubectl apply -f k8s/namespace.yaml
kubectl apply -f k8s/secret.yaml
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
kubectl apply -f k8s/service-headless.yaml
kubectl apply -f k8s/certificate.yaml
kubectl apply -f k8s/ingressroute.yaml