Ponlo a correr
De una copia recién clonada a la aplicación abierta en tu navegador, con sesión de admin.
Esta guía te lleva de un clon del repositorio a la aplicación corriendo en tu máquina y a ti con sesión iniciada como administrador. La necesitas una vez por máquina.
Qué necesitas instalado
| Requisito | Versión | Para qué |
|---|---|---|
| PHP | 8.2 o más reciente | composer.json exige ^8.2 |
| Composer | 2 | instala las dependencias de PHP |
| Node.js y npm | Node 20.19 o más reciente, o 22.12 o más reciente | los assets se compilan con Vite 7 |
| Una base de datos | MySQL 8, MariaDB, PostgreSQL o SQLite | config/database.php también trae una conexión a SQL Server |
Redis y Memcached son opcionales. Los drivers por omisión de cola, caché y sesión son todos database, así que nada más tiene que estar corriendo.
Los siete pasos
Córrelos desde la raíz del clon, en este orden.
1. Copia el archivo de entorno.
cp .env.example .env
2. Instala las dependencias de PHP.
composer install
Además de instalar paquetes, esto apunta core.hooksPath a scripts/git-hooks, así que desde ahora corre un hook pre-push. Detiene un push cuando a una guía de ayuda le falta su traducción; git push --no-verify lo salta una vez.
3. Genera la llave de la aplicación.
php artisan key:generate
4. Apunta .env a tu base de datos. El bloque depende del motor; ve la siguiente sección. Crea la base de datos antes: la migración no la crea.
5. Corre las migraciones y los seeders.
php artisan migrate --seed
6. Instala las dependencias del frontend y compila los assets.
npm ci && npm run build
7. Enlaza la carpeta pública de archivos.
php artisan storage:link
El bloque de base de datos de .env
.env.example viene con MySQL. Reemplaza el bloque por el de tu motor.
MySQL o MariaDB:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tu_proyecto
DB_USERNAME=root
DB_PASSWORD=
Para MariaDB pon DB_CONNECTION=mariadb; las demás variables son las mismas.
PostgreSQL:
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=tu_proyecto
DB_USERNAME=postgres
DB_PASSWORD=
SQLite no necesita servidor. Crea el archivo y nómbralo:
touch database/database.sqlite
DB_CONNECTION=sqlite
DB_DATABASE=/ruta/absoluta/a/tu-proyecto/database/database.sqlite
Si quitas DB_DATABASE por completo, la conexión sqlite cae a database/database.sqlite dentro del proyecto. Dejar el valor laravel de MySQL haría que SQLite buscara un archivo llamado laravel, así que quítalo o reemplázalo.
Todos los motores aceptan también DB_URL como una sola cadena de conexión en lugar de host, puerto, base de datos, usuario y contraseña por separado. El resto de las variables de base de datos está en El archivo de entorno.
Dos variables que arreglar antes de que cargue la primera página
.env.example está escrito para un servidor que tiene Amazon S3 y un mailer transaccional. En una laptop, dos de sus valores van a romper la primera petición o el primer correo.
| Variable | Valor que trae | Ponle |
|---|---|---|
FILESYSTEM_DISK |
s3, con llaves de AWS de relleno |
public hasta que tengas un bucket |
MAIL_MAILER |
failover, que intenta Mailgun y luego Amazon SES |
log para escribir los correos al log, o smtp con un capturador local |
Pon también APP_URL en la dirección que de verdad vas a abrir. El valor de ejemplo es http://weblabor-base.test, que sólo resuelve si Herd o Valet sirven la carpeta con ese nombre.
Qué crea el seed
php artisan migrate --seed corre DatabaseSeeder, que llama cinco seeders en este orden:
PermissionSeederlee cada recurso del panel y crea un permisocreate,retrieve,updateydeletepor cada uno, más lo que agregues apermissionsenconfig/app.php. Los permisos que ya no existen se borran cuandoallow_permisisons_deletionestrue, que es su valor por omisión.RoleSeedercrea el rol nombrado enadmin_role(admin) y le da todos los permisos, crea un rol llamadoclientsin ninguno, y crea eldefault_rolesi nombras uno.AdminSeedercrea un administrador por cada correo ensudoy le asigna el rol de admin.UserSeedercrea un usuario normal por cada correo endefault_users, sin rol.AddOnSeedercrea los complementos listados en el archivo. La lista viene vacía y el seeder termina antes de empezar cuando el paquete de cobros no está instalado.
Los dos seeders de usuarios usan firstOrCreate, así que volver a correr el seed nunca reinicia una contraseña.
Tu primer inicio de sesión
Las cuentas salen de dos arreglos en config/app.php:
'sudo' => [
'[email protected]',
],
'default_users' => [
'[email protected]',
],
Pon tu propio correo en sudo antes de sembrar. Si ya sembraste, agrégalo y corre php artisan db:seed --class=AdminSeeder; el seeder sólo crea lo que falta.
Por cada correo, los dos seeders hacen exactamente esto:
- El nombre es la parte antes de la
@convertida en palabras:CarlosEscobarse vuelveCarlos Escobar,adminse vuelveAdmin. - El correo se pasa a minúsculas antes de guardarlo, así que inicias sesión con la forma en minúsculas aunque
config/app.phptenga mayúsculas. - La contraseña es la parte antes de la
@, en minúsculas y al revés.[email protected]recibenimda;[email protected]recibetset;[email protected]reciberabocsesolrac. - El correo se marca como verificado, así que la cuenta se salta la verificación.
AdminSeeder hace una cosa más: si la contraseña guardada sigue siendo la generada, registra una solicitud de cambio de contraseña. La primera vez que ese administrador inicia sesión, el middleware security lo manda a /password/request a elegir una contraseña de verdad antes de llegar a cualquier otra cosa. Los default_users no reciben esa solicitud.
Que una cuenta sea superadministrador no se guarda: el atributo sudo del usuario compara el correo contra la lista sudo en minúsculas cada vez. Quitar un correo del arreglo le quita el privilegio en la siguiente petición, aunque la cuenta conserva el rol de admin hasta que se lo quites en el panel.
Abre el sitio y ve a /login. El inicio de sesión acepta el correo por omisión; la variable LOGIN_IDENTITIES lo amplía a teléfono y usuario. Después de iniciar sesión caes en /app, el valor de home_route en config/app.php, y el panel de administración está en /admin. Tu propio perfil, dispositivos y notificaciones están en /account; ve Tu área de cuenta.
Arranca los servidores
composer dev
Esto corre cuatro procesos en una sola terminal: php artisan serve en el puerto 8000, php artisan queue:listen --tries=1, php artisan pail siguiendo el log, y npm run dev para Vite con recarga en caliente. Pon APP_URL=http://localhost:8000 para que los enlaces que construye la aplicación coincidan con la dirección que abres.
Si sirves la carpeta con Herd, Valet o tu propio servidor web, sólo necesitas Vite:
npm run dev
O sáltate Vite por completo y usa los assets que compilaste en el paso 6.
Todo lo opcional empieza apagado
Planes, complementos, avisos, referidos y seguimiento tienen cada uno una bandera en config/features.php, y toda bandera vale false por omisión. Una función deshabilitada pierde sus rutas y sus entradas de menú, panel de administración incluido. Si al panel le falta una sección que esperabas, es por eso. El PIN, la verificación telefónica, la PWA, el web push, Stripe y el traductor con IA también esperan cada uno sus propias variables. Configura tu proyecto lista las banderas y a dónde lleva cada una.
Cuando no arranca
| Lo que ves | Causa | Arreglo |
|---|---|---|
No application encryption key has been specified |
se saltó el paso 3 | php artisan key:generate |
Connection refused o Unknown database |
el servidor está apagado o la base de datos no existe | arranca el servidor y crea la base de datos nombrada en DB_DATABASE |
Database file at path [laravel] does not exist |
SQLite con el DB_DATABASE de MySQL todavía puesto |
quita DB_DATABASE o apúntalo al archivo .sqlite |
Unable to locate file in Vite manifest |
los assets nunca se compilaron | npm run build, o deja npm run dev corriendo |
Un error con InvalidAccessKeyId o S3 al subir un archivo |
FILESYSTEM_DISK=s3 con las llaves de relleno |
FILESYSTEM_DISK=public |
| Un correo de verificación nunca llega | MAIL_MAILER=failover sin credenciales de Mailgun ni SES |
MAIL_MAILER=log y lee storage/logs/laravel.log |
No admin role defined. durante el seed |
admin_role en config/app.php está vacío |
dale un nombre; admin es el valor por omisión |
| Un permiso que acabas de crear se niega | Spatie cachea los permisos por 24 horas | php artisan permission:cache-reset |
Las imágenes bajo /storage/... devuelven 404 |
se saltó el paso 7 | php artisan storage:link |
| Vite no arranca o reporta un error de sintaxis | Node más viejo que 20.19 | actualiza Node |
| Un ajuste que cambiaste se ignora | una configuración cacheada | php artisan config:clear |
Los comandos del día a día, las pruebas y las revisiones que corren antes de un push están en Trabaja en el código.