Skip to content

Instantly share code, notes, and snippets.

@yanker
Last active July 14, 2025 08:03
Show Gist options
  • Select an option

  • Save yanker/652af7ccf6bd172dfca5933fb1242912 to your computer and use it in GitHub Desktop.

Select an option

Save yanker/652af7ccf6bd172dfca5933fb1242912 to your computer and use it in GitHub Desktop.
Deploy Laravel

🚀 Guía Completa para Desplegar Laravel en un VPS (Producción)

✅ Aplicable a Laravel 8, 9, 10, 11 con Composer y assets compilados localmente con Vite o Mix.


📋 1. Requisitos del servidor VPS

  • ✅ 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

🖥️ 2. Preparar el proyecto por SSH

  1. 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)
  1. Verifica que se generen correctamente:
  • public/build/ (o public/css/, public/js/ si usas Mix)
  • public/mix-manifest.json o vite.config.js
  1. Elimina carpetas innecesarias antes de subir (opcional):
rm -rf node_modules
rm -rf tests
rm -rf .git

☁️ 3. Subir el proyecto al VPS

Usa 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-app

🔐 4. Conectarte por SSH y entrar al proyecto

ssh usuario@tu-servidor.com
cd /var/www/html/mi-app

⚙️ 5. Instalar dependencias de Composer en producción

⚠️ Consejo adicional Para prevenir que Composer instale dependencias de desarrollo por accidente en el futuro, en tu servidor de producción agrega este flag por defecto:

composer config --global optimize-autoloader true

Y asegúrate de usar siempre:

composer install --no-dev --prefer-dist --optimize-autoloader

NOTA: 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-autoloader

🧪 6. Configurar archivo .env

Si no existe:

cp .env.example .env

Edita 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=stack

🔑 7. Generar clave de aplicación

php artisan key:generate

NOTA: en MI VPS

/usr/local/php82/bin/php artisan key:generate

🗄️ 8. Ejecutar migraciones (base de datos)

php artisan migrate --force

📌 Hace lo siguiente:

  1. Ejecuta las migraciones pendientes (archivos en database/migrations/) Aplica los cambios en la base de datos: crear tablas, añadir campos, índices, etc.

  2. 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.).

⚠️ Precaución Nunca corras migrate --force a ciegas. Asegúrate de que: Estás en la base de datos correcta. Las migraciones no eliminan datos críticos. Hay backups si es un entorno sensible.


🧹 9. Limpiar y optimizar el framework

php artisan optimize:clear

Opcional pero recomendable:

php artisan optimize

🧱 10. Subir los assets compilados

Desde tu máquina local (donde hiciste npm run build), sube:

  • public/build/ (o public/css, public/js)
  • public/mix-manifest.json
  • resources/fonts si usas fuentes personalizadas

🔐 11. Asignar permisos adecuados

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

🌐 12. Configurar Apache o Nginx

Apache (ejemplo):

<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 apache2

Nginx (ejemplo):

server {
    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;
    }
}

🔐 13. (Opcional) HTTPS con Let's Encrypt

apt install certbot python3-certbot-apache
certbot --apache -d tudominio.com

✅ 14. Verificación final

  • Abre https://tudominio.com
  • Confirma que carga tu app Laravel
  • Verifica rutas, base de datos, login, etc.

🛡️ 15. Seguridad adicional

  • APP_DEBUG=false
  • Usa .env.production fuera del repo
  • Permisos seguros: 644 archivos, 755 carpetas
  • Firewall (ufw, fail2ban)
  • Deshabilita acceso público a .env, .git, storage/logs, etc.

✅ ¡Tu aplicación Laravel ya está en producción! 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment