Deploy de um site Astro com Docker e Nginx
Neste artigo, mostro como configurei o deploy deste site usando Docker com build multi-stage e Nginx como servidor.
Se você quer entender por que escolhi Astro, leia o artigo Por que escolhi Astro para meu site pessoal.
Dockerfile multi-stage
A ideia é simples: um estágio para build com Node.js e outro para servir os arquivos estáticos com Nginx.
FROM node:22-alpine AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine AS runtime
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
O resultado é uma imagem de ~30MB — muito menor do que rodar Node.js em produção.
Configuração do Nginx
O nginx.conf precisa lidar com as rotas do Astro e cache de assets:
server {
listen 80;
root /usr/share/nginx/html;
location / {
try_files $uri $uri/index.html =404;
}
location ~* \.(js|css|png|jpg|svg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
Gzip
Habilitar gzip reduz significativamente o tamanho das respostas. A documentação do Nginx sobre gzip é uma boa referência.
Deploy no EasyPanel
Com o Dockerfile pronto, o deploy no EasyPanel é direto:
- Crie um novo serviço apontando para o repositório Git
- Selecione build type Dockerfile
- Configure a porta 80
- Adicione seu domínio
Conclusão
Docker simplifica muito o deploy e garante que o ambiente é idêntico em dev e produção. Para mais dicas de desenvolvimento, confira meu primeiro post e o artigo sobre Astro.