Executando verificação de segurança...
18

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)

Homepage do 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:

  1. Um computador pra ficar ligado 24/7
    1. Pode ser um desktop, um Raspberry Pi ou até um notebook velho
  2. Acesso de admin ao roteador
    1. Para configurar o servidor de DNS
    2. Para configurar o DHCP e fixar o IP do HomeLab
    3. Para expor portas quando for necessário
  3. Um monitor pra uso temporário
  4. Um pen drive pra uso temporário
    1. Com pelo menos 4GB de espaço
  5. 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

  1. Instale o Docker
  2. 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
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 pasta traefik 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

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
  • 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

  1. 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
  2. Cuidado em hardcodar o IP do container. Se o PC for reiniciado, os containers com IPs fixo podem não subir automaticamente depois
Carregando publicação patrocinada...
2

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 [email protected] se quiserem montar algum grupo de discussão.

1

Caramba, vou dar uma olhada!
Ainda não to decidido se gosto ou não de usar tunnel, mas bom demais saber que existe essa alternativa! Valeu por compartilhar!

2

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.
1

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?