Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
FROM golang:1.22

RUN curl -L https://github.com/golang-migrate/migrate/releases/download/v4.15.0/migrate.linux-amd64.tar.gz | tar xvz -C /usr/local/bin

WORKDIR /usr/src/app

COPY go.mod go.sum ./

RUN go mod download && go mod verify

COPY . .

RUN go build -v -o /usr/local/bin/app ./cmd/...

CMD ["app"]
9 changes: 9 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,15 @@ migrate-up:
migrate-down:
migrate -database $(DB_URL) -path internal/database/postgres/migration down

migrate-docker-down:
docker-compose run app migrate -path ./internal/database/postgres/migration -database "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable" down

migrate-docker-up:
docker-compose run app migrate -path ./internal/database/postgres/migration -database "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable" up

kube-forward-port:
kubectl port-forward services/booking-app-app 8080:8080

migrate-up-test:
migrate -database $(DB_URL_TEST) -path internal/database/postgres/migration up

Expand Down
35 changes: 34 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,17 @@ After initializing all the necessary dependencies, you can run project:
go run cmd/main.go
```

Use, if running on local machine:
```
POSTGRES_HOST=localhost
REDIS_HOST=localhost
```
if running on docker or kubernetes:
```
POSTGRES_HOST=postgres
REDIS_HOST=redis
```

### Testing

to test integration tests:
Expand All @@ -59,4 +70,26 @@ also set config variables as below example:
```
make export_env
source set_env.sh
```
```

### Kubernetes

[Install minikube if you dont have it yet](https://minikube.sigs.k8s.io/docs/start/)

Then you just need too, apply kubernetes configuration to run the project:

```
helm install booking-app ./booking-chart
```

or to update:
```
helm upgrade booking-app ./booking-chart
```

Warning: job 'migrate-job' may crash before 'app' pod is running, that is why you may recreate 'migrate-job' to run migration on postgres schema after 'app' pod is ready.

To forward a local port 8080 to a port on a Kubernetes service:
```
make kube-forward-port
```
23 changes: 23 additions & 0 deletions booking-chart/.helmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/
24 changes: 24 additions & 0 deletions booking-chart/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
apiVersion: v2
name: booking-chart
description: A Helm chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.0

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: "1.16.0"
28 changes: 28 additions & 0 deletions booking-chart/templates/app_deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-app
labels:
app: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
containers:
- name: {{ .Release.Name }}-app
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.service.port }}
env:
{{- range $key, $value := .Values.env }}
- name: {{ $key }}
value: "{{ $value }}"
{{- end }}
resources: {}
restartPolicy: Always
13 changes: 13 additions & 0 deletions booking-chart/templates/app_service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-app
labels:
app: {{ .Release.Name }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.port }}
selector:
app: {{ .Release.Name }}
25 changes: 25 additions & 0 deletions booking-chart/templates/configmap_env.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-local-env
labels:
io.kompose.service: app-local-env
data:
ACCESS_TOKEN_EXPIRE: "{{ .Values.env.ACCESS_TOKEN_EXPIRE }}"
ADDRESS: "{{ .Values.env.ADDRESS }}"
ENVIRONMENT: "{{ .Values.env.ENVIRONMENT }}"
HEADER_TIMEOUT: "{{ .Values.env.HEADER_TIMEOUT }}"
JWT_TOKEN_SECRET: "{{ .Values.env.JWT_TOKEN_SECRET }}"
POSTGRES_DB: "{{ .Values.env.POSTGRES_DB }}"
POSTGRES_HOST: "{{ .Values.env.POSTGRES_HOST }}"
POSTGRES_MAX_CONNECTIONS: "{{ .Values.env.POSTGRES_MAX_CONNECTIONS }}"
POSTGRES_PORT: "{{ .Values.env.POSTGRES_PORT }}"
POSTGRES_TIMEOUT: "{{ .Values.env.POSTGRES_TIMEOUT }}"
POSTGRES_USER: "{{ .Values.env.POSTGRES_USER }}"
REDIS_DATABASE: "{{ .Values.env.REDIS_DATABASE }}"
REDIS_HOST: "{{ .Values.env.REDIS_HOST }}"
REDIS_POOL_SIZE: "{{ .Values.env.REDIS_POOL_SIZE }}"
REDIS_PORT: "{{ .Values.env.REDIS_PORT }}"
REDIS_TIMEOUT: "{{ .Values.env.REDIS_TIMEOUT }}"
REDIS_TTL: "{{ .Values.env.REDIS_TTL }}"
REST_PORT: "{{ .Values.env.REST_PORT }}"
26 changes: 26 additions & 0 deletions booking-chart/templates/migrate_job.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
apiVersion: batch/v1
kind: Job
metadata:
name: {{ .Release.Name }}-migrate-job
spec:
template:
spec:
containers:
- name: migrate
image: {{ .Values.migrate.image }}:{{ .Values.migrate.tag }}
command:
- sh
- -c
- migrate -path ./internal/database/postgres/migration -database postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@{{ .Values.env.POSTGRES_HOST}}:{{ .Values.env.POSTGRES_PORT }}/$(POSTGRES_DB)?sslmode=disable up
env:
- name: POSTGRES_USER
value: {{ .Values.env.POSTGRES_USER }}
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .Release.Name }}-postgres-secret
key: POSTGRES_PASSWORD
- name: POSTGRES_DB
value: {{ .Values.env.POSTGRES_DB }}
restartPolicy: Never
backoffLimit: {{ .Values.migrate.backoffLimit }}
48 changes: 48 additions & 0 deletions booking-chart/templates/postgres_deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-postgres
labels:
app: {{ .Release.Name }}-postgres
annotations:
kompose.cmd: kompose convert -f docker-compose.yml -o kubermanifests.yaml
kompose.version: 1.34.0 (cbf2835db)
spec:
replicas: {{ .Values.postgres.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}-postgres
strategy:
type: Recreate
template:
metadata:
labels:
app: {{ .Release.Name }}-postgres
annotations:
kompose.cmd: kompose convert -f docker-compose.yml -o kubermanifests.yaml
kompose.version: 1.34.0 (cbf2835db)
spec:
containers:
- name: {{ .Release.Name }}-postgres
image: "{{ .Values.postgres.image.repository }}:{{ .Values.postgres.image.tag }}"
ports:
- containerPort: {{ .Values.env.POSTGRES_PORT }}
protocol: TCP
env:
- name: POSTGRES_DB
value: "{{ .Values.env.POSTGRES_DB }}"
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .Release.Name }}-postgres-secret
key: POSTGRES_PASSWORD
- name: POSTGRES_USER
value: "{{ .Values.env.POSTGRES_USER }}"
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgres-data
restartPolicy: Always
volumes:
- name: postgres-data
persistentVolumeClaim:
claimName: {{ .Release.Name }}-postgres-data
10 changes: 10 additions & 0 deletions booking-chart/templates/postgres_pvc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ .Release.Name }}-postgres-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
7 changes: 7 additions & 0 deletions booking-chart/templates/postgres_secret.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-postgres-secret
type: Opaque
data:
POSTGRES_PASSWORD: {{ .Values.env.POSTGRES_PASSWORD | b64enc }}
16 changes: 16 additions & 0 deletions booking-chart/templates/postgres_service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-postgres
labels:
app: {{ .Release.Name }}-postgres
annotations:
kompose.cmd: kompose convert -f docker-compose.yml -o kubermanifests.yaml
kompose.version: 1.34.0 (cbf2835db)
spec:
ports:
- name: "5432"
port: {{ .Values.env.POSTGRES_PORT }}
targetPort: {{ .Values.env.POSTGRES_PORT }}
selector:
app: {{ .Release.Name }}-postgres
45 changes: 45 additions & 0 deletions booking-chart/templates/redis_deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-redis
labels:
app: {{ .Release.Name }}-redis
annotations:
kompose.cmd: kompose convert -f docker-compose.yml -o kubermanifests.yaml
kompose.version: 1.34.0 (cbf2835db)
spec:
replicas: {{ .Values.redis.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}-redis
strategy:
type: Recreate
template:
metadata:
labels:
app: {{ .Release.Name }}-redis
spec:
containers:
- name: redis
image: {{ .Values.redis.image.repository }}:{{ .Values.redis.image.tag }}
args:
- redis-server
- --requirepass
- "$(REDIS_PASSWORD)"
ports:
- containerPort: 6379
protocol: TCP
env:
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: {{ .Release.Name }}-redis-secret
key: REDIS_PASSWORD
volumeMounts:
- mountPath: /data
name: redis-data
restartPolicy: Always
volumes:
- name: redis-data
persistentVolumeClaim:
claimName: {{ .Release.Name }}-redis-data
12 changes: 12 additions & 0 deletions booking-chart/templates/redis_pvc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ .Release.Name }}-redis-data
labels:
app: {{ .Release.Name }}-redis-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .Values.redis.persistentVolume.storage }}
9 changes: 9 additions & 0 deletions booking-chart/templates/redis_secret.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-redis-secret
labels:
app: {{ .Release.Name }}-redis-secret
type: Opaque
data:
REDIS_PASSWORD: {{ .Values.env.REDIS_PASSWORD | b64enc }}
16 changes: 16 additions & 0 deletions booking-chart/templates/redis_service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-redis
labels:
app: {{ .Release.Name }}-redis
annotations:
kompose.cmd: kompose convert -f docker-compose.yml -o kubermanifests.yaml
kompose.version: 1.34.0 (cbf2835db)
spec:
ports:
- name: redis
port: {{ .Values.env.REDIS_PORT }}
targetPort: {{ .Values.env.REDIS_PORT }}
selector:
app: {{ .Release.Name }}-redis
Loading