How to setup a new Go project using Google Cloud Run and Cloud SQL.
$ gcloud components update
$ gcloud auth login
$ gcloud projects create <PROJECT_NAME>
$ gcloud config set project <PROJECT_NAME>
$ gcloud config set run/region <REGION>
$ mkdir <PROJECT_NAME>
$ cd <PROJECT_NAME>
$ gcloud run deploy <PROJECT_NAME> --source . --region <REGION>
I'm deploying from a Go project directory. In order for this to work you need to have a main.go
in the root of the project and all dependencies need to either be in the directory or publicly accessable on Github. This guide may help.
$ gcloud dns managed-zones create <PROJECT_NAME>-dns --dns-name <DOMAIN> --description "Example DNS"
$ gcloud dns managed-zones describe <PROJECT_NAME>-dns
Add the printed out nameservers to wherever the domain is being hosted.
$ gcloud domains verify <DOMAIN>
This will open a web browser and provide a code to be entered into the TXT record below.
$ gcloud beta dns record-sets transaction start --zone <PROJECT_NAME>-dns
$ gcloud beta dns record-sets transaction add <GOOGLE_VERIFICATION_CODE> --name "<DOMAIN>." --ttl 300 --type TXT --zone <PROJECT_NAME>-dns
$ gcloud beta dns record-sets transaction execute --zone <PROJECT_NAME>-dns
$ gcloud beta run domain-mappings create --service <PROJECT_NAME> --domain <DOMAIN>
This will print out IP addresses to be entered as DNS A records below.
$ gcloud beta dns record-sets transaction start --zone <PROJECT_NAME>-dns
$ gcloud beta dns record-sets transaction add <IPv4> <IPv4> <IPv4> --name "<DOMAIN>." --ttl 300 --type A --zone <PROJECT_NAME>-dns
$ gcloud beta dns record-sets transaction add <IPv6> <IPv6> <IPv6> --name "<DOMAIN>." --ttl 300 --type AAAA --zone <PROJECT_NAME>-dns
$ gcloud beta dns record-sets transaction execute --zone <PROJECT_NAME>-dns
$ gcloud services enable sqladmin.googleapis.com
$ gcloud sql instances create <PROJECT_NAME>-postgres --database-version POSTGRES_14 --tier db-f1-micro --region <REGION>
$ gcloud sql users set-password postgres --instance <PROJECT_NAME>-postgres --password <PASSWORD>
$ gcloud sql databases create <DATABASE_NAME> --instance <PROJECT_NAME>-postgres
$ cd <PROJECT_NAME>
$ gcloud run services update <PROJECT_NAME> --add-cloudsql-instances <PROJECT_NAME>-postgres
$ gcloud secrets create <PROJECT_NAME>-postgres-user --replication-policy automatic
$ gcloud secrets create <PROJECT_NAME>-postgres-password --replication-policy automatic
$ gcloud secrets create <PROJECT_NAME>-postgres-db --replication-policy automatic
$ echo -n "postgres" | gcloud secrets versions add <PROJECT_NAME>-postgres-user --data-file -
$ echo -n "<PASSWORD>" | gcloud secrets versions add <PROJECT_NAME>-postgres-password --data-file -
$ echo -n "<DATABASE_NAME>" | gcloud secrets versions add <PROJECT_NAME>-postgres-db --data-file -
$ gcloud run services update <PROJECT_NAME> \
--update-env-vars INSTANCE_CONNECTION_NAME=<PROJECT_NAME>:<REGION>:<PROJECT_NAME>-postgres \
--update-secrets DB_USER=<PROJECT_NAME>-postgres-user:latest \
--update-secrets DB_PASS=<PROJECT_NAME>-postgres-password:latest \
--update-secrets DB_NAME=<PROJECT_NAME>-postgres-db:latest
Follow tutorial: https://cloud.google.com/sql/docs/postgres/connect-admin-proxy#macos-64-bit
$ cloud_sql_proxy -instances=<PROJECT_NAME>:<REGION>:<PROJECT_NAME>-postgres=tcp:5432 -dir=/tmp
$ psql "host=127.0.0.1 port=5432 dbname=<DATABASE_NAME> user=postgres password=<PASSWORD> sslmode=disable"
$ cd <PROJECT_NAME>
$ gcloud run deploy <PROJECT_NAME> --source .
$ gcloud run services update <PROJECT_NAME> --update-secrets <ENV_VAR_NAME>=<SECRET_NAME>:latest
$ gcloud run services update <PROJECT_NAME> --remove-secrets <ENV_VAR_NAME>
$ gcloud projects delete <PROJECT_NAME>