Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/camiloivcode/biblioteca-la-palabra/llms.txt

Use this file to discover all available pages before exploring further.

Biblioteca La Palabra incluye un archivo docker-compose.yml que orquesta los cuatro servicios necesarios para ejecutar la aplicación completa: base de datos MySQL 8, backend Express/Prisma, frontend Astro y una interfaz phpMyAdmin. Con un único comando se construyen las imágenes, se inicializa la base de datos, se aplica el esquema Prisma y se siembra con datos iniciales, dejando todo el stack operativo y listo para usar.

Requisitos previos

Antes de iniciar, asegúrate de tener instalado y disponible en tu sistema:
  • Docker Engine 20+Instalar Docker
  • Docker Compose v2 — incluido con Docker Desktop; en Linux instala el plugin docker-compose-plugin
  • Puertos libres en tu máquina host:
Puerto hostUso
3000Frontend Astro
4000Backend API (Express)
3307MySQL (expuesto externamente)
8080phpMyAdmin

Servicios

El stack está compuesto por cuatro contenedores definidos en docker-compose.yml:
ServicioImagen / DockerfilePuerto interno → externoPropósito
dbmysql:8.03306 → 3307Base de datos MySQL 8
backendbackend/Dockerfile (Node 20 Alpine)4000 → 4000API Express + Prisma ORM
frontendfrontend/Dockerfile (Node 20 Alpine)3000 → 3000Servidor de desarrollo Astro
phpmyadminphpmyadmin/phpmyadmin80 → 8080Interfaz de administración MySQL
Todos los contenedores se comunican entre sí a través de la red interna biblioteca_net (bridge), por lo que el backend se conecta a MySQL mediante el hostname db y el puerto 3306 —nunca por 3307, que es solo el mapeo hacia el host.

Inicio rápido

1

Copiar el archivo de configuración

Crea tu archivo .env local a partir de la plantilla incluida en el repositorio:
cp .env.example .env
Revisa los valores antes de continuar. Para un entorno local de desarrollo, los valores por defecto funcionan sin modificaciones.
2

Construir e iniciar todos los servicios

Ejecuta el siguiente comando desde la raíz del repositorio:
docker-compose up --build -d
El flag --build reconstruye las imágenes del backend y el frontend. El flag -d ejecuta los contenedores en segundo plano (modo detached).
3

Verificar que el backend está listo

El backend realiza varias tareas de inicialización antes de empezar a servir peticiones. Sigue sus logs para confirmar que el proceso terminó correctamente:
docker-compose logs -f backend
Espera hasta ver mensajes similares a los siguientes en orden:
MySQL is ready!
🚀 Servidor corriendo en puerto 4000
Esto indica que Prisma aplicó el esquema, el seed terminó y el servidor Express está activo.
4

Verificar el estado de todos los contenedores

Comprueba que los cuatro servicios están en ejecución (Up) con:
docker-compose ps
Deberías ver biblioteca_db, biblioteca_backend, biblioteca_frontend y biblioteca_phpmyadmin con estado Up.
Una vez completado el inicio rápido, los servicios están disponibles en:

Secuencia de inicio del backend

El servicio backend no ejecuta npm run dev directamente. En su lugar, Docker Compose le asigna el siguiente comando compuesto:
node wait-for-mysql.js && npx prisma db push --accept-data-loss && node prisma/seed.js && npm run dev
Cada paso cumple una función específica:
  1. node wait-for-mysql.js — Utiliza el cliente Prisma para intentar conectarse a MySQL cada 2 segundos, hasta un máximo de 30 intentos (60 segundos). Esto garantiza que el backend no proceda hasta que la base de datos acepte conexiones, incluso si el healthcheck del contenedor db ya se marcó como sano.
  2. npx prisma db push --accept-data-loss — Aplica el esquema definido en backend/prisma/schema.prisma directamente sobre la base de datos. Este proyecto usa db push en lugar de migraciones (el directorio migrations/ está en .gitignore).
  3. node prisma/seed.js — Pobla la base de datos con datos iniciales (usuarios administrador y bibliotecario, categorías, etc.). El seed es idempotente: utiliza operaciones upsert internamente, por lo que puede ejecutarse múltiples veces sin duplicar registros.
  4. npm run dev — Inicia el servidor Express con Nodemon para hot-reload.
El servicio db tiene configurado un healthcheck con mysqladmin ping que se ejecuta cada 10 segundos con hasta 10 reintentos. Gracias a depends_on: condition: service_healthy, Docker Compose no arranca el contenedor backend hasta que MySQL haya superado este check. El script wait-for-mysql.js añade una segunda capa de verificación a nivel de aplicación para mayor robustez.

Comandos útiles

ComandoDescripción
docker-compose up -dInicia todos los servicios en segundo plano (sin reconstruir imágenes)
docker-compose downDetiene y elimina los contenedores (los datos persisten en el volumen db_data)
docker-compose down -vDetiene los contenedores y elimina todos los volúmenes
docker-compose logs -f backendMuestra y sigue los logs del backend en tiempo real
docker-compose exec backend shAbre una shell interactiva dentro del contenedor del backend
El comando docker-compose down -v elimina el volumen db_data, lo que borra todos los datos de la base de datos de forma irreversible. Usa este comando solo si deseas reiniciar el entorno desde cero.

Contenido completo de docker-compose.yml

services:
  db:
    image: mysql:8.0
    container_name: biblioteca_db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - "3307:3306"
    volumes:
      - db_data:/var/lib/mysql
      - ./backend/prisma/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h localhost -u root -p${MYSQL_ROOT_PASSWORD}"]
      interval: 10s
      timeout: 5s
      retries: 10
    networks:
      - biblioteca_net

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    container_name: biblioteca_backend
    restart: unless-stopped
    env_file: .env
    environment:
      DATABASE_URL: ${DATABASE_URL}
    ports:
      - "4000:4000"
    depends_on:
      db:
        condition: service_healthy
    volumes:
      - ./backend:/app
      - /app/node_modules
    networks:
      - biblioteca_net
    command: sh -c "node wait-for-mysql.js && npx prisma db push --accept-data-loss && node prisma/seed.js && npm run dev"

  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
    container_name: biblioteca_frontend
    restart: unless-stopped
    environment:
      PUBLIC_API_URL: http://localhost:4000/api
    ports:
      - "3000:3000"
    depends_on:
      - backend
    volumes:
      - ./frontend:/app
      - /app/node_modules
    networks:
      - biblioteca_net

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: biblioteca_phpmyadmin
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    depends_on:
      - db
    networks:
      - biblioteca_net

volumes:
  db_data:
    driver: local

networks:
  biblioteca_net:
    driver: bridge

Build docs developers (and LLMs) love