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
traefik.yml
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
conf/services.yml
_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
secrets/cloudflare_api_token
- Crie um Token em https://dash.cloudflare.com/profile/api-tokens
- Permissões
- Zone:Read
- DNS:Edit
- Salve o token no arquivo
secrets/cloudflare_email
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