[ 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
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!
Daora d+, tem um pc pegando poeira aqui em casa, tava pensando nisso já!
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:
- Configurar um Split DNS que resolva o domínio para o IP do Docker.
- 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.
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.
É 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
.
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.
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.
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?