este guia documenta como colocar um site feito com Quartz no ar usando Docker, com Nginx como proxy reverso e HTTPS gratuito via Let’s Encrypt.
pré-requisitos
- servidor com Linux (Debian 12 foi utilizado no exemplo)
- instalação do docker no debian 12
- um domínio próprio (exemplo: tiffs.dev) apontando para o IP do servidor
- portas 80 (HTTP) e 443 liberadas (HTTPS)
- um site criado com Quartz em um repositório local ou remoto (GitHub, GitLab etc)
1. estrutura do projeto
ao final da configuração, os arquivos do Quartz deverão estar estruturados assim:
quartz/
├── Dockerfile
├── nginx/
│ └── nginx.conf
├── package.json
├── package-lock.json
├── content/ (+ outros arquivos do quartz)
2. dockerfile do quartz
dentro do diretório do projeto quartz/, criar o arquivo Dockerfile:
FROM node:22-slim AS builder
WORKDIR /usr/src/app
COPY package.json .
COPY package-lock.json* .
RUN npm ci
FROM node:22-slim
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/ /usr/src/app/
COPY . .
CMD sh -c "npx quartz build --serve && tail -f /dev/null"npx quartz build --serve: gera o site e inicia um servidor localtail -f /dev/null: impede que o container encerre após servir o site
3. configurações do nginx
dentro do diretório do projeto quartz, criar um novo diretório nginx e, dentro dele, o arquivo nginx.conf:
server {
listen 80;
server_name tiffs.dev www.tiffs.dev; # substituir "tiffs.dev" pelo domínio real
location / {
proxy_pass http://quartz-site:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
server {
listen 443 ssl;
server_name tiffs.dev www.tiffs.dev; # substituir "tiffs.dev" pelo domínio real
ssl_certificate /etc/letsencrypt/live/tiffs.dev/fullchain.pem; # substituir "tiffs.dev" pelo domínio real
ssl_certificate_key /etc/letsencrypt/live/tiffs.dev/privkey.pem; # substituir "tiffs.dev" pelo domínio real
location / {
proxy_pass http://quartz-site:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}4. criação da rede docker
criar uma rede para que os containers se comuniquem:
docker network create quartz-net5. certificados HTTPS com CertBot
uso do container oficial do Certbot para gerar os certificados:
docker run -it --rm \
-v /var/www/certbot:/var/www/certbot \
-v /etc/letsencrypt:/etc/letsencrypt \
certbot/certbot certonly \
--webroot -w /var/www/certbot \
--email seu@email.com \
--agree-tos \
--no-eff-email \
-d tiffs.dev -d www.tiffs.dev # substituir "tiffs.dev" pelo domínio realse tudo der certo, o domínio será validado e os certificados salvos em /etc/letsencrypt.
6. build e execução dos containers
- build da imagem do Quartz:
docker build -t quartz-site . - rodando o container do Quartz:
docker run -d --name quartz-site --network quartz-net quartz-site - criação da pasta de desafios do Certbot:
mkdir -p /var/www/certbot - subindo o container do nginx:
docker run -d \ --name quartz-nginx \ --network quartz-net \ -p 80:80 -p 443:443 \ -v $(pwd)/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro \ -v /etc/letsencrypt:/etc/letsencrypt:ro \ -v /var/www/certbot:/var/www/certbot:ro \ nginx:stable
7. renovação automática dos certificados
- abrir o crontab:
crontab -e - adicionar o job ao final do arquivo. esse job irá verificar e renovar os certificados todos os dias às 3h da manhã:
0 3 * * * docker run --rm -v /etc/letsencrypt:/etc/letsencrypt -v /var/www/certbot:/var/www/certbot certbot/certbot renew --webroot -w /var/www/certbot && docker restart quartz-nginx
8. script de deploy
-
dentro da pasta do projeto
quartz/, criar o scriptdeploy.sh:#!/bin/bash echo "🔄 Atualizando repositório..." git pull origin main echo "🛠️ Rebuild do container Quartz..." docker build -t quartz-site . echo "🧹 Parando e removendo containers antigos..." docker stop quartz-site quartz-nginx docker rm quartz-site quartz-nginx echo "🚀 Subindo Quartz..." docker run -d --name quartz-site --network quartz-net quartz-site echo "🌐 Subindo Nginx..." docker run -d \ --name quartz-nginx \ --network quartz-net \ -p 80:80 -p 443:443 \ -v /home/debian/quartz/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro \ -v /etc/letsencrypt:/etc/letsencrypt:ro \ -v /var/www/certbot:/var/www/certbot:ro \ nginx:stable echo "✅ Deploy concluído!" -
tornar o script executável:
chmod +x deploy.sh -
rodar o script para fazer deploy:
./deploy.sh