How to deploy a new region
The following steps are needed to provision a new region/cluster
Steps needed before terraform can runβ
deepdesk-gcpβ
If grafana is required, add the hostname of the new grafana instance to the existing OAuth credentials in "deepdesk-cloud" project, named "Deepdesk SSO" and "Deepdesk SSO Staging"
- Create the new project in onboarding.deepdesk.com
- Remove the 'Editor' role from the default compute service account in the new project
- Add a new unique subnet number to the hash in deepdesk-gcp/modules/vpc/subnetworks.tf
- Add the project to Vanta's "scope" (in integrations β google cloud)
gcloud projects create --organization=467147383583 --set-as-default --name=deepdesk-sg-staging deepdesk-sg-staging
gcloud beta billing projects link deepdesk-sg-staging --billing-account=012DAF-614773-4E8BB1
gcloud compute project-info add-metadata --metadata google-compute-default-region=asia-southeast1
gcloud services enable compute.googleapis.com
gcloud services enable cloudbuild.googleapis.com
gcloud services enable secretmanager.googleapis.com
gcloud services enable servicenetworking.googleapis.com
gcloud config set compute/region asia-southeast1
terraform init
terraform workspace new deepdesk-sg-staging
terraform import module.logging.google_logging_project_sink.default-logging-sink projects/deepdesk-sg-staging/sinks/_Default
-
Manually create a Cloud Build private worker pool:
- Go to: https://console.cloud.google.com/cloud-build/settings/worker-pool
- Click 'Create', and fill out the form as follows:
- Name: e2-medium
- Region: europe-west4 (yes, this is fixed for every project)
- Machine type: e2-medium
- Disk size: 100G
- Project:
<id of the newly created project> - Network: "default"
- Assign external IPs: enabled
-
Create a secret 'vpn_private_key' that will be used for the VPN gateway:
wg genkey | tee privatekey | wg pubkey > publickey- Store te contents of 'privatekey' in the vpn_private_key secret
- Publish the public key in the VPN setup guide (document not migrated)
deepdesk-gcpβ
- Create a slack notification channel #alerting (requires OAuth flow with Slack). Display name must be "Slack Alerting Channel"
- After creation of the cloudsql instance, set the postgres user password (Console -> DB Instance -> Users -> postgress -> Change password) to the password set in the "postgres_db_password" secret.
- Create a ElasticSearch AppSearch admin key:
https://kibana.<region_subdomain>.deepdesk.com/. Create a new google secret manager secret called 'appsearch_admin_key' and set the value to the admin token. - Run the following commands in order in the deepdesk-gcp repo (terraform doesn't handle CRD deps properly):
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.apis
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.vpc
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.cmek
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.gke_private_cluster
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.prometheus
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.cert-manager.helm_release.cert-manager
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.cert-manager
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.external-dns
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.istio.helm_release.istio-operator
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.istio
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.external-secrets.helm_release.external-secrets
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.external-secrets
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.flux
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.rabbitmq.helm_release.rabbitmq_cluster_operator
DEBUG=1 ./terraform/projects/per-project/run.sh `<project>` apply -target=module.rabbitmq
Further Onboardingβ
- Manually trigger all cloud build triggers in the new project to deploy cloud functions, kubeflow pipelines, etc.
- Register github webhook to flux webhook url (
kubectl get receivers.notification.toolkit.fluxcd.io) on repo deepdesk-config and deepdesk-helmcharts. WebHook secret in flux/github-webhook-token k8s secret. - Add the outbound NAT IP to the gmail smtp relay whitelist
- Add the cluster public IP to the Tailscale ACL/grant configuration