Hemos completado el ciclo de desarrollo. Tenemos una aplicación optimizada, con una arquitectura sólida… que solo funciona en tú equipo.
Ahora toca el momento de la verdad. Tenemos que construir la página web de verdad y desplegarla a un servidor para que todo el mundo pueda verla.
En este artículo abordaremos el despliegue de Astro priorizando el uso de un Servidor Privado Virtual (VPS), tanto para sitios estáticos como para aplicaciones renderizadas en el servidor (SSR). También repasaremos brevemente las opciones PaaS para prototipados rápidos.
Preparación del Artefacto (Build)
Independientemente del destino del despliegue, el primer paso es generar el código de producción. Astro compila nuestro código, optimiza imágenes y minifica los activos.
npm run build
Este comando generará una carpeta dist/ en la raíz del proyecto. El contenido de esta carpeta variará según el modo configurado en astro.config.mjs:
- Modo Estático (
output: 'static'): Contendrá archivos.html,.cssy.jslistos para ser servidos por cualquier servidor web. - Modo Servidor (
output: 'server'): Contendrá el servidor de entrada (entry point) y los activos necesarios para ejecutar la aplicación en un entorno Node.js (o el adaptador seleccionado).
Despliegue en VPS
Esta es la opción recomendada para tener control total y sin dependencias de terceros. Asumiremos un entorno Linux estándar (Ubuntu/Debian).
Sitio Estático (SSG)
Si tu proyecto es puramente estático (blog, documentación, landing page), el despliegue es muy sencillo. Solo necesitamos un servidor web eficiente como Nginx o Apache para servir la carpeta dist.
Copiamos el contenido de dist/ a nuestro servidor (por ejemplo, mediante scp o un pipeline de CI/CD) a la ruta /var/www/mi-proyecto.
server {
listen 80;
server_name midominio.com;
root /var/www/mi-proyecto;
index index.html;
location / {
try_files $uri $uri/ /404.html;
}
# Caché agresiva para activos inmutables (Astro genera hashes en los nombres)
location /_astro/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
Aplicación SSR (Node.js)
Si utilizamos output: 'server' o 'hybrid', necesitamos un entorno de ejecución. Para un VPS estándar, utilizaremos Node.js.
Primero, debemos adaptar Astro para que funcione como un servidor Node.js independiente.
npx astro add node
Esto configurará el adaptador en astro.config.mjs. Asegúrate de usar el modo standalone:
import node from '@astrojs/node';
export default defineConfig({
output: 'server',
adapter: node({
mode: 'standalone'
})
});
Tras ejecutar npm run build, tendremos un archivo dist/server/entry.mjs. Podemos ejecutarlo con node dist/server/entry.mjs, pero en producción necesitamos un gestor de procesos que asegure que la aplicación se reinicia si falla o si el servidor se reinicia.
Utilizaremos PM2:
# Instalación global de PM2
npm install -g pm2
# Iniciar la aplicación
pm2 start dist/server/entry.mjs --name "mi-astro-app"
No debemos exponer el puerto de Node.js (por defecto 4321 o 8080) directamente a internet. Lo correcto es usar Nginx como Proxy Inverso para gestionar SSL, compresión Gzip/Brotli y cabeceras de seguridad.
server {
listen 80;
server_name midominio.com;
location / {
proxy_pass http://localhost:4321; # Puerto donde corre Astro
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Alternativas PaaS (Vercel / Netlify)
Si el proyecto no requiere una infraestructura dedicada o estamos en una fase de prototipado rápido, los servicios de Plataforma como Servicio (PaaS) son opciones válidas.
Estas plataformas abstraen la gestión del servidor y ofrecen CI/CD integrado (conectan con tu repositorio Git y despliegan al hacer push).
Consideraciones al usar PaaS
- Adaptadores Específicos: Al igual que con Node.js, si usas SSR en estas plataformas, debes instalar su adaptador específico (
@astrojs/vercelo@astrojs/netlify) para que Astro genere funciones serverless compatibles con su infraestructura. - Límites: Ten en cuenta los límites de ejecución (timeout) de las funciones serverless y el ancho de banda en los planes gratuitos.
- Vendor Lock-in: El código generado para Vercel puede no funcionar directamente en Netlify sin cambiar el adaptador y la configuración.
