Compare commits
10 Commits
2bfa1de120
...
e8da447b68
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e8da447b68 | ||
| 05d819687e | |||
|
|
6ff33f6ccb | ||
|
|
45c7f915b9 | ||
|
|
8c1f39aa64 | ||
|
|
7503b2beda | ||
|
|
7fff56f592 | ||
|
|
3c66914804 | ||
|
|
235ab40baa | ||
|
|
d3fabd72e8 |
@ -29,11 +29,15 @@ LOG_DEPRECATIONS_CHANNEL=null
|
|||||||
LOG_LEVEL=debug
|
LOG_LEVEL=debug
|
||||||
|
|
||||||
DB_CONNECTION=mysql
|
DB_CONNECTION=mysql
|
||||||
DB_HOST=127.0.0.1
|
DB_HOST=mysql
|
||||||
DB_PORT=3306
|
DB_PORT=3306
|
||||||
DB_DATABASE=holos-backend
|
DB_DATABASE=holos-backend
|
||||||
DB_USERNAME=notsoweb
|
DB_USERNAME=notsoweb
|
||||||
DB_PASSWORD=
|
DB_PASSWORD=
|
||||||
|
PMA_PORT=8081 # Puerto para phpMyAdmin
|
||||||
|
|
||||||
|
REDIS_PORT=6379 # Puerto para Redis
|
||||||
|
NGINX_PORT=8080 # Puerto para Nginx
|
||||||
|
|
||||||
SESSION_DRIVER=database
|
SESSION_DRIVER=database
|
||||||
SESSION_LIFETIME=120
|
SESSION_LIFETIME=120
|
||||||
|
|||||||
66
Docker/nginx/nginx.conf
Normal file
66
Docker/nginx/nginx.conf
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name _;
|
||||||
|
root /var/www/golscontrols/public;
|
||||||
|
index index.php index.html;
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
error_log /var/log/nginx/error.log;
|
||||||
|
access_log /var/log/nginx/access.log;
|
||||||
|
|
||||||
|
# Handle Laravel routes (Front Controller)
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.php?$query_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Handle PHP files
|
||||||
|
location ~ \.php$ {
|
||||||
|
try_files $uri =404;
|
||||||
|
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||||
|
fastcgi_pass golscontrols:9000;
|
||||||
|
fastcgi_index index.php;
|
||||||
|
|
||||||
|
# Timeouts importantes para evitar errores 500
|
||||||
|
fastcgi_read_timeout 300;
|
||||||
|
fastcgi_connect_timeout 300;
|
||||||
|
fastcgi_send_timeout 300;
|
||||||
|
|
||||||
|
# Carga los parámetros por defecto
|
||||||
|
include fastcgi_params;
|
||||||
|
|
||||||
|
# Parámetros críticos para Laravel
|
||||||
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
fastcgi_param PATH_INFO $fastcgi_path_info;
|
||||||
|
fastcgi_param REQUEST_URI $request_uri;
|
||||||
|
fastcgi_param QUERY_STRING $query_string;
|
||||||
|
fastcgi_param REQUEST_METHOD $request_method;
|
||||||
|
fastcgi_param CONTENT_TYPE $content_type;
|
||||||
|
fastcgi_param CONTENT_LENGTH $content_length;
|
||||||
|
fastcgi_param HTTP_HOST $http_host;
|
||||||
|
fastcgi_param HTTPS $https if_not_empty;
|
||||||
|
fastcgi_param HTTP_PROXY "";
|
||||||
|
}
|
||||||
|
|
||||||
|
client_max_body_size 20M;
|
||||||
|
|
||||||
|
# Handle storage files (Laravel storage link)
|
||||||
|
location /storage {
|
||||||
|
alias /var/www/golscontrols/storage/app;
|
||||||
|
try_files $uri =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /profile {
|
||||||
|
alias /var/www/golscontrols/storage/app/profile;
|
||||||
|
try_files $uri =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /images {
|
||||||
|
alias /var/www/golscontrols/storage/app/images;
|
||||||
|
try_files $uri =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Denegar acceso a archivos ocultos como .htaccess
|
||||||
|
location ~ /\.ht {
|
||||||
|
deny all;
|
||||||
|
}
|
||||||
|
}
|
||||||
87
docker-compose.yml
Normal file
87
docker-compose.yml
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
services:
|
||||||
|
repuve-backend:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: dockerfile.dev
|
||||||
|
working_dir: /var/www/repuve-v1
|
||||||
|
environment:
|
||||||
|
- DB_HOST=mysql
|
||||||
|
- DB_USERNAME=${DB_USERNAME}
|
||||||
|
- DB_PASSWORD=${DB_PASSWORD}
|
||||||
|
- DB_DATABASE=${DB_DATABASE}
|
||||||
|
- DB_PORT=${DB_PORT}
|
||||||
|
volumes:
|
||||||
|
- ./:/var/www/repuve-v1
|
||||||
|
- /var/www/repuve-v1/vendor
|
||||||
|
networks:
|
||||||
|
- repuve-network
|
||||||
|
depends_on:
|
||||||
|
mysql:
|
||||||
|
condition: service_healthy
|
||||||
|
redis:
|
||||||
|
condition: service_healthy
|
||||||
|
|
||||||
|
nginx:
|
||||||
|
image: nginx:alpine
|
||||||
|
ports:
|
||||||
|
- "${NGINX_PORT}:80"
|
||||||
|
volumes:
|
||||||
|
- ./public:/var/www/repuve-v1/public
|
||||||
|
- ./Docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
|
||||||
|
networks:
|
||||||
|
- repuve-network
|
||||||
|
depends_on:
|
||||||
|
- repuve-backend
|
||||||
|
|
||||||
|
mysql:
|
||||||
|
image: mysql:8.0
|
||||||
|
environment:
|
||||||
|
MYSQL_DATABASE: ${DB_DATABASE}
|
||||||
|
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
|
||||||
|
MYSQL_PASSWORD: ${DB_PASSWORD}
|
||||||
|
MYSQL_USER: ${DB_USERNAME}
|
||||||
|
ports:
|
||||||
|
- ${DB_PORT}:${DB_PORT}
|
||||||
|
volumes:
|
||||||
|
- mysql_data:/var/lib/mysql
|
||||||
|
networks:
|
||||||
|
- repuve-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
|
||||||
|
timeout: 15s
|
||||||
|
retries: 10
|
||||||
|
|
||||||
|
phpmyadmin:
|
||||||
|
image: phpmyadmin/phpmyadmin
|
||||||
|
environment:
|
||||||
|
PMA_HOST: mysql
|
||||||
|
PMA_PORT: 3306
|
||||||
|
ports:
|
||||||
|
- '${PMA_PORT}:80'
|
||||||
|
depends_on:
|
||||||
|
- mysql
|
||||||
|
networks:
|
||||||
|
- repuve-network
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:alpine
|
||||||
|
ports:
|
||||||
|
- "${REDIS_PORT}:6379"
|
||||||
|
volumes:
|
||||||
|
- redis_data:/data
|
||||||
|
networks:
|
||||||
|
- repuve-network
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "redis-cli", "ping"]
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
mysql_data:
|
||||||
|
driver: local
|
||||||
|
redis_data:
|
||||||
|
driver: local
|
||||||
|
|
||||||
|
networks:
|
||||||
|
repuve-network:
|
||||||
|
driver: bridge
|
||||||
40
dockerfile
Normal file
40
dockerfile
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
FROM php:8.3-fpm
|
||||||
|
|
||||||
|
RUN mkdir -p /var/www/repuve-v1
|
||||||
|
|
||||||
|
WORKDIR /var/www/repuve-v1
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y\
|
||||||
|
git \
|
||||||
|
curl \
|
||||||
|
libpng-dev \
|
||||||
|
libonig-dev \
|
||||||
|
libxml2-dev \
|
||||||
|
zip \
|
||||||
|
unzip \
|
||||||
|
libzip-dev\
|
||||||
|
nano \
|
||||||
|
openssl
|
||||||
|
|
||||||
|
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip
|
||||||
|
|
||||||
|
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
|
||||||
|
|
||||||
|
COPY composer.json composer.lock ./
|
||||||
|
|
||||||
|
RUN composer install --optimize-autoloader --no-interaction --no-scripts
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
COPY entrypoint-dev.sh /usr/local/bin/entrypoint-dev.sh
|
||||||
|
RUN chmod +x /usr/local/bin/entrypoint-dev.sh
|
||||||
|
|
||||||
|
RUN mkdir -p storage/app/keys storage/logs bootstrap/cache
|
||||||
|
|
||||||
|
RUN chown -R www-data:www-data /var/www/repuve-v1/storage /var/www/repuve-v1/bootstrap/cache
|
||||||
|
RUN chmod -R 775 /var/www/repuve-v1/storage /var/www/repuve-v1/bootstrap/cache
|
||||||
|
|
||||||
|
EXPOSE 9000
|
||||||
|
|
||||||
|
ENTRYPOINT ["/usr/local/bin/entrypoint-dev.sh"]
|
||||||
|
CMD ["php-fpm"]
|
||||||
115
entrypoint-dev.sh
Normal file
115
entrypoint-dev.sh
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
git config --global --add safe.directory /var/www/repuve-v1
|
||||||
|
|
||||||
|
echo "=== Iniciando entrypoint DESARROLLO ==="
|
||||||
|
|
||||||
|
# Variables desde Docker environment
|
||||||
|
DB_HOST=${DB_HOST:-mysql}
|
||||||
|
DB_USERNAME=${DB_USERNAME:-root}
|
||||||
|
DB_PASSWORD=${DB_PASSWORD:-}
|
||||||
|
DB_DATABASE=${DB_DATABASE:-laravel}
|
||||||
|
MAX_RETRIES=30
|
||||||
|
RETRY_COUNT=0
|
||||||
|
|
||||||
|
echo "Configuración de BD: Host=${DB_HOST}, Usuario=${DB_USERNAME}, Base=${DB_DATABASE}"
|
||||||
|
|
||||||
|
# Función para verificar conectividad con MySQL usando PHP
|
||||||
|
check_mysql() {
|
||||||
|
php -r "
|
||||||
|
try {
|
||||||
|
\$pdo = new PDO('mysql:host=${DB_HOST};port=3306', '${DB_USERNAME}', '${DB_PASSWORD}');
|
||||||
|
\$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
exit(0);
|
||||||
|
} catch (Exception \$e) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Esperar a que MySQL esté disponible
|
||||||
|
echo "Esperando conexión a MySQL..."
|
||||||
|
until check_mysql; do
|
||||||
|
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||||||
|
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
|
||||||
|
echo "ERROR: No se pudo conectar a MySQL después de $MAX_RETRIES intentos"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Intento $RETRY_COUNT/$MAX_RETRIES - Esperando a MySQL..."
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✓ MySQL está disponible"
|
||||||
|
|
||||||
|
# Comandos de inicialización para desarrollo
|
||||||
|
echo "Ejecutando comandos de inicialización de DESARROLLO..."
|
||||||
|
|
||||||
|
# Instalar dependencias (incluye dev)
|
||||||
|
echo "Instalando dependencias de desarrollo..."
|
||||||
|
composer install --optimize-autoloader --no-interaction
|
||||||
|
|
||||||
|
echo "Ejecutando package:discover..."
|
||||||
|
php artisan package:discover --ansi
|
||||||
|
|
||||||
|
echo "Creando enlaces simbólicos..."
|
||||||
|
php artisan storage:link --force || true
|
||||||
|
|
||||||
|
echo "Ejecutando configuración de desarrollo..."
|
||||||
|
composer run env:dev
|
||||||
|
|
||||||
|
echo "Creando directorio de claves Passport..."
|
||||||
|
mkdir -p storage/app/keys
|
||||||
|
|
||||||
|
echo "Generando claves de Passport..."
|
||||||
|
php artisan passport:keys --force || true
|
||||||
|
|
||||||
|
# Verificar que las claves se crearon
|
||||||
|
if [ ! -f "storage/app/keys/oauth-private.key" ] || [ ! -f "storage/app/keys/oauth-public.key" ]; then
|
||||||
|
echo "ERROR: Las claves de Passport no se generaron correctamente"
|
||||||
|
echo "Intentando generar manualmente..."
|
||||||
|
|
||||||
|
# Generar claves manualmente usando OpenSSL
|
||||||
|
openssl genrsa -out storage/app/keys/oauth-private.key 4096
|
||||||
|
openssl rsa -in storage/app/keys/oauth-private.key -pubout -out storage/app/keys/oauth-public.key
|
||||||
|
|
||||||
|
echo "✓ Claves generadas manualmente"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Establecer permisos correctos para las claves
|
||||||
|
chmod 600 storage/app/keys/oauth-private.key
|
||||||
|
chmod 644 storage/app/keys/oauth-public.key
|
||||||
|
chown www-data:www-data storage/app/keys/oauth-*.key
|
||||||
|
|
||||||
|
echo "✓ Claves de Passport verificadas"
|
||||||
|
|
||||||
|
# Para desarrollo, siempre verificar migraciones
|
||||||
|
echo "=== VERIFICANDO BASE DE DATOS DESARROLLO ==="
|
||||||
|
|
||||||
|
# Verificar si necesita migraciones
|
||||||
|
if php artisan migrate:status | grep -q "Pending"; then
|
||||||
|
echo "Ejecutando migraciones pendientes..."
|
||||||
|
php artisan migrate --force
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verificar si la base de datos tiene datos
|
||||||
|
USER_COUNT=$(php -r "
|
||||||
|
require 'vendor/autoload.php';
|
||||||
|
\$app = require 'bootstrap/app.php';
|
||||||
|
\$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
|
||||||
|
echo \App\Models\User::count();
|
||||||
|
")
|
||||||
|
|
||||||
|
if [ "$USER_COUNT" -eq "0" ]; then
|
||||||
|
echo "Base de datos vacía, ejecutando seeders de desarrollo..."
|
||||||
|
composer run db:dev
|
||||||
|
else
|
||||||
|
echo "✓ Base de datos ya tiene datos ($USER_COUNT usuarios)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✓ Configuración de desarrollo completada"
|
||||||
|
|
||||||
|
echo "=== Iniciando PHP-FPM DESARROLLO ==="
|
||||||
|
|
||||||
|
# Iniciar PHP-FPM
|
||||||
|
exec "$@"
|
||||||
105
entrypoint.sh
Normal file
105
entrypoint.sh
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=== Iniciando entrypoint ==="
|
||||||
|
|
||||||
|
# Variables desde Docker environment
|
||||||
|
DB_HOST=${DB_HOST:-mysql}
|
||||||
|
DB_USERNAME=${DB_USERNAME:-root}
|
||||||
|
DB_PASSWORD=${DB_PASSWORD:-}
|
||||||
|
DB_DATABASE=${DB_DATABASE:-laravel}
|
||||||
|
MAX_RETRIES=30
|
||||||
|
RETRY_COUNT=0
|
||||||
|
|
||||||
|
echo "Configuración de BD: Host=${DB_HOST}, Usuario=${DB_USERNAME}, Base=${DB_DATABASE}"
|
||||||
|
|
||||||
|
# Función para verificar conectividad con MySQL usando PHP
|
||||||
|
check_mysql() {
|
||||||
|
php -r "
|
||||||
|
try {
|
||||||
|
\$pdo = new PDO('mysql:host=${DB_HOST};port=3306', '${DB_USERNAME}', '${DB_PASSWORD}');
|
||||||
|
\$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
exit(0);
|
||||||
|
} catch (Exception \$e) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Esperar a que MySQL esté disponible
|
||||||
|
echo "Esperando conexión a MySQL..."
|
||||||
|
until check_mysql; do
|
||||||
|
RETRY_COUNT=$((RETRY_COUNT + 1))
|
||||||
|
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
|
||||||
|
echo "ERROR: No se pudo conectar a MySQL después de $MAX_RETRIES intentos"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Intento $RETRY_COUNT/$MAX_RETRIES - Esperando a MySQL..."
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✓ MySQL está disponible"
|
||||||
|
|
||||||
|
# Comandos de inicialización
|
||||||
|
echo "Ejecutando comandos de inicialización..."
|
||||||
|
|
||||||
|
echo "Ejecutando package:discover..."
|
||||||
|
php artisan package:discover --ansi
|
||||||
|
|
||||||
|
echo "Creando enlaces simbólicos..."
|
||||||
|
php artisan storage:link --force || true
|
||||||
|
|
||||||
|
echo "Ejecutando configuración de producción..."
|
||||||
|
composer run env:prod
|
||||||
|
|
||||||
|
echo "Creando directorio de claves Passport..."
|
||||||
|
mkdir -p storage/app/keys
|
||||||
|
|
||||||
|
echo "Generando claves de Passport..."
|
||||||
|
php artisan passport:keys --force || true
|
||||||
|
|
||||||
|
# Verificar que las claves se crearon
|
||||||
|
if [ ! -f "storage/app/keys/oauth-private.key" ] || [ ! -f "storage/app/keys/oauth-public.key" ]; then
|
||||||
|
echo "ERROR: Las claves de Passport no se generaron correctamente"
|
||||||
|
echo "Intentando generar manualmente..."
|
||||||
|
|
||||||
|
# Generar claves manualmente usando OpenSSL
|
||||||
|
openssl genrsa -out storage/app/keys/oauth-private.key 4096
|
||||||
|
openssl rsa -in storage/app/keys/oauth-private.key -pubout -out storage/app/keys/oauth-public.key
|
||||||
|
|
||||||
|
echo "✓ Claves generadas manualmente"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Establecer permisos correctos para las claves
|
||||||
|
chmod 600 storage/app/keys/oauth-private.key
|
||||||
|
chmod 644 storage/app/keys/oauth-public.key
|
||||||
|
chown www-data:www-data storage/app/keys/oauth-*.key
|
||||||
|
|
||||||
|
echo "✓ Claves de Passport verificadas"
|
||||||
|
|
||||||
|
# Archivo de control para primera ejecución
|
||||||
|
FIRST_RUN_FLAG="/var/www/holos.backend/.first_run_completed"
|
||||||
|
|
||||||
|
# Solo en la primera ejecución
|
||||||
|
if [ ! -f "$FIRST_RUN_FLAG" ]; then
|
||||||
|
echo "=== PRIMERA EJECUCIÓN DETECTADA ==="
|
||||||
|
|
||||||
|
echo "Ejecutando migraciones y seeders..."
|
||||||
|
if composer run db:prod; then
|
||||||
|
echo "✓ db:prod completado"
|
||||||
|
else
|
||||||
|
echo "ERROR: Falló db:prod"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Marcar como completado
|
||||||
|
touch "$FIRST_RUN_FLAG"
|
||||||
|
echo "✓ Primera ejecución completada exitosamente"
|
||||||
|
else
|
||||||
|
echo "✓ No es primera ejecución, omitiendo setup inicial"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Iniciando PHP-FPM ==="
|
||||||
|
|
||||||
|
# Iniciar PHP-FPM
|
||||||
|
exec "$@"
|
||||||
5
limpiar_docker.sh
Executable file
5
limpiar_docker.sh
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
echo "eliminando imagenes no utilizadas..."
|
||||||
|
|
||||||
|
docker image prune -a -f
|
||||||
|
|
||||||
|
echo "¡Limpio!"
|
||||||
Loading…
x
Reference in New Issue
Block a user