Instalación nativa (servidor dedicado)
Instalación nativa en Linux, sin contenedores (ver Requisitos). El despliegue de referencia con el que se instala BIAM en los clientes es la instalación con contenedores; esta página es la alternativa para quien prefiera php-fpm + nginx en el propio servidor.
BIAM incluye un asistente de instalación web estilo Moodle: la base de datos y el primer administrador se configuran desde el navegador, no editando archivos.
1. Preparar el sistema
# Ubuntu 24.04 — paquetes base
sudo apt install nginx postgresql-client \
php8.4-fpm php8.4-pgsql php8.4-ldap php8.4-mbstring php8.4-xml \
php8.4-curl php8.4-zip php8.4-intl php8.4-bcmath php8.4-opcacheEn la VM de base de datos, crear la base y el rol:
CREATE ROLE biam LOGIN PASSWORD '...';
CREATE DATABASE biam OWNER biam;2. Desplegar el código
# Backend
cd /opt/biam/backend
composer install --no-dev --optimize-autoloader
# SPA (omitir si el release ya trae el build)
cd /opt/biam/frontend
npm ci && npm run buildEl SPA se sirve junto al backend, en el mismo origen (sin CORS): nginx apunta su raíz a backend/public.
Permisos: storage/ y bootstrap/cache/ escribibles por el usuario de php-fpm.
3. Servicios
- Cron (obligatorio — las ventanas de ciclo de vida y la salud de conectores dependen de él):
* * * * * cd /opt/biam/backend && php artisan schedule:run >> /dev/null 2>&1- Worker de colas (systemd):
[Service]
ExecStart=/usr/bin/php /opt/biam/backend/artisan queue:work --tries=3
Restart=always
User=www-data4. .env de arranque
Parte de backend/.env.example. La conexión a la base de datos la escribe el asistente; lo que sí debe estar antes de abrirlo:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://biam.miempresa.com # de aquí salen los enlaces de los correos
APP_TIMEZONE=America/La_Paz
APP_LOCALE=es
# Llaves PROPIAS de esta instalación: las líneas deben existir. Genera la APP_KEY
# ANTES de abrir el navegador — sin ella ninguna página carga, ni la del asistente.
APP_KEY=
JWT_SECRET=
# `file` mientras dura el asistente (la tabla `cache` aún no existe);
# `database` después, seguido de `php artisan config:cache`
CACHE_STORE=file
SESSION_DRIVER=array
QUEUE_CONNECTION=database
DB_CONNECTION=main
BIAM_HUB_URL=https://hub.b-iam.com
BIAM_HUB_PUBLIC_KEY=<la imprime `php artisan hub:public-key` en el Hub>
BIAM_HANDLERS_PATH=/opt/biam/backend/storage/app/handlers # handlers RPA cargados por zip, fuera del códigocd /opt/biam/backend
sudo -u www-data php artisan key:generate --force # reemplaza la línea APP_KEY= (debe existir)
sudo -u www-data php artisan jwt:secret --force
sudo -u www-data php artisan storage:linkEl SMTP, la conexión LDAP/AD y la licencia no van en el .env: se configuran desde la consola y quedan cifrados en la base de datos. Las llaves nunca se copian de otra instancia: con la misma APP_KEY dos instalaciones comparten la llave que cifra las credenciales, y con el mismo JWT_SECRET una sesión vale en ambas.
5. Asistente de instalación
Abrir https://biam.miempresa.com/install y seguir los tres pasos:
- Base de datos — el asistente prueba las credenciales antes de guardarlas y escribe las variables
DB_*en el.env(siJWT_SECRETquedó en blanco, lo genera aquí). - Migración — crea el esquema y los catálogos iniciales.
- Administrador — crea el primer usuario root con las credenciales que tú elijas y cierra el asistente en el mismo paso.
No existe ningún usuario/contraseña por defecto: hasta no completar el paso 3, nadie puede entrar; después de completarlo, el asistente queda bloqueado (reintentos devuelven INIT101W).
6. Post-instalación
cd /opt/biam/backend
sudo sed -i 's/^CACHE_STORE=.*/CACHE_STORE=database/' .env
sudo -u www-data php artisan config:cache # imprescindible: el cierre del asistente dejó la config cacheada
sudo systemctl restart biam-queue # el worker debe nacer con la caché en base de datos
sudo -u www-data php artisan biam:handlers-migrate # siembra BIAM_HANDLERS_PATH con los handlers del releaseCualquier cambio posterior del .env sigue la misma regla: editar → config:cache como el usuario de php-fpm → reiniciar el worker.
- Backups:
pg_dumpde la base +storage/app/(ahí viven los paquetes de conectores instalados y el marcador de instalación). - Opcional: cifrado del
.enven reposo conphp artisan env:encrypt(tarea de operaciones). - Configurar la conexión LDAP/AD desde la consola (Settings) — se guarda cifrada en la base de datos, no en
.env.