~repos /gromer

#golang#htmx#ssr

git clone https://pyrossh.dev/repos/gromer.git

gromer is a framework and cli to build multipage web apps in golang using htmx and alpinejs.


a8ba7e05 Peter John

4 years ago
add infra
Dockerfile ADDED
@@ -0,0 +1,14 @@
1
+ FROM golang:1.16-buster AS build
2
+
3
+ WORKDIR /app
4
+ COPY go.mod ./
5
+ COPY go.sum ./
6
+ RUN go mod download
7
+ COPY ./ ./
8
+ RUN cd example && go build -o /example
9
+
10
+ FROM gcr.io/distroless/base-debian10
11
+
12
+ WORKDIR /
13
+ COPY --from=build /example /example
14
+ ENTRYPOINT ["/example"]
example/.gitignore CHANGED
@@ -19,4 +19,7 @@ test
19
19
  *.gcloudignore
20
20
  *.wasm
21
21
  main
22
- dev.db
22
+ .terraform
23
+ terraform.tfstate
24
+ terraform.tfstate.backup
25
+ .terraform.lock.hcl
example/k8s/base/configmap.yaml ADDED
@@ -0,0 +1,6 @@
1
+ apiVersion: v1
2
+ kind: ConfigMap
3
+ metadata:
4
+ name: my-app
5
+ data:
6
+ ENV: OVERRIDDEN
example/k8s/base/deployment.yaml ADDED
@@ -0,0 +1,13 @@
1
+ apiVersion: apps/v1
2
+ kind: Deployment
3
+ metadata:
4
+ name: my-app
5
+ spec:
6
+ replicas: 1
7
+ template:
8
+ spec:
9
+ containers:
10
+ - name: my-app
11
+ image: example:develop
12
+ ports:
13
+ - containerPort: 3000
example/k8s/base/ingress.yaml ADDED
@@ -0,0 +1,24 @@
1
+ apiVersion: networking.k8s.io/v1
2
+ kind: Ingress
3
+ metadata:
4
+ name: my-app
5
+ spec:
6
+ ingressClassName: nginx
7
+ rules:
8
+ - host: localhost
9
+ http:
10
+ paths:
11
+ - path: /
12
+ pathType: Prefix
13
+ backend:
14
+ service:
15
+ name: my-app
16
+ port:
17
+ number: 3000
18
+ ---
19
+ apiVersion: networking.k8s.io/v1
20
+ kind: IngressClass
21
+ metadata:
22
+ name: my-app
23
+ spec:
24
+ controller: k8s.io/ingress-nginx
example/k8s/base/kustomization.yaml ADDED
@@ -0,0 +1,11 @@
1
+ apiVersion: kustomize.config.k8s.io/v1beta1
2
+ kind: Kustomization
3
+
4
+ namespace: my-app
5
+ commonLabels:
6
+ app: my-app
7
+ resources:
8
+ - deployment.yaml
9
+ - configmap.yaml
10
+ - service.yaml
11
+ - ingress.yaml
example/k8s/base/service.yaml ADDED
@@ -0,0 +1,13 @@
1
+ apiVersion: v1
2
+ kind: Service
3
+ metadata:
4
+ name: my-app
5
+ spec:
6
+ type: LoadBalancer
7
+ selector:
8
+ app: my-app
9
+ ports:
10
+ - name: http
11
+ protocol: TCP
12
+ port: 3000
13
+ targetPort: 3000
example/k8s/development/configmap.yaml ADDED
@@ -0,0 +1,7 @@
1
+ apiVersion: v1
2
+ kind: ConfigMap
3
+ metadata:
4
+ name: my-app
5
+ data:
6
+ ENV: development
7
+ DATABASE_URL: postgres://postgres:demo@127.0.0.1:5432/postgres?sslmode=disable
example/k8s/development/kustomization.yaml ADDED
@@ -0,0 +1,16 @@
1
+ apiVersion: kustomize.config.k8s.io/v1beta1
2
+ kind: Kustomization
3
+
4
+ namePrefix: development-
5
+ namespace: development-my-app
6
+ commonLabels:
7
+ environment: development
8
+
9
+ bases:
10
+ - ../base
11
+
12
+ resources:
13
+ - namespace.yaml
14
+
15
+ patchesStrategicMerge:
16
+ - configmap.yaml
example/k8s/development/namespace.yaml ADDED
@@ -0,0 +1,4 @@
1
+ apiVersion: v1
2
+ kind: Namespace
3
+ metadata:
4
+ name: development-my-app
example/k8s/integration/configmap.yaml ADDED
@@ -0,0 +1,7 @@
1
+ apiVersion: v1
2
+ kind: ConfigMap
3
+ metadata:
4
+ name: my-app
5
+ data:
6
+ ENV: integration
7
+ POSTGRES_CONN_URL: hello
example/k8s/integration/kustomization.yaml ADDED
@@ -0,0 +1,16 @@
1
+ apiVersion: kustomize.config.k8s.io/v1beta1
2
+ kind: Kustomization
3
+
4
+ namePrefix: integration-
5
+ namespace: integration-my-app
6
+ commonLabels:
7
+ environment: integration
8
+
9
+ bases:
10
+ - ../base
11
+
12
+ resources:
13
+ - namespace.yaml
14
+
15
+ patchesStrategicMerge:
16
+ - configmap.yaml
example/k8s/integration/namespace.yaml ADDED
@@ -0,0 +1,4 @@
1
+ apiVersion: v1
2
+ kind: Namespace
3
+ metadata:
4
+ name: integration-my-app
example/k8s/production/configmap.yaml ADDED
@@ -0,0 +1,7 @@
1
+ apiVersion: v1
2
+ kind: ConfigMap
3
+ metadata:
4
+ name: my-app
5
+ data:
6
+ ENV: production
7
+ POSTGRES_CONN_URL: hello
example/k8s/production/kustomization.yaml ADDED
@@ -0,0 +1,16 @@
1
+ apiVersion: kustomize.config.k8s.io/v1beta1
2
+ kind: Kustomization
3
+
4
+ namePrefix: production-
5
+ namespace: production-my-app
6
+ commonLabels:
7
+ environment: production
8
+
9
+ bases:
10
+ - ../base
11
+
12
+ resources:
13
+ - namespace.yaml
14
+
15
+ patchesStrategicMerge:
16
+ - configmap.yaml
example/k8s/production/namespace.yaml ADDED
@@ -0,0 +1,4 @@
1
+ apiVersion: v1
2
+ kind: Namespace
3
+ metadata:
4
+ name: production-my-app
example/makefile CHANGED
@@ -23,4 +23,15 @@ run:
23
23
  build: export GOOS=linux
24
24
  build: export GOARCH=amd64
25
25
  build:
26
- go build -o main
26
+ go build -o main
27
+
28
+ build-image:
29
+ cd .. && docker build -t example:develop .
30
+
31
+ run-image: export DATABASE_URL=postgres://postgres:demo@docker.for.mac.host.internal:5432/postgres?sslmode=disable
32
+ run-image:
33
+ docker run -p 3000:3000 -e DATABASE_URL=$$DATABASE_URL example:develop
34
+
35
+ k8s-local:
36
+ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml
37
+ kubectl apply -k k8s/development
example/terraform.tf ADDED
@@ -0,0 +1,82 @@
1
+ terraform {
2
+ required_providers {
3
+ docker = {
4
+ source = "kreuzwerker/docker"
5
+ version = "2.15.0"
6
+ }
7
+ aws = {
8
+ source = "hashicorp/aws"
9
+ version = "3.37.0"
10
+ }
11
+ }
12
+ }
13
+
14
+ provider "aws" {
15
+ region = "ap-south-1"
16
+ }
17
+
18
+ resource "docker_image" "example" {
19
+ name = "example"
20
+ build {
21
+ path = "../"
22
+ tag = ["example:develop"]
23
+ }
24
+ }
25
+
26
+ resource "aws_vpc" "example" {
27
+ cidr_block = "10.0.0.0/16"
28
+ }
29
+
30
+ resource "aws_subnet" "example1" {
31
+ vpc_id = aws_vpc.example.id
32
+ availability_zone = "ap-south-1a"
33
+ cidr_block = "10.0.1.0/24"
34
+ }
35
+
36
+ resource "aws_subnet" "example2" {
37
+ vpc_id = aws_vpc.example.id
38
+ availability_zone = "ap-south-1b"
39
+ cidr_block = "10.0.2.0/24"
40
+ }
41
+
42
+ resource "aws_db_subnet_group" "example" {
43
+ name = "example"
44
+ subnet_ids = [aws_subnet.example1.id, aws_subnet.example2.id]
45
+ }
46
+
47
+ resource "random_password" "example" {
48
+ length = 24
49
+ special = true
50
+ override_special = "!#$%^*()-=+_?{}|"
51
+ }
52
+
53
+ # random_password.example.result
54
+
55
+ # resource "aws_ssm_parameter" "example" {
56
+ # name = "database-master-password"
57
+ # type = "SecureString"
58
+ # value = random_password.example.result
59
+ # }
60
+
61
+ resource "aws_rds_cluster" "example" {
62
+ cluster_identifier = "example"
63
+ engine = "aurora-postgresql"
64
+ engine_mode = "serverless"
65
+ database_name = "postgres"
66
+ enable_http_endpoint = false
67
+ master_username = "root"
68
+ master_password = "chang333eme321"
69
+ backup_retention_period = 1
70
+ skip_final_snapshot = true
71
+ db_subnet_group_name = aws_db_subnet_group.example.name
72
+ # vpc_security_group_ids = [aws_security_group.rds.id]
73
+ # parameter_group_name = aws_db_parameter_group.education.name
74
+
75
+ scaling_configuration {
76
+ auto_pause = true
77
+ min_capacity = 2
78
+ max_capacity = 4
79
+ seconds_until_auto_pause = 300
80
+ timeout_action = "ForceApplyCapacityChange"
81
+ }
82
+ }