added n8n

This commit is contained in:
nick committed 2026-09-23 22:14:24 +00:00
1 parent 148516688c
commit 8d947a5ae1
3 files changed
+65 -1

No files matched your search

+61
View File
@@ -42,6 +42,59 @@ systemd:
RestartSec=5s RestartSec=5s
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
# n8n workflow automation, served publicly at n8n.atlashorizon.net.
#
# Prerequisites, all of which must exist before the VM is rebuilt:
# - an "n8n" Postgres database and role on argo.lan.atlashorizon.net
# - N8N_DB_PASSWORD and N8N_ENCRYPTION_KEY in Infisical (see
# secrets.tmpl); generate the key with `openssl rand -hex 32`
# - n8n.atlashorizon.net terminating TLS and proxying to this host's
# :5678 (not managed here)
#
# Workflows, credentials and execution history all live in Postgres, so
# a taint loses nothing. The encryption key is what makes that true:
# without a fixed one n8n generates its own under /home/node/.n8n, and
# the credentials in Postgres become undecryptable the moment the VM
# disk goes. Never rotate it without re-entering every credential.
- name: n8n.service
enabled: true
contents: |
[Unit]
Description=n8n workflow automation
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=/usr/bin/docker pull docker.n8n.io/n8nio/n8n:2.40.5
ExecStartPre=-/usr/bin/docker rm --force n8n
# /var/lib/n8n holds only what is left in /home/node/.n8n once the
# database and key are external: installed community nodes and
# n8n's own config file. Losing it to a taint means reinstalling
# community nodes, nothing more.
#
# N8N_PROXY_HOPS=1: requests arrive through the reverse proxy, so
# n8n takes the client IP from X-Forwarded-For (rate limiting and
# audit logs would otherwise see only the proxy).
ExecStart=/usr/bin/docker run --name n8n \
-e DB_TYPE=postgresdb \
-e DB_POSTGRESDB_HOST=argo.lan.atlashorizon.net \
-e DB_POSTGRESDB_PORT=5432 \
-e DB_POSTGRESDB_DATABASE=n8n \
-e DB_POSTGRESDB_USER=n8n \
-e DB_POSTGRESDB_PASSWORD=${n8n_db_password} \
-e N8N_ENCRYPTION_KEY=${n8n_encryption_key} \
-e N8N_HOST=n8n.atlashorizon.net \
-e N8N_PROTOCOL=https \
-e WEBHOOK_URL=https://n8n.atlashorizon.net/ \
-e N8N_PROXY_HOPS=1 \
-v /var/lib/n8n:/home/node/.n8n \
-p 5678:5678 \
docker.n8n.io/n8nio/n8n:2.40.5
ExecStop=/usr/bin/docker stop n8n
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
- name: dozzle-agent.service - name: dozzle-agent.service
enabled: true enabled: true
contents: | contents: |
@@ -66,3 +119,11 @@ storage:
directories: directories:
- path: /var/lib/oswald_runner - path: /var/lib/oswald_runner
mode: 0755 mode: 0755
# The n8n image runs as the "node" user (uid 1000), which needs to own
# its data directory.
- path: /var/lib/n8n
mode: 0700
user:
id: 1000
group:
id: 1000
+2
View File
@@ -24,6 +24,8 @@
{{- if eq $secret.Key "OPENWEBUI_OIDC_PROVIDER_URL" }}"openwebui_oidc_provider_url": "{{$secret.Value}}",{{ end }} {{- if eq $secret.Key "OPENWEBUI_OIDC_PROVIDER_URL" }}"openwebui_oidc_provider_url": "{{$secret.Value}}",{{ end }}
{{- if eq $secret.Key "OPENWEBUI_TERMINAL_API_KEY" }}"openwebui_terminal_api_key": "{{$secret.Value}}",{{ end }} {{- if eq $secret.Key "OPENWEBUI_TERMINAL_API_KEY" }}"openwebui_terminal_api_key": "{{$secret.Value}}",{{ end }}
{{- if eq $secret.Key "OPENWEBUI_ADMIN_API_KEY" }}"openwebui_admin_api_key": "{{$secret.Value}}",{{ end }} {{- if eq $secret.Key "OPENWEBUI_ADMIN_API_KEY" }}"openwebui_admin_api_key": "{{$secret.Value}}",{{ end }}
{{- if eq $secret.Key "N8N_DB_PASSWORD" }}"n8n_db_password": "{{$secret.Value}}",{{ end }}
{{- if eq $secret.Key "N8N_ENCRYPTION_KEY" }}"n8n_encryption_key": "{{$secret.Value}}",{{ end }}
{{- if eq $secret.Key "DOZZLE_OIDC_CLIENT_ID" }}"dozzle_oidc_client_id": "{{$secret.Value}}",{{ end }} {{- if eq $secret.Key "DOZZLE_OIDC_CLIENT_ID" }}"dozzle_oidc_client_id": "{{$secret.Value}}",{{ end }}
{{- if eq $secret.Key "DOZZLE_OIDC_CLIENT_SECRET" }}"dozzle_oidc_client_secret": "{{$secret.Value}}",{{ end }} {{- if eq $secret.Key "DOZZLE_OIDC_CLIENT_SECRET" }}"dozzle_oidc_client_secret": "{{$secret.Value}}",{{ end }}
{{- end }} {{- end }}
+2 -1
View File
@@ -209,7 +209,8 @@ nodes = {
qemu_guest_agent = false qemu_guest_agent = false
# Rendered with templatefile(): ${gitea_runner_token} comes from # Rendered with templatefile(): ${gitea_runner_token} comes from
# Infisical (GITEA_RUNNER_TOKEN in secrets.tmpl), so the token is # Infisical (GITEA_RUNNER_TOKEN in secrets.tmpl), so the token is
# never committed. # never committed. Also runs n8n on :5678 (N8N_* secrets, Postgres
# on argo); see the prerequisites in the Butane file.
butane_file = "butane/oswald_runner.yaml.tftpl" butane_file = "butane/oswald_runner.yaml.tftpl"
} }
"ai" = { "ai" = {