<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ohcnwiki.tellmey.fyi/index.php?action=history&amp;feed=atom&amp;title=Deployment%2FProviders%2FGcp%2FDeploying_Care_on_GKE</id>
	<title>Deployment/Providers/Gcp/Deploying Care on GKE - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://ohcnwiki.tellmey.fyi/index.php?action=history&amp;feed=atom&amp;title=Deployment%2FProviders%2FGcp%2FDeploying_Care_on_GKE"/>
	<link rel="alternate" type="text/html" href="https://ohcnwiki.tellmey.fyi/index.php?title=Deployment/Providers/Gcp/Deploying_Care_on_GKE&amp;action=history"/>
	<updated>2026-07-06T05:43:22Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.4</generator>
	<entry>
		<id>https://ohcnwiki.tellmey.fyi/index.php?title=Deployment/Providers/Gcp/Deploying_Care_on_GKE&amp;diff=378&amp;oldid=prev</id>
		<title>Admin: Add Navbox deployment template before Related (via update-page on MediaWiki MCP Server)</title>
		<link rel="alternate" type="text/html" href="https://ohcnwiki.tellmey.fyi/index.php?title=Deployment/Providers/Gcp/Deploying_Care_on_GKE&amp;diff=378&amp;oldid=prev"/>
		<updated>2026-07-06T04:00:39Z</updated>

		<summary type="html">&lt;p&gt;Add Navbox deployment template before Related (via update-page on MediaWiki MCP Server)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:30, 6 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 638:&lt;/td&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 638:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;These steps will initiate the build pipeline for the backend and frontend projects across all the projects set up in the GitHub Secrets.&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;These steps will initiate the build pipeline for the backend and frontend projects across all the projects set up in the GitHub Secrets.&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td colspan=&quot;2&quot; class=&quot;diff-empty diff-side-deleted&quot;&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Navbox deployment}}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Related}}&lt;/div&gt;&lt;/td&gt;
  &lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;
  &lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{Related}}&lt;/div&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://ohcnwiki.tellmey.fyi/index.php?title=Deployment/Providers/Gcp/Deploying_Care_on_GKE&amp;diff=211&amp;oldid=prev</id>
		<title>Admin: OHC identity seed</title>
		<link rel="alternate" type="text/html" href="https://ohcnwiki.tellmey.fyi/index.php?title=Deployment/Providers/Gcp/Deploying_Care_on_GKE&amp;diff=211&amp;oldid=prev"/>
		<updated>2026-07-04T23:08:24Z</updated>

		<summary type="html">&lt;p&gt;OHC identity seed&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Doc header&lt;br /&gt;
|type=guide&lt;br /&gt;
|domain=deployment&lt;br /&gt;
|title=Deploying Care on GKE&lt;br /&gt;
|order=2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
This guide provides a step-by-step process for deploying the &amp;#039;&amp;#039;&amp;#039;Care&amp;#039;&amp;#039;&amp;#039; application on &amp;#039;&amp;#039;&amp;#039;Google Cloud Platform (GCP)&amp;#039;&amp;#039;&amp;#039; using &amp;#039;&amp;#039;&amp;#039;Google Kubernetes Engine (GKE)&amp;#039;&amp;#039;&amp;#039;. It combines the full infrastructure setup, the Cloud Build pipeline, and the deployment workflow into a single reference.&lt;br /&gt;
&lt;br /&gt;
The deployment involves three phases:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Infrastructure&amp;#039;&amp;#039;&amp;#039; — provision the VPC, static IP, Cloud SQL databases, Cloud Storage buckets, and the GKE cluster.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Build pipeline&amp;#039;&amp;#039;&amp;#039; — set up Artifact Registry, Cloud Source Repositories, the &amp;lt;code&amp;gt;infra_template&amp;lt;/code&amp;gt; configuration, and Cloud Build.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Deploying&amp;#039;&amp;#039;&amp;#039; — apply the Kubernetes manifests, configure DNS, and trigger releases manually or via GitHub Actions.&lt;br /&gt;
&lt;br /&gt;
{{Info|1=For an overview of the GCP deployment options and infrastructure requirements, see the [[Index|Google Cloud overview]]. To host the Care frontend on Cloud Storage instead of GKE, see [[Gcs|Host the frontend on GCS]].}}&lt;br /&gt;
&lt;br /&gt;
== Infrastructure ==&lt;br /&gt;
&lt;br /&gt;
=== Setting up the network and creating a VPC ===&lt;br /&gt;
&lt;br /&gt;
==== Creating a VPC network ====&lt;br /&gt;
&lt;br /&gt;
# Go to &amp;#039;&amp;#039;&amp;#039;VPC Network&amp;#039;&amp;#039;&amp;#039; in &amp;#039;&amp;#039;&amp;#039;Google Cloud Console&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Click &amp;#039;&amp;#039;&amp;#039;Create VPC network&amp;#039;&amp;#039;&amp;#039; and name it &amp;lt;code&amp;gt;care-vpc&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Configure the following settings:&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;MTU&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;1460&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;IPv6 Range&amp;#039;&amp;#039;&amp;#039;: Disabled&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Subnet Creation Mode&amp;#039;&amp;#039;&amp;#039;: Custom&lt;br /&gt;
&lt;br /&gt;
==== Creating a subnet ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol start=&amp;quot;4&amp;quot; style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Create a new subnet with these details:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;cluster-snet&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;Region&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;asia-south1&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;IP Stack Type&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;IPv4 (single-stack)&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;IPv4 Range&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;10.0.0.0/16&amp;lt;/code&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;Private Google Access&amp;#039;&amp;#039;&amp;#039;: On&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;Flow Logs&amp;#039;&amp;#039;&amp;#039;: Off&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Set &amp;#039;&amp;#039;&amp;#039;Dynamic Routing Mode&amp;#039;&amp;#039;&amp;#039; to &amp;lt;code&amp;gt;Regional&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Keep the default firewall rules.&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Command-line equivalent ====&lt;br /&gt;
&lt;br /&gt;
To create the VPC and subnet using &amp;lt;code&amp;gt;gcloud&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;gcloud compute networks create care-vpc --project=$PROJECT --subnet-mode=custom --mtu=1460 --bgp-routing-mode=regional&lt;br /&gt;
gcloud compute networks subnets create cluster-snet --project=$PROJECT --range=10.0.0.0/16 --stack-type=IPV4_ONLY --network=care-vpc --region=asia-south1 --enable-private-ip-google-access&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Reserving a static IP address ====&lt;br /&gt;
&lt;br /&gt;
# Navigate to &amp;#039;&amp;#039;&amp;#039;VPC Networks &amp;amp;gt; IP Addresses&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Click &amp;#039;&amp;#039;&amp;#039;RESERVE EXTERNAL STATIC IP ADDRESS&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Configure the following:&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;pip-care&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Network Service Tier&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;Premium&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;IP Version&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;IPv4&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Type&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;Regional&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Region&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;asia-south1 (Mumbai)&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Attached to&amp;#039;&amp;#039;&amp;#039;: None&lt;br /&gt;
# Note down the assigned IP for future use.&lt;br /&gt;
&lt;br /&gt;
Command-line equivalent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;gcloud compute addresses create pip-care --project=$PROJECT --region=asia-south1&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Setting up databases ===&lt;br /&gt;
&lt;br /&gt;
==== Creating a Cloud SQL instance ====&lt;br /&gt;
&lt;br /&gt;
# Go to &amp;#039;&amp;#039;&amp;#039;Google Cloud Console&amp;#039;&amp;#039;&amp;#039; &amp;amp;gt; &amp;#039;&amp;#039;&amp;#039;Cloud SQL&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Click &amp;#039;&amp;#039;&amp;#039;Create Instance&amp;#039;&amp;#039;&amp;#039; and choose &amp;lt;code&amp;gt;PostgreSQL&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Configure the first database:&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Instance ID&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;care-db&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Authentication&amp;#039;&amp;#039;&amp;#039;: Cloud SQL (set a strong master password)&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Database Version&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;PostgreSQL 16&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Cloud SQL Edition&amp;#039;&amp;#039;&amp;#039;: Enterprise&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Region&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;asia-south1&amp;lt;/code&amp;gt; | &amp;#039;&amp;#039;&amp;#039;Primary Zone&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;asia-south1-a&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Machine Type&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;2 vCPU, 8 GB RAM, 20 GB SSD&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Enable&amp;#039;&amp;#039;&amp;#039;: Automatic storage increases, backups, point-in-time recovery, deletion protection&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Instance IP&amp;#039;&amp;#039;&amp;#039;: Private (assign to &amp;lt;code&amp;gt;care-vpc&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Create a database named &amp;lt;code&amp;gt;care&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Repeat for &amp;lt;code&amp;gt;metabase-db&amp;lt;/code&amp;gt;, but configure it with:&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Machine Type&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;1 vCPU, 3.75 GB RAM&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Database Name&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;metabase&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Configuring Cloud Storage ===&lt;br /&gt;
&lt;br /&gt;
==== Creating buckets ====&lt;br /&gt;
&lt;br /&gt;
# Go to &amp;#039;&amp;#039;&amp;#039;Cloud Storage&amp;#039;&amp;#039;&amp;#039; &amp;amp;gt; &amp;#039;&amp;#039;&amp;#039;Buckets&amp;#039;&amp;#039;&amp;#039; &amp;amp;gt; &amp;#039;&amp;#039;&amp;#039;Create&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Configure the first bucket:&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;&amp;amp;lt;prefix&amp;amp;gt;-care-facility&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Location&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;asia-south1 (Mumbai)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Standard&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Access Control&amp;#039;&amp;#039;&amp;#039;: Uniform&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Public Access Prevention&amp;#039;&amp;#039;&amp;#039;: Off&lt;br /&gt;
# Configure the second bucket:&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;&amp;amp;lt;prefix&amp;amp;gt;-care-patient-data&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Public Access Prevention&amp;#039;&amp;#039;&amp;#039;: On&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Retention Policy&amp;#039;&amp;#039;&amp;#039;: 7 days&lt;br /&gt;
&lt;br /&gt;
==== Configuring the service account ====&lt;br /&gt;
&lt;br /&gt;
# Navigate to &amp;#039;&amp;#039;&amp;#039;Settings &amp;amp;gt; Interoperability&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Create a service account &amp;lt;code&amp;gt;care-bucket-access&amp;lt;/code&amp;gt; with role &amp;lt;code&amp;gt;Storage Object Admin&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Generate access keys and note them for later use.&lt;br /&gt;
&lt;br /&gt;
==== Configuring CORS for Cloud Storage ====&lt;br /&gt;
&lt;br /&gt;
For &amp;lt;code&amp;gt;&amp;amp;lt;prefix&amp;amp;gt;-care-facility&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;origin&amp;quot;: [&amp;quot;*&amp;quot;],&lt;br /&gt;
    &amp;quot;responseHeader&amp;quot;: [&amp;quot;Content-Type&amp;quot;],&lt;br /&gt;
    &amp;quot;method&amp;quot;: [&amp;quot;GET&amp;quot;, &amp;quot;HEAD&amp;quot;, &amp;quot;PUT&amp;quot;, &amp;quot;POST&amp;quot;, &amp;quot;DELETE&amp;quot;],&lt;br /&gt;
    &amp;quot;maxAgeSeconds&amp;quot;: 3600&lt;br /&gt;
  }&lt;br /&gt;
]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
For &amp;lt;code&amp;gt;&amp;amp;lt;prefix&amp;amp;gt;-care-patient-data&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;origin&amp;quot;: [&amp;quot;care.example.com&amp;quot;],&lt;br /&gt;
    &amp;quot;responseHeader&amp;quot;: [&amp;quot;Content-Type&amp;quot;],&lt;br /&gt;
    &amp;quot;method&amp;quot;: [&amp;quot;GET&amp;quot;, &amp;quot;HEAD&amp;quot;, &amp;quot;PUT&amp;quot;, &amp;quot;POST&amp;quot;, &amp;quot;DELETE&amp;quot;],&lt;br /&gt;
    &amp;quot;maxAgeSeconds&amp;quot;: 3600&lt;br /&gt;
  }&lt;br /&gt;
]&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Command-line equivalent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;gsutil cors set cors.json gs://&amp;lt;prefix&amp;gt;-care-facility&lt;br /&gt;
gsutil cors set cors.json gs://&amp;lt;prefix&amp;gt;-care-patient-data&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Configuring Google Kubernetes Engine (GKE) ===&lt;br /&gt;
&lt;br /&gt;
==== Creating a GKE cluster ====&lt;br /&gt;
&lt;br /&gt;
# Navigate to &amp;#039;&amp;#039;&amp;#039;Kubernetes Engine&amp;#039;&amp;#039;&amp;#039; &amp;amp;gt; &amp;#039;&amp;#039;&amp;#039;Clusters&amp;#039;&amp;#039;&amp;#039; &amp;amp;gt; &amp;#039;&amp;#039;&amp;#039;Create&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Choose &amp;#039;&amp;#039;&amp;#039;Standard Mode&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Configure cluster settings:&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Name&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;care-gke&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Location&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;Zonal&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Zone&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;asia-south1-a&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Configuring node pools ====&lt;br /&gt;
&lt;br /&gt;
# Select &amp;lt;code&amp;gt;default pool&amp;lt;/code&amp;gt; and set nodes to &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;.&lt;br /&gt;
# In &amp;#039;&amp;#039;&amp;#039;Nodes&amp;#039;&amp;#039;&amp;#039; section:&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Machine Type&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;E2-Series&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;e2-standard-2&amp;lt;/code&amp;gt; (2 vCPU, 8 GB RAM)&lt;br /&gt;
# In &amp;#039;&amp;#039;&amp;#039;Networking&amp;#039;&amp;#039;&amp;#039; section:&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Network&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;care-vpc&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Subnet&amp;#039;&amp;#039;&amp;#039;: &amp;lt;code&amp;gt;cluster-snet&amp;lt;/code&amp;gt;&lt;br /&gt;
#* &amp;#039;&amp;#039;&amp;#039;Access&amp;#039;&amp;#039;&amp;#039;: Public Cluster&lt;br /&gt;
# Enable &amp;#039;&amp;#039;&amp;#039;HTTP Load Balancing&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Build pipeline ==&lt;br /&gt;
&lt;br /&gt;
=== Setting up the Artifact Registry ===&lt;br /&gt;
&lt;br /&gt;
# Navigate to the &amp;#039;&amp;#039;&amp;#039;Artifact Registry&amp;#039;&amp;#039;&amp;#039; in the &amp;#039;&amp;#039;&amp;#039;Google Cloud Console&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Create private Artifact Registry repositories named &amp;lt;code&amp;gt;care&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;care_fe&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Ensure that the repositories are &amp;#039;&amp;#039;&amp;#039;mutable&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Use the &amp;#039;&amp;#039;&amp;#039;Default Encryption Key&amp;#039;&amp;#039;&amp;#039; for the repositories.&lt;br /&gt;
&lt;br /&gt;
=== Setting up Cloud Source Repositories ===&lt;br /&gt;
&lt;br /&gt;
# Navigate to the &amp;#039;&amp;#039;&amp;#039;Cloud Source Repositories&amp;#039;&amp;#039;&amp;#039; service in the &amp;#039;&amp;#039;&amp;#039;Google Cloud Console&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Create a new repository named &amp;lt;code&amp;gt;infra-name&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Add the files &amp;lt;code&amp;gt;build/react.env&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;plug_config.py&amp;lt;/code&amp;gt; to the repository. (The &amp;lt;code&amp;gt;plug_config.py&amp;lt;/code&amp;gt; file can be used to include plugins for &amp;lt;code&amp;gt;care&amp;lt;/code&amp;gt;.)&lt;br /&gt;
# Add the following content to the &amp;lt;code&amp;gt;react.env&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;REACT_PLAUSIBLE_SERVER_URL=https://plausible.example.com&lt;br /&gt;
REACT_HEADER_LOGO=&amp;#039;{&amp;quot;light&amp;quot;:&amp;quot;https://cdn.ohc.network/header_logo.png&amp;quot;,&amp;quot;dark&amp;quot;:&amp;quot;https://cdn.ohc.network/header_logo.png&amp;quot;}&amp;#039;&lt;br /&gt;
REACT_MAIN_LOGO=&amp;#039;{&amp;quot;light&amp;quot;:&amp;quot;https://cdn.ohc.network/light-logo.svg&amp;quot;,&amp;quot;dark&amp;quot;:&amp;quot;https://cdn.ohc.network/black-logo.svg&amp;quot;}&amp;#039;&lt;br /&gt;
REACT_GMAPS_API_KEY=&amp;quot;examplekey&amp;quot;&lt;br /&gt;
REACT_GOV_DATA_API_KEY=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_RECAPTCHA_SITE_KEY=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_SENTRY_DSN=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_SAMPLE_FORMAT_ASSET_IMPORT=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_SAMPLE_FORMAT_EXTERNAL_RESULT_IMPORT=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_KASP_ENABLED=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_ENABLE_HCX=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_ENABLE_ABDM=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_ENABLE_SCRIBE=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_WARTIME_SHIFTING=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_OHCN_URL=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_PLAUSIBLE_SITE_DOMAIN=&amp;quot;care.example.com&amp;quot;&lt;br /&gt;
REACT_SENTRY_ENVIRONMENT=&amp;quot;&amp;quot;&lt;br /&gt;
REACT_CARE_API_URL=&amp;quot;https://care.example.com&amp;quot;&lt;br /&gt;
REACT_DASHBOARD_URL=&amp;quot;&amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ol start=&amp;quot;5&amp;quot; style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Add the following content to the &amp;lt;code&amp;gt;plug_config.py&amp;lt;/code&amp;gt; file (if required):&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;from plugs.manager import PlugManager&lt;br /&gt;
from plugs.plug import Plug&lt;br /&gt;
&lt;br /&gt;
hcx_plugin = Plug(&lt;br /&gt;
    name=&amp;quot;hcx&amp;quot;,&lt;br /&gt;
    package_name=&amp;quot;git+https://github.com/ohcnetwork/care_hcx.git&amp;quot;,&lt;br /&gt;
    version=&amp;quot;@main&amp;quot;,&lt;br /&gt;
    configs={},&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
plugs = [hcx_plugin]&lt;br /&gt;
&lt;br /&gt;
manager = PlugManager(plugs)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ol start=&amp;quot;6&amp;quot; style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Clone the [&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/infra_template infra_template] repository. This repository contains the necessary YAML files to deploy our applications as Kubernetes workloads. You will need to replace all generic/example values with your production values. Here&amp;#039;s a guide on what to change in each folder:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;Certificate&amp;#039;&amp;#039;&amp;#039;: Replace the example hostnames for &amp;lt;code&amp;gt;dnsNames&amp;lt;/code&amp;gt; with your actual hostnames.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;ConfigMaps&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In &amp;lt;code&amp;gt;care-configmap.yaml&amp;lt;/code&amp;gt;, add your database configurations.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Update the hostnames in &amp;lt;code&amp;gt;CSRF_TRUSTED_ORIGINS&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DJANGO_ALLOWED_HOSTS&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In &amp;lt;code&amp;gt;nginx.yaml&amp;lt;/code&amp;gt;, update the &amp;lt;code&amp;gt;server_name&amp;lt;/code&amp;gt; with your hostnames.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;Helm&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Install Helm if you haven&amp;#039;t already.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Use the static IP created from the &amp;#039;&amp;#039;&amp;#039;&amp;amp;quot;Reserve a static IP address&amp;amp;quot;&amp;#039;&amp;#039;&amp;#039; step to replace the IP value in &amp;lt;code&amp;gt;helm/scripts.sh&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;Ingress&amp;#039;&amp;#039;&amp;#039;: Replace the example hostnames with your actual hostnames.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;#039;&amp;#039;&amp;#039;Secrets&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Update &amp;lt;code&amp;gt;care-secrets.yml&amp;lt;/code&amp;gt; with your secrets.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Update &amp;lt;code&amp;gt;metabase.yml&amp;lt;/code&amp;gt; with your Metabase database credentials.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Push the changes to the &amp;lt;code&amp;gt;infra-name&amp;lt;/code&amp;gt; repository created earlier in &amp;#039;&amp;#039;&amp;#039;Cloud Source Repositories&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Setting up the Cloud Build project ===&lt;br /&gt;
&lt;br /&gt;
# Navigate to the &amp;#039;&amp;#039;&amp;#039;Cloud Build&amp;#039;&amp;#039;&amp;#039; service in the &amp;#039;&amp;#039;&amp;#039;Google Cloud Console&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Establish a new build project, name it &amp;lt;code&amp;gt;deploy-care&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Generate a new trigger for the project.&lt;br /&gt;
# Configure the Event to respond to &amp;#039;&amp;#039;&amp;#039;Webhook events&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# Retrieve the &amp;#039;&amp;#039;&amp;#039;Webhook URL&amp;#039;&amp;#039;&amp;#039; from the &amp;lt;code&amp;gt;Show URL Preview&amp;lt;/code&amp;gt; option.&lt;br /&gt;
# Define the Configuration as &amp;lt;code&amp;gt;Cloud Build configuration file (yaml or json)&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Specify the Location as &amp;lt;code&amp;gt;Inline&amp;lt;/code&amp;gt; and insert the following content:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;steps:&lt;br /&gt;
  - name: ubuntu&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        echo &amp;quot;be $_BE_TAG&amp;quot; \&lt;br /&gt;
        &amp;amp;&amp;amp; echo &amp;quot;fe $_FE_TAG&amp;quot; \&lt;br /&gt;
        &amp;amp;&amp;amp; echo &amp;quot;metabase $_METABASE_TAG&amp;quot;&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: &amp;#039;gcr.io/google.com/cloudsdktool/cloud-sdk:slim&amp;#039;&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        gcloud source repos clone $_INFRA_REPO infra&lt;br /&gt;
        cd infra&lt;br /&gt;
        git config user.name &amp;quot;CloudBuild&amp;quot;&lt;br /&gt;
        git config user.email example@cloudbuild.gserviceaccount.com&lt;br /&gt;
    dir: /workspace&lt;br /&gt;
    id: clone-infra&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: gcr.io/cloud-builders/gsutil&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        if [[ -n &amp;quot;$_BE_TAG&amp;quot; ]]; then&lt;br /&gt;
          curl -L https://github.com/ohcnetwork/care/archive/$_BE_TAG.zip -o care.zip&lt;br /&gt;
          unzip care.zip&lt;br /&gt;
          mv care-$_BE_TAG care&lt;br /&gt;
        else&lt;br /&gt;
          echo &amp;quot;Skipping...&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    dir: /workspace&lt;br /&gt;
    id: download-care&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: ubuntu&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        if [[ -n &amp;quot;$_BE_TAG&amp;quot; ]]; then&lt;br /&gt;
          cp -r /workspace/infra/build/. /workspace/care&lt;br /&gt;
        else&lt;br /&gt;
          echo &amp;quot;Skipping...&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    id: copy-build-files&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: gcr.io/cloud-builders/docker&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        if [[ -n &amp;quot;$_BE_TAG&amp;quot; ]]; then&lt;br /&gt;
          DOCKER_BUILDKIT=1 docker build -f ./care/docker/prod.Dockerfile \&lt;br /&gt;
            -t asia-south1-docker.pkg.dev/$PROJECT_ID/care/care:$_BE_TAG \&lt;br /&gt;
            -t asia-south1-docker.pkg.dev/$PROJECT_ID/care/care:latest \&lt;br /&gt;
            ./care&lt;br /&gt;
          docker push \&lt;br /&gt;
            asia-south1-docker.pkg.dev/$PROJECT_ID/care/care:$_BE_TAG&lt;br /&gt;
          docker push \&lt;br /&gt;
            asia-south1-docker.pkg.dev/$PROJECT_ID/care/care:latest&lt;br /&gt;
        else&lt;br /&gt;
          echo &amp;quot;Skipping...&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    dir: /workspace&lt;br /&gt;
    id: build-care&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: gcr.io/cloud-builders/git&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        if [[ -n &amp;quot;$_BE_TAG&amp;quot; ]]; then&lt;br /&gt;
          cd infra&lt;br /&gt;
          sed -i -e &amp;#039;s|\(image: .*care:\).*|\1$_BE_TAG|&amp;#039; deployments/*&lt;br /&gt;
          sed -i -e &amp;quot;/name: deployment-version/{n;s/value: .*/value: \&amp;quot;$BUILD_ID\&amp;quot;/;}&amp;quot; deployments/care-backend.yaml&lt;br /&gt;
          sed -i -e &amp;quot;/name: deployment-version/{n;s/value: .*/value: \&amp;quot;$BUILD_ID\&amp;quot;/;}&amp;quot; deployments/care-celery-worker.yaml&lt;br /&gt;
          sed -i -e &amp;quot;/name: deployment-version/{n;s/value: .*/value: \&amp;quot;$BUILD_ID\&amp;quot;/;}&amp;quot; deployments/care-celery-beat.yaml&lt;br /&gt;
          git add .&lt;br /&gt;
          git commit -m &amp;quot;update backend crds to $_BE_TAG&amp;quot; || true&lt;br /&gt;
        else&lt;br /&gt;
          echo &amp;quot;Skipping...&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    dir: /workspace&lt;br /&gt;
    id: update-care-crd&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: gcr.io/cloud-builders/gsutil&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        if [[ -n &amp;quot;$_FE_TAG&amp;quot; ]]; then&lt;br /&gt;
          curl -L https://github.com/ohcnetwork/care_fe/archive/$_FE_TAG.zip -o /workspace/care_fe.zip&lt;br /&gt;
          unzip /workspace/care_fe.zip -d /workspace&lt;br /&gt;
          mv /workspace/care_fe-$_FE_TAG /workspace/care_fe&lt;br /&gt;
          cp /workspace/infra/build/react.env /workspace/care_fe/.env.local&lt;br /&gt;
          cd /workspace/care_fe&lt;br /&gt;
        else&lt;br /&gt;
          echo &amp;quot;Skipping...&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    dir: /workspace&lt;br /&gt;
    id: download-care-fe&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: ubuntu&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        if [[ -n &amp;quot;$_FE_TAG&amp;quot; ]]; then&lt;br /&gt;
          cp /workspace/infra/build/react.env /workspace/care_fe/.env.local&lt;br /&gt;
        else&lt;br /&gt;
          echo &amp;quot;Skipping...&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    id: copy-fe-build-files&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: gcr.io/cloud-builders/docker&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        if [[ -n &amp;quot;$_FE_TAG&amp;quot; ]]; then&lt;br /&gt;
          DOCKER_BUILDKIT=1 docker build -f ./care_fe/Dockerfile \&lt;br /&gt;
            -t asia-south1-docker.pkg.dev/$PROJECT_ID/care/care_fe:$_FE_TAG \&lt;br /&gt;
            -t asia-south1-docker.pkg.dev/$PROJECT_ID/care/care_fe:latest \&lt;br /&gt;
            ./care_fe&lt;br /&gt;
          docker push \&lt;br /&gt;
            asia-south1-docker.pkg.dev/$PROJECT_ID/care/care_fe:$_FE_TAG&lt;br /&gt;
          docker push \&lt;br /&gt;
            asia-south1-docker.pkg.dev/$PROJECT_ID/care/care_fe:latest&lt;br /&gt;
        else&lt;br /&gt;
          echo &amp;quot;Skipping...&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    dir: /workspace&lt;br /&gt;
    id: build-care-fe&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: gcr.io/cloud-builders/git&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        if [[ -n &amp;quot;$_FE_TAG&amp;quot; ]]; then&lt;br /&gt;
          cd infra&lt;br /&gt;
          sed -i -e &amp;#039;s|\(image: .*care_fe:\).*|\1$_FE_TAG|&amp;#039; deployments/care-fe.yaml&lt;br /&gt;
          sed -i -e &amp;quot;/name: deployment-version/{n;s/value: .*/value: \&amp;quot;$BUILD_ID\&amp;quot;/;}&amp;quot; deployments/care-fe.yaml&lt;br /&gt;
          git add .&lt;br /&gt;
          git commit -m &amp;quot;update frontend crds to $_FE_TAG&amp;quot; || true&lt;br /&gt;
        else&lt;br /&gt;
          echo &amp;quot;Skipping...&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    dir: /workspace&lt;br /&gt;
    id: update-care-fe-crd&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: gcr.io/cloud-builders/git&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        if [[ -n &amp;quot;$_METABASE_TAG&amp;quot; ]]; then&lt;br /&gt;
          cd infra&lt;br /&gt;
          sed -i -e &amp;#039;s|\(image: metabase/metabase:\).*|\1$_METABASE_TAG|&amp;#039; deployments/metabase.yaml&lt;br /&gt;
          git add .&lt;br /&gt;
          git commit -m &amp;quot;update frontend crds&amp;quot; || true&lt;br /&gt;
        else&lt;br /&gt;
          echo &amp;quot;Skipping...&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    dir: /workspace&lt;br /&gt;
    id: update-metabase-crd&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: gcr.io/cloud-builders/gke-deploy&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        gke-deploy apply \&lt;br /&gt;
          --location=${_CARE_GKE_ZONE} \&lt;br /&gt;
          --cluster=${_CARE_GKE_CLUSTER} \&lt;br /&gt;
          --filename=infra/deployments&lt;br /&gt;
    dir: /workspace&lt;br /&gt;
    id: deploy-to-gke&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
  - name: &amp;#039;gcr.io/google.com/cloudsdktool/cloud-sdk:slim&amp;#039;&lt;br /&gt;
    args:&lt;br /&gt;
      - &amp;#039;-c&amp;#039;&lt;br /&gt;
      - |&lt;br /&gt;
        cd infra&lt;br /&gt;
        git pull --rebase&lt;br /&gt;
        git push&lt;br /&gt;
    dir: /workspace&lt;br /&gt;
    id: push-crds&lt;br /&gt;
    entrypoint: bash&lt;br /&gt;
&lt;br /&gt;
options:&lt;br /&gt;
  logging: CLOUD_LOGGING_ONLY&lt;br /&gt;
&lt;br /&gt;
substitutions:&lt;br /&gt;
  _FE_TAG: $(body.substitutions.care_fe_tag)&lt;br /&gt;
  _METABASE_TAG: $(body.substitutions.metabase_tag)&lt;br /&gt;
  _BE_TAG: $(body.substitutions.care_be_tag)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;ol start=&amp;quot;8&amp;quot; style=&amp;quot;list-style-type: decimal;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Save the file and exit the editor.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Configure the &amp;#039;&amp;#039;&amp;#039;Substitution variables&amp;#039;&amp;#039;&amp;#039; for the Cloud Build trigger:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Navigate to the &amp;#039;&amp;#039;&amp;#039;Substitution variables&amp;#039;&amp;#039;&amp;#039; tab.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Select the &amp;lt;code&amp;gt;Add substitution variable&amp;lt;/code&amp;gt; button.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Input the following variables:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Name: &amp;lt;code&amp;gt;_FE_TAG&amp;lt;/code&amp;gt;, Value: ``&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Name: &amp;lt;code&amp;gt;_METABASE_TAG&amp;lt;/code&amp;gt;, Value: ``&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Name: &amp;lt;code&amp;gt;_BE_TAG&amp;lt;/code&amp;gt;, Value: ``&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Name: &amp;lt;code&amp;gt;_CARE_GKE_ZONE&amp;lt;/code&amp;gt;, Value: ``&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Name: &amp;lt;code&amp;gt;_CARE_GKE_CLUSTER&amp;lt;/code&amp;gt;, Value: ``&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Name: &amp;lt;code&amp;gt;_INFRA_REPO&amp;lt;/code&amp;gt;, Value: ``&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Save your changes.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;In a separate tab, create a &amp;#039;&amp;#039;&amp;#039;Service Account&amp;#039;&amp;#039;&amp;#039; for Cloud Build:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Navigate to the &amp;#039;&amp;#039;&amp;#039;IAM Section&amp;#039;&amp;#039;&amp;#039;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Name the account &amp;lt;code&amp;gt;cloudbuilder&amp;lt;/code&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Assign the following roles:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Artifact Registry Administrator&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Cloud Build Service Account&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Cloud Run Source Developer&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Cloud Source Repositories Service Agent&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Kubernetes Engine Admin&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Logs Bucket Writer&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Secret Manager Secret Accessor&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Source Repository Reader&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Source Repository Writer&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Assign the Service Account to the &amp;#039;&amp;#039;&amp;#039;Cloud Build trigger&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Navigate to the &amp;#039;&amp;#039;&amp;#039;Service account&amp;#039;&amp;#039;&amp;#039; tab.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Choose the &amp;lt;code&amp;gt;cloudbuilder&amp;lt;/code&amp;gt; service account from the list.&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Save the trigger by selecting the &amp;lt;code&amp;gt;Create&amp;lt;/code&amp;gt; button.&amp;lt;/li&amp;gt;&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Deploying ==&lt;br /&gt;
&lt;br /&gt;
=== Getting ready for first deployment ===&lt;br /&gt;
&lt;br /&gt;
==== Set the default GKE cluster ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Get the name using:&lt;br /&gt;
kubectl config get-contexts&lt;br /&gt;
&lt;br /&gt;
# Set the config:&lt;br /&gt;
kubectl config use-context &amp;lt;name&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Run the Helm script ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;bash helm/scripts.sh&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Apply Kubernetes configurations ====&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;kubectl&amp;lt;/code&amp;gt; to apply all the Kubernetes YAML files in the following order:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Deploy ConfigMaps:&lt;br /&gt;
kubectl apply -f &amp;#039;configmaps/*&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# Secrets:&lt;br /&gt;
kubectl apply -f &amp;#039;secrets/*&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# Deployments:&lt;br /&gt;
kubectl apply -f &amp;#039;deployments/*&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# Services:&lt;br /&gt;
kubectl apply -f &amp;#039;services/*&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# ClusterIssuer:&lt;br /&gt;
kubectl apply -f ClusterIssuer/cluster-issuer.yaml&lt;br /&gt;
&lt;br /&gt;
# Certificate:&lt;br /&gt;
kubectl apply -f certificate/certificate.yml&lt;br /&gt;
&lt;br /&gt;
# Ingress:&lt;br /&gt;
kubectl apply -f ingress/care.yaml&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Once ingress is created, &amp;lt;code&amp;gt;kubectl get ingress care-ingress&amp;lt;/code&amp;gt; will show the IP of the TCP load balancer. Once the DNS records are added, the SSL will be automatically handled.&lt;br /&gt;
&lt;br /&gt;
=== Add DNS records ===&lt;br /&gt;
&lt;br /&gt;
Create DNS A records for each domain pointing to the static IP created from the &amp;amp;quot;Reserve a static IP address&amp;amp;quot; step.&lt;br /&gt;
&lt;br /&gt;
=== Applying release updates on GCP manually ===&lt;br /&gt;
&lt;br /&gt;
To apply release updates, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Fetch the latest commit hash from the [&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/care/commits/production Care Commit History] and [&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/care_fe/commits/production Care FE Commit History].&lt;br /&gt;
# Trigger the Cloud Build using the webhook URL available in the Cloud Build console.&lt;br /&gt;
# Use &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; or any API platform to initiate the build process:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;curl --request POST \&lt;br /&gt;
  --url &amp;#039;https://cloudbuild.googleapis.com/v1/projects/examplelink&amp;#039; \&lt;br /&gt;
  --header &amp;#039;Content-Type: application/json&amp;#039; \&lt;br /&gt;
  --data &amp;#039;{&lt;br /&gt;
  &amp;quot;substitutions&amp;quot;: {&lt;br /&gt;
      &amp;quot;care_be_tag&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
      &amp;quot;care_fe_tag&amp;quot;: &amp;quot;&amp;quot;,&lt;br /&gt;
      &amp;quot;metabase_tag&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&amp;#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Setting up automated GitHub workflow triggers ===&lt;br /&gt;
&lt;br /&gt;
The manual process of triggering the build process can be automated using GitHub Actions. Follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Navigate to the deploy repository where the GitHub Actions are to be set up.&lt;br /&gt;
# Add the Webhook URL to the GitHub Secrets.&lt;br /&gt;
# Create a new GitHub Action workflow file in the &amp;lt;code&amp;gt;.github/workflows&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
# Add the following code snippet to the workflow file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;name: Deploy Multiple Projects&lt;br /&gt;
on:&lt;br /&gt;
  workflow_dispatch:&lt;br /&gt;
    inputs:&lt;br /&gt;
      BE_TAG:&lt;br /&gt;
        description: &amp;quot;Backend release tag&amp;quot;&lt;br /&gt;
        required: true&lt;br /&gt;
      FE_TAG:&lt;br /&gt;
        description: &amp;quot;Frontend release tag&amp;quot;&lt;br /&gt;
        required: true&lt;br /&gt;
      METABASE_TAG:&lt;br /&gt;
        description: &amp;quot;Metabase release tag&amp;quot;&lt;br /&gt;
        required: false&lt;br /&gt;
&lt;br /&gt;
jobs:&lt;br /&gt;
  trigger-post-requests:&lt;br /&gt;
    runs-on: ubuntu-latest&lt;br /&gt;
    steps:&lt;br /&gt;
      - name: Setup Payload&lt;br /&gt;
        run: |&lt;br /&gt;
          JSON=&amp;#039;{ &amp;quot;substitutions&amp;quot;: { &amp;quot;care_be_tag&amp;quot;:&amp;quot;&amp;#039;&amp;quot;$BE_TAG&amp;quot;&amp;#039;&amp;quot;, &amp;quot;care_fe_tag&amp;quot;: &amp;quot;&amp;#039;&amp;quot;$FE_TAG&amp;quot;&amp;#039;&amp;quot;, &amp;quot;metabase_tag&amp;quot;: &amp;quot;&amp;#039;&amp;quot;$METABASE_TAG&amp;quot;&amp;#039;&amp;quot; } }&amp;#039;&lt;br /&gt;
          echo &amp;quot;json=$JSON&amp;quot; &amp;gt;&amp;gt; $GITHUB_ENV&lt;br /&gt;
        env:&lt;br /&gt;
          BE_TAG: ${{ github.event.inputs.BE_TAG }}&lt;br /&gt;
          FE_TAG: ${{ github.event.inputs.FE_TAG }}&lt;br /&gt;
          METABASE_TAG: ${{ github.event.inputs.METABASE_TAG }}&lt;br /&gt;
      - name: Deploy Project 1&lt;br /&gt;
        env:&lt;br /&gt;
          SECRET_URL: ${{ secrets.WEBHOOK_P1 }}&lt;br /&gt;
        run: |&lt;br /&gt;
          curl -X POST -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
          -d &amp;quot;$json&amp;quot; \&lt;br /&gt;
          $SECRET_URL&lt;br /&gt;
&lt;br /&gt;
      - name: Deploy Project 2&lt;br /&gt;
        env:&lt;br /&gt;
          SECRET_URL: ${{ secrets.WEBHOOK_P2 }}&lt;br /&gt;
        run: |&lt;br /&gt;
          curl -X POST -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
          -d &amp;quot;$json&amp;quot; \&lt;br /&gt;
          $SECRET_URL&lt;br /&gt;
&lt;br /&gt;
      - name: Deploy Project 3&lt;br /&gt;
        env:&lt;br /&gt;
          SECRET_URL: ${{ secrets.WEBHOOK_P3 }}&lt;br /&gt;
        run: |&lt;br /&gt;
          curl -X POST -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
          -d &amp;quot;$json&amp;quot; \&lt;br /&gt;
          $SECRET_URL&lt;br /&gt;
&lt;br /&gt;
      - name: Deploy Project 4&lt;br /&gt;
        env:&lt;br /&gt;
          SECRET_URL: ${{ secrets.WEBHOOK_P4 }}&lt;br /&gt;
        run: |&lt;br /&gt;
          curl -X POST -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
          -d &amp;quot;$json&amp;quot; \&lt;br /&gt;
          $SECRET_URL&lt;br /&gt;
&lt;br /&gt;
      - name: Deploy Project 5&lt;br /&gt;
        env:&lt;br /&gt;
          SECRET_URL: ${{ secrets.WEBHOOK_P5 }}&lt;br /&gt;
        run: |&lt;br /&gt;
          curl -X POST -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
          -d &amp;quot;$json&amp;quot; \&lt;br /&gt;
          $SECRET_URL&lt;br /&gt;
&lt;br /&gt;
      - name: Deploy Project 6&lt;br /&gt;
        env:&lt;br /&gt;
          SECRET_URL: ${{ secrets.WEBHOOK_P6 }}&lt;br /&gt;
        run: |&lt;br /&gt;
          curl -X POST -H &amp;quot;Content-Type: application/json&amp;quot; \&lt;br /&gt;
          -d &amp;quot;$json&amp;quot; \&lt;br /&gt;
          $SECRET_URL&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Applying release updates ===&lt;br /&gt;
&lt;br /&gt;
To apply release updates, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Retrieve the latest commit hash from the [&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/care/commits/production Care Commit History] and [&amp;lt;nowiki/&amp;gt;https://github.com/ohcnetwork/care_fe/commits/production Care FE Commit History].&lt;br /&gt;
# Go to the deploy repository where the GitHub Action mentioned above is set up.&lt;br /&gt;
# Click on the &amp;lt;code&amp;gt;Actions&amp;lt;/code&amp;gt; tab.&lt;br /&gt;
# Choose the &amp;lt;code&amp;gt;Deploy Multiple Projects&amp;lt;/code&amp;gt; workflow.&lt;br /&gt;
# Click on the &amp;lt;code&amp;gt;Run Workflow&amp;lt;/code&amp;gt; button.&lt;br /&gt;
# Input the latest commit hash for both the backend and frontend.&lt;br /&gt;
# Click on the &amp;lt;code&amp;gt;Run Workflow&amp;lt;/code&amp;gt; button again.&lt;br /&gt;
&lt;br /&gt;
These steps will initiate the build pipeline for the backend and frontend projects across all the projects set up in the GitHub Secrets.&lt;br /&gt;
&lt;br /&gt;
{{Related}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>