Proyecto de ejemplo de Astro con PostgreSQL y Prisma ORM configurado para desplegarse automáticamente en GitHub Container Registry (GHCR) y ejecutarse en Docker.
- Astro: Framework web moderno con SSR (Server-Side Rendering)
- PostgreSQL: Base de datos relacional privada
- Prisma ORM: ORM moderno con type-safety completo
- Docker: Contenedorización para despliegue consistente
- GHCR: GitHub Container Registry para almacenar imágenes
- CI/CD: GitHub Actions para construcción automática
- Node.js: Servidor de aplicación para SSR
- Cuenta de GitHub
- Docker instalado en tu NAS/servidor
- Git instalado localmente
# En tu máquina local, dentro del directorio del proyecto
git init
git add .
git commit -m "Initial commit: Astro + PostgreSQL"
git branch -M main
git remote add origin https://github.com/TU_USUARIO/astro-demo.git
git push -u origin main- Ve a tu repositorio en GitHub
- Ve a Settings → Actions → General
- En "Workflow permissions", selecciona "Read and write permissions"
- Guarda los cambios
Después de que GitHub Actions construya la imagen:
- Ve a tu perfil de GitHub → Packages
- Encuentra el paquete
astro-demo - Ve a Package settings
- En "Danger Zone" → Change visibility → Public
# SSH a tu NAS
ssh usuario@tu-nas-ip
# Crear directorio para el proyecto
mkdir -p ~/apps/astro-demo
cd ~/apps/astro-demo
# Descargar los archivos necesarios
# Opción 1: Clonar el repo
git clone https://github.com/TU_USUARIO/astro-demo.git .
# Opción 2: Crear manualmente docker-compose.yml e init.sql
# (copia el contenido de docker-compose.yml)
# (copia el contenido de init.sql)
# IMPORTANTE: Editar docker-compose.yml y cambiar TU_USUARIO por tu usuario de GitHub
nano docker-compose.yml
# Iniciar los contenedores
docker-compose up -d
# Ver logs
docker-compose logs -f# Autenticarse en GHCR primero
echo "TU_GITHUB_TOKEN" | docker login ghcr.io -u TU_USUARIO --password-stdin
# Luego ejecutar docker-compose
docker-compose pull
docker-compose up -dAbre tu navegador y ve a: http://IP_DE_TU_NAS:3000
Deberías ver:
- Una página con diseño moderno
- Una tabla con usuarios cargados desde PostgreSQL
- Información de conexión a la base de datos
- ✅ Base de datos NO expuesta: Solo accesible dentro de la red Docker
- ✅ Red privada: Los contenedores se comunican por
app-network - ✅ Datos persistentes: Se guardan en un volumen Docker (
postgres_data) - ✅ Healthcheck: Verifica que la BD esté lista antes de iniciar la app
La base de datos se inicializa automáticamente con:
- Tabla
usuarioscon 5 registros de ejemplo - Índices optimizados
- Triggers para actualización automática de timestamps
Este proyecto usa Prisma como ORM. Consulta PRISMA_GUIDE.md para ejemplos de uso.
Comandos útiles:
# Generar cliente de Prisma
npm run prisma:generate
# Abrir Prisma Studio (UI visual)
npm run prisma:studio
# Crear migración
npm run prisma:migrate# Conectarse al contenedor de PostgreSQL
docker exec -it astro-postgres psql -U astro_user -d astro_db
# Ver usuarios
SELECT * FROM usuarios;
# Insertar nuevo usuario
INSERT INTO usuarios (nombre, email) VALUES ('Nuevo Usuario', 'nuevo@example.com');
# Salir
\qgit clone https://github.com/TU_USUARIO/astro-demo.git
cd astro-demonpm install# Iniciar solo la base de datos
docker-compose -f docker-compose.dev.yml up -d
# Copiar archivo de entorno
cp .env.example .envnpm run devVisita: http://localhost:3000
Cuando hagas cambios en el código:
# En tu máquina local
git add .
git commit -m "Descripción de cambios"
git push
# GitHub Actions construirá automáticamente una nueva imagen
# En tu NAS
cd ~/apps/astro-demo
docker-compose pull
docker-compose down
docker-compose up -d# Ver estado de los contenedores
docker-compose ps
# Ver logs de la aplicación
docker-compose logs -f astro-demo
# Ver logs de PostgreSQL
docker-compose logs -f postgres
# Reiniciar todo
docker-compose restart
# Detener todo
docker-compose down
# Detener y eliminar volúmenes (¡CUIDADO! Borra los datos)
docker-compose down -v
# Ver estadísticas de recursos
docker stats
# Backup de la base de datos
docker exec astro-postgres pg_dump -U astro_user astro_db > backup.sql
# Restaurar backup
docker exec -i astro-postgres psql -U astro_user astro_db < backup.sqlastro-demo/
├── .github/
│ └── workflows/
│ └── docker-build.yml # GitHub Actions
├── prisma/
│ └── schema.prisma # Esquema de la base de datos (Prisma)
├── src/
│ ├── lib/
│ │ └── prisma.js # Cliente de Prisma
│ ├── pages/
│ │ ├── api/
│ │ │ └── usuarios.js # Endpoint API
│ │ └── index.astro # Página principal
├── astro.config.mjs # Configuración de Astro
├── package.json # Dependencias
├── Dockerfile # Imagen Docker
├── docker-compose.yml # Despliegue producción
├── docker-compose.dev.yml # Desarrollo local
├── init.sql # Inicialización de BD
├── .env.example # Variables de entorno
├── PRISMA_GUIDE.md # Guía de uso de Prisma
└── README.md # Este archivo
Edita docker-compose.yml:
ports:
- "8080:3000" # Cambia 8080 por el puerto que prefierasEdita docker-compose.yml y actualiza:
environment:
POSTGRES_DB: mi_base_datos
POSTGRES_USER: mi_usuario
POSTGRES_PASSWORD: mi_password_seguraTambién actualiza las variables en el servicio astro-demo.
Edita init.sql y añade tus tablas:
CREATE TABLE productos (
id SERIAL PRIMARY KEY,
nombre VARCHAR(200) NOT NULL,
precio DECIMAL(10,2) NOT NULL
);Luego recrea la base de datos:
docker-compose down -v
docker-compose up -d- ✅ Usuario no-root en el contenedor de Astro
- ✅ Base de datos en red privada (no expuesta al exterior)
- ✅ Variables de entorno para credenciales
- ✅ Healthchecks para verificar estado de servicios
- ✅ Volúmenes persistentes para datos
IMPORTANTE: Cambia las credenciales por defecto:
# En docker-compose.yml, usa contraseñas fuertes:
POSTGRES_PASSWORD: $(openssl rand -base64 32)# Verificar que PostgreSQL está corriendo
docker-compose ps
# Ver logs de PostgreSQL
docker-compose logs postgres
# Verificar que el healthcheck está OK
docker inspect astro-postgres | grep -A 10 Health# Verificar que init.sql se ejecutó
docker-compose logs postgres | grep "inicializada"
# Si no se ejecutó, recrear el volumen
docker-compose down -v
docker-compose up -dLa base de datos no se inicializó correctamente:
docker-compose down -v
docker-compose up -dCambia el puerto en docker-compose.yml:
ports:
- "3001:3000" # Usa 3001 en lugar de 3000MIT