Skip to content

danielgv93/test

Repository files navigation

Astro Demo - Despliegue con Docker, PostgreSQL, Prisma y GHCR

Proyecto de ejemplo de Astro con PostgreSQL y Prisma ORM configurado para desplegarse automáticamente en GitHub Container Registry (GHCR) y ejecutarse en Docker.

🚀 Características

  • 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

📋 Requisitos previos

  • Cuenta de GitHub
  • Docker instalado en tu NAS/servidor
  • Git instalado localmente

🛠️ Pasos para desplegar

1. Crear el repositorio en GitHub

# 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

2. Configurar permisos en GitHub

  1. Ve a tu repositorio en GitHub
  2. Ve a SettingsActionsGeneral
  3. En "Workflow permissions", selecciona "Read and write permissions"
  4. Guarda los cambios

3. Hacer la imagen pública (opcional pero recomendado)

Después de que GitHub Actions construya la imagen:

  1. Ve a tu perfil de GitHub → Packages
  2. Encuentra el paquete astro-demo
  3. Ve a Package settings
  4. En "Danger Zone" → Change visibilityPublic

4. Desplegar en tu NAS

# 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

Si la imagen es privada

# 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 -d

5. Acceder a la aplicación

Abre 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 PostgreSQL

Características de seguridad

  • 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

Datos de ejemplo

La base de datos se inicializa automáticamente con:

  • Tabla usuarios con 5 registros de ejemplo
  • Índices optimizados
  • Triggers para actualización automática de timestamps

Prisma ORM

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

Acceder a la base de datos (solo para desarrollo)

# 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
\q

💻 Desarrollo local

1. Clonar el repositorio

git clone https://github.com/TU_USUARIO/astro-demo.git
cd astro-demo

2. Instalar dependencias

npm install

3. Iniciar PostgreSQL en desarrollo

# Iniciar solo la base de datos
docker-compose -f docker-compose.dev.yml up -d

# Copiar archivo de entorno
cp .env.example .env

4. Iniciar el servidor de desarrollo

npm run dev

Visita: http://localhost:3000

🔄 Actualizar la aplicación

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

🐳 Comandos útiles de Docker

# 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.sql

📁 Estructura del proyecto

astro-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

🎯 Personalización

Cambiar el puerto

Edita docker-compose.yml:

ports:
  - "8080:3000"  # Cambia 8080 por el puerto que prefieras

Cambiar credenciales de la base de datos

Edita docker-compose.yml y actualiza:

environment:
  POSTGRES_DB: mi_base_datos
  POSTGRES_USER: mi_usuario
  POSTGRES_PASSWORD: mi_password_segura

También actualiza las variables en el servicio astro-demo.

Añadir más tablas

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

🔒 Seguridad

Mejores prácticas implementadas

  • ✅ 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

Para producción

IMPORTANTE: Cambia las credenciales por defecto:

# En docker-compose.yml, usa contraseñas fuertes:
POSTGRES_PASSWORD: $(openssl rand -base64 32)

❓ Solución de problemas

La aplicación no se conecta a la base de datos

# 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

La base de datos está vacía

# 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 -d

Error "relation usuarios does not exist"

La base de datos no se inicializó correctamente:

docker-compose down -v
docker-compose up -d

Puerto 3000 ya en uso

Cambia el puerto en docker-compose.yml:

ports:
  - "3001:3000"  # Usa 3001 en lugar de 3000

📚 Recursos

📄 Licencia

MIT

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors