@digilogiclabs/create-saas-app 1.20.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/CHANGELOG.md +27 -388
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli/commands/create.d.ts +10 -0
  4. package/dist/cli/commands/create.d.ts.map +1 -1
  5. package/dist/cli/commands/create.js +10 -0
  6. package/dist/cli/commands/create.js.map +1 -1
  7. package/dist/cli/prompts/project-setup.d.ts.map +1 -1
  8. package/dist/cli/prompts/project-setup.js +72 -9
  9. package/dist/cli/prompts/project-setup.js.map +1 -1
  10. package/dist/generators/template-generator.d.ts +13 -1
  11. package/dist/generators/template-generator.d.ts.map +1 -1
  12. package/dist/generators/template-generator.js +155 -52
  13. package/dist/generators/template-generator.js.map +1 -1
  14. package/dist/templates/infrastructure/kubernetes/base/template/README.md +253 -0
  15. package/dist/templates/infrastructure/kubernetes/base/template/configmap.yaml +12 -0
  16. package/dist/templates/infrastructure/kubernetes/base/template/deployment.yaml +123 -0
  17. package/dist/templates/infrastructure/kubernetes/base/template/hpa.yaml +45 -0
  18. package/dist/templates/infrastructure/kubernetes/base/template/ingress.yaml +31 -0
  19. package/dist/templates/infrastructure/kubernetes/base/template/kustomization.yaml +25 -0
  20. package/dist/templates/infrastructure/kubernetes/base/template/namespace.yaml +8 -0
  21. package/dist/templates/infrastructure/kubernetes/base/template/networkpolicy.yaml +48 -0
  22. package/dist/templates/infrastructure/kubernetes/base/template/pdb.yaml +14 -0
  23. package/dist/templates/infrastructure/kubernetes/base/template/secret.yaml +17 -0
  24. package/dist/templates/infrastructure/kubernetes/base/template/service.yaml +19 -0
  25. package/dist/templates/infrastructure/kubernetes/base/template/serviceaccount.yaml +9 -0
  26. package/dist/templates/infrastructure/kubernetes/production/template/kustomization.yaml +92 -0
  27. package/dist/templates/infrastructure/terraform/aws/template/README.md +156 -0
  28. package/dist/templates/infrastructure/terraform/aws/template/main.tf +343 -0
  29. package/dist/templates/infrastructure/terraform/aws/template/outputs.tf +66 -0
  30. package/dist/templates/infrastructure/terraform/aws/template/terraform.tfvars.example +28 -0
  31. package/dist/templates/infrastructure/terraform/aws/template/variables.tf +110 -0
  32. package/dist/templates/infrastructure/terraform/gcp/template/README.md +165 -0
  33. package/dist/templates/infrastructure/terraform/gcp/template/main.tf +397 -0
  34. package/dist/templates/infrastructure/terraform/gcp/template/outputs.tf +51 -0
  35. package/dist/templates/infrastructure/terraform/gcp/template/terraform.tfvars.example +29 -0
  36. package/dist/templates/infrastructure/terraform/gcp/template/variables.tf +115 -0
  37. package/dist/templates/web/ai-platform/template/.env.example +16 -0
  38. package/dist/templates/web/ai-platform/template/README.md +84 -0
  39. package/dist/templates/web/ai-platform/template/middleware.ts +55 -0
  40. package/dist/templates/web/ai-platform/template/next.config.js +14 -0
  41. package/dist/templates/web/ai-platform/template/package.json +55 -0
  42. package/dist/templates/web/ai-platform/template/src/app/api/chat/route.ts +54 -0
  43. package/dist/templates/web/ai-platform/template/src/app/chat/page.tsx +235 -0
  44. package/dist/templates/web/ai-platform/template/src/app/dashboard/page.tsx +142 -0
  45. package/dist/templates/web/ai-platform/template/src/app/globals.css +34 -0
  46. package/dist/templates/web/ai-platform/template/src/app/layout.tsx +27 -0
  47. package/dist/templates/web/ai-platform/template/src/app/page.tsx +203 -0
  48. package/dist/templates/web/ai-platform/template/src/components/providers/app-providers.tsx +27 -0
  49. package/dist/templates/web/ai-platform/template/src/lib/auth-server.ts +33 -0
  50. package/dist/templates/web/ai-platform/template/src/lib/supabase/client.ts +8 -0
  51. package/dist/templates/web/ai-platform/template/src/lib/supabase/server.ts +27 -0
  52. package/dist/templates/web/ai-platform/template/src/lib/utils.ts +6 -0
  53. package/dist/templates/web/ai-platform/template/tsconfig.json +27 -0
  54. package/dist/templates/web/base/template/package.json +5 -4
  55. package/dist/templates/web/base/template/src/lib/platform.ts +146 -0
  56. package/dist/templates/web/iot-dashboard/template/.env.example +12 -0
  57. package/dist/templates/web/iot-dashboard/template/README.md +101 -0
  58. package/dist/templates/web/iot-dashboard/template/middleware.ts +56 -0
  59. package/dist/templates/web/iot-dashboard/template/next.config.js +14 -0
  60. package/dist/templates/web/iot-dashboard/template/package.json +49 -0
  61. package/dist/templates/web/iot-dashboard/template/src/app/dashboard/page.tsx +229 -0
  62. package/dist/templates/web/iot-dashboard/template/src/app/globals.css +20 -0
  63. package/dist/templates/web/iot-dashboard/template/src/app/layout.tsx +27 -0
  64. package/dist/templates/web/iot-dashboard/template/src/app/page.tsx +191 -0
  65. package/dist/templates/web/iot-dashboard/template/src/components/providers/app-providers.tsx +24 -0
  66. package/dist/templates/web/iot-dashboard/template/src/lib/auth-server.ts +33 -0
  67. package/dist/templates/web/iot-dashboard/template/src/lib/supabase/client.ts +8 -0
  68. package/dist/templates/web/iot-dashboard/template/src/lib/supabase/server.ts +27 -0
  69. package/dist/templates/web/iot-dashboard/template/src/lib/utils.ts +25 -0
  70. package/dist/templates/web/iot-dashboard/template/tsconfig.json +27 -0
  71. package/dist/templates/web/marketplace/template/.env.example +12 -0
  72. package/dist/templates/web/marketplace/template/README.md +66 -0
  73. package/dist/templates/web/marketplace/template/middleware.ts +56 -0
  74. package/dist/templates/web/marketplace/template/next.config.js +14 -0
  75. package/dist/templates/web/marketplace/template/package.json +51 -0
  76. package/dist/templates/web/marketplace/template/src/app/cart/page.tsx +147 -0
  77. package/dist/templates/web/marketplace/template/src/app/dashboard/page.tsx +149 -0
  78. package/dist/templates/web/marketplace/template/src/app/globals.css +20 -0
  79. package/dist/templates/web/marketplace/template/src/app/layout.tsx +27 -0
  80. package/dist/templates/web/marketplace/template/src/app/page.tsx +167 -0
  81. package/dist/templates/web/marketplace/template/src/app/products/page.tsx +129 -0
  82. package/dist/templates/web/marketplace/template/src/components/providers/app-providers.tsx +27 -0
  83. package/dist/templates/web/marketplace/template/src/lib/auth-server.ts +33 -0
  84. package/dist/templates/web/marketplace/template/src/lib/supabase/client.ts +8 -0
  85. package/dist/templates/web/marketplace/template/src/lib/supabase/server.ts +27 -0
  86. package/dist/templates/web/marketplace/template/src/lib/utils.ts +19 -0
  87. package/dist/templates/web/marketplace/template/tsconfig.json +27 -0
  88. package/dist/templates/web/micro-saas/template/.env.example +10 -0
  89. package/dist/templates/web/micro-saas/template/README.md +63 -0
  90. package/dist/templates/web/micro-saas/template/middleware.ts +53 -0
  91. package/dist/templates/web/micro-saas/template/next.config.js +14 -0
  92. package/dist/templates/web/micro-saas/template/package.json +41 -0
  93. package/dist/templates/web/micro-saas/template/src/app/dashboard/page.tsx +117 -0
  94. package/dist/templates/web/micro-saas/template/src/app/globals.css +20 -0
  95. package/dist/templates/web/micro-saas/template/src/app/layout.tsx +27 -0
  96. package/dist/templates/web/micro-saas/template/src/app/login/page.tsx +87 -0
  97. package/dist/templates/web/micro-saas/template/src/app/page.tsx +137 -0
  98. package/dist/templates/web/micro-saas/template/src/app/signup/page.tsx +108 -0
  99. package/dist/templates/web/micro-saas/template/src/components/providers/app-providers.tsx +24 -0
  100. package/dist/templates/web/micro-saas/template/src/lib/auth-server.ts +33 -0
  101. package/dist/templates/web/micro-saas/template/src/lib/supabase/client.ts +8 -0
  102. package/dist/templates/web/micro-saas/template/src/lib/supabase/server.ts +29 -0
  103. package/dist/templates/web/micro-saas/template/src/lib/utils.ts +6 -0
  104. package/dist/templates/web/micro-saas/template/tsconfig.json +27 -0
  105. package/dist/templates/web/ui-auth/template/package.json +4 -3
  106. package/dist/templates/web/ui-auth/template/src/lib/platform.ts +137 -0
  107. package/dist/templates/web/ui-auth-payments/template/.env.example +51 -15
  108. package/dist/templates/web/ui-auth-payments/template/package.json +5 -4
  109. package/dist/templates/web/ui-auth-payments/template/src/lib/platform.ts +146 -0
  110. package/dist/templates/web/ui-auth-payments-ai/template/.env.example +60 -22
  111. package/dist/templates/web/ui-auth-payments-ai/template/package.json +6 -5
  112. package/dist/templates/web/ui-auth-payments-ai/template/src/lib/platform.ts +155 -0
  113. package/package.json +6 -6
  114. package/src/templates/infrastructure/kubernetes/base/template/README.md +253 -0
  115. package/src/templates/infrastructure/kubernetes/base/template/configmap.yaml +12 -0
  116. package/src/templates/infrastructure/kubernetes/base/template/deployment.yaml +123 -0
  117. package/src/templates/infrastructure/kubernetes/base/template/hpa.yaml +45 -0
  118. package/src/templates/infrastructure/kubernetes/base/template/ingress.yaml +31 -0
  119. package/src/templates/infrastructure/kubernetes/base/template/kustomization.yaml +25 -0
  120. package/src/templates/infrastructure/kubernetes/base/template/namespace.yaml +8 -0
  121. package/src/templates/infrastructure/kubernetes/base/template/networkpolicy.yaml +48 -0
  122. package/src/templates/infrastructure/kubernetes/base/template/pdb.yaml +14 -0
  123. package/src/templates/infrastructure/kubernetes/base/template/secret.yaml +17 -0
  124. package/src/templates/infrastructure/kubernetes/base/template/service.yaml +19 -0
  125. package/src/templates/infrastructure/kubernetes/base/template/serviceaccount.yaml +9 -0
  126. package/src/templates/infrastructure/kubernetes/production/template/kustomization.yaml +92 -0
  127. package/src/templates/infrastructure/terraform/aws/template/README.md +156 -0
  128. package/src/templates/infrastructure/terraform/aws/template/main.tf +343 -0
  129. package/src/templates/infrastructure/terraform/aws/template/outputs.tf +66 -0
  130. package/src/templates/infrastructure/terraform/aws/template/terraform.tfvars.example +28 -0
  131. package/src/templates/infrastructure/terraform/aws/template/variables.tf +110 -0
  132. package/src/templates/infrastructure/terraform/gcp/template/README.md +165 -0
  133. package/src/templates/infrastructure/terraform/gcp/template/main.tf +397 -0
  134. package/src/templates/infrastructure/terraform/gcp/template/outputs.tf +51 -0
  135. package/src/templates/infrastructure/terraform/gcp/template/terraform.tfvars.example +29 -0
  136. package/src/templates/infrastructure/terraform/gcp/template/variables.tf +115 -0
  137. package/src/templates/web/ai-platform/template/.env.example +16 -0
  138. package/src/templates/web/ai-platform/template/README.md +84 -0
  139. package/src/templates/web/ai-platform/template/middleware.ts +55 -0
  140. package/src/templates/web/ai-platform/template/next.config.js +14 -0
  141. package/src/templates/web/ai-platform/template/package.json +55 -0
  142. package/src/templates/web/ai-platform/template/src/app/api/chat/route.ts +54 -0
  143. package/src/templates/web/ai-platform/template/src/app/chat/page.tsx +235 -0
  144. package/src/templates/web/ai-platform/template/src/app/dashboard/page.tsx +142 -0
  145. package/src/templates/web/ai-platform/template/src/app/globals.css +34 -0
  146. package/src/templates/web/ai-platform/template/src/app/layout.tsx +27 -0
  147. package/src/templates/web/ai-platform/template/src/app/page.tsx +203 -0
  148. package/src/templates/web/ai-platform/template/src/components/providers/app-providers.tsx +27 -0
  149. package/src/templates/web/ai-platform/template/src/lib/auth-server.ts +33 -0
  150. package/src/templates/web/ai-platform/template/src/lib/supabase/client.ts +8 -0
  151. package/src/templates/web/ai-platform/template/src/lib/supabase/server.ts +27 -0
  152. package/src/templates/web/ai-platform/template/src/lib/utils.ts +6 -0
  153. package/src/templates/web/ai-platform/template/tsconfig.json +27 -0
  154. package/src/templates/web/base/template/package.json +5 -4
  155. package/src/templates/web/base/template/src/lib/platform.ts +146 -0
  156. package/src/templates/web/iot-dashboard/template/.env.example +12 -0
  157. package/src/templates/web/iot-dashboard/template/README.md +101 -0
  158. package/src/templates/web/iot-dashboard/template/middleware.ts +56 -0
  159. package/src/templates/web/iot-dashboard/template/next.config.js +14 -0
  160. package/src/templates/web/iot-dashboard/template/package.json +49 -0
  161. package/src/templates/web/iot-dashboard/template/src/app/dashboard/page.tsx +229 -0
  162. package/src/templates/web/iot-dashboard/template/src/app/globals.css +20 -0
  163. package/src/templates/web/iot-dashboard/template/src/app/layout.tsx +27 -0
  164. package/src/templates/web/iot-dashboard/template/src/app/page.tsx +191 -0
  165. package/src/templates/web/iot-dashboard/template/src/components/providers/app-providers.tsx +24 -0
  166. package/src/templates/web/iot-dashboard/template/src/lib/auth-server.ts +33 -0
  167. package/src/templates/web/iot-dashboard/template/src/lib/supabase/client.ts +8 -0
  168. package/src/templates/web/iot-dashboard/template/src/lib/supabase/server.ts +27 -0
  169. package/src/templates/web/iot-dashboard/template/src/lib/utils.ts +25 -0
  170. package/src/templates/web/iot-dashboard/template/tsconfig.json +27 -0
  171. package/src/templates/web/marketplace/template/.env.example +12 -0
  172. package/src/templates/web/marketplace/template/README.md +66 -0
  173. package/src/templates/web/marketplace/template/middleware.ts +56 -0
  174. package/src/templates/web/marketplace/template/next.config.js +14 -0
  175. package/src/templates/web/marketplace/template/package.json +51 -0
  176. package/src/templates/web/marketplace/template/src/app/cart/page.tsx +147 -0
  177. package/src/templates/web/marketplace/template/src/app/dashboard/page.tsx +149 -0
  178. package/src/templates/web/marketplace/template/src/app/globals.css +20 -0
  179. package/src/templates/web/marketplace/template/src/app/layout.tsx +27 -0
  180. package/src/templates/web/marketplace/template/src/app/page.tsx +167 -0
  181. package/src/templates/web/marketplace/template/src/app/products/page.tsx +129 -0
  182. package/src/templates/web/marketplace/template/src/components/providers/app-providers.tsx +27 -0
  183. package/src/templates/web/marketplace/template/src/lib/auth-server.ts +33 -0
  184. package/src/templates/web/marketplace/template/src/lib/supabase/client.ts +8 -0
  185. package/src/templates/web/marketplace/template/src/lib/supabase/server.ts +27 -0
  186. package/src/templates/web/marketplace/template/src/lib/utils.ts +19 -0
  187. package/src/templates/web/marketplace/template/tsconfig.json +27 -0
  188. package/src/templates/web/micro-saas/template/.env.example +10 -0
  189. package/src/templates/web/micro-saas/template/README.md +63 -0
  190. package/src/templates/web/micro-saas/template/middleware.ts +53 -0
  191. package/src/templates/web/micro-saas/template/next.config.js +14 -0
  192. package/src/templates/web/micro-saas/template/package.json +41 -0
  193. package/src/templates/web/micro-saas/template/src/app/dashboard/page.tsx +117 -0
  194. package/src/templates/web/micro-saas/template/src/app/globals.css +20 -0
  195. package/src/templates/web/micro-saas/template/src/app/layout.tsx +27 -0
  196. package/src/templates/web/micro-saas/template/src/app/login/page.tsx +87 -0
  197. package/src/templates/web/micro-saas/template/src/app/page.tsx +137 -0
  198. package/src/templates/web/micro-saas/template/src/app/signup/page.tsx +108 -0
  199. package/src/templates/web/micro-saas/template/src/components/providers/app-providers.tsx +24 -0
  200. package/src/templates/web/micro-saas/template/src/lib/auth-server.ts +33 -0
  201. package/src/templates/web/micro-saas/template/src/lib/supabase/client.ts +8 -0
  202. package/src/templates/web/micro-saas/template/src/lib/supabase/server.ts +29 -0
  203. package/src/templates/web/micro-saas/template/src/lib/utils.ts +6 -0
  204. package/src/templates/web/micro-saas/template/tsconfig.json +27 -0
  205. package/src/templates/web/ui-auth/template/package.json +4 -3
  206. package/src/templates/web/ui-auth/template/src/lib/platform.ts +137 -0
  207. package/src/templates/web/ui-auth-payments/template/.env.example +51 -15
  208. package/src/templates/web/ui-auth-payments/template/package.json +5 -4
  209. package/src/templates/web/ui-auth-payments/template/src/lib/platform.ts +146 -0
  210. package/src/templates/web/ui-auth-payments-ai/template/.env.example +60 -22
  211. package/src/templates/web/ui-auth-payments-ai/template/package.json +6 -5
  212. package/src/templates/web/ui-auth-payments-ai/template/src/lib/platform.ts +155 -0
  213. package/bin/index.js +0 -36
@@ -0,0 +1,110 @@
1
+ # {{titleCaseName}} - Terraform Variables
2
+
3
+ # ============================================
4
+ # General
5
+ # ============================================
6
+
7
+ variable "environment" {
8
+ description = "Environment name (staging, production)"
9
+ type = string
10
+ default = "staging"
11
+ }
12
+
13
+ variable "aws_region" {
14
+ description = "AWS region"
15
+ type = string
16
+ default = "us-east-1"
17
+ }
18
+
19
+ # ============================================
20
+ # Vercel
21
+ # ============================================
22
+
23
+ variable "vercel_api_token" {
24
+ description = "Vercel API token"
25
+ type = string
26
+ sensitive = true
27
+ }
28
+
29
+ variable "vercel_team_id" {
30
+ description = "Vercel team ID (optional)"
31
+ type = string
32
+ default = null
33
+ }
34
+
35
+ variable "github_repo" {
36
+ description = "GitHub repository (org/repo format)"
37
+ type = string
38
+ }
39
+
40
+ variable "domain" {
41
+ description = "Production domain"
42
+ type = string
43
+ }
44
+
45
+ # ============================================
46
+ # Supabase
47
+ # ============================================
48
+
49
+ variable "supabase_url" {
50
+ description = "Supabase project URL"
51
+ type = string
52
+ }
53
+
54
+ variable "supabase_anon_key" {
55
+ description = "Supabase anonymous key"
56
+ type = string
57
+ sensitive = true
58
+ }
59
+
60
+ variable "supabase_service_role_key" {
61
+ description = "Supabase service role key"
62
+ type = string
63
+ sensitive = true
64
+ }
65
+
66
+ # ============================================
67
+ # Stripe (Optional)
68
+ # ============================================
69
+
70
+ variable "stripe_secret_key" {
71
+ description = "Stripe secret key"
72
+ type = string
73
+ default = ""
74
+ sensitive = true
75
+ }
76
+
77
+ variable "stripe_webhook_secret" {
78
+ description = "Stripe webhook secret"
79
+ type = string
80
+ default = ""
81
+ sensitive = true
82
+ }
83
+
84
+ # ============================================
85
+ # AI (Optional)
86
+ # ============================================
87
+
88
+ variable "openai_api_key" {
89
+ description = "OpenAI API key"
90
+ type = string
91
+ default = ""
92
+ sensitive = true
93
+ }
94
+
95
+ variable "anthropic_api_key" {
96
+ description = "Anthropic API key"
97
+ type = string
98
+ default = ""
99
+ sensitive = true
100
+ }
101
+
102
+ # ============================================
103
+ # Monitoring
104
+ # ============================================
105
+
106
+ variable "alert_email" {
107
+ description = "Email address for alerts"
108
+ type = string
109
+ default = ""
110
+ }
@@ -0,0 +1,165 @@
1
+ # {{titleCaseName}} - GCP Infrastructure
2
+
3
+ Terraform configuration for deploying {{titleCaseName}} to Google Cloud Platform with Vercel frontend.
4
+
5
+ ## Architecture
6
+
7
+ ```
8
+ ┌─────────────────────────────────────────────────────────────┐
9
+ │ Internet │
10
+ └─────────────────────────────────────────────────────────────┘
11
+
12
+ ┌───────────────┼───────────────┐
13
+ ▼ ▼ ▼
14
+ ┌──────────┐ ┌───────────┐ ┌───────────┐
15
+ │ Vercel │ │ Cloud CDN │ │ Supabase │
16
+ │ (App) │ │ │ │ (Auth/DB) │
17
+ └──────────┘ └───────────┘ └───────────┘
18
+
19
+
20
+ ┌─────────────────┐
21
+ │ Cloud Storage │
22
+ │ (Buckets) │
23
+ └─────────────────┘
24
+
25
+ ┌───────────┐ ┌───────────┐ ┌───────────┐
26
+ │Cloud Tasks│ │ Pub/Sub │ │ Secret │
27
+ │ (Queue) │ │ (Events) │ │ Manager │
28
+ └───────────┘ └───────────┘ └───────────┘
29
+ ```
30
+
31
+ ## Prerequisites
32
+
33
+ 1. **GCP Project** with billing enabled
34
+ 2. **Vercel Account** with API token
35
+ 3. **Supabase Project** created
36
+ 4. **Terraform** >= 1.0 installed
37
+ 5. **gcloud CLI** configured
38
+
39
+ ## Quick Start
40
+
41
+ 1. **Enable required APIs:**
42
+ ```bash
43
+ gcloud services enable \
44
+ storage.googleapis.com \
45
+ compute.googleapis.com \
46
+ cloudtasks.googleapis.com \
47
+ pubsub.googleapis.com \
48
+ secretmanager.googleapis.com \
49
+ logging.googleapis.com \
50
+ monitoring.googleapis.com
51
+ ```
52
+
53
+ 2. **Initialize Terraform:**
54
+ ```bash
55
+ terraform init
56
+ ```
57
+
58
+ 3. **Create variables file:**
59
+ ```bash
60
+ cp terraform.tfvars.example terraform.tfvars
61
+ ```
62
+
63
+ 4. **Update variables:**
64
+ Edit `terraform.tfvars` with your values.
65
+
66
+ 5. **Plan changes:**
67
+ ```bash
68
+ terraform plan
69
+ ```
70
+
71
+ 6. **Apply changes:**
72
+ ```bash
73
+ terraform apply
74
+ ```
75
+
76
+ ## Resources Created
77
+
78
+ | Resource | Purpose |
79
+ |----------|---------|
80
+ | Vercel Project | Frontend hosting with automatic deployments |
81
+ | Cloud Storage | File storage with versioning |
82
+ | Cloud CDN | Global CDN for storage content |
83
+ | Cloud Tasks | Background job queue with retries |
84
+ | Pub/Sub | Event-driven messaging |
85
+ | Secret Manager | Secure storage for API keys |
86
+ | Service Account | IAM identity for application |
87
+ | Cloud Logging | Centralized log storage |
88
+ | Cloud Monitoring | Alerting for errors |
89
+
90
+ ## Environments
91
+
92
+ ### Staging
93
+ ```bash
94
+ terraform workspace new staging
95
+ terraform apply -var="environment=staging"
96
+ ```
97
+
98
+ ### Production
99
+ ```bash
100
+ terraform workspace new production
101
+ terraform apply -var="environment=production"
102
+ ```
103
+
104
+ ## Remote State (Recommended for Teams)
105
+
106
+ 1. Create GCS bucket:
107
+ ```bash
108
+ gsutil mb -l us-central1 gs://{{projectName}}-terraform-state
109
+ gsutil versioning set on gs://{{projectName}}-terraform-state
110
+ ```
111
+
112
+ 2. Uncomment backend configuration in `main.tf`
113
+
114
+ 3. Re-initialize:
115
+ ```bash
116
+ terraform init -migrate-state
117
+ ```
118
+
119
+ ## Security Notes
120
+
121
+ - Uniform bucket-level access enabled
122
+ - Encryption at rest (Google-managed)
123
+ - Secrets stored in Secret Manager
124
+ - Service account follows least-privilege
125
+ - Cloud CDN uses HTTPS only
126
+
127
+ ## Cost Estimation
128
+
129
+ | Resource | Estimated Monthly Cost |
130
+ |----------|----------------------|
131
+ | Vercel | Free - $20 (Hobby/Pro) |
132
+ | Cloud Storage | ~$5 (50GB storage) |
133
+ | Cloud CDN | ~$8 (100GB egress) |
134
+ | Cloud Tasks | ~$0.40 (1M tasks) |
135
+ | Pub/Sub | ~$1 (1M messages) |
136
+ | Secret Manager | ~$0.06 (4 secrets) |
137
+ | Cloud Logging | ~$5 (10GB logs) |
138
+ | **Total** | **~$20-40/month** |
139
+
140
+ ## Cleanup
141
+
142
+ ```bash
143
+ terraform destroy
144
+ ```
145
+
146
+ ## Troubleshooting
147
+
148
+ ### GCP Authentication
149
+ ```bash
150
+ gcloud auth application-default login
151
+ # Or use service account
152
+ export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"
153
+ ```
154
+
155
+ ### Vercel API Token
156
+ Generate at: https://vercel.com/account/tokens
157
+
158
+ ### State Lock Issues
159
+ ```bash
160
+ terraform force-unlock LOCK_ID
161
+ ```
162
+
163
+ ## License
164
+
165
+ MIT - Built with DLL Platform
@@ -0,0 +1,397 @@
1
+ # {{titleCaseName}} - GCP Infrastructure
2
+ # Terraform configuration for deploying to Google Cloud with Vercel frontend
3
+
4
+ terraform {
5
+ required_version = ">= 1.0"
6
+
7
+ required_providers {
8
+ google = {
9
+ source = "hashicorp/google"
10
+ version = "~> 5.0"
11
+ }
12
+ vercel = {
13
+ source = "vercel/vercel"
14
+ version = "~> 1.0"
15
+ }
16
+ }
17
+
18
+ # Uncomment for remote state storage
19
+ # backend "gcs" {
20
+ # bucket = "{{projectName}}-terraform-state"
21
+ # prefix = "terraform/state"
22
+ # }
23
+ }
24
+
25
+ provider "google" {
26
+ project = var.gcp_project_id
27
+ region = var.gcp_region
28
+ }
29
+
30
+ provider "vercel" {
31
+ api_token = var.vercel_api_token
32
+ team = var.vercel_team_id
33
+ }
34
+
35
+ # ============================================
36
+ # Vercel Project
37
+ # ============================================
38
+
39
+ resource "vercel_project" "app" {
40
+ name = "{{projectName}}-${var.environment}"
41
+ framework = "nextjs"
42
+
43
+ git_repository = {
44
+ type = "github"
45
+ repo = var.github_repo
46
+ }
47
+
48
+ environment = [
49
+ {
50
+ key = "NEXT_PUBLIC_SUPABASE_URL"
51
+ value = var.supabase_url
52
+ target = ["production", "preview", "development"]
53
+ },
54
+ {
55
+ key = "NEXT_PUBLIC_SUPABASE_ANON_KEY"
56
+ value = var.supabase_anon_key
57
+ target = ["production", "preview", "development"]
58
+ },
59
+ {
60
+ key = "SUPABASE_SERVICE_ROLE_KEY"
61
+ value = var.supabase_service_role_key
62
+ target = ["production"]
63
+ },
64
+ {
65
+ key = "NEXT_PUBLIC_APP_URL"
66
+ value = "https://${var.domain}"
67
+ target = ["production"]
68
+ }
69
+ ]
70
+ }
71
+
72
+ resource "vercel_project_domain" "app" {
73
+ project_id = vercel_project.app.id
74
+ domain = var.domain
75
+ }
76
+
77
+ # ============================================
78
+ # Cloud Storage Bucket
79
+ # ============================================
80
+
81
+ resource "google_storage_bucket" "storage" {
82
+ name = "{{projectName}}-${var.environment}-storage"
83
+ location = var.gcp_region
84
+ storage_class = "STANDARD"
85
+
86
+ uniform_bucket_level_access = true
87
+
88
+ versioning {
89
+ enabled = true
90
+ }
91
+
92
+ lifecycle_rule {
93
+ action {
94
+ type = "Delete"
95
+ }
96
+ condition {
97
+ age = 365
98
+ }
99
+ }
100
+
101
+ cors {
102
+ origin = ["https://${var.domain}"]
103
+ method = ["GET", "PUT", "POST", "DELETE", "HEAD"]
104
+ response_header = ["*"]
105
+ max_age_seconds = 3600
106
+ }
107
+
108
+ labels = {
109
+ project = "{{projectName}}"
110
+ environment = var.environment
111
+ managed-by = "terraform"
112
+ }
113
+ }
114
+
115
+ # ============================================
116
+ # Cloud CDN for Storage
117
+ # ============================================
118
+
119
+ resource "google_compute_backend_bucket" "storage_cdn" {
120
+ name = "{{projectName}}-${var.environment}-cdn"
121
+ bucket_name = google_storage_bucket.storage.name
122
+ enable_cdn = true
123
+
124
+ cdn_policy {
125
+ cache_mode = "CACHE_ALL_STATIC"
126
+ default_ttl = 3600
127
+ max_ttl = 86400
128
+ client_ttl = 3600
129
+ negative_caching = true
130
+ }
131
+ }
132
+
133
+ resource "google_compute_url_map" "storage_cdn" {
134
+ name = "{{projectName}}-${var.environment}-url-map"
135
+ default_service = google_compute_backend_bucket.storage_cdn.id
136
+ }
137
+
138
+ resource "google_compute_global_address" "storage_cdn" {
139
+ name = "{{projectName}}-${var.environment}-cdn-ip"
140
+ }
141
+
142
+ resource "google_compute_global_forwarding_rule" "storage_cdn_https" {
143
+ name = "{{projectName}}-${var.environment}-cdn-https"
144
+ ip_address = google_compute_global_address.storage_cdn.address
145
+ ip_protocol = "TCP"
146
+ load_balancing_scheme = "EXTERNAL"
147
+ port_range = "443"
148
+ target = google_compute_target_https_proxy.storage_cdn.id
149
+ }
150
+
151
+ resource "google_compute_managed_ssl_certificate" "storage_cdn" {
152
+ name = "{{projectName}}-${var.environment}-cdn-cert"
153
+
154
+ managed {
155
+ domains = ["cdn.${var.domain}"]
156
+ }
157
+ }
158
+
159
+ resource "google_compute_target_https_proxy" "storage_cdn" {
160
+ name = "{{projectName}}-${var.environment}-cdn-proxy"
161
+ url_map = google_compute_url_map.storage_cdn.id
162
+ ssl_certificates = [google_compute_managed_ssl_certificate.storage_cdn.id]
163
+ }
164
+
165
+ # ============================================
166
+ # Cloud Tasks (Job Queue)
167
+ # ============================================
168
+
169
+ resource "google_cloud_tasks_queue" "jobs" {
170
+ name = "{{projectName}}-${var.environment}-jobs"
171
+ location = var.gcp_region
172
+
173
+ rate_limits {
174
+ max_concurrent_dispatches = 10
175
+ max_dispatches_per_second = 100
176
+ }
177
+
178
+ retry_config {
179
+ max_attempts = 5
180
+ max_retry_duration = "3600s"
181
+ min_backoff = "1s"
182
+ max_backoff = "3600s"
183
+ max_doublings = 16
184
+ }
185
+ }
186
+
187
+ # ============================================
188
+ # Pub/Sub (Event Bus)
189
+ # ============================================
190
+
191
+ resource "google_pubsub_topic" "events" {
192
+ name = "{{projectName}}-${var.environment}-events"
193
+
194
+ labels = {
195
+ project = "{{projectName}}"
196
+ environment = var.environment
197
+ }
198
+ }
199
+
200
+ resource "google_pubsub_subscription" "events" {
201
+ name = "{{projectName}}-${var.environment}-events-sub"
202
+ topic = google_pubsub_topic.events.name
203
+
204
+ ack_deadline_seconds = 60
205
+
206
+ retry_policy {
207
+ minimum_backoff = "10s"
208
+ maximum_backoff = "600s"
209
+ }
210
+
211
+ dead_letter_policy {
212
+ dead_letter_topic = google_pubsub_topic.events_dlq.id
213
+ max_delivery_attempts = 5
214
+ }
215
+ }
216
+
217
+ resource "google_pubsub_topic" "events_dlq" {
218
+ name = "{{projectName}}-${var.environment}-events-dlq"
219
+ }
220
+
221
+ # ============================================
222
+ # Secret Manager
223
+ # ============================================
224
+
225
+ resource "google_secret_manager_secret" "stripe_secret_key" {
226
+ secret_id = "{{projectName}}-${var.environment}-stripe-secret-key"
227
+
228
+ replication {
229
+ auto {}
230
+ }
231
+
232
+ labels = {
233
+ project = "{{projectName}}"
234
+ environment = var.environment
235
+ }
236
+ }
237
+
238
+ resource "google_secret_manager_secret_version" "stripe_secret_key" {
239
+ count = var.stripe_secret_key != "" ? 1 : 0
240
+ secret = google_secret_manager_secret.stripe_secret_key.id
241
+ secret_data = var.stripe_secret_key
242
+ }
243
+
244
+ resource "google_secret_manager_secret" "stripe_webhook_secret" {
245
+ secret_id = "{{projectName}}-${var.environment}-stripe-webhook-secret"
246
+
247
+ replication {
248
+ auto {}
249
+ }
250
+
251
+ labels = {
252
+ project = "{{projectName}}"
253
+ environment = var.environment
254
+ }
255
+ }
256
+
257
+ resource "google_secret_manager_secret_version" "stripe_webhook_secret" {
258
+ count = var.stripe_webhook_secret != "" ? 1 : 0
259
+ secret = google_secret_manager_secret.stripe_webhook_secret.id
260
+ secret_data = var.stripe_webhook_secret
261
+ }
262
+
263
+ resource "google_secret_manager_secret" "openai_api_key" {
264
+ secret_id = "{{projectName}}-${var.environment}-openai-api-key"
265
+
266
+ replication {
267
+ auto {}
268
+ }
269
+
270
+ labels = {
271
+ project = "{{projectName}}"
272
+ environment = var.environment
273
+ }
274
+ }
275
+
276
+ resource "google_secret_manager_secret_version" "openai_api_key" {
277
+ count = var.openai_api_key != "" ? 1 : 0
278
+ secret = google_secret_manager_secret.openai_api_key.id
279
+ secret_data = var.openai_api_key
280
+ }
281
+
282
+ # ============================================
283
+ # Service Account
284
+ # ============================================
285
+
286
+ resource "google_service_account" "app" {
287
+ account_id = "{{projectName}}-${var.environment}"
288
+ display_name = "{{titleCaseName}} ${var.environment} Service Account"
289
+ }
290
+
291
+ resource "google_project_iam_member" "app_storage" {
292
+ project = var.gcp_project_id
293
+ role = "roles/storage.objectAdmin"
294
+ member = "serviceAccount:${google_service_account.app.email}"
295
+ }
296
+
297
+ resource "google_project_iam_member" "app_tasks" {
298
+ project = var.gcp_project_id
299
+ role = "roles/cloudtasks.enqueuer"
300
+ member = "serviceAccount:${google_service_account.app.email}"
301
+ }
302
+
303
+ resource "google_project_iam_member" "app_pubsub" {
304
+ project = var.gcp_project_id
305
+ role = "roles/pubsub.publisher"
306
+ member = "serviceAccount:${google_service_account.app.email}"
307
+ }
308
+
309
+ resource "google_project_iam_member" "app_secrets" {
310
+ project = var.gcp_project_id
311
+ role = "roles/secretmanager.secretAccessor"
312
+ member = "serviceAccount:${google_service_account.app.email}"
313
+ }
314
+
315
+ resource "google_project_iam_member" "app_logging" {
316
+ project = var.gcp_project_id
317
+ role = "roles/logging.logWriter"
318
+ member = "serviceAccount:${google_service_account.app.email}"
319
+ }
320
+
321
+ # ============================================
322
+ # Cloud Logging
323
+ # ============================================
324
+
325
+ resource "google_logging_project_sink" "app_logs" {
326
+ name = "{{projectName}}-${var.environment}-logs"
327
+ destination = "storage.googleapis.com/${google_storage_bucket.logs.name}"
328
+ filter = "resource.labels.project_id=\"${var.gcp_project_id}\" AND labels.project=\"{{projectName}}\""
329
+
330
+ unique_writer_identity = true
331
+ }
332
+
333
+ resource "google_storage_bucket" "logs" {
334
+ name = "{{projectName}}-${var.environment}-logs"
335
+ location = var.gcp_region
336
+ storage_class = "STANDARD"
337
+
338
+ lifecycle_rule {
339
+ action {
340
+ type = "Delete"
341
+ }
342
+ condition {
343
+ age = 90
344
+ }
345
+ }
346
+
347
+ labels = {
348
+ project = "{{projectName}}"
349
+ environment = var.environment
350
+ }
351
+ }
352
+
353
+ resource "google_storage_bucket_iam_member" "logs_writer" {
354
+ bucket = google_storage_bucket.logs.name
355
+ role = "roles/storage.objectCreator"
356
+ member = google_logging_project_sink.app_logs.writer_identity
357
+ }
358
+
359
+ # ============================================
360
+ # Cloud Monitoring Alerts
361
+ # ============================================
362
+
363
+ resource "google_monitoring_notification_channel" "email" {
364
+ count = var.alert_email != "" ? 1 : 0
365
+ display_name = "{{titleCaseName}} Alerts"
366
+ type = "email"
367
+
368
+ labels = {
369
+ email_address = var.alert_email
370
+ }
371
+ }
372
+
373
+ resource "google_monitoring_alert_policy" "high_error_rate" {
374
+ count = var.alert_email != "" ? 1 : 0
375
+ display_name = "{{titleCaseName}} High Error Rate"
376
+ combiner = "OR"
377
+
378
+ conditions {
379
+ display_name = "Error rate > 5%"
380
+ condition_threshold {
381
+ filter = "resource.type=\"cloud_run_revision\" AND metric.type=\"run.googleapis.com/request_count\" AND metric.labels.response_code_class=\"5xx\""
382
+ duration = "300s"
383
+ comparison = "COMPARISON_GT"
384
+ threshold_value = 0.05
385
+ aggregations {
386
+ alignment_period = "60s"
387
+ per_series_aligner = "ALIGN_RATE"
388
+ }
389
+ }
390
+ }
391
+
392
+ notification_channels = [google_monitoring_notification_channel.email[0].id]
393
+
394
+ alert_strategy {
395
+ auto_close = "86400s"
396
+ }
397
+ }