Skip to content

Commit 6b47792

Browse files
committed
feat: add kubernetes manifests
1 parent b317539 commit 6b47792

File tree

8 files changed

+268
-2
lines changed

8 files changed

+268
-2
lines changed

.github/workflows/docker.yaml

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ on:
99
- ".github/workflows/docker.yml"
1010

1111
jobs:
12-
build:
12+
build-website:
1313
runs-on: ubuntu-latest
1414
steps:
1515
- name: Checkout repository
@@ -35,3 +35,30 @@ jobs:
3535
tags: fraguinha/a50passos.com:latest
3636
context: ./src/website
3737
file: ./src/website/Dockerfile
38+
39+
build-assets:
40+
runs-on: ubuntu-latest
41+
steps:
42+
- name: Checkout repository
43+
uses: actions/checkout@v4
44+
45+
- name: Set up QEMU
46+
uses: docker/setup-qemu-action@v3
47+
48+
- name: Set up Docker Buildx
49+
uses: docker/setup-buildx-action@v3
50+
51+
- name: Log in to Docker Hub
52+
uses: docker/login-action@v3
53+
with:
54+
username: ${{ secrets.DOCKER_USERNAME }}
55+
password: ${{ secrets.DOCKER_PASSWORD }}
56+
57+
- name: Build and push Docker image
58+
uses: docker/build-push-action@v5
59+
with:
60+
push: true
61+
platforms: linux/amd64,linux/arm/v7
62+
tags: fraguinha/a50passos.com-assets:latest
63+
context: .
64+
file: ./src/website/Dockerfile.assets

k8s/ingress.yml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
apiVersion: networking.k8s.io/v1
2+
kind: Ingress
3+
metadata:
4+
name: a50passos-ingress
5+
namespace: a50passos
6+
annotations:
7+
cert-manager.io/cluster-issuer: letsencrypt
8+
kubernetes.io/ingress.class: traefik
9+
spec:
10+
rules:
11+
- host: a50passos.com
12+
http:
13+
paths:
14+
- backend:
15+
service:
16+
name: website
17+
port:
18+
number: 8080
19+
path: /
20+
pathType: Prefix
21+
- host: www.a50passos.com
22+
http:
23+
paths:
24+
- backend:
25+
service:
26+
name: website
27+
port:
28+
number: 8080
29+
path: /
30+
pathType: Prefix
31+
- host: a50passos.pt
32+
http:
33+
paths:
34+
- backend:
35+
service:
36+
name: website
37+
port:
38+
number: 8080
39+
path: /
40+
pathType: Prefix
41+
- host: www.a50passos.pt
42+
http:
43+
paths:
44+
- backend:
45+
service:
46+
name: website
47+
port:
48+
number: 8080
49+
path: /
50+
pathType: Prefix
51+
tls:
52+
- hosts:
53+
- a50passos.com
54+
- www.a50passos.com
55+
- a50passos.pt
56+
- www.a50passos.pt
57+
secretName: a50passos-tls-secret

k8s/kustomization.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
apiVersion: kustomize.config.k8s.io/v1beta1
2+
kind: Kustomization
3+
namespace: a50passos
4+
resources:
5+
- namespace.yml
6+
- website.yml
7+
- ingress.yml
8+
- update-automation.yml

k8s/namespace.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
apiVersion: v1
2+
kind: Namespace
3+
metadata:
4+
name: a50passos

k8s/update-automation.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
apiVersion: source.toolkit.fluxcd.io/v1
2+
kind: GitRepository
3+
metadata:
4+
name: a50passos-git
5+
namespace: a50passos
6+
spec:
7+
interval: 1m0s
8+
ref:
9+
branch: main
10+
url: https://github.com/fraguinha/a50passos.com
11+
secretRef:
12+
name: git-credentials
13+
---
14+
apiVersion: image.toolkit.fluxcd.io/v1
15+
kind: ImageUpdateAutomation
16+
metadata:
17+
name: a50passos-update-automation
18+
namespace: a50passos
19+
spec:
20+
interval: 10m
21+
sourceRef:
22+
kind: GitRepository
23+
name: a50passos-git
24+
git:
25+
commit:
26+
author:
27+
email: fluxcdbot@users.noreply.github.com
28+
name: fluxcdbot
29+
push:
30+
branch: main
31+
update:
32+
path: ./k8s

k8s/website.yml

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
apiVersion: image.toolkit.fluxcd.io/v1
2+
kind: ImageRepository
3+
metadata:
4+
name: a50passos-website-image
5+
namespace: flux-system
6+
spec:
7+
image: fraguinha/a50passos.com
8+
interval: 1m0s
9+
---
10+
apiVersion: image.toolkit.fluxcd.io/v1
11+
kind: ImagePolicy
12+
metadata:
13+
name: a50passos-website-policy
14+
namespace: flux-system
15+
spec:
16+
digestReflectionPolicy: Always
17+
interval: 1m0s
18+
imageRepositoryRef:
19+
name: a50passos-website-image
20+
filterTags:
21+
pattern: '^latest$'
22+
policy:
23+
alphabetical:
24+
order: asc
25+
---
26+
apiVersion: image.toolkit.fluxcd.io/v1
27+
kind: ImageRepository
28+
metadata:
29+
name: a50passos-website-assets-image
30+
namespace: flux-system
31+
spec:
32+
image: fraguinha/a50passos.com-assets
33+
interval: 1m0s
34+
---
35+
apiVersion: image.toolkit.fluxcd.io/v1
36+
kind: ImagePolicy
37+
metadata:
38+
name: a50passos-website-assets-policy
39+
namespace: flux-system
40+
spec:
41+
digestReflectionPolicy: Always
42+
interval: 1m0s
43+
imageRepositoryRef:
44+
name: a50passos-website-assets-image
45+
filterTags:
46+
pattern: '^latest$'
47+
policy:
48+
alphabetical:
49+
order: asc
50+
---
51+
apiVersion: apps/v1
52+
kind: Deployment
53+
metadata:
54+
name: website
55+
namespace: a50passos
56+
spec:
57+
replicas: 2
58+
selector:
59+
matchLabels:
60+
app: website
61+
template:
62+
metadata:
63+
labels:
64+
app: website
65+
spec:
66+
initContainers:
67+
- name: create-uploads-dir
68+
image: busybox
69+
command: ['sh', '-c', 'mkdir -p /app/dist/public/images/uploads && chmod -R 755 /app/dist/public/images/uploads']
70+
volumeMounts:
71+
- name: images
72+
mountPath: /app/dist/public/images
73+
- name: copy-image-assets
74+
image: fraguinha/a50passos.com-assets:latest@sha256:d46169856e31c652330351b0a86fd8126ca359a7fdf08d9372ed1bf6704248e0 # {"$imagepolicy": "a50passos:a50passos-website-assets-policy"}
75+
imagePullPolicy: Always
76+
command: ['sh', '-c', 'cp -r /assets/* /app/dist/public/images/']
77+
volumeMounts:
78+
- name: images
79+
mountPath: /app/dist/public/images
80+
containers:
81+
- name: website
82+
image: fraguinha/a50passos.com:latest@sha256:55228dd1c67f964934d3aca79bfa43bdadcc43731a59ff3f4b032e2c490cdf2b # {"$imagepolicy": "a50passos:a50passos-website-policy"}
83+
imagePullPolicy: Always
84+
ports:
85+
- containerPort: 8080
86+
env:
87+
- name: PORT
88+
value: "8080"
89+
- name: NODE_ENV
90+
value: "production"
91+
- name: APPNAME
92+
value: "a50passos"
93+
- name: DATABASE
94+
valueFrom:
95+
secretKeyRef:
96+
name: a50passos-secrets
97+
key: DATABASE
98+
- name: SESSION_SECRET
99+
valueFrom:
100+
secretKeyRef:
101+
name: a50passos-secrets
102+
key: SESSION_SECRET
103+
volumeMounts:
104+
- name: images
105+
mountPath: /app/dist/public/images
106+
volumes:
107+
- name: images
108+
persistentVolumeClaim:
109+
claimName: a50passos-images-pvc
110+
---
111+
apiVersion: v1
112+
kind: Service
113+
metadata:
114+
name: website
115+
namespace: a50passos
116+
spec:
117+
selector:
118+
app: website
119+
ports:
120+
- port: 8080
121+
targetPort: 8080
122+
---
123+
apiVersion: v1
124+
kind: PersistentVolumeClaim
125+
metadata:
126+
name: a50passos-images-pvc
127+
namespace: a50passos
128+
spec:
129+
accessModes:
130+
- ReadWriteMany
131+
storageClassName: longhorn
132+
resources:
133+
requests:
134+
storage: 1Gi

src/website/Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ RUN npm ci --verbose
1010
COPY . .
1111

1212
RUN npm run deploy
13+
RUN rm -rf /app/dist/public/images
1314

1415
FROM node:22-slim
1516

@@ -19,4 +20,4 @@ COPY --from=builder /app/dist ./dist
1920
COPY --from=builder /app/node_modules ./node_modules
2021
COPY --from=builder /app/package.json .
2122

22-
CMD ["npm", "start"]
23+
CMD ["npm", "start"]

src/website/Dockerfile.assets

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM busybox
2+
3+
COPY src/website/src/public/images /assets

0 commit comments

Comments
 (0)