✅ Aplicable a Laravel 8, 9, 10, 11 con Composer y assets compilados localmente con Vite o Mix.
- ✅ PHP 8.1 o superior (con extensiones requeridas por Laravel)
- ✅ Composer instalado (
composer --version) - ✅ Servidor web (Apache o Nginx)
- ✅ Acceso SSH
- ✅ Base de datos (MySQL o PostgreSQL)
- ✅ Acceso a la carpeta
public/como document root - ✅ (Opcional) Dominio apuntando al VPS
- Instala dependencias:
composer install --optimize-autoloader --no-dev
npm install (si compilo los assets en local y los subo, no hace falta que haga esto en el servidor)
npm run build (idem anterior pero es que es un jaleo si lo hago con gitftp)- Verifica que se generen correctamente:
public/build/(opublic/css/,public/js/si usas Mix)public/mix-manifest.jsonovite.config.js
- Elimina carpetas innecesarias antes de subir (opcional):
rm -rf node_modules
rm -rf tests
rm -rf .gitUsa scp, rsync, sftp, git ftp o despliegue desde Git.
Ejemplo con scp:
scp -r /ruta/a/tu/proyecto usuario@tu-servidor.com:/var/www/html/mi-appssh usuario@tu-servidor.com
cd /var/www/html/mi-appcomposer config --global optimize-autoloader trueY asegúrate de usar siempre:
composer install --no-dev --prefer-dist --optimize-autoloaderNOTA: en el caso de mi servidor como estoy utilizando Laravel 12 necesito la versión 8.2 por ello debo hacer lo siguiente
/usr/local/php82/bin/php /usr/local/bin/composer install --no-dev --prefer-dist --optimize-autoloaderSi no existe:
cp .env.example .envEdita el archivo .env y configura:
APP_NAME="Mi App Laravel"
APP_ENV=production
APP_KEY= # ← Se generará después
APP_DEBUG=false
APP_URL=https://tudominio.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mi_base
DB_USERNAME=usuario
DB_PASSWORD=clave
LOG_CHANNEL=stackphp artisan key:generateNOTA: en MI VPS
/usr/local/php82/bin/php artisan key:generatephp artisan migrate --force📌 Hace lo siguiente:
-
Ejecuta las migraciones pendientes (archivos en database/migrations/) Aplica los cambios en la base de datos: crear tablas, añadir campos, índices, etc.
-
La opción --force salta la protección en producción Laravel no permite por defecto correr migraciones en entorno production sin --force, para evitar desastres accidentales.
🔒 Si ejecutas solo php artisan migrate en producción, te saldrá:
In ConfirmableTrait.php line 79:
Application In Production!✅ ¿Cuándo usar --force? Cuando quieres desplegar cambios a producción y has revisado bien las migraciones. Al automatizar despliegues con CI/CD (GitHub Actions, GitLab, Deployer, etc.).
php artisan optimize:clearOpcional pero recomendable:
php artisan optimizeDesde tu máquina local (donde hiciste npm run build), sube:
public/build/(opublic/css,public/js)public/mix-manifest.jsonresources/fontssi usas fuentes personalizadas
chown -R www-data:www-data /var/www/html/mi-app
chmod -R 755 /var/www/html/mi-app
chmod -R 775 storage bootstrap/cache<VirtualHost *:80>
ServerName tudominio.com
DocumentRoot /var/www/html/mi-app/public
<Directory /var/www/html/mi-app>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/mi-app-error.log
CustomLog ${APACHE_LOG_DIR}/mi-app-access.log combined
</VirtualHost>Habilitar mod_rewrite:
a2enmod rewrite
systemctl restart apache2server {
listen 80;
server_name tudominio.com;
root /var/www/html/mi-app/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}apt install certbot python3-certbot-apache
certbot --apache -d tudominio.com- Abre
https://tudominio.com - Confirma que carga tu app Laravel
- Verifica rutas, base de datos, login, etc.
APP_DEBUG=false- Usa
.env.productionfuera del repo - Permisos seguros:
644archivos,755carpetas - Firewall (
ufw,fail2ban) - Deshabilita acceso público a
.env,.git,storage/logs, etc.