Once the architecture is fully operational, the monthly maintenance burden is largely automated — the managed services (UpCloud Databases, Kubernetes, Object Storage) handle patching and backups. The non-trivial ongoing work is concentrated in the self-hosted services, security rotation, and data tier management. The table below lists every recurring activity, its typical effort, frequency, and responsible party.
Self-hosted service operational responsibilities
These are the services your team owns end-to-end. UpCloud keeps the Kubernetes nodes running; everything below is your responsibility.
| Service | What you own | Failure impact | Mitigation |
|---|---|---|---|
| RabbitMQ | Version upgrades · persistent volume backup · queue policy config · DLQ monitoring | HOT file processing stops — messages queue in client buckets until restored | Kubernetes restarts pod on crash. Persistent volume survives pod restart. DLQ alert fires within 60s of first failure. |
| Temporal server | PostgreSQL backend maintenance · version upgrades (migration scripts between versions) · worker count tuning · history retention policy | Contract actuals workflows and Contract IQ jobs cannot start new runs — in-flight workflows pause | Temporal is stateless compute; its state is in PostgreSQL. Back up PostgreSQL daily. Temporal version upgrades require running tctl schema update — document and test in staging first. |
| Trino cluster | Coordinator + worker pod health · memory tuning per query load · Iceberg catalog refresh · connector version alignment with Iceberg spec | Historical queries fail — portal falls back to Aurora read replica for recent data only. Tripcube jobs covering >24m data fail. | KEDA can scale Trino workers to zero when idle. Coordinator should always have at least 1 replica. Alerting on coordinator pod restarts. |
| Kong gateway | Route config updates for new tenants · plugin version upgrades · JWT key rotation · rate limit policy tuning | All portal and API access fails — total outage | Run 2 Kong replicas minimum. Kong is stateless in DB-less mode (config from Git). A pod restart picks up config in seconds. |
| HashiCorp Vault | Unseal on restart · root token rotation · audit log review · lease renewal monitoring · backup of encrypted secrets | All containers fail to start or rotate credentials — secrets unavailable until Vault is unsealed | Auto-unseal via UpCloud KMS or a Vault-native transit unseal. Never rely on manual unseal in production. Backup Vault snapshot to Object Storage daily. |
| Grafana + Loki + Tempo | Dashboard maintenance · alert rule updates · log retention policy · Tempo trace retention | Observability only — no impact on processing or portal | Lowest priority self-hosted service. Loki log retention set to 90 days. Tempo trace retention 30 days. Grafana config in Git. |
Full monthly maintenance schedule
| Activity | Frequency | Effort | Owner | Notes |
|---|---|---|---|---|
| Automated — no manual action required | ||||
| UpCloud Managed Databases backup | Daily (automated) | Auto | UpCloud | Point-in-time recovery up to 7 days. Verify restore works quarterly. |
| UpCloud Kubernetes node patching | Managed rolling update | Auto | UpCloud | UpCloud patches worker nodes. Pod disruption budget ensures zero downtime during rolling update. |
| Vault dynamic database credential rotation | Every 30 days (automated) | Auto | Vault | Quarkus containers pick up new credentials automatically via Vault agent sidecar. |
| Nightly ETL — Aurora → Iceberg | Nightly (automated) | Auto | Spark/Glue | Monitor row count reconciliation alert. If ETL fails, Aurora grows — alert fires after 48h gap. |
| Iceberg compaction + snapshot expiry | Weekly (automated) | Auto | Spark job | Runs CALL system.rewrite_data_files() and expire_snapshots(). Keeps Parquet files at optimal size and physically removes GDPR-deleted rows. |
| DLQ monitoring + Grafana alerts | Continuous (automated) | Auto | Grafana | Alert fires within 60s of DLQ message. On-call engineer investigates. Most failures self-resolve on retry. |
| Temporal workflow history cleanup | Daily (automated) | Auto | Temporal | Retention policy set to 30 days for completed workflows, indefinite for failed workflows requiring investigation. |
| Weekly — low effort | ||||
| DLQ review — failed HOT file messages | Weekly | 30 min | DevOps | Review any messages in DLQ not auto-resolved. Check Temporal dashboard for stuck workflows. Re-queue or escalate. |
| Grafana dashboard review | Weekly | 20 min | DevOps | Review processing latency trends, DB connection pool utilisation, Trino query times, KEDA scaling events. |
| WORM audit log integrity check | Weekly | 15 min | DevOps | Verify Object Storage WORM policy still active on audit bucket. Check log ingestion rate has not dropped unexpectedly. |
| Monthly — moderate effort | ||||
| Kubernetes Helm chart upgrades | Monthly | 2–3 hrs | DevOps | Review Helm chart releases for RabbitMQ, Kong, Temporal, Grafana stack, Trino. Test upgrades in staging before production rollout. |
| Container image base layer updates | Monthly | 1–2 hrs | DevOps + Backend | Rebuild all Quarkus container images against latest UBI base. Run full CI/CD pipeline. Catches OS-level CVEs in base images. |
| Vault snapshot backup verification | Monthly | 30 min | DevOps | Restore Vault snapshot to test instance and verify all secrets are accessible. Confirms backup is valid, not just present. |
| UpCloud Managed Databases restore test | Monthly | 1 hr | DevOps | Restore prior day backup to isolated test instance. Run schema validation and row count checks. Confirm RTO is within SLA. |
| Iceberg partition statistics refresh | Monthly | 20 min | DevOps | Run ANALYZE TABLE equivalent via Trino to refresh partition statistics. Keeps Trino query planning accurate as data grows. |
| Tripcube output file cleanup | Monthly | Auto + 10 min | DevOps | Object Storage lifecycle policy expires signed-URL report files after 30 days. Verify policy is active and bucket size is stable. |
| AI model performance review | Monthly | 2 hrs | Backend | Compare prediction inference results against actual contract outcomes for the prior month. Trigger model retrain if MAPE >15% on tier prediction. |
| Security — dependency vulnerability scan | Monthly | 1–2 hrs | Backend | Run mvn dependency-check:check across all Quarkus services. Triage CVSS >7.0 CVEs. Patch and redeploy within 7 days for critical findings. |
| JWT key rotation — per-tenant | Monthly (or on request) | 30 min | DevOps | Rotate JWT signing keys in Vault. Kong picks up new key on next config sync. Old key remains valid for 1hr overlap window to drain in-flight requests. |
| Quarterly — higher effort | ||||
| Temporal server version upgrade | Quarterly | 4–6 hrs | DevOps + Backend | Most operationally complex upgrade. Temporal requires sequential version upgrades (no version skipping). Run schema migration via tctl. Test all workflow types in staging before production. Keep previous version image available for 48hr rollback window. |
| Quarkus + GraalVM version upgrade | Quarterly | 3–5 hrs | Backend | GraalVM native compilation is sensitive to library version changes. Test native compilation in staging. Some reflection config may need updating. Run full test suite including Testcontainers integration tests. |
| Full DR (disaster recovery) drill | Quarterly | 4 hrs | DevOps | Simulate loss of primary DB instance. Measure failover time to read replica promotion. Simulate loss of Vault — test auto-unseal. Document RTO and compare against SLA. Fix any gaps found. |
| GDPR data audit | Quarterly | 2–3 hrs | Backend + DevOps | Verify tenant data residency — confirm no EU data in APAC buckets or vice versa. Process any outstanding right-to-erasure requests via Iceberg row-level delete. Confirm compaction has physically removed deleted rows from prior quarter. |
| AI model retrain | Quarterly (or on trigger) | 3 hrs | Backend | Retrain prediction model on latest 3 years of Iceberg data. Evaluate against holdout set. Deploy new model version if validation MAPE improves. Keep prior version for 30-day rollback. |
Routine weekly activities: approximately 1 hour per week. Monthly tasks: approximately 10–14 hours per month total across the team. Quarterly tasks (amortised): approximately 5–6 hours per month equivalent. Total ongoing platform maintenance estimate: 15–20 engineer-hours per month once fully operational — the majority of which is Helm upgrades, security scanning, and the Temporal version upgrade cadence.