From 29c5b00c1671cdd71db71ff9770dd69e869c8644 Mon Sep 17 00:00:00 2001 From: AB Date: Sat, 12 Sep 2026 07:18:56 +0300 Subject: [PATCH] Added airtrail deployment --- k8s/apps/airtrail/app.yaml | 20 ++++++++ k8s/apps/airtrail/deployment.yaml | 66 +++++++++++++++++++++++++ k8s/apps/airtrail/external-secrets.yaml | 25 ++++++++++ k8s/apps/airtrail/ingress.yaml | 25 ++++++++++ k8s/apps/airtrail/kustomization.yaml | 10 ++++ k8s/apps/airtrail/service.yaml | 15 ++++++ k8s/apps/airtrail/storage.yaml | 11 +++++ 7 files changed, 172 insertions(+) create mode 100644 k8s/apps/airtrail/app.yaml create mode 100644 k8s/apps/airtrail/deployment.yaml create mode 100644 k8s/apps/airtrail/external-secrets.yaml create mode 100644 k8s/apps/airtrail/ingress.yaml create mode 100644 k8s/apps/airtrail/kustomization.yaml create mode 100644 k8s/apps/airtrail/service.yaml create mode 100644 k8s/apps/airtrail/storage.yaml diff --git a/k8s/apps/airtrail/app.yaml b/k8s/apps/airtrail/app.yaml new file mode 100644 index 0000000..98b16c2 --- /dev/null +++ b/k8s/apps/airtrail/app.yaml @@ -0,0 +1,20 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: airtrail + namespace: argocd +spec: + project: apps + destination: + namespace: airtrail + server: https://kubernetes.default.svc + source: + repoURL: ssh://git@gt.hexor.cy:30022/ab/homelab.git + targetRevision: HEAD + path: k8s/apps/airtrail + syncPolicy: + automated: + selfHeal: true + prune: true + syncOptions: + - CreateNamespace=true diff --git a/k8s/apps/airtrail/deployment.yaml b/k8s/apps/airtrail/deployment.yaml new file mode 100644 index 0000000..973c198 --- /dev/null +++ b/k8s/apps/airtrail/deployment.yaml @@ -0,0 +1,66 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: airtrail + labels: + app: airtrail +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: airtrail + template: + metadata: + labels: + app: airtrail + spec: + securityContext: + fsGroup: 1000 + containers: + - name: airtrail + image: johly/airtrail:latest + imagePullPolicy: Always + ports: + - name: http + containerPort: 3000 + env: + - name: ORIGIN + value: https://at.hexor.cy + - name: DB_URL + valueFrom: + secretKeyRef: + name: airtrail-creds + key: DB_URL + - name: UPLOAD_LOCATION + value: /app/uploads + - name: BODY_SIZE_LIMIT + value: 20M + volumeMounts: + - name: uploads + mountPath: /app/uploads + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 1000m + memory: 1Gi + startupProbe: + tcpSocket: + port: http + periodSeconds: 10 + failureThreshold: 30 + readinessProbe: + tcpSocket: + port: http + periodSeconds: 10 + livenessProbe: + tcpSocket: + port: http + periodSeconds: 30 + volumes: + - name: uploads + persistentVolumeClaim: + claimName: airtrail-uploads diff --git a/k8s/apps/airtrail/external-secrets.yaml b/k8s/apps/airtrail/external-secrets.yaml new file mode 100644 index 0000000..7427d63 --- /dev/null +++ b/k8s/apps/airtrail/external-secrets.yaml @@ -0,0 +1,25 @@ +apiVersion: external-secrets.io/v1 +kind: ExternalSecret +metadata: + name: airtrail-creds +spec: + target: + name: airtrail-creds + deletionPolicy: Delete + template: + type: Opaque + data: + DB_URL: |- + postgresql://airtrail:{{ .airtrail | trim | urlquery | replace "+" "%20" }}@psql.psql.svc:5432/airtrail + data: + - secretKey: airtrail + sourceRef: + storeRef: + name: vaultwarden-login + kind: ClusterSecretStore + remoteRef: + conversionStrategy: Default + decodingStrategy: None + metadataPolicy: None + key: 2a9deb39-ef22-433e-a1be-df1555625e22 + property: fields[21].value diff --git a/k8s/apps/airtrail/ingress.yaml b/k8s/apps/airtrail/ingress.yaml new file mode 100644 index 0000000..82bd85e --- /dev/null +++ b/k8s/apps/airtrail/ingress.yaml @@ -0,0 +1,25 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: airtrail-tls-ingress + annotations: + cert-manager.io/cluster-issuer: letsencrypt + traefik.ingress.kubernetes.io/router.middlewares: kube-system-https-redirect@kubernetescrd + acme.cert-manager.io/http01-edit-in-place: "true" +spec: + ingressClassName: traefik + rules: + - host: at.hexor.cy + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: airtrail + port: + number: 3000 + tls: + - secretName: airtrail-tls + hosts: + - at.hexor.cy diff --git a/k8s/apps/airtrail/kustomization.yaml b/k8s/apps/airtrail/kustomization.yaml new file mode 100644 index 0000000..416c4e6 --- /dev/null +++ b/k8s/apps/airtrail/kustomization.yaml @@ -0,0 +1,10 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - app.yaml + - external-secrets.yaml + - storage.yaml + - deployment.yaml + - service.yaml + - ingress.yaml diff --git a/k8s/apps/airtrail/service.yaml b/k8s/apps/airtrail/service.yaml new file mode 100644 index 0000000..9104a9e --- /dev/null +++ b/k8s/apps/airtrail/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: airtrail + labels: + app: airtrail +spec: + type: ClusterIP + selector: + app: airtrail + ports: + - name: http + protocol: TCP + port: 3000 + targetPort: http diff --git a/k8s/apps/airtrail/storage.yaml b/k8s/apps/airtrail/storage.yaml new file mode 100644 index 0000000..02b5b9f --- /dev/null +++ b/k8s/apps/airtrail/storage.yaml @@ -0,0 +1,11 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: airtrail-uploads +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 1Gi