🏠 Self‑hosting sem drama: simplificado e poderoso
Olá pessoal, tudo certo? Recentemente postei aqui sobre meu projeto pessoal, Kronos. Hoje, venho trazer uma forma simples e poderosa de self hosting, que uso hoje no site do Kronos.
Fase 1 - Cloudflare
Para o roteamento https iremos usar o Cloudflare Zero Trust. Vou passar algo bem simples aqui, mas recomendo ver aqui também: Create a tunnel (dashboard)
-
Entrar no Zero Trust
- Acesse dash.teams.cloudflare.com → Networks > Tunnels → Create a tunnel.
-
Escolher o conector
- Na tela “Create a tunnel”, selecione Cloudflared e clique Next
-
Dar um nome
- Ex.:
kronos-home. Clique Save tunnel
- Ex.:
-
Copiar o comando mágico
-
A página “Connect your instance” mostra um único comando, já pronto para seu sistema:
cloudflared service install <TOKEN> -
Copie esse comando (o
<TOKEN>é exclusivo do túnel).
-
🐳 Fase 2 — Docker Swarm!
Primeiramente, vamos entender algumas coisas do Swarm
| Conceito | Pra que serve |
|---|---|
| Swarm mode | Transforma várias máquinas (ou só a sua) em um cluster. |
| Manager × Worker | Manager decide; Workers executam. Em single‑node ambos papéis ficam na mesma máquina. |
| Service | É o “deployment unit”. Define imagem, portas e quantas cópias (réplicas) rodar. |
| Overlay network | Rede virtual criptografada que liga todos os containers do cluster. |
| Rolling update | Swarm troca containers antigos por novos sem downtime. |
Comandos básicos:
docker swarm init # vira manager
docker node ls # lista nós
docker service ls # lista services
docker service scale web=3 # sobe réplicas
Fontes: documentação oficial do docker stack deploy e Swarm (Docker Documentation, Docker Documentation)
🚀 Fase 3 — Deploy
compose.yml (recorte)
version: "3.8"
services:
web:
image: kronos-site:${CACHEBUST}
ports:
- "2020:80"
deploy:
replicas: 2 # escalar é só mudar o número
update_config:
order: start-first # rolling update suave
networks: [proxy]
networks:
proxy:
external: true # overlay compartilhado
Script de deploy
#!/usr/bin/env bash
set -e
export CACHEBUST=$(date +%s)
docker swarm init || true
docker compose build --build-arg CACHEBUST=$CACHEBUST
docker stack deploy -c compose.yml kronos --with-registry-auth
CACHEBUSTforça rebuild limpo.docker stack deploycria ou atualiza o Service, aplica health‑checks e faz rolling update.- Se precisar escalar:
docker service scale kronos_app=5— Swarm cria containers idênticos instantaneamente.- Pra saber o nome do service rode
docker service ls
- Pra saber o nome do service rode
🎁 Com isso, ganhamos:
- HTTPS & WAF gerenciados pela Cloudflare
- Zero NAT: não toca no roteador
- Deploy idempotente: repete o script sem medo
- Escalabilidade:
replicas:+ overlay network
Futuro
Pra não ficar tanta coisa aqui, estou montando um post novo de como eu automatizei esse processo com:
- SSH só com chave e
ufwfechado. - git bare repo +
post‑receivehook para pull automático. - GitHub Webhook → push = deploy.
É isso, obrigado pessoal!