Homelab - O artigo que eu gostaria de ter lido
(vi um post sobre hospedar um site em casa e isso me motivou a escrever esse artigo compartilhando um pouco da minha experiência com meu HomeLab)
DISCLAIMER
Fiz o artigo sem validar se vai funcionar certinho, mas acho que tá tudo certo. Também tentei deixar enxuto, mas não dá pra ser detalhado nos passos e ser breve ao mesmo tempo kkkkkk
Qualquer problema que encontrarem me avisa que atualizo
Conteúdo do post
Tentei escrever nesse post o que eu gostaria de ter lido quando estava começando com essa brincadeira. Tive que penar um bom tanto pra conseguir chegar no estágio atual e espero que o conteúdo da publicação minimize as barreiras de entrada pra esse hobby.
O objetivo final do artigo é termos HTTPS nos serviços executados no homelab. Isso é a base pra expandir depois e adicionar novos serviços
Se vcs curtirem e quiserem, posso fazer mais posts sobre como configurar cada serviço individualmente.
Itens necessários:
- Um computador pra ficar ligado 24/7
- Pode ser um desktop, um Raspberry Pi ou até um notebook velho
- Acesso de admin ao roteador
- Para configurar o servidor de DNS
- Para configurar o DHCP e fixar o IP do HomeLab
- Para expor portas quando for necessário
- Um monitor pra uso temporário
- Um pen drive pra uso temporário
- Com pelo menos 4GB de espaço
- Vontade, perseverança e paciência
Passo a passo
Passo 1 - Instalar o Ubuntu Server
Se você estiver usando um Raspberry Pi, acho que o OS próprio dele é a melhor opção.
Bom. Não vou entrar muito em detalhes, mas basicamente baixar a ISO e tornar o pen drive “bootável”. Deixo aqui um guia de como fazer isso. Em inglês, oficial do Ubuntu e em portugues também.
Com o pen drive no jeito, faça a instalação do Ubuntu Server no seu futuro servidor.
Recomendo instalar o agent SSH e depois configurar uma chave privada/pública para conseguir acessar o server remotamente enquanto na mesma rede ou quando estiver na VPN
Quando finalizar, digite o login e a senha configurados durante a instalação. Quando estiver dentro do server, siga para o próximo passo.
Recomendo já acessar seu roteador e fixar o IP do seu Homelab no DHCP para evitar que o IP dele troque
Passo 2 - Instalar o Docker
- Instale o Docker
- Configure o Docker para conseguir acessá-lo sem precisar ficando
sudo
toda hora
Passo 3 - Portainer
Eu gostei de usar o Portainer pois é mais fácil lidar com os containers via interface ao invés de fazer tudo na CLI do Docker. Acho que dá pra usar Rancher aqui se preferir tbm (nunca usei)
3.1 - Criar a network do homelab
docker network create homelab
Recomendo criar uma network específica e colocar tudo nela. Sempre evite rodar os containers com
network: host
pois as portas dos containers são automaticamente expostas, podendo abrir vulnerabilidades da sua rede interna para a internet.
3.2 - Colocando o Portainer pra rodar
Crie um arquivo portainer/docker-compose.yml
com o seguinte conteúdo
networks:
homelab:
external: true
services:
portainer:
image: portainer/portainer-ce:2.20.2 # Dá pra usar :latest aqui tbm se preferir
container_name: portainer
restart: unless-stopped
ports:
- 9000:9000
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- PATH_DOS_CONTAINERS/portainer:/data
networks:
- homelab
No arquivo eu citei o
PATH_DOS_CONTAINERS
. Recomendo separar um caminho do seu disco para criar as pastas com os arquivos de configuração dos containers que você vai rodar
E execute o comando abaixo para subir o Portainer
docker compose up -d
Acesse http://<IP DO SERVER>:9000
para acessar o Portainer
Passo 4 - Traefik
Pra funcionar certinho vc precisa ter um domínio.
Nos exemplos abaixo vou usar o domínio
server.com
como exemplo, mas troque todas as ocorrências deste domínio pelo que vc deseja utilizar.
Eu utilizo
*.homelab.server.com
para as URLs locais dos serviços. O Traefik gera automaticamente um certificado wildcard para este domínio usando Let's Encrypt. Fica bem
Crie uma pasta para o Traefik e crie os seguintes arquivos dentro desta pasta
api:
dashboard: true
insecure: true
entryPoints:
http:
address: :80
http:
redirections:
entryPoint:
to: https
scheme: https
https:
address: :443
forwardedHeaders:
trustedIPs:
# Local
- "127.0.0.1/32"
- "192.168.0.0/16"
- "10.0.0.0/8"
# Utilizado pelo Docker
- "172.16.0.0/12"
# CloudFlare
- "173.245.48.0/20"
- "103.21.244.0/22"
- "103.22.200.0/22"
- "103.31.4.0/22"
- "141.101.64.0/18"
- "108.162.192.0/18"
- "190.93.240.0/20"
- "188.114.96.0/20"
- "197.234.240.0/22"
- "198.41.128.0/17"
- "162.158.0.0/15"
- "104.16.0.0/13"
- "104.24.0.0/14"
- "172.64.0.0/13"
- "131.0.72.0/22"
providers:
file:
directory: /etc/traefik/conf
watch: true
certificatesResolvers:
cloudflare:
acme:
email: "<SEU_EMAIL>"
storage: "/etc/traefik/acme.json"
# caServer: https://acme-staging-v02.api.letsencrypt.org/directory
dnsChallenge:
provider: cloudflare
_commonLocalConfig: &commonLocalConfig
entrypoints:
- https
tls: &wildcardTLS
certResolver: cloudflare
domains:
- sans:
- "*.homelab.server.com"
http:
routers:
traefik-internal:
entrypoints:
- http
rule: "Host(`traefik`)"
service: api@internal
traefik:
<<: *commonLocalConfig
rule: "Host(`traefik.homelab.server.com`)"
service: api@internal
portainer:
<<: *commonLocalConfig
rule: "Host(`portainer.homelab.server.com`)"
service: portainer
services:
portainer:
loadBalancer:
servers:
- url: http://portainer:9000
- Crie um Token em https://dash.cloudflare.com/profile/api-tokens
- Permissões
- Zone:Read
- DNS:Edit
- Salve o token no arquivo
Seu email da cloudflare
Com os arquivos criados, é hora de executar o container do Traefik
- Network
homelab
, aquela que criamos no começo
- Portas
80:80
443:443
- Volumes.
CAMINHO
= o path onde a pastatraefik
foi criada/etc/traefik:CAMINHO
/var/run/docker.sock:/var/run/docker.sock
READ ONLY
- Envs
CF_DNS_API_TOKEN_FILE=/etc/traefik/secrets/cloudflare_api_token
CF_API_EMAIL_FILE=/etc/traefik/secrets/cloudflare_email
- Restart Policy
- Unless Stopped
- Recomendo usar isso em tudo, a não ser que seja um caso específico
- Unless Stopped
Com o traefik rodando, acesse https://portainer.homelab.server.com
e https://traefik.homelab.server.com
. Tudo deveria funcionar 🙏
Se algo der errado, verifique os logs do Traefik.
Passo 5 - A brincadeira começa agora
Já com HTTPS configurado, agora é a hora de adicionar seus serviços ao seu Homelab.
O HTTPS é muito importante para que suas aplicações locais que são PWA possam ser instaladas no celular, facilitando DEMAIS o acesso.
O meu HomeLab
- Adguard Home pra ter acesso à internet ad-free em qualquer dispositivo conectado no wifi
- Isso é muito legal! Mas não é 100% perfeito, não bloqueia YouTube nem Twitch
- Homepage para dashboard do Homelab
- Frigate para câmeras IP
- Sério, é mto legal! A minha câmera baratinha de soquete de lâmpada deu trabalho pra integrar, mas serviu
- HomeAssistant. E alguns serviços acoplados
- Zigbee2MQTT pra integrar dispositivos Zigbee
- Node RED para as automações
- Plex + toda suíte de suporte
- Radarr
- Sonarr
- Bazarr
- Jacket
- Overserr
- FreshRSS
- VPN usando Wg Easy
- Paperless-ngx, pra ter meus documentos digitalizados
- Whats Up Docker pra saber quais containers estão desatualizados
- Code Server pra alterar configs do Homelab pela interface web
- Duplicati pra fazer backup de tudo
- Uptime Kuma pra monitorar containers e uns serviços todo na internet
- Cloudflare DDNS pra manter o IP atualizado na Cloudflare pra eu conseguir acessar a VPN mesmo quando o IP troca
- Cloudflared para configurar tunnel da cloudflare
- Meu provedor de internet oferece um IP público, mas as portas 80/443 são bloqueadas :(
- Uso os túneis da CF pra rotear tráfego de domínios pra dentro do meu traefik, que joga pro container
- Pterodactyl pra gestão mais fácil de servidores de jogos
- Esse eu apanhei um bom tanto pra configurar
- E por último um servidor de Satisfactory 1.0, pq ninguém é de ferro
Dicas
- Ligar esse PC + o roteador + modem da internet em um nobreak fica bem legal! Assim qualquer queda temporária de energia vai garantir o completo funcionamento das coisas
- Cuidado em hardcodar o IP do container. Se o PC for reiniciado, os containers com IPs fixo podem não subir automaticamente depois
Na propria cloudflare você consegue colocar uma regra de porta padrão pra ele responder na origem. Meu provedor bloqueia todas as portas menores que 999 então coloquei pra cloudflare chamar na porta 8080 ao invés da 80 e 8443 ao invés da 443 e no roteador coloquei que requisições externas vindo dessas portas devem ser redirecionadas pra porta especifica na rede interna. 8080 (externo) -> 80 (interno) nisso dá pra eliminar o cloudflared e ganhar um pouco de performance. Ah e dá pra usar o Nginx como proxy pra responder diferentes apps na mesma porta. Outro ponto é que a propria cloudflare consegue gerar um "certificado de origem" pra voce instalar no servidor não precisando de ter certificado "Let's Encrypt" local. Mesmo no plano free da cloudflare dá pra fazer isso. Hoje uso um Raspberry Pi 4B de 8GB como server e pretendo trocar mais pra frente por um notebook velho com um i5 que tenho. Gostaria super de participar de mais discussões sobre o tema. Sugestões são sempre bem vindas. Meu email eu@vitorlima.dev se quiserem montar algum grupo de discussão.
Show! A infraestrutura que você montou está muito legal!
Tenho algo semelhante rodando em casa. Eu evito mexer em configurações de roteadores que não são meus, porque qualquer mudança exige reconfigurar tudo. Por isso, prefiro usar serviços que não precisam de portas abertas no roteador (e ainda são mais seguros!). Como um amigo já mencionou, com o Cloudflared, você não precisa abrir portas, pois a comunicação é feita via túnel do container.
Aqui eu uso o WG Easy, mas também recomendo dar uma olhada no Tailscale. Ele oferece um serviço parecido com o túnel da Cloudflare, então você não precisa abrir portas nem se preocupar em atualizar o IP do DNS. Nos meus testes, funcionou muito bem para um único usuário.
Vou deixar algumas aplicações que utilizo e acho uteis.
- Crowdsec: para proteger aplicações que serão expostas na internet, possui planos free que atendem muito bem e tem integração com o Traefik.
- AutoKuma: um agente que automatiza a criação de monitores no Uptime via Docker Labels.
- Dozzle: para visualizar logs de containeres
- Prowlarr: gerenciador de indexador, acho bem melhor que o Jacket para trabalhar com os apps ARR's
- Webmin: gerenciador web do sistema operacional, pra mim facilita muito o acesso via web do host para verificar algo na camada do SO mesmo.
- Dockge: Se não for utilizar a parte de Stacks do portainer recomendo utilizar o Dockge, muito bom para gerenciar docker composes.
Gosto da ideia do home lab, um dia crio coragem e $$ para montar o meu.. Vocês que acompanham o assunto, o pessoal está rodando modelos de LLMs locais neles também?