apiVersion: app.claw.cloud/v1 kind: Template metadata: name: n8n spec: title: 'N8N' type: official author: ClawCloud Run author_id: 180503656 date: 2025-04-17 url: 'https://n8n.io/' gitRepo: 'https://github.com/n8n-io/n8n' description: 'Free and source-available fair-code licensed workflow automation tool. Easily automate tasks across different services.' readme: 'https://raw.githubusercontent.com/ClawCloud/Run-Template/refs/heads/main/template/N8N/README.md' icon: 'https://n8n.io/favicon.ico' templateType: inline categories: - ai - Free-Plan-Compatible defaults: app_host: type: string value: n8n-${{ random(8) }} app_name: type: string value: n8n-${{ random(8) }} --- apiVersion: apps/v1 kind: StatefulSet metadata: name: ${{ defaults.app_name }} annotations: originImageName: n8nio/n8n:stable deploy.run.claw.cloud/minReplicas: '1' deploy.run.claw.cloud/maxReplicas: '1' labels: run.claw.cloud/app-deploy-manager: ${{ defaults.app_name }} app: ${{ defaults.app_name }} spec: replicas: 1 revisionHistoryLimit: 1 minReadySeconds: 10 serviceName: ${{ defaults.app_name }} selector: matchLabels: app: ${{ defaults.app_name }} template: metadata: labels: app: ${{ defaults.app_name }} spec: terminationGracePeriodSeconds: 10 automountServiceAccountToken: false initContainers: - name: take-data-dir-ownership image: alpine command: ["/bin/sh", "-c", "chown 1000:1000 /data"] imagePullPolicy: IfNotPresent volumeMounts: - name: vn-homevn-nodevn-vn-n8n mountPath: /data containers: - name: ${{ defaults.app_name }} image: n8nio/n8n:stable env: - name: N8N_PORT value: "5678" - name: WEBHOOK_URL value: https://${{ defaults.app_host }}.${{ CLAWCLOUD_CLOUD_DOMAIN }}/ - name: QUEUE_HEALTH_CHECK_ACTIVE value: true resources: requests: cpu: 50m memory: 102Mi limits: cpu: 500m memory: 1024Mi ports: - name: http protocol: TCP containerPort: 5678 imagePullPolicy: IfNotPresent volumeMounts: - name: vn-homevn-nodevn-vn-n8n mountPath: /home/node/.n8n livenessProbe: httpGet: path: /healthz port: http initialDelaySeconds: 20 volumeClaimTemplates: - metadata: annotations: path: /home/node/.n8n value: '1' name: vn-homevn-nodevn-vn-n8n spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: v1 kind: Service metadata: name: ${{ defaults.app_name }} labels: run.claw.cloud/app-deploy-manager: ${{ defaults.app_name }} spec: ports: - port: 5678 selector: app: ${{ defaults.app_name }} --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ${{ defaults.app_name }} labels: run.claw.cloud/app-deploy-manager: ${{ defaults.app_name }} run.claw.cloud/app-deploy-manager-domain: ${{ defaults.app_host }} annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/proxy-body-size: 32m nginx.ingress.kubernetes.io/server-snippet: | client_header_buffer_size 64k; large_client_header_buffers 4 128k; nginx.ingress.kubernetes.io/ssl-redirect: 'true' nginx.ingress.kubernetes.io/backend-protocol: HTTP nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/client-body-buffer-size: 64k nginx.ingress.kubernetes.io/proxy-buffer-size: 64k nginx.ingress.kubernetes.io/proxy-send-timeout: '300' nginx.ingress.kubernetes.io/proxy-read-timeout: '300' nginx.ingress.kubernetes.io/configuration-snippet: | if ($request_uri ~* \.(js|css|gif|jpe?g|png)) { expires 30d; add_header Cache-Control "public"; } spec: rules: - host: ${{ defaults.app_host }}.${{ CLAWCLOUD_CLOUD_DOMAIN }} http: paths: - pathType: Prefix path: /()(.*) backend: service: name: ${{ defaults.app_name }} port: number: 5678 tls: - hosts: - ${{ defaults.app_host }}.${{ CLAWCLOUD_CLOUD_DOMAIN }} secretName: ${{ CLAWCLOUD_CERT_SECRET_NAME }} --- apiVersion: app.claw.cloud/v1 kind: App metadata: name: ${{ defaults.app_name }} labels: run.claw.cloud/app-deploy-manager: ${{ defaults.app_name }} spec: data: url: https://${{ defaults.app_host }}.${{ CLAWCLOUD_CLOUD_DOMAIN }} displayType: normal icon: "https://n8n.io/favicon.ico" name: ${{ defaults.app_name }} type: link