Construindo um homelab de IA: n8n, Ollama e Qdrant para testes e aprendizado

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/

4 curtidas