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


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 local
  • tail -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-net

5. 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 real

se 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 script deploy.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