AVISO IMPORTANTE - RECOMENDO LER
Configurar este ambiente vai mexer profundamente no sistema operacional. Apesar de improvável, problemas podem ocorrer então FAÇA UM BACKUP ou utilize um ambiente onde quebrar tudo não vá te trazer dores de cabeça.
Comecei recentemente a estudar como criar agentes para auxiliar em tarefas de criação de conteúdo, gestão de mídia e identificação de oportunidades em marketing digital.
Montar este tipo de infra é algo novo pra mim, então não esperem um primor de boas práticas.
Ao final deste roteiro, teremos um ambiente de estudos totalmente local e funcional (e vazio) usando ferramentas reconhecidas no mercado como:
- N8N → orquestração dos agentes.
- Ollama → execução de modelos locais.
- Qdrant → memória vetorial para agentes.
- Docker Compose → orquestração.
- Flowise → ferramenta de prototipação de agentes.
- Duplicati → backup e restauração do ambiente.
- PostgreSQL → persistência do n8n.
- Redis → fila interna.
Obs.: Configurar os fluxos, baixar LLMs e fazer o setup fino de cada serviço não está no escopo deste tutorial.
Testei o ambiente em duas máquinas diferentes (Ryzen 3 3400g + 8Gb + 3060ti 8Gb / Ryzen 7 5700x + 48Gb + 5070ti 16g) e ele ficou bastante funcional em ambas.
Em máquinas modestas o tempo para processar algumas tarefas será maior, considere os recursos disponíveis em seu ambiente e veja se faz sentido um setup desses.
Como sempre em meus guias, este não é um script automático que você vai copiar e esperar terminar. É um roteiro, você vai precisar ajustar passos e adaptar ao seu ambiente que realmente quiser que isso funcione.
Objetivos: ter um ambiente local robusto para estudar agentes e fluxos, sem assinaturas de serviços e/ou gastos imediatos.
Não-objetivos: Ser um guia “completo oficial final” para ambientes de produção real.
Preparação do sistema operacional
Este ambiente está atualmente rodando no Debian 13 usando o setup do Frankendebian com alguns ajustes para atender as necessidades do docker:
Sempre tenha certeza de que seu sistema está atualizado e com os drivers da Nvidia instalados, use o roteiro do Frankendbian em caso de dúvidas.
sudo apt update && sudo apt upgrade -y
Obs.: A instalação deste ambiente pode consumir bastante espaço na raiz do sistema, dependendo dos modelos que foram baixados. Meu setup atual consumiu em torno de 30Gb na partição /.
Docker setup completo: chaves, repositório e testes
# instala dependências
sudo apt install -y ca-certificates curl gnupg
# Adicionar chave GPG oficial
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Adicionar repositório
echo \
"deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian \
$(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instalar Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Ativa o serviço do docker na inicialização do sistema
sudo systemctl enable --now docker
Depois de concluir a instalação, execute um teste para validar o docker.
sudo docker run hello-world
Instalar NVIDIA Container Toolkit
Esse é o componente que conecta Docker + GPU, ele não está disponível no repositório padrão então é obrigatório este passo.
# Adicionar repositório NVIDIA
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /etc/apt/keyrings/nvidia-container-toolkit.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/etc/apt/keyrings/nvidia-container-toolkit.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# Instalar o pacote
sudo apt update
sudo apt install -y nvidia-container-toolkit
# Configurar o runtime
sudo nvidia-ctk runtime configure --runtime=docker
# Reiniciar o Docker
sudo systemctl restart docker
# Testar GPU dentro do container
sudo docker run --rm --gpus all nvidia/cuda:12.3.2-base-ubuntu22.04 nvidia-smi
Rodar docker sem sudo (opcional)
Para facilitar o uso nos testes e por se um ambiente não voltado para produção estou usando o docker sem sudo. Basta adicionar seu usuário ao grupo docker e garantir que as permissões dos diretórios estão corretas.
sudo usermod -aG docker $USER
newgrp docker
Arquivo compose e observações
O compose do Docker utiliza uma única rede para facilitar a comunicação entre os serviços e também estou usando diretórios locais como armazenamento ao invés de volumes do docker, no momento não existe preocupação com acesso externo então não adicionei nenhum serviço para isso. Se você quiser que o acesso remoto esteja disponível, pode integrar uma solução de proxy como o Traefik.
Estou usando esta estrutura de diretórios dentro do home do meu usuário para concentrar os arquivos de configuração e dados do docker.
n8n-local
- data
data\backups
data\duplicati-config
data\flowise
data\ollama
data\n8n
data\postgres
data\qdrant
data\redis
Depois de ajustar o arquivo .env de acordo com as suas preferências salve ele no diretório n8n-local como “.env”. Ele é um arquivo oculto por padrão, lembre de trocar as senhas e nunca compartilhar ou publicar o arquivo com seus dados reais.
Arquivo .env
# =========================
# N8N - Core
# =========================
N8N_HOST=localhost
N8N_PORT=5678
N8N_PROTOCOL=http
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=SeuUsuario
N8N_BASIC_AUTH_PASSWORD=ColocaPasswordDecenteAqui
N8N_EMAIL_MODE=smtp
N8N_SMTP_HOST=
N8N_SMTP_PORT=
N8N_SMTP_USER=seumelhoremail.com
N8N_SMTP_PASS=ColocaPasswordDecenteAqui
N8N_SMTP_SENDER=seumelhoremail.com
N8N_ENCRYPTION_KEY=AquiVocePrecisaColocarUmHashManeiroTambem
WEBHOOK_URL=http://localhost:5678/
# =========================
# Database - PostgreSQL
# =========================
POSTGRES_USER=n8n
POSTGRES_PASSWORD=ColocaPasswordDecenteAqui
POSTGRES_DB=n8n
DB_TYPE=postgresdb
DB_POSTGRESDB_HOST=postgres
DB_POSTGRESDB_PORT=5432
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=ColocaPasswordDecenteAqui
# =========================
# Redis (Queue Mode)
# =========================
QUEUE_BULL_REDIS_HOST=redis
QUEUE_BULL_REDIS_PORT=6379
EXECUTIONS_MODE=queue
# =========================
# Ollama
# =========================
OLLAMA_HOST=http://ollama:11434
# =========================
# Qdrant
# =========================
QDRANT_URL=http://qdrant:6333
# =========================
# Duplicati
# =========================
DUPLICATI_PORT=8200
DUPLICATI_PASSWORD=ColocaPasswordDecenteAqui
DUPLICATI_BACKUP_PATH=./backups
DUPLICATI_CONFIG_PATH=./duplicati-config
# =========================
# Timezone
# =========================
GENERIC_TIMEZONE=America/Sao_Paulo
TZ=America/Sao_Paulo
Arquivo docker-compose.yml
services:
postgres:
image: postgres:16
container_name: n8n-postgres
restart: unless-stopped
env_file:
- .env
volumes:
- ./data/postgres:/var/lib/postgresql/data
networks:
- n8n-net
redis:
image: redis:7-alpine
container_name: n8n-redis
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- ./data/redis:/data
networks:
- n8n-net
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "${N8N_PORT}:5678"
env_file:
- .env
volumes:
- ./data/n8n:/home/node/.n8n
depends_on:
- postgres
- redis
networks:
- n8n-net
n8n-worker:
image: n8nio/n8n:latest
container_name: n8n-worker
restart: unless-stopped
command: worker
env_file:
- .env
depends_on:
- postgres
- redis
networks:
- n8n-net
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- ./data/ollama:/root/.ollama
networks:
- n8n-net
qdrant:
image: qdrant/qdrant:latest
container_name: qdrant
restart: unless-stopped
ports:
- "6333:6333"
volumes:
- ./data/qdrant:/qdrant/storage
networks:
- n8n-net
flowise:
image: flowiseai/flowise:latest
container_name: flowise
restart: unless-stopped
ports:
- "3000:3000"
environment:
- PORT=3000
- FLOWISE_USERNAME=admin
- FLOWISE_PASSWORD=K4k4r0th0ZService
volumes:
- ./data/flowise:/root/.flowise
networks:
- n8n-net
duplicati:
image: duplicati/duplicati:latest
container_name: duplicati
restart: unless-stopped
ports:
- "${DUPLICATI_PORT}:8200"
env_file:
- .env
environment:
- DUPLICATI__WEBSERVICE_PASSWORD=${DUPLICATI_PASSWORD}
volumes:
- ./data:/source/data
- ${DUPLICATI_BACKUP_PATH}:/backups
- ${DUPLICATI_CONFIG_PATH}:/config
networks:
- n8n-net
networks:
n8n-net:
driver: bridge
Subindo o ambiente
Com tudo configurado, agora você pode subir o ambiente e começar a testar as ferramentas.
Dentro do diretório base (n8n-local), teste se o arquivo compose e env estão corretos - este comando valida o YAML, resolve variáveis do .env e mostra o compose final “expandido”.
Se tiver algum erro de variável ou sintaxe, já aparece aqui.
docker compose config
Se estiver tudo certo, o próximo passo é subir o ambiente completo.
docker compose up -d
O processo pode demorar um pouco dependendo do poder de processamento da sua máquina e também da velocidade da conexão de internet para baixar os arquivos.
Depois do processo concluído (se não houver nenhum erro) você pode verificar se os serviços estão ativos com o comando abaixo.
docker ps
Caso você queira desligar os serviços para liberar recursos, use o comando abaixo:
docker compose down
Os serviços do docker irão iniciar automaticamente com o computador, se você não quiser que isso ocorra, desative o serviço no SystemD.
sudo systemctl disable docker
Você agora pode acessar os serviços no navegador via localhost:porta ou dentro do ambiente do docker usando o nome do serviço:porta.
Qdrant - http://localhost:6333/dashboard
Duplicati - http://localhost:8200
Ollama - http://ollama:11434/api/tags
Flowise - http://localhost:3000
N8N - http://localhost:5678/
Documentação oficial para estudos
Qdrant - https://qdrant.tech/documentation/
Duplicati - https://docs.duplicati.com/
Ollama - https://docs.ollama.com/
Flowise - https://docs.flowiseai.com/
N8N - https://docs.n8n.io/