🚀

Setup Rápido (5 minutos)

Para desarrollo local con Docker, salta directamente a la sección Docker.

📋 Requisitos del Sistema

🔧 API Limbo (Backend)

  • PHP 8.2+ con extensiones: gd, intl, pdo_mysql, redis
  • MySQL 8.4+ o MySQL 8.0 compatible
  • Redis 7+ para caching y colas
  • Composer 2.0+ para gestión de dependencias
  • Nginx/Apache con mod_rewrite habilitado

🎨 Component-Limbo (Frontend)

  • Node.js 18+ para desarrollo/build
  • NPM/Yarn/PNPM package manager
  • Navegadores: Chrome 90+, Firefox 88+, Safari 14+
  • React 19 (incluido en UMD, opcional en ESM)

🔧 Instalación API Limbo

1

Clonar/Descargar Proyecto

bash
git clone git@github.com:Lefebvre-El-Derecho-SA/api-limbo.git
# o #
git clone https://github.com/Lefebvre-El-Derecho-SA/api-limbo.git
2

Instalar Dependencias

bash
composer install
# Para producción: composer install --no-dev --optimize-autoloader
3

Configurar Variables de Entorno

Copia el archivo de ejemplo y configura las variables:

bash
cp .env.example .env

Edita el archivo .env con tus configuraciones:

env
# Database
DATABASE_URL="mysql://user:password@127.0.0.1:3306/limbo?serverVersion=8.4"

# Redis
REDIS_URL="redis://127.0.0.1:6379"

# Storage
LIMBO_STORAGE_PATH="%kernel.project_dir%/var/limbo"

# Security
LIMBO_SIGNING_SECRET="your-super-secret-signing-key"
LIMBO_JWT_HMAC_SECRET="your-jwt-secret-key"

# Atenea Integration
ATENEA_BASE_URL="https://atenea.lefebvre.es"
ATENEA_TOKEN="your-atenea-token"
4

Configurar Base de Datos

bash
# Crear base de datos
php bin/console doctrine:database:create

# Ejecutar migraciones
php bin/console doctrine:migrations:migrate --no-interaction

# Crear usuario administrador inicial
php bin/console app:create-admin-user admin admin
5

Configurar Servidor Web

nginx
server {
    listen 80;
    server_name ${NGINX_BACKEND_DOMAIN};
    root /var/www/lefebvredocker/public;

    index index.php index.html index.htm;

    # CDN routes - MUST come first, always pass to Symfony
    location ~ ^/cdn/.+\.(js|css|map)$ {
        try_files /nonexistent /index.php$is_args$args;
    }

    location / {
        # Disable automatic trailing slash redirects
        try_files $uri /index.php$is_args$args;
    }

    # Node modules assets - direct to PHP
    location /node_modules/ {
        fastcgi_pass php:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
    }

    location ~ \.php$ {
        # CORS headers removed - handled by Symfony's CorsMiddleware
        # This allows dynamic CORS based on Portal configuration
        # DO NOT add CORS headers here, they will conflict with Symfony
        
        # try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_index index.php;
        fastcgi_pass php:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
    }

    location ~ /\.ht {
            deny all;
    }

    location = /favicon.ico {
            log_not_found off; access_log off;
    }
    location = /robots.txt {
            log_not_found off; access_log off; allow all;
    }
    location ~ ^/files/.+\.(css|gif|ico|jpeg|jpg|js|png|webp)$ {
        try_files $uri /index.php$is_args$args;
    }
    
    # Commented out - this was blocking CDN routes
    # location ~* \.(css|gif|ico|jpeg|jpg|js|png|webp)$ {
    #         expires max;
    #         log_not_found off;
    # }
    
    error_log /dev/stdout info;
    access_log /var/log/nginx/project_access.log;
}
apache
<VirtualHost *:80>
    ServerName ${NGINX_BACKEND_DOMAIN}
    DocumentRoot /var/www/lefebvredocker/public

    DirectoryIndex index.php index.html index.htm

    # === Logs ===
    ErrorLog /dev/stdout
    CustomLog /var/log/apache2/project_access.log combined

    # === Base Directory Configuration ===
    <Directory /var/www/lefebvredocker/public>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted

        # Desactiva redirección automática de trailing slash
        DirectorySlash Off

        # Reescrituras Symfony
        <IfModule mod_rewrite.c>
            RewriteEngine On

            # === CDN routes - priorizadas ===
            RewriteCond %{REQUEST_URI} ^/cdn/.+\.(js|css|map)$ [NC]
            RewriteRule ^.*$ /index.php [QSA,L]

            # === Files estáticos en /files/... ===
            RewriteCond %{REQUEST_URI} ^/files/.+\.(css|gif|ico|jpeg|jpg|js|png|webp)$ [NC]
            RewriteRule ^.*$ /index.php [QSA,L]

            # === Node modules: enviar al front controller ===
            RewriteCond %{REQUEST_URI} ^/node_modules/ [NC]
            RewriteRule ^.*$ /index.php [QSA,L]

            # === Symfony front controller ===
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule ^ index.php [QSA,L]
        </IfModule>
    </Directory>

    # === PHP-FPM Configuration ===
    <FilesMatch \.php$>
        SetHandler "proxy:fcgi://php:9000"
    </FilesMatch>

    # === Seguridad ===
    <FilesMatch "^\.ht">
        Require all denied
    </FilesMatch>

    # === Favicon & Robots ===
    <LocationMatch "^/(favicon\.ico|robots\.txt)$">
        ErrorDocument 404 "Not Found"
        SetEnvIf Request_URI "robots\.txt$" allow_all
        <If "%{env:allow_all}">
            Require all granted
        </If>
        CustomLog /dev/null common
    </LocationMatch>
</VirtualHost>

🐳 Setup Rápido con Docker

Para desarrollo local, usa Docker Compose:

1

Iniciar Servicios

bash
docker-compose build && docker-compose up -d
2

Configurar Aplicación

bash
# Instalar dependencias
docker-compose exec php composer install

# Configurar base de datos
docker-compose exec php php bin/console doctrine:database:create
docker-compose exec php php bin/console doctrine:migrations:migrate --no-interaction

# Crear usuario admin
docker-compose exec php php bin/console app:create-admin-user admin admin
3

¡Listo!

En principio la API estará disponible en (comprueba el puerto que hayas configurado):

🎨 Instalación Component-Limbo

Elige el método según tu stack tecnológico:

📦

UMD (Universal)

WordPress, Symfony, HTML

Para sitios que NO usan bundlers js modernos:

html
<!-- Por CDN -->
<!-- CSS -->
<link rel="stylesheet" href="https://limbo.lefebvre.es/cdn/component-limbo/latest/limbo.css" />

<!-- JavaScript (React incluido) -->
<script src="https://limbo.lefebvre.es/cdn/component-limbo/latest/limbo.umd.js"></script>

<!-- O por importación en un archivo JS que se renderice en la cabecera SI ESTA EN NODE_MODULES -->
<script>
import Limbo from "limbo-component";
import "limbo-component/css";
window.Limbo = Limbo; // Hacer global de la forma que gustes
</script>

<script>
  // Configurar globalmente
  Limbo.configure({
    publicKey: "pk_tu_clave_publica",
    authMode: "session" // o "jwt" con tokenProvider
  });
  
  // Crear instancia
  Limbo.create({
    container: "#limbo-container",
    mode: "embed",
    modeUI: "full"
  });
</script>
⚛️

ESM/NPM

React, Vue, Angular, WebPack

Para aplicaciones con bundlers js modernos:

bash
npm install limbo-component
# o
yarn add limbo-component
# o
pnpm add limbo-component
javascript
import Limbo from 'limbo-component';
import 'limbo-component/css';

// Configuración global
Limbo.configure({
  publicKey: "pk_tu_clave_publica",
  authMode: "jwt",
  tokenProvider: async () => {
    const res = await fetch('/api/limbo-token');
    const data = await res.json();
    return data.token;
  }
});

// Crear instancia
Limbo.create({
  container: "#limbo-container",
  mode: "embed",
  modeUI: "full"
});

Más información sobre como integrar el componente

✅ Verificación de Instalación

Comprueba que todo funciona correctamente:

🔧

API Limbo

Visita /api/doc y verifica que las API References funcionan correctamente.

🧪 Probar Conexión API
🎨

Component-Limbo

Crea un HTML simple para verificar que el component carga tras la importacion del js y css:

<div id="limbo-test"></div>
<script>
  Limbo.create({
    container: "#limbo-test",
    mode: "embed"
  });
</script>
🗄️

Base de Datos

Verifica que las tablas se crearon correctamente:

php bin/console doctrine:schema:validate
🔴

Redis & Workers

Inicia los workers para procesamiento asíncrono:

php bin/console messenger:consume async_low -vv

🚀 Próximos Pasos