Skip to content

Configuración Laravel

Configuración inicial del proyecto Laravel.

Terminal window
cd /root
git clone git@github.com:tu-usuario/proyecto-laravel.git
cd proyecto-laravel
Terminal window
# Crear Dockerfile en la raíz del proyecto
vim Dockerfile

Contenido del Dockerfile:

FROM php:8.3-fpm-alpine
# Dependencias
RUN apk add --no-cache nginx supervisor mysql-client git curl \
libpng-dev oniguruma-dev libxml2-dev zip unzip
# Extensiones PHP
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
COPY . .
RUN composer install --no-dev --optimize-autoloader
RUN chown -R www-data:www-data storage bootstrap/cache
# Configuraciones
COPY docker/nginx/default.conf /etc/nginx/http.d/default.conf
COPY docker/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 80
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

Crear carpeta y archivo dentro del proyecto Laravel:

Terminal window
# Desde la raíz del proyecto Laravel (/root/proyecto-laravel)
mkdir -p docker/nginx
vim docker/nginx/default.conf

Contenido 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;
}
}

Crear archivo dentro del proyecto Laravel:

Terminal window
# Desde la raíz del proyecto Laravel (/root/proyecto-laravel)
mkdir -p docker/supervisor
vim docker/supervisor/supervisord.conf

Contenido 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=true

Crear en la raíz del proyecto Laravel:

Terminal window
vim .dockerignore

Contenido:

.git
node_modules
vendor
storage/logs/*
storage/framework/cache/*

Nota: No incluir .env para que se copie al contenedor.

El proyecto Laravel ya tiene un archivo .env. No lo elimines. Copia tu .env de local al VPS o edítalo directamente:

Terminal window
vim .env

Variables que DEBES modificar para Docker:

APP_ENV=production
APP_DEBUG=false
APP_URL=https://tudominio.com
ASSET_URL=https://tudominio.com
DB_CONNECTION=mysql
DB_HOST=laravel-db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel_user
DB_PASSWORD=tu_password_seguro

Importante:

  • Mantén TODAS las demás variables de tu .env local (sesiones, caché, mail, etc.)
  • APP_URL y ASSET_URL deben usar HTTPS y tu dominio real para evitar errores de Mixed Content
  • DB_HOST debe ser laravel-db (nombre del contenedor MySQL)
  • DB_PASSWORD debe coincidir exactamente con MYSQL_PASSWORD en docker-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

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();