Deploy on Google Cloud
Run Elixium on Google Cloud Platform using Cloud Run for containers, Cloud SQL for PostgreSQL, and Cloud Storage for objects. This guide covers a production-ready deployment using managed GCP services.
Prerequisites
- GCP project with billing enabled
- gcloud CLI configured (
gcloud auth login) - Docker installed locally (for image pull/push)
- Elixium enterprise license key
Architecture Overview
| Component | GCP Service | Notes |
|---|---|---|
| Frontend + API | Cloud Run | Fully managed, scales to zero |
| Database | Cloud SQL (PostgreSQL 16) | Managed backups, HA optional |
| File Storage | Cloud Storage (GCS) | S3-compatible interop API |
| Authentication | Cloud Run (Keycloak) | Backed by Cloud SQL |
| AI Inference | Gemini (default), OpenAI, Azure OpenAI, or Ollama (external GPU) | Cloud AI provider or self-hosted Ollama |
| Container Registry | Artifact Registry | Mirror images from GHCR |
Step 1: Mirror Container Images
Pull the Elixium images from GHCR and push them to Artifact Registry:
# Create Artifact Registry repository gcloud artifacts repositories create elixium \ --repository-format=docker \ --location=<region> # Authenticate to GHCR and pull docker login ghcr.io docker pull ghcr.io/indirecttek/elixium-app:latest docker pull ghcr.io/indirecttek/elixium-api:latest # Tag and push to Artifact Registry gcloud auth configure-docker <region>-docker.pkg.dev docker tag ghcr.io/indirecttek/elixium-app:latest \ <region>-docker.pkg.dev/<project>/elixium/elixium-app:latest docker tag ghcr.io/indirecttek/elixium-api:latest \ <region>-docker.pkg.dev/<project>/elixium/elixium-api:latest docker push <region>-docker.pkg.dev/<project>/elixium/elixium-app:latest docker push <region>-docker.pkg.dev/<project>/elixium/elixium-api:latest
Step 2: Provision Infrastructure
Cloud SQL (PostgreSQL)
gcloud sql instances create elixium-db \ --database-version=POSTGRES_16 \ --tier=db-custom-2-4096 \ --region=<region> \ --root-password=<your-secure-password> gcloud sql databases create elixium --instance=elixium-db gcloud sql users create elixium \ --instance=elixium-db \ --password=<your-secure-password>
Cloud Storage Bucket
gsutil mb -l <region> gs://elixium-uploads-<your-org> # Create HMAC key for S3-compatible access gsutil hmac create <service-account-email>
Step 3: Deploy Cloud Run Services
Deploy each service to Cloud Run. Cloud Run provides automatic TLS, scaling, and load balancing:
Keycloak
gcloud run deploy keycloak \ --image=quay.io/keycloak/keycloak:23.0 \ --port=8080 \ --memory=2Gi --cpu=1 \ --min-instances=1 \ --set-env-vars="KC_DB=postgres,KC_HTTP_ENABLED=true,KC_HEALTH_ENABLED=true" \ --set-env-vars="KC_HOSTNAME_STRICT=false" \ --add-cloudsql-instances=<project>:<region>:elixium-db \ --command="start","--import-realm","--health-enabled=true" \ --region=<region> \ --allow-unauthenticated
Elixium API
gcloud run deploy elixium-api \ --image=<region>-docker.pkg.dev/<project>/elixium/elixium-api:latest \ --port=3001 \ --memory=2Gi --cpu=1 \ --min-instances=1 \ --set-env-vars="ELIXIUM_MODE=local,NODE_ENV=production" \ --set-env-vars="KEYCLOAK_URL=<keycloak-cloud-run-url>" \ --set-env-vars="KEYCLOAK_REALM=elixium" \ --set-env-vars="AI_PROVIDER=gemini" \ --set-env-vars="MINIO_ENDPOINT=storage.googleapis.com" \ --set-secrets="DATABASE_URL=elixium-db-url:latest" \ --set-secrets="ELIXIUM_LICENSE_KEY=elixium-license:latest" \ --set-secrets="KEYCLOAK_CLIENT_SECRET=keycloak-secret:latest" \ --add-cloudsql-instances=<project>:<region>:elixium-db \ --region=<region> \ --allow-unauthenticated
Elixium App (Frontend)
gcloud run deploy elixium-app \ --image=<region>-docker.pkg.dev/<project>/elixium/elixium-app:latest \ --port=3000 \ --memory=1Gi --cpu=1 \ --min-instances=1 \ --set-env-vars="ELIXIUM_MODE=local,NODE_ENV=production" \ --set-env-vars="NEXT_PUBLIC_ELIXIUM_MODE=local" \ --set-env-vars="NEXT_PUBLIC_KEYCLOAK_URL=<keycloak-cloud-run-url>" \ --region=<region> \ --allow-unauthenticated
Step 4: Custom Domain & DNS
# Map custom domain to Cloud Run gcloud run domain-mappings create \ --service=elixium-app \ --domain=elixium.yourcompany.com \ --region=<region> # Add the CNAME record shown in the output to your DNS provider
Estimated Monthly Cost
| Service | Configuration | Est. Cost |
|---|---|---|
| Cloud Run (3 services) | App + API + Keycloak, min 1 instance | ~$70 |
| Cloud SQL | db-custom-2-4096, 20GB SSD | ~$50 |
| Cloud Storage | Standard, minimal usage | <$1 |
| AI Provider (optional GPU) | Gemini API or Ollama on GCE with T4 | $0–$300 |
| Total (without GPU) | ~$150/mo | |
Budget Option: Single GCE Instance (~$30/mo)
For small teams (under 10 users), you can run all Elixium services on a single Compute Engine instance using the same Docker Compose setup from the self-hosted guide. This eliminates the cost of Cloud Run, Cloud SQL, and other managed services.
Terraform via Command Center (Coming Soon)
Terraform modules for GCP are on the roadmap. Once available, you'll be able to download a pre-configured deployment bundle from your Elixium Command Center (Settings → Deployment → Download Bundle) — the same workflow available today for AWS. In the meantime, use the manual setup below.
Manual Setup
Launch a GCE instance and follow the Self-Hosted (Docker) guide:
# 1. Create firewall rule gcloud compute firewall-rules create allow-elixium \ --allow=tcp:80,tcp:443,tcp:3000 \ --target-tags=http-server # 2. Launch the instance gcloud compute instances create elixium \ --machine-type=e2-medium \ --zone=<zone> \ --image-family=ubuntu-2204-lts \ --image-project=ubuntu-os-cloud \ --boot-disk-size=30GB \ --tags=http-server,https-server # 3. SSH in and install Docker gcloud compute ssh elixium --zone=<zone> sudo apt-get update && sudo apt-get install -y docker.io docker-compose-v2 sudo systemctl enable --now docker # 4. Follow the Self-Hosted (Docker) guide from here
| Service | Configuration | Est. Cost |
|---|---|---|
| Compute Engine | e2-medium (2 vCPU, 4GB RAM) | ~$25 |
| Boot Disk | 30GB pd-balanced | ~$3 |
| Static IP | Regional external IP | ~$3 |
| Total | ~$31/mo | |
Trade-offs: No auto-scaling, no managed database backups (set up pg_dump cron), and a single point of failure. Great for getting started — you can migrate to the managed architecture above as your team grows.
Need help with your GCP deployment? Contact [email protected] or back to self-hosted docs.
