[ HOMELAB ] Como hospedar um site em casa ?

Bom, você já deve ter se perguntado se isso é possível, e é claro que a resposta é SIM! E vou te mostrar como fiz isso, com um notebook velho e um pouco de curiosidade.

O que é preciso ?

Antes de mais nada você precisa de:

  • 1 PC com acesso a internet para ser o servidor, pode ser um pc ou notebook normal, ou até mesmo um SoC (System on Chip) como um Raspberry PI ou um Orange PI da vida;
  • IP Fixo/Público que é adquirido com o seu provedor, no meu caso R$ 50,00;
  • 1 Roteador, no meu caso é um Mikrotik RB 750GR3, mas pode ser qualquer outro que te permita gerenciar portas.
  • 1 Domínio, esse você pode comprar na hostgator por exemplo, gira em torno de 30 reais por ano.

Com os equipamentos em mãos, quais os próximos passos ?

Agora você precisa instalar um SO de servidor no PC, como um Ubuntu Server por exemplo, depois de instalado você vai precisar do Apache:

sudo apt install apache2

depois de instalado, verificar se está rodando:

sudo systemctl status apache2

Tudo certo, agora precisa copiar os arquivos do site para o diretório /var/www/(nome-do-site), nesse exemplo estou copiando apenas o index.html, mas você deve copiar todos os arquivos do seu site:

sudo cp /home/(seu-usuario)/index.html /var/www/(nome-do-site)

Seguindo, vamos criar a configuração do site no diretório /etc/apache2/sites-available:

sudo nano seu-site.conf

Configuração:

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/(nome-do-site)

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Vamos desativar o site padrão do apache e ativar o nosso site e reiniciar o apache:

sudo a2dissite 000-default.conf
sudo a2ensite seu-site.conf
sudo systemctl reload apache2

Pronto! Agora você deve conseguir acessar o seu site usando http://seu-ip no navegador.

Acessando de qualquer rede externa

Para torná-lo acessível de fora, precisamos configurar o redirecionamento de portas dentro do roteador, para que quando uma requisição chegar na porta X ser direcionado para o IP do servidor na rede interna. Na prática pode mudar de roteador para roteador, deixo aqui um vídeo ensinando a configurar no Mikrotik.

Pronto! Agora está acessível de uma rede externa usando http://seu-ip no navegador.

O penúltimo passo seria configurar o apontamento DNS, que pode varia de acordo com a plataforma que você está usando, e o último passo seria gerar um certificado SSL para que consiga acessar usando https, esse eu vou ensinar em um outro momento.

É claro que existem N formas de fazer essa hospedagem, pode ser usando o NGINX no lugar do Apache por exemplo, nesse meu primeiro post a intenção é ser simples mesmo.

Em caso de dúvidas, sugestões ou dicas, podem deixar nos comentários, fica aqui o meu muito obrigado.

Neste comentário explico prós e contras de ter um servidor self-host

Mas em resumo: Nunca aponte seu DNS diretamente para seu IP. SEMPRE coloque atrás de um proxy (como ligar a opção "proxied" da cloudflare)

E muito cuidado com portas abertas, você pode estar dando um ponto de acesso para pessoas externas à rede interna da sua casa.

Eu recebo diariamente milhares de ataques força bruta

Muito bem pontuado, as vezes esquecemos dos riscos provenientes de um servidor *self-host* e criamos uma *playground* para invasores kkkkk
Tô usando o proxy do próprio cloudflare, ainda não sei se é p suficiente, mas vou procurar alternativas, obrigado pela observação

Adoro autohospedagem, belo artigo, contribuiu para um ecossistema mais saudavel.

Hospedo meus sites no meu RPi Zero aqui em casa, porem uso softwares mais leves.

Minha maior dificuldade foi conseguir um plano de internet de empresas com IP fixo, foram meses! Como foi sua experiencia para adquirir esse plano e qual foi o provedor de internet?

Outra duvida, alguem sabe se da pra usar starlink ou planos de 5G para hospedar?

Obrigado!

Aqui na minha região, todos os provedores vendem, eu trabalhei como analista de TI no atual provedor, quando contratei conhecia o pessoal do NOC e foi bem rápido.
nao precisa de ip fixo. você pode utilizar ddns ou instalar um serviço da cloudflare que ela consegue fazer o tunelamento.

Daora d+, tem um pc pegando poeira aqui em casa, tava pensando nisso já!

Não perca tempo, da pra fazer muiiiita coisa

Dica:

Otimizando Banda Larga com Redundância e Alta Disponibilidade

Considerando uma banda larga de 100,00 reais, é possível elevar essa solução a outro nível, gastando mais R$ 50 (cancelando o IP fixo), e obter redundância, alta disponibilidade e sem a necessidade de redirecionamento de portas.

Requisitos

  • Duas conexões de fibra de banda larga ao cusrto de 100,00 cada.
  • Servidor Ubuntu rodando Docker.
  • Uso do Cloudflare Tunnel (com suporte a IPv6).

Configuração com Docker e Cloudflare Tunnel

Supondo que você tenha duas fibras e um servidor Ubuntu com Docker, o Cloudflare Tunnel pode rodar em duas instâncias (cada container conectado a uma faixa de rede diferente de cada ISP) mas ao mesmo tempo conectado à rede do seu app dentro do docker.

Se a sua aplicação (como Nginx, Apache, PHP, Node, .NET, etc) estiver rodando em um container escutando qualquer porta HTTP, a configuração do Cloudflare Tunnel no painel de controle seria simples:

Protocolo: http Host: nomedoseucontainer ou nomedoseucontainer:porta se a porta for diferente de 80

O legal é que próprio tunnel avaliará os conectores ativos (instancias do tunnel) e fará o trabalho de distribuir as conexões de forma semelhante a um sistema de fail-over. Mas é possivel criar um Load Balance baseado em regras usando o painel da cloudflare, mas na prática eu acho desnecessário.

Terminação HTTPS Simplificada

Como o HTTPS é terminado na borda do Cloudflare, não há necessidade de configurar um Nginx para proxy reverso HTTPS, no seu app e nem de usar o Certbot. Isso simplifica a configuração e reduz o overhead no servidor, afinal a comunicação entre containers é segura por sí só.

Split DNS para Acessos da rede interna

O legal é que seu site é protegido pela cloudflare mesmo em acessos internos, neste caso pode ser que você prefera que o tráfego da rede interna não saia para a borda para depois voltar, e deseja acessar seu domínio via HTTPS diretamente na rede interna, será necessário:

  1. Configurar um Split DNS que resolva o domínio para o IP do Docker.
  2. Utilizar o Certbot-Cloudflare para gerar certificados Let's Encrypt e instalá-los em um container Nginx, que fará a terminação HTTPS internamente e direcionará a conexão ao seu app.

Com essa configuração, você garante segurança e redundância na sua infraestrutura sem complicações adicionais.

Exemplo de uma aplicação dotnet com 1 ISP

Abaixo um exemplo de docker compose usado em um portainer, para ficar simples, não estou cobrindo a parte da rede, mas basicamente você precisa de dois containers "cloudlfared" usando o mesmo token com suas redes ajustadas para conectar a ISPs de forma independente e ter reduncância.

A aplicação é um sistema feito em blazor com banco de dados sql server, e o tunnel (cloudflared) expôe ele em um host. é interessante notar que a aplicação e o banco de dados estão em uma rede docker sem acesso a internet, ou à rede local, assim em teoria se eles fossem comprometidos não teria acesso a nenhum recurso de rede.

version: '3.4'

services:
  mssql-server:
    image: mcr.microsoft.com/mssql/server
    environment:
      ACCEPT_EULA: "Y"
      SA_PASSWORD: "********"
      MSSQL_PID: Express
      restart: always
    volumes:
      - /opt/anmtp/mssqldata:/var/opt/mssql/data

  App:
    depends_on:
      - mssql-server
    environment:
      ConnectionStrings__DefaultConnection: "Server=mssql-server;Initial Catalog=Appdb;User ID=SA;Password=*******;TrustServerCertificate=true;"
    image: myapp:latest
   # ou poderia dar o buid se nao tiver a imagem
   # build:
   #   context: /opt/
   #   dockerfile: myapp/Dockerfile
    restart: always
    volumes:
      - /opt/anmtp/appdata:/app/Data
  cloudflared:
    depends_on:
      - App
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel --no-autoupdate run
    container_name: myapp-cloudflared
    environment:
      TZ: "America/Sao_Paulo"
      TUNNEL_TOKEN: "*********"

O legal é que para configurar o tunnel você so precisa de um token, e o resto da configuração é feita totalmente no painel da cloudflare, então você pode trocar o host ou apontar varios hosts diferente, criar regras, etc. E de brinde ganha proteção contra DDOS mantendo sua rede sem portas abertas.

No caso de não ter um roteador Mikrotik, onde possa definir regras para, use ufw e fail2ban para reduzir dores de cabeça ao ter vulnerabilidades exploradas afetar o servidor ou mesmo sua rede doméstica.

Opa obrigado pela pontuação, vou até pesquisar sobre o fail2ban, trabalhei com isso mas não sei ainda como é implementado

caramba isso e um otimo hack para aprender como as coisas funcionam por de baixo do pano, fazia muito isso quando era crianca, sempre fiquei afcionado em ter meu proprio server de game, entao foi por esse caminho que comecei minha jornada no universo do desenvolvimento

Muito bom, faço isso aqui com uma raspberry4, mas no meu caso eu hospedo um bot do telegram que conta com um painel admin web. Uso nginx, certbot para configurar o certificado ssl, domínio no registro.br apontando para meu IP fixo e tudo funciona como uma maravilha.

Massa demais, eu uso o certbot também, o meu domínio comprei na hostgator mas eu administro no Cloudflare.
O meu também administro pela Cloudflare, kkkk... Não tem como ser diferente.
Cara, muito interessante isso de usar um Raspberry pra hospedar um bot, fala mais pra gente e explica sobre isso. To querendo fazer um bot pra pegar alguns informações de forma automatizada no Telegran pra filtrar vagas de tecnologia, mas ainda não sei como começar a fazer isso.
Não queria poluir o post do amigo com isso,mas em resumo o bot pode ser "hospedado" em qualquer máquina, desde que ela fique sempre ligada, o telegram possui algumas libs específicas para isso no caso de usar python a lib [python-telegram-bot](https://docs.python-telegram-bot.org/en/v21.6/) é uma ótima opção, eu por outro lado uso [telethon](https://docs.telethon.dev/en/stable/) que é outra ótima lib, com recursos tanto para bots quanto para usuários, é uma lib Proto e para casos de uso mais avançados. No geral você desenvolve seu bot e ao executar, a lib controla os updates das mensagens e você só deve se preocupar com possíveis erros e quedas que podem ocorrer, para evitar isso eu uso [pm2](https://pm2.keymetrics.io/docs/usage/quick-start/) para controlar os processos. O que me fez usar as raspberry para subir e hospedar esse bot e o painel admin dele é que ela tem baixo consumo de energia e pode ficar ligada por dias,pelo menos 1 vez por semana eu reinicio ela. No geral funciona bem e o sistema consegue suportar os acessos de multiusuários de forma bem satisfatória. O [bot](https://t.me/BlazeAuto_bot) em si é relacionado a automação de apostas, que é um tema um tanto quanto polêmico e talvez não seja algo interessante de ser esmiuçado aqui, basicamente é isso. Talvez algum dia eu crie um post aqui sobre isso.
muito bacana, vlw pelas informações. Vou dar uma pesquisada mais aprofundada sobre.

É realmente legal poder hospedar sites ou serviços de casa, para projetos pequenos sai mais barato que VPS. Conforme comentaram, a Cloudflare disponibiliza um serviço gratuito de tunelamento que funciona muito bem, e permite que você aponte um subdomínio que você controla para o seu computador sem precisar configurar roteador (sempre uma experiência horrível) ou ter IP fixo. O nome da coisa é Cloudflare Tunnel e para configurar isso vá lá no menu esquerdo lá no seu dashboard da Cloudflare e clique em Zero Trust e depois em Networks.

Caramba, dessa eu não sabia, muito obrigado!

Você pode usar o cloudflare tunnel para fazer isso e vincular seu IP a um domínio, eu por exemplo hospedo vários serviços em minha casa, um exemplo seria minha "netflix" pessoal que faça com um servidor de mídia chamado Jellyfin.

Eu tô com o proxmox, meu próximo passo é criar um servidor de mídia e posteriormente um NAS para armazenar as gravações das câmeras.

A melhor e mais econômica solução é usar o Cloudflared, uma aplicação desenvolvida pela Cloudflare que permite colocar seu site online em qualquer computador com Windows ou Linux. Para isso, basta ter seu domínio configurado na Cloudflare e ter o Node ou Apache instalado em sua máquina. Depois, você precisará rodar seu projeto localmente e, em seguida, iniciar o Cloudflared, definindo o host e a porta. Com isso, seu site estará online, garantindo a segurança oferecida pela Cloudflare.

Eu estou na luta para hospedar e disponibilizar o meu site, o servidor ja funciona que e um PC antigo com Windows 10 "EU SEI EU NÃO DEVIA ESTA USANDO O WINDOWS 10 PRA ESSE PROPÓSITO". O Site com Asp .Net e esta rodando no IIS o domínio eu comprei na Goodady, esta tudo funcionando menos uma coisa. O acesso fora da rede, tudo leva a acrer que apesar do meu IP esta fixo ele aparentemente não é público, mas isso eu ainda vou resolver com a operadora.

Opa Gustavo, provavelmente é isso mesmo, eu tava tendo um problema de Loop de NAT ao tentar acessar na minha rede interna, mas consegui resolver

Muito bacana esse conteúdo, eu estou já tem um tempo querendo realizar isso. Voce acredita que uma Raspberry PI 3 com 4GB de RAM consegue ter um desempenho interessante ou ideal é a partir de 8?

Eu uso uma Rasp4 com 4GB de RAM e tem me atendido bem.