From d7ebcdfec244de0d9590ca0dd9b24394006bb12b Mon Sep 17 00:00:00 2001 From: funman300 Date: Wed, 2 Sep 2026 15:21:39 -0700 Subject: [PATCH] Add n8n --- apps/n8n/deployment.yaml | 98 ++++++++++++++++++++++++++++++ apps/n8n/ingress.yaml | 24 ++++++++ apps/n8n/kustomization.yaml | 10 +++ apps/n8n/postgres-service.yaml | 12 ++++ apps/n8n/postgres-statefulset.yaml | 47 ++++++++++++++ apps/n8n/pvc.yaml | 12 ++++ apps/n8n/sealedsecret.yaml | 16 +++++ apps/n8n/service.yaml | 13 ++++ argocd/n8n.yaml | 20 ++++++ 9 files changed, 252 insertions(+) create mode 100644 apps/n8n/deployment.yaml create mode 100644 apps/n8n/ingress.yaml create mode 100644 apps/n8n/kustomization.yaml create mode 100644 apps/n8n/postgres-service.yaml create mode 100644 apps/n8n/postgres-statefulset.yaml create mode 100644 apps/n8n/pvc.yaml create mode 100644 apps/n8n/sealedsecret.yaml create mode 100644 apps/n8n/service.yaml create mode 100644 argocd/n8n.yaml diff --git a/apps/n8n/deployment.yaml b/apps/n8n/deployment.yaml new file mode 100644 index 0000000..bed930c --- /dev/null +++ b/apps/n8n/deployment.yaml @@ -0,0 +1,98 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: n8n + namespace: n8n +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: n8n + template: + metadata: + labels: + app: n8n + spec: + containers: + - name: n8n + image: docker.n8n.io/n8nio/n8n:2.32.7 + imagePullPolicy: IfNotPresent + ports: + - containerPort: 5678 + env: + - name: N8N_HOST + value: n8n.aleshym.co + - name: N8N_PORT + value: "5678" + - name: N8N_PROTOCOL + value: https + - name: WEBHOOK_URL + value: https://n8n.aleshym.co/ + - name: N8N_EDITOR_BASE_URL + value: https://n8n.aleshym.co/ + - name: GENERIC_TIMEZONE + value: America/Vancouver + - name: TZ + value: America/Vancouver + - name: DB_TYPE + value: postgresdb + - name: DB_POSTGRESDB_HOST + value: n8n-postgres + - name: DB_POSTGRESDB_PORT + value: "5432" + - name: DB_POSTGRESDB_DATABASE + value: n8n + - name: DB_POSTGRESDB_USER + valueFrom: + secretKeyRef: + name: n8n-secrets + key: postgres-user + - name: DB_POSTGRESDB_PASSWORD + valueFrom: + secretKeyRef: + name: n8n-secrets + key: postgres-password + - name: N8N_ENCRYPTION_KEY + valueFrom: + secretKeyRef: + name: n8n-secrets + key: encryption-key + - name: N8N_SECURE_COOKIE + value: "true" + - name: N8N_PROXY_HOPS + value: "1" + - name: EXECUTIONS_DATA_PRUNE + value: "true" + - name: EXECUTIONS_DATA_MAX_AGE + value: "336" + volumeMounts: + - name: n8n-data + mountPath: /home/node/.n8n + readinessProbe: + httpGet: + path: /healthz + port: 5678 + initialDelaySeconds: 15 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + livenessProbe: + httpGet: + path: /healthz + port: 5678 + initialDelaySeconds: 30 + periodSeconds: 20 + timeoutSeconds: 5 + failureThreshold: 6 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + memory: 1Gi + volumes: + - name: n8n-data + persistentVolumeClaim: + claimName: n8n-data diff --git a/apps/n8n/ingress.yaml b/apps/n8n/ingress.yaml new file mode 100644 index 0000000..7301b32 --- /dev/null +++ b/apps/n8n/ingress.yaml @@ -0,0 +1,24 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: n8n + namespace: n8n + annotations: + cert-manager.io/cluster-issuer: letsencrypt-production +spec: + ingressClassName: traefik + tls: + - hosts: + - n8n.aleshym.co + secretName: n8n-tls + rules: + - host: n8n.aleshym.co + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: n8n + port: + number: 5678 diff --git a/apps/n8n/kustomization.yaml b/apps/n8n/kustomization.yaml new file mode 100644 index 0000000..2454537 --- /dev/null +++ b/apps/n8n/kustomization.yaml @@ -0,0 +1,10 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - pvc.yaml + - postgres-service.yaml + - postgres-statefulset.yaml + - sealedsecret.yaml + - deployment.yaml + - service.yaml + - ingress.yaml diff --git a/apps/n8n/postgres-service.yaml b/apps/n8n/postgres-service.yaml new file mode 100644 index 0000000..1d6b83c --- /dev/null +++ b/apps/n8n/postgres-service.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Service +metadata: + name: n8n-postgres + namespace: n8n +spec: + selector: + app: n8n-postgres + ports: + - name: postgres + port: 5432 + targetPort: 5432 diff --git a/apps/n8n/postgres-statefulset.yaml b/apps/n8n/postgres-statefulset.yaml new file mode 100644 index 0000000..caee2c0 --- /dev/null +++ b/apps/n8n/postgres-statefulset.yaml @@ -0,0 +1,47 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: n8n-postgres + namespace: n8n +spec: + serviceName: n8n-postgres + replicas: 1 + selector: + matchLabels: + app: n8n-postgres + template: + metadata: + labels: + app: n8n-postgres + spec: + containers: + - name: postgres + image: postgres:17-alpine + ports: + - containerPort: 5432 + env: + - name: POSTGRES_DB + value: n8n + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: n8n-secrets + key: postgres-user + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: n8n-secrets + key: postgres-password + volumeMounts: + - name: postgres-data + mountPath: /var/lib/postgresql/data + volumeClaimTemplates: + - metadata: + name: postgres-data + spec: + accessModes: + - ReadWriteOnce + storageClassName: local-path + resources: + requests: + storage: 5Gi diff --git a/apps/n8n/pvc.yaml b/apps/n8n/pvc.yaml new file mode 100644 index 0000000..21b00f0 --- /dev/null +++ b/apps/n8n/pvc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: n8n-data + namespace: n8n +spec: + accessModes: + - ReadWriteOnce + storageClassName: local-path + resources: + requests: + storage: 5Gi diff --git a/apps/n8n/sealedsecret.yaml b/apps/n8n/sealedsecret.yaml new file mode 100644 index 0000000..7e7fbf3 --- /dev/null +++ b/apps/n8n/sealedsecret.yaml @@ -0,0 +1,16 @@ +--- +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + name: n8n-secrets + namespace: n8n +spec: + encryptedData: + encryption-key: AgBI4Sa7Q/lsgDO4jp5IcMwrw0sIoqaNmEWMHhuS1hQNAnTBTqHaSUXkDjrcvOv/7ubS5yFKowtlCynrYO7Fv4y+glEXXSI512GJx/mU5DDo89ef6D4nM+Kn6cpR9vn+nFqAamif2U2DVt7tRS31XWz4QGUiw6J9+Q64bRa3kExT6ZsWGuzotkwwo2kZaC8EaZ75B+hy3UJUZjmDW0v/7eDQuQAjMkua9KKnbI7g6sqn9Ti6L4ND1MklhY+cDfcIO24sLcb4lo4tI15+WL943/pzotwFZEIZblENCf2VlwYhNo8x3nCaARnw1LC0ju8LWmUNBakRqJvXJlxKTxPWvmwRt+BTuzMCvNoN6kLeDNfiQrwN6gyT6UB37wqmGXBeBfAETyBOaFGiLIgv1kROcuv6FhUviaG0W3YC/CIWxK24u4V4GgcErM6IwlIlAJsftNE+KTPYCKj56P7jFp5S7zDmhUf6GgtS8O0ocPir4Dc/5Zju4e3FolcllmJSIS1PtfufFIPdAAdRHYNhOByIWYlJyD4wd4h0qH4YtRy/aYHO5B7fY2hKpC7ad5WltbZTrEoQeSLr0kaCrT0T7YB0jkdRT1BCIk1mR0/LhOI5rSObKESyytPVHVwSQfzccH8P0HBsG0I15UeQn8kYap+dJB+X7U9Cbr5c/goXHnajCKSul5K+8i6xq/8aO9vG+LGaP+DfQhQ7yolqnrCrURawv/2OvUU5dLsVqGIiXLyQIimT4cjqt5CNGnhRMQ9f2TRQbHOPT/FMdGqrxK6QFR2fimnZ + postgres-password: AgBRu0w5OTR15pB2OGEZtGVz0s0XIBhY67aPOEB/FvS/faWhtJtV69xN8/LaoRdyRuRHX58Ky3J+z2EZD3Q41S2DWyXeCV+bAYIaoyIsjyZUa/WNcigOdfbHLUiPvl3WsQWD90kyZb+EdlXi/BHwDZ/rSVWk5ZNsNSHUivk85RiOYviQO8EJhaYlzvb2KfN2yzhyLT7BuznkNE13a/BBXESfB27YBHoxfech7gxRiXZYPibuTM5wUw09i1pEBOX5kK9rnC5Hj90iN42sxmPFwd+B6o9jV9RsBmMKSdtQWhNqLEXJcBjmH6i31fszaMrvGdK3nOyKQWqJxHh6wcO3GChPZc/3fMGwPMw0Y7eK045VeMl67MW1uggpmv8yBmSlXo93fw2iEfD2tVOSZwNm1bM62QMBO9Ok8y4lJbszd8d4/OWX/qeAop8IRlMhupI952z/V9bskpMIPnVaOSSWCgEe25LamKA0i5D64bsYYo4IBFyC4UCOrCvY2xmaCEgknKEOWAXuLgalgEtQkUfBet3fF4A/rRMF+rhjbbfOH2wKKU1XaNRWlhuA7Lnk2KtdwfwdqlSDvYwqqNAAzSJrdee8LKGaBlIDej3enE7/jGye2+13I1xQ+3wIAvKfvXI0gMoYEhYcWiFYldJMKjS/lcdJ1F+caGqFAdOn0k9DpNZ4dFQdaBj3d+D7dCFW6ii9KPV4hrAjKqPJa8FPdF3sR/gOAtsYcFXFbCrsZ3CE1+sUsdITZJ7oleSvuy7F3zOF7VA= + postgres-user: AgCm12dBHHVfsdofAo+zVLpLqYm9AKEtAP7G2idJvhY5/KAiO4UAmz02oeN2pSuj2EeTkY2V8AEIa2Biw57P7nkxlibFFVu6RM09naJHHmEyXEgFtCEcdBuXHmBM5WEDhrB3zhKh38OghZiqDoWX0UjUTZK4nrlTV6ITl7nA+NghTf8xTVFUKy/Gs833gOngi3qWyZZ+ypB6PaVD8Scxioga9pws09ODFL7Vthcwtukrza2Hxvc6XjmSp07sFn7aBL8sPgFgqeTft2fLdYyWof3hYAZauJ1YLNy/enXOzr3lWeZBIPlZ38micn9R4xb31lfolo9RqyJg1iqbHassOqzAaZyreqpNOiteq7mjFvq6inaZggFwmI38YulGaJvQSq5M+9meBGvyYbXO4TcE9rhhZWgYUyXDeYHBh3NqEe5Yyeul0s7/CisFwLnQTx00V9U505TyI/+ERAUSrLYT44EH4cLo1CoBPbqtibIrqyMdiXk3hRBSNdK7uNtkJ5EYD41Fssc4bVI6XPsxrKWc39FFVbToz6hw/UQdHxRHkosQ2RUGxWA4Wzje3bTAoMBdRtJlCAlASqAxS/DOWlgnJXW/w84E+L4whHVuLDW5vnbFgZ+78n5H9fZ0A4+dDKXjOPmSSR0x4PAb3/3Chbf3rHQUh+HRMNkawkp6dbTqRNWPU56rbqBl4vdkxu+S+7r+GuEB1Kw= + template: + metadata: + name: n8n-secrets + namespace: n8n + type: Opaque diff --git a/apps/n8n/service.yaml b/apps/n8n/service.yaml new file mode 100644 index 0000000..ea45aa5 --- /dev/null +++ b/apps/n8n/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: n8n + namespace: n8n +spec: + selector: + app: n8n + ports: + - name: http + port: 5678 + targetPort: 5678 + type: ClusterIP diff --git a/argocd/n8n.yaml b/argocd/n8n.yaml new file mode 100644 index 0000000..298f3e4 --- /dev/null +++ b/argocd/n8n.yaml @@ -0,0 +1,20 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: n8n + namespace: argocd +spec: + project: default + source: + repoURL: https://git.aleshym.co/funman300/k3s-homelab.git + targetRevision: HEAD + path: apps/n8n + destination: + server: https://kubernetes.default.svc + namespace: n8n + syncPolicy: + automated: + prune: true + selfHeal: true + syncOptions: + - CreateNamespace=true