Skip to content

Commit 35a3414

Browse files
committed
Remove React frontend support and fix VPC connector naming
- Remove cloud-run-react.tf and all React frontend resources - Eliminate React-specific variables and outputs - Consolidate DNS to single app subdomain instead of separate API/UI - Make database deployment optional with enable_database variable - Update documentation to reflect simplified architecture - Remove production example directory structure - Update dev example with proper resource references - Fix VPC connector naming to comply with Google's 25-char limit
1 parent fffe863 commit 35a3414

28 files changed

Lines changed: 195 additions & 1006 deletions

Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ docs: ## Generate documentation with terraform-docs
6464
@echo "Generating documentation..."
6565
@docker run --rm --volume "$$(pwd):/terraform-docs" -u $$(id -u) quay.io/terraform-docs/terraform-docs:latest markdown /terraform-docs --output-file README.md
6666
@terraform-docs markdown examples/dev > examples/dev/README.md || true
67-
@terraform-docs markdown examples/prod > examples/prod/README.md || true
6867

6968
clean: ## Clean up temporary files and directories
7069
@echo "Cleaning up..."

README.md

Lines changed: 6 additions & 30 deletions
Large diffs are not rendered by default.

cloud-run-react.tf

Lines changed: 0 additions & 114 deletions
This file was deleted.

cloud-run.tf

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,16 @@ resource "google_cloud_run_service" "main_app" {
6060
}
6161
}
6262

63-
# Database connection string from Secret Manager
64-
env {
65-
name = "DATABASE_URL"
66-
value_from {
67-
secret_key_ref {
68-
name = local.db_connection_secret
69-
key = "latest"
63+
# Database connection string from Secret Manager (if database is enabled)
64+
dynamic "env" {
65+
for_each = var.enable_database ? [1] : []
66+
content {
67+
name = "DATABASE_URL"
68+
value_from {
69+
secret_key_ref {
70+
name = local.db_connection_secret
71+
key = "latest"
72+
}
7073
}
7174
}
7275
}
@@ -121,7 +124,6 @@ resource "google_cloud_run_service" "main_app" {
121124

122125
depends_on = [
123126
google_project_service.required_apis,
124-
google_secret_manager_secret_version.db_connection,
125127
google_secret_manager_secret_version.ai_api_keys
126128
]
127129
}
@@ -136,30 +138,11 @@ resource "google_cloud_run_service_iam_member" "main_app_public" {
136138
}
137139

138140
# Domain mapping for the hrafnar application (if Cloudflare DNS is enabled)
141+
# Domain mapping for the application
139142
resource "google_cloud_run_domain_mapping" "main_app" {
140143
count = var.enable_cloudflare_dns && var.base_domain != "" ? 1 : 0
141144
location = var.region
142-
name = local.api_fqdn
143-
project = var.project_id
144-
145-
metadata {
146-
namespace = var.project_id
147-
labels = local.common_labels
148-
}
149-
150-
spec {
151-
route_name = google_cloud_run_service.main_app.name
152-
}
153-
154-
depends_on = [google_cloud_run_service.main_app]
155-
}
156-
157-
# Domain mapping for UI traffic (points to hrafnar app if no React frontend)
158-
resource "google_cloud_run_domain_mapping" "ui_app" {
159-
count = var.enable_cloudflare_dns && var.base_domain != "" && !var.enable_react_frontend && var.enable_htmx_frontend ? 1 : 0
160-
161-
location = var.region
162-
name = local.ui_fqdn
145+
name = local.app_fqdn
163146
project = var.project_id
164147

165148
metadata {

database.tf

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
# Random password for database user
22
resource "random_password" "db_password" {
3+
count = var.enable_database ? 1 : 0
34
length = 32
45
special = true
56
}
67

78
# Cloud SQL PostgreSQL instance
89
resource "google_sql_database_instance" "main" {
10+
count = var.enable_database ? 1 : 0
911
name = local.database_name
1012
database_version = "POSTGRES_15"
1113
region = var.region
@@ -85,11 +87,12 @@ resource "google_sql_database_instance" "main" {
8587
}
8688
}
8789

88-
depends_on = [google_service_networking_connection.private_vpc_connection]
90+
depends_on = [google_service_networking_connection.private_vpc_connection[0]]
8991
}
9092

9193
# Private service connection for Cloud SQL
9294
resource "google_compute_global_address" "private_ip_address" {
95+
count = var.enable_database ? 1 : 0
9396
name = "${local.resource_prefix}-private-ip"
9497
purpose = "VPC_PEERING"
9598
address_type = "INTERNAL"
@@ -99,28 +102,32 @@ resource "google_compute_global_address" "private_ip_address" {
99102
}
100103

101104
resource "google_service_networking_connection" "private_vpc_connection" {
105+
count = var.enable_database ? 1 : 0
102106
network = google_compute_network.main.id
103107
service = "servicenetworking.googleapis.com"
104-
reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
108+
reserved_peering_ranges = [google_compute_global_address.private_ip_address[0].name]
105109
}
106110

107111
# Database
108112
resource "google_sql_database" "main" {
113+
count = var.enable_database ? 1 : 0
109114
name = local.database_name
110-
instance = google_sql_database_instance.main.name
115+
instance = google_sql_database_instance.main[0].name
111116
project = var.project_id
112117
}
113118

114119
# Database user
115120
resource "google_sql_user" "main" {
121+
count = var.enable_database ? 1 : 0
116122
name = local.database_user
117-
instance = google_sql_database_instance.main.name
118-
password = random_password.db_password.result
123+
instance = google_sql_database_instance.main[0].name
124+
password = random_password.db_password[0].result
119125
project = var.project_id
120126
}
121127

122128
# Store database password in Secret Manager
123129
resource "google_secret_manager_secret" "db_password" {
130+
count = var.enable_database ? 1 : 0
124131
secret_id = local.db_password_secret_name
125132
project = var.project_id
126133

@@ -132,6 +139,7 @@ resource "google_secret_manager_secret" "db_password" {
132139
}
133140

134141
resource "google_secret_manager_secret_version" "db_password" {
135-
secret = google_secret_manager_secret.db_password.id
136-
secret_data = random_password.db_password.result
142+
count = var.enable_database ? 1 : 0
143+
secret = google_secret_manager_secret.db_password[0].id
144+
secret_data = random_password.db_password[0].result
137145
}

dns.tf

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,14 @@
11

2-
# DNS A record for API subdomain pointing to hrafnar application
3-
resource "cloudflare_record" "api" {
2+
# DNS CNAME record for application subdomain pointing to hrafnar application
3+
resource "cloudflare_record" "app" {
44
count = var.enable_cloudflare_dns && var.base_domain != "" ? 1 : 0
55
zone_id = var.cloudflare_zone_id
6-
name = var.api_subdomain
6+
name = var.app_subdomain
77
content = google_cloud_run_service.main_app.status[0].url
88
type = "CNAME"
99
proxied = true
1010

11-
comment = "Managed by Terraform - API endpoint for ${local.resource_prefix} hrafnar application"
11+
comment = "Managed by Terraform - Application endpoint for ${local.resource_prefix} hrafnar application"
1212

1313
depends_on = [google_cloud_run_domain_mapping.main_app]
1414
}
15-
16-
# DNS A record for UI subdomain pointing to React frontend or hrafnar application
17-
resource "cloudflare_record" "ui" {
18-
count = var.enable_cloudflare_dns && var.base_domain != "" && (var.enable_react_frontend || var.enable_htmx_frontend) ? 1 : 0
19-
20-
zone_id = var.cloudflare_zone_id
21-
name = var.ui_subdomain
22-
content = var.enable_react_frontend ? google_cloud_run_service.react_frontend[0].status[0].url : google_cloud_run_service.main_app.status[0].url
23-
type = "CNAME"
24-
proxied = true
25-
26-
comment = var.enable_react_frontend ? "Managed by Terraform - UI endpoint for ${local.resource_prefix} React frontend" : "Managed by Terraform - UI endpoint for ${local.resource_prefix} hrafnar HTMX frontend"
27-
28-
depends_on = [
29-
google_cloud_run_domain_mapping.react_frontend,
30-
google_cloud_run_domain_mapping.ui_app
31-
]
32-
}

examples/dev/.terraform.lock.hcl

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/dev/README.md

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,38 +79,48 @@ module "hrafnar_gcp_deploy" {
7979

8080
## Providers
8181

82-
No providers.
82+
| Name | Version |
83+
|------|---------|
84+
| <a name="provider_google"></a> [google](#provider\_google) | 5.45.2 |
85+
| <a name="provider_random"></a> [random](#provider\_random) | 3.7.2 |
8386

8487
## Modules
8588

8689
| Name | Source | Version |
8790
|------|--------|---------|
88-
| <a name="module_hrafnar_dev"></a> [hrafnar\_dev](#module\_hrafnar\_dev) | ../../ | n/a |
91+
| <a name="module_hrafnar_deploy"></a> [hrafnar\_deploy](#module\_hrafnar\_deploy) | ../../ | n/a |
8992

9093
## Resources
9194

92-
No resources.
95+
| Name | Type |
96+
|------|------|
97+
| [google_secret_manager_secret.hrafnar_auth_password](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/secret_manager_secret) | resource |
98+
| [google_secret_manager_secret_version.hrafnar_auth_password](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/secret_manager_secret_version) | resource |
99+
| [random_password.hrafnar_auth_password](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/password) | resource |
93100

94101
## Inputs
95102

96103
| Name | Description | Type | Default | Required |
97104
|------|-------------|------|---------|:--------:|
98105
| <a name="input_ai_api_keys"></a> [ai\_api\_keys](#input\_ai\_api\_keys) | Map of AI API keys (e.g., OPENAI\_API\_KEY, ANTHROPIC\_API\_KEY) | `map(string)` | `{}` | no |
99106
| <a name="input_app_image"></a> [app\_image](#input\_app\_image) | Container image for the hrafnar application | `string` | `"gcr.io/my-project/hrafnar:dev"` | no |
107+
| <a name="input_app_subdomain"></a> [app\_subdomain](#input\_app\_subdomain) | Subdomain for application access (e.g., 'app' for app.example.com) | `string` | `"app"` | no |
100108
| <a name="input_base_domain"></a> [base\_domain](#input\_base\_domain) | Base domain name (e.g., 'example.com') | `string` | `""` | no |
101109
| <a name="input_cloudflare_api_token"></a> [cloudflare\_api\_token](#input\_cloudflare\_api\_token) | Cloudflare API token (required if enable\_cloudflare\_dns is true) | `string` | `""` | no |
102110
| <a name="input_cloudflare_zone_id"></a> [cloudflare\_zone\_id](#input\_cloudflare\_zone\_id) | Cloudflare zone ID (required if enable\_cloudflare\_dns is true) | `string` | `""` | no |
103111
| <a name="input_enable_cloudflare_dns"></a> [enable\_cloudflare\_dns](#input\_enable\_cloudflare\_dns) | Enable Cloudflare DNS management for development | `bool` | `false` | no |
112+
| <a name="input_environment"></a> [environment](#input\_environment) | Deployment environment (e.g., 'prod') | `string` | `"test"` | no |
104113
| <a name="input_mcp_servers"></a> [mcp\_servers](#input\_mcp\_servers) | MCP server configurations for development | <pre>map(object({<br/> url = string<br/> api_key = optional(string)<br/> description = string<br/> }))</pre> | <pre>{<br/> "filesystem": {<br/> "description": "Local filesystem MCP server for development",<br/> "url": "http://localhost:3001"<br/> }<br/>}</pre> | no |
114+
| <a name="input_name_prefix"></a> [name\_prefix](#input\_name\_prefix) | Prefix for resource names | `string` | `"hrafnar-dev"` | no |
105115
| <a name="input_project_id"></a> [project\_id](#input\_project\_id) | GCP project ID for development environment | `string` | n/a | yes |
116+
| <a name="input_region"></a> [region](#input\_region) | GCP region for production deployment | `string` | `"us-central1"` | no |
106117

107118
## Outputs
108119

109120
| Name | Description |
110121
|------|-------------|
111-
| <a name="output_api_domain"></a> [api\_domain](#output\_api\_domain) | Development API domain (if DNS enabled) |
122+
| <a name="output_app_domain"></a> [app\_domain](#output\_app\_domain) | Development app domain (if DNS enabled) |
112123
| <a name="output_database_connection_name"></a> [database\_connection\_name](#output\_database\_connection\_name) | Development database connection name |
113124
| <a name="output_hrafnar_app_url"></a> [hrafnar\_app\_url](#output\_hrafnar\_app\_url) | URL of the hrafnar application in development |
114-
| <a name="output_ui_domain"></a> [ui\_domain](#output\_ui\_domain) | Development UI domain (if DNS enabled) |
115125
| <a name="output_vpc_name"></a> [vpc\_name](#output\_vpc\_name) | Development VPC network name |
116-
<!-- END_TF_DOCS -->
126+
<!-- END_TF_DOCS -->

0 commit comments

Comments
 (0)