N8N

Docker-compose.yml

services:
  tailscale:
    image: ghcr.io/tailscale/tailscale:${TAILSCALE_VERSION}
    container_name: ${APP_NAME}-tailscale
    hostname: ${SUBDOMAIN}
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    volumes:
      - tailscale-state:/var/lib/tailscale
    environment:
      - TZ=${TZ}
      - TS_AUTHKEY=${TS_AUTHKEY}
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_USERSPACE=false
      - TS_HOSTNAME=${SUBDOMAIN}
      - TS_ACCEPT_DNS=true
    command: >
      sh -c "
        tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/var/run/tailscale/tailscaled.sock &
        sleep 5

        tailscale up --authkey=${TS_AUTHKEY} --hostname=${SUBDOMAIN} --accept-dns=true --accept-routes=true

        echo 'Waiting for Tailscale to connect...'
        until tailscale status --json 2>/dev/null | grep -q 'Running'; do
          sleep 2
        done
        echo 'Tailscale connected successfully!'
        
        echo 'Getting SSL certificate and setting up HTTPS...'
        tailscale cert ${SUBDOMAIN}.${TAILNET_ROOT}
        tailscale serve --bg --https=443 --set-path=/ http://localhost:5678
        sleep 10
        
        echo 'Checking serve status...'
        tailscale serve status
        
        tailscale status
        echo 'N8N should be available at: https://${SUBDOMAIN}.${TAILNET_ROOT}'

        wait
      "
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "sh", "-c", "tailscale status --json >/dev/null 2>&1"]
      interval: 15s
      timeout: 5s
      retries: 10
      start_period: 60s

  n8n:
    image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
    container_name: ${APP_NAME}-app
    depends_on:
      tailscale:
        condition: service_healthy
    network_mode: "service:tailscale"
    volumes:
      - n8n-data:/home/node/.n8n
    environment:
      - TZ=${TZ}
      - GENERIC_TIMEZONE=${TZ}
      - N8N_HOST=0.0.0.0
      - N8N_PORT=5678
      - N8N_PROTOCOL=http
      - WEBHOOK_URL=https://${SUBDOMAIN}.${TAILNET_ROOT}
      - N8N_SECURE_COOKIE=true
      - N8N_PROXY_HOPS=1
      - DB_SQLITE_POOL_SIZE=5
      - N8N_RUNNERS_ENABLED=true
      - N8N_BLOCK_ENV_ACCESS_IN_NODE=false
      - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
    restart: unless-stopped

volumes:
  tailscale-state:
    name: tailscale-state-${APP_NAME}
  n8n-data:
    name: n8n-data-${APP_NAME}

Environment.env

# Required variables
TS_AUTHKEY=tskey-xxxxxxxxxxx
TAILNET_ROOT=tailxxxxxx.ts.net
SUBDOMAIN=n8n

# Optional variables (with default values)
APP_NAME=n8n
APP_PORT=5678
TZ=Europe/Warsaw

# Image versions
TAILSCALE_VERSION=v1.88.2
N8N_VERSION=1.112.6

Last updated

Was this helpful?