Configuración Laravel
Configuración inicial del proyecto Laravel.
1. Preparar Proyecto
Section titled “1. Preparar Proyecto”cd /rootgit clone git@github.com:tu-usuario/proyecto-laravel.gitcd proyecto-laravel2. Configurar Dockerfile
Section titled “2. Configurar Dockerfile”# Crear Dockerfile en la raíz del proyectovim DockerfileContenido del Dockerfile:
FROM php:8.3-fpm-alpine
# DependenciasRUN apk add --no-cache nginx supervisor mysql-client git curl \ libpng-dev oniguruma-dev libxml2-dev zip unzip
# Extensiones PHPRUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/htmlCOPY . .RUN composer install --no-dev --optimize-autoloaderRUN chown -R www-data:www-data storage bootstrap/cache
# ConfiguracionesCOPY docker/nginx/default.conf /etc/nginx/http.d/default.confCOPY docker/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 80CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]3. Nginx Config
Section titled “3. Nginx Config”Crear carpeta y archivo dentro del proyecto Laravel:
# Desde la raíz del proyecto Laravel (/root/proyecto-laravel)mkdir -p docker/nginxvim docker/nginx/default.confContenido de docker/nginx/default.conf:
server { listen 80; root /var/www/html/public; index index.php;
location / { try_files $uri $uri/ /index.php?$query_string; }
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
location ~ /\.ht { deny all; }}4. Supervisor
Section titled “4. Supervisor”Crear archivo dentro del proyecto Laravel:
# Desde la raíz del proyecto Laravel (/root/proyecto-laravel)mkdir -p docker/supervisorvim docker/supervisor/supervisord.confContenido de docker/supervisor/supervisord.conf:
[supervisord]nodaemon=true
[program:php-fpm]command=/usr/local/sbin/php-fpm --nodaemonize
[program:nginx]command=/usr/sbin/nginx -g 'daemon off;'
# Descomentar si usas colas de Laravel# [program:laravel-worker]# process_name=%(program_name)s_%(process_num)02d# command=php /var/www/html/artisan queue:work --sleep=3 --tries=3# numprocs=2# user=www-data# autostart=true# autorestart=true5. .dockerignore
Section titled “5. .dockerignore”Crear en la raíz del proyecto Laravel:
vim .dockerignoreContenido:
.gitnode_modulesvendorstorage/logs/*storage/framework/cache/*Nota: No incluir .env para que se copie al contenedor.
6. Variables de Entorno
Section titled “6. Variables de Entorno”El proyecto Laravel ya tiene un archivo .env. No lo elimines. Copia tu .env de local al VPS o edítalo directamente:
vim .envVariables que DEBES modificar para Docker:
APP_ENV=productionAPP_DEBUG=falseAPP_URL=https://tudominio.comASSET_URL=https://tudominio.com
DB_CONNECTION=mysqlDB_HOST=laravel-dbDB_PORT=3306DB_DATABASE=laravelDB_USERNAME=laravel_userDB_PASSWORD=tu_password_seguroImportante:
- Mantén TODAS las demás variables de tu
.envlocal (sesiones, caché, mail, etc.) APP_URLyASSET_URLdeben usar HTTPS y tu dominio real para evitar errores de Mixed ContentDB_HOSTdebe serlaravel-db(nombre del contenedor MySQL)DB_PASSWORDdebe coincidir exactamente conMYSQL_PASSWORDendocker-compose.yml- Si no tienes
APP_KEY, cópiala de local o genera una después del despliegue:Terminal window docker exec -it laravel-app php artisan key:generate
7. Forzar HTTPS en Producción
Section titled “7. Forzar HTTPS en Producción”Edita app/Providers/AppServiceProvider.php:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;use Illuminate\Support\Facades\URL;
class AppServiceProvider extends ServiceProvider{ public function boot(): void { if ($this->app->environment('production')) { URL::forceScheme('https'); } }}Y configura bootstrap/app.php para confiar en Traefik:
return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { $middleware->trustProxies(at: '*'); }) ->withExceptions(function (Exceptions $exceptions) { // })->create();