diff --git a/Dockerfile b/Dockerfile index d5c490d..59cf31c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # Stage 1: Build frontend FROM node:20-alpine AS builder -WORKDIR /app +WORKDIR /build COPY package*.json ./ RUN npm ci @@ -14,24 +14,20 @@ FROM node:20-alpine WORKDIR /app -# Install MariaDB and nginx -RUN apk add --no-cache mariadb mariadb-client mariadb-server-utils nginx +# Install dependencies +RUN apk add --no-cache mariadb mariadb-client mariadb-server-utils nginx bash -# Initialize MariaDB data directory -RUN mkdir -p /run/mysqld /var/lib/mysql && \ - chown -R mysql:mysql /run/mysqld /var/lib/mysql +# Initialize directories +RUN mkdir -p /run/mysqld /var/lib/mysql && chown -R mysql:mysql /run/mysqld /var/lib/mysql -# Copy MariaDB config -RUN sed -i 's/\[mysqld\]/[mysqld]\ncharacter-set-server=utf8mb4\ncollation-server=utf8mb4_unicode_ci/' /etc/my.cnf.d/mariadb.cnf || true - -# Copy built frontend -COPY --from=builder /app/dist /usr/share/nginx/html +# Copy built frontend to nginx +COPY --from=builder /build/dist /usr/share/nginx/html # Copy server files -COPY server/package*.json server/ -RUN cd server && npm ci +COPY server/package*.json ./server/ +RUN cd ./server && npm ci -COPY server/ server/ +COPY server/ ./server/ # Copy nginx config COPY nginx.conf /etc/nginx/http.d/default.conf @@ -39,7 +35,7 @@ COPY nginx.conf /etc/nginx/http.d/default.conf # Create directories RUN mkdir -p /run/nginx /run/mysqld /var/lib/mysql -# Copy entrypoint script +# Copy entrypoint COPY docker-entrypoint.sh /docker-entrypoint.sh RUN chmod +x /docker-entrypoint.sh diff --git a/docker-compose.yml b/docker-compose.yml index 4744542..2437a8d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,7 +16,9 @@ services: - ADMIN_PASSWORD=Admin123! volumes: - mariadb-data:/var/lib/mysql + - nginx-data:/usr/share/nginx/html restart: unless-stopped volumes: - mariadb-data: \ No newline at end of file + mariadb-data: + nginx-data: \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 67be71b..04ea3c8 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,61 +1,33 @@ -#!/bin/bash +#!/usr/bin/env bash set -e echo "=== Starting MariaDB ===" mysqld --user=mysql & -MYSQL_PID=$! -echo "Waiting for MariaDB to be ready..." -for i in {1..60}; do - if mysqladmin ping -h localhost --silent 2>/dev/null; then - echo "MariaDB is ready!" - break - fi - sleep 1 +echo "Waiting for MariaDB..." +for i in $(seq 1 60); do + mysqladmin ping -h localhost --silent 2>/dev/null && break || sleep 1 done DB_NAME="${DB_NAME:-hospital}" -echo "Creating database if not exists..." mysql -h localhost -u root -e "CREATE DATABASE IF NOT EXISTS \`$DB_NAME\`;" -if [ -n "$DB_PASSWORD" ] && [ "$DB_PASSWORD" != "" ]; then - echo "Creating user and setting permissions..." +if [ -n "$DB_PASSWORD" ]; then DB_USER="${DB_USER:-hospital}" - USER_EXISTS=$(mysql -h localhost -u root -N -e "SELECT COUNT(*) FROM mysql.user WHERE User='$DB_USER' AND Host='%';") - - if [ "$USER_EXISTS" = "0" ]; then - mysql -h localhost -u root -e "CREATE USER '$DB_USER'@'%' IDENTIFIED BY '$DB_PASSWORD';" - mysql -h localhost -u root -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'%';" - mysql -h localhost -u root -e "FLUSH PRIVILEGES;" - else - mysql -h localhost -u root -e "ALTER USER '$DB_USER'@'%' IDENTIFIED BY '$DB_PASSWORD';" - mysql -h localhost -u root -e "GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'%';" - mysql -h localhost -u root -e "FLUSH PRIVILEGES;" - fi + mysql -h localhost -u root -e "CREATE USER IF NOT EXISTS '$DB_USER'@'%' IDENTIFIED BY '$DB_PASSWORD'; GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'%'; FLUSH PRIVILEGES;" fi ADMIN_DNI="${ADMIN_DNI:-00000000}" ADMIN_PASSWORD="${ADMIN_PASSWORD:-Admin123!}" -echo "Checking for admin user..." -TABLE_EXISTS=$(mysql -h localhost -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" -N -e "SHOW TABLES LIKE 'usuarios';" 2>/dev/null || echo "") - +TABLE_EXISTS=$(mysql -h localhost -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" -N -e "SHOW TABLES LIKE 'usuarios';" 2>/dev/null || true) if [ -n "$TABLE_EXISTS" ]; then USER_COUNT=$(mysql -h localhost -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" -N -e "SELECT COUNT(*) FROM usuarios WHERE dni='$ADMIN_DNI';" 2>/dev/null || echo "0") - if [ "$USER_COUNT" = "0" ]; then - echo "Creating initial admin user..." - ADMIN_ID=$(cat /proc/sys/kernel/random/uuid) + ADMIN_ID=$(uuidgen) TODAY=$(date +%Y-%m-%d) - - # Hash password using bcryptjs via node - HASH=$(node -e "const bcrypt = require('bcryptjs'); console.log(bcrypt.hashSync('$ADMIN_PASSWORD', 10));") - - mysql -h localhost -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" -e " - INSERT INTO usuarios (id, apellido, nombre, dni, fechaNacimiento, email, rol, passwordHash, fechaCreacion) - VALUES ('$ADMIN_ID', 'Administrador', 'Sistema', '$ADMIN_DNI', '$TODAY', 'admin@hospital.local', 'admin', '$HASH', '$TODAY'); - " - + HASH=$(node -e "const bcrypt=require('bcryptjs'); console.log(bcrypt.hashSync('$ADMIN_PASSWORD',10));") + mysql -h localhost -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" -e "INSERT INTO usuarios (id,apellido,nombre,dni,fechaNacimiento,email,rol,passwordHash,fechaCreacion) VALUES ('$ADMIN_ID','Administrador','Sistema','$ADMIN_DNI','$TODAY','admin@hospital.local','admin','$HASH','$TODAY');" echo "==========================================" echo "ADMIN CREDENTIALS:" echo "DNI: $ADMIN_DNI" @@ -64,10 +36,8 @@ if [ -n "$TABLE_EXISTS" ]; then fi fi -echo "=== Initialisation complete ===" - -# Start nginx in background +echo "Starting nginx..." nginx & -# Run the backend +echo "Starting API server..." exec node server/api-mariadb.js \ No newline at end of file