O n8n é uma plataforma de automação de workflows open source que permite integrar sistemas, APIs e serviços com baixa complexidade de implementação.
Requerimentos
- FastPanel
- Docker
- Podman
- SO: CentOS/Rocky/AlmaLinux 8 ou Debian/derivados
- Domínio ou subdomínio apontando para o IP do servidor
Atualizando o sistema
redhat/derivados
sudo dnf --refresh update
sudo dnf upgrade
Debian/derivados
sudo apt update
sudo apt upgrade
Habilitando repositório Docker
redhat/derivados
sudo dnf install yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Debian/derivados
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Instalando Podman
dnf install podman podman-compose
podman -v
Saída esperada (exemplo):
podman version 4.9.4-rhel
Instalando Docker
dnf install docker
apt install docker
Habilitando serviço
sudo systemctl enable podman
sudo systemctl start podman
Estrutura de diretórios
mkdir -p /opt/n8n_stack
cd /opt/n8n_stack
mkdir -p n8n_storage redis_storage db_storage
touch docker-compose.yml .env init-data.sh healthcheck.js
docker-compose.yml
Link: https://github.com/sr00t3d/fastpanel-n8n-docker/blob/main/docker-compose.yml
version: '3.8'
x-shared: &shared
restart: always
image: docker.n8n.io/n8nio/n8n:1.91.3
env_file: .env
user: "1000:1000"
volumes:
- /opt/n8n_stack/n8n_storage:/home/node/.n8n
- ./healthcheck.js:/healthcheck.js
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy
services:
postgres:
image: postgres:11
restart: always
env_file: .env
ports:
- "127.0.0.1:5433:5432"
volumes:
- /opt/n8n_stack/db_storage:/var/lib/postgresql/data
- ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
healthcheck:
test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}']
interval: 10s
timeout: 10s
retries: 30
start_period: 60s
redis:
image: redis:6-alpine
restart: always
volumes:
- /opt/n8n_stack/redis_storage:/data
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 5s
timeout: 5s
retries: 10
n8n:
<<: *shared
ports:
- "127.0.0.1:5678:5678"
healthcheck:
test: ["CMD", "node", "/healthcheck.js"]
interval: 10s
timeout: 10s
retries: 20
start_period: 60s
n8n-worker:
<<: *shared
command: worker
depends_on:
- n8n
healthcheck:
test: ["CMD-SHELL", "node -e 'process.exit(0)'"]
interval: 30s
timeout: 5s
retries: 3
.env
Link: https://github.com/sr00t3d/fastpanel-n8n-docker/blob/main/.env
Aviso: gere chaves e senhas fortes.
openssl rand -hex 32
N8N_HOST=dominio.com.br
N8N_PORT=5678
N8N_PROTOCOL=https
WEBHOOK_URL=https://dominio.com.br/
N8N_ENCRYPTION_KEY=CHAVE_FORTE_32BITS
GENERIC_TIMEZONE=America/Sao_Paulo
TZ=America/Sao_Paulo
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=n8n_prod_db
DB_POSTGRESDB_USER=n8n_prod_user
DB_POSTGRESDB_PASSWORD=SENHA_FORTE_DB
N8N_EMAIL_MODE=smtp
N8N_SMTP_HOST=email@dominio.com.br
N8N_SMTP_PORT=465
N8N_SMTP_USER=seu_email@dominio.com.br
N8N_SMTP_PASS=SENHA_EMAIL
N8N_SMTP_SENDER=seu_email@dominio.com.br
N8N_SMTP_SSL=true
POSTGRES_DB=n8n_prod_db
POSTGRES_USER=postgres
POSTGRES_PASSWORD=SENHA_FORTE_POSTGRES
POSTGRES_NON_ROOT_USER=n8n_prod_user
POSTGRES_NON_ROOT_PASSWORD=SENHA_FORTE_NON_ROOT
QUEUE_BULL_REDIS_HOST=redis
QUEUE_BULL_REDIS_PORT=6379
QUEUE_BULL_REDIS_DB=0
N8N_RUNNERS_ENABLED=true
OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true
N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
init-data.sh
Link: https://github.com/sr00t3d/fastpanel-n8n-docker/blob/main/init-data.sh
#!/bin/bash
set -e
if [ -n "${POSTGRES_NON_ROOT_USER:-}" ] && [ -n "${POSTGRES_NON_ROOT_PASSWORD:-}" ]; then
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
DO
\$do\$
BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '${POSTGRES_NON_ROOT_USER}') THEN
CREATE USER "${POSTGRES_NON_ROOT_USER}" WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}';
ELSE
ALTER USER "${POSTGRES_NON_ROOT_USER}" WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}';
END IF;
END
\$do\$;
GRANT ALL PRIVILEGES ON DATABASE "${POSTGRES_DB}" TO "${POSTGRES_NON_ROOT_USER}";
EOSQL
else
echo "SETUP INFO: POSTGRES_NON_ROOT_USER ou POSTGRES_NON_ROOT_PASSWORD nao definidos."
fi
chmod +x init-data.sh
healthcheck.js
Link: https://github.com/sr00t3d/fastpanel-n8n-docker/blob/main/healthcheck.js
var http = require('http');
var options = {
host: '127.0.0.1',
port: 5678,
path: '/healthz',
method: 'GET'
};
var req = http.request(options, function(res) {
console.log('STATUS: ' + res.statusCode);
process.exit(res.statusCode === 200 ? 0 : 1);
});
req.on('error', function(e) {
console.log('ERROR: ' + e.message);
process.exit(1);
});
req.end();
Permissões
sudo chown -R 1000:1000 /opt/n8n_stack/*
Iniciando os containers
docker compose up -d
docker ps
Verifique se os serviços estão running/healthy.
Para debug:
docker compose logs -f n8n
Habilitando stack no boot (systemd)
Link: https://github.com/sr00t3d/fastpanel-n8n-docker/blob/main/n8n_stack.service
Crie /etc/systemd/system/n8n_stack.service:
[Unit]
Description=n8n Stack
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/n8n_stack
ExecStart=/usr/bin/podman-compose -f docker-compose.yml up -d
ExecStop=/usr/bin/podman-compose -f docker-compose.yml down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
Ative:
sudo systemctl enable n8n_stack.service
Configurando no FastPanel (proxy reverso)
No domínio/subdomínio do n8n:
- Crie site manualmente.

- Desmarque banco e FTP.
- Vá em Backend (PHP, Proxy reverso, etc).
- Adicione proxy:

- Tipo:
host - Endereço:
http://127.0.0.1:5678
Se necessário, obtenha IP interno do container:

Tente conectar:
http://dominio.tld:5678

Resolvendo erro “Connection lost”
Esse erro normalmente indica websocket mal configurado no NGINX.
No bloco location /, adicione:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Recarregue o NGINX:
sudo nginx -t
sudo systemctl restart nginx
Após isso, o n8n deve estabilizar sem perda de conexão.
Este post está licenciado sob CC BY-NC.
Comentários
Participe da discussão abaixo.
Comentários ainda não configurados. Adicione as opções do Cusdis em /assets/json/config/blog-comments-config.json.