Pon PNLCS en marcha
PNLCS es una aplicación Laravel. Funciona en cualquier sitio donde haya PHP 8.4, MySQL o MariaDB y un servidor web. Si antes quieres echar un vistazo, la demo en vivo es una instalación real.
docker pull panelica/pnlcs-runtime
Tres formas de instalarlo
| Método | Ideal para | Tiempo | Guía |
|---|---|---|---|
| Docker | Probar PNLCS, o ejecutarlo como un único contenedor | Unos 5 minutos | Comandos |
| Tu propio servidor | Un VPS o servidor dedicado sin Docker: Ubuntu, Debian, AlmaLinux o Rocky Linux | Unos 30 minutos | Comandos |
| Dentro de un panel de hosting | Un servidor que ya ejecuta Panelica, cPanel o similar | Unos 20 minutos | Guía |
Inicio rápido con Docker
La imagen oficial incluye PHP-FPM 8.4, nginx, Node.js 20 y supervisor, y descarga el código más reciente en el primer arranque.
- Inicia los contenedoresAntes, sustituye
changemepor tus propias contraseñas. - Espera de 3 a 5 minutosEl primer arranque instala las dependencias y compila el frontend.
- Abre /installEl asistente comprueba los requisitos, crea tu cuenta de administrador y después se bloquea.
$ docker network create pnlcs-net $ docker run -d --name pnlcs-db --network pnlcs-net \ -e MYSQL_ROOT_PASSWORD=changeme \ -e MYSQL_DATABASE=pnlcs -e MYSQL_USER=pnlcs \ -e MYSQL_PASSWORD=changeme \ mariadb:11 $ docker run -d --name pnlcs --network pnlcs-net \ -p 8090:80 \ -e DB_HOST=pnlcs-db -e DB_DATABASE=pnlcs \ -e DB_USERNAME=pnlcs -e DB_PASSWORD=changeme \ -e APP_URL=http://localhost:8090 \ panelica/pnlcs-runtime:1.4
Instalar en tu propio servidor, sin Docker
PNLCS funciona como una aplicación Laravel normal sobre PHP-FPM 8.4, MySQL o MariaDB y Nginx. Los comandos siguientes cubren Ubuntu 24.04, Debian 13 y AlmaLinux 9; Rocky Linux 9 usa los comandos de AlmaLinux. Sustituye example.com por tu propia dirección.
-
Preparar el servidor
PHP 8.4 con sus extensiones, una base de datos, Nginx, Node.js 20 para compilar el frontend y Composer. Omite este paso si ya están instalados.
Ubuntu 24.04 trae PHP 8.3, así que PHP 8.4 viene del PPA de ondrej. Debian 13 incluye PHP 8.4, trae MariaDB en lugar de MySQL, y el paquete
php8.4-imapno existe. En AlmaLinux y Rocky, PHP 8.4 viene del repositorio Remi.Terminal$ sudo apt update $ sudo apt install -y software-properties-common git unzip curl cron $ sudo add-apt-repository -y ppa:ondrej/php $ sudo apt update $ sudo apt install -y php8.4-fpm php8.4-cli php8.4-mysql php8.4-mbstring \ php8.4-xml php8.4-curl php8.4-zip php8.4-gd php8.4-bcmath php8.4-intl php8.4-imap $ sudo apt install -y mysql-server nginx $ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - $ sudo apt install -y nodejs $ curl -sS https://getcomposer.org/installer | php $ sudo mv composer.phar /usr/local/bin/composer
Terminal$ sudo apt update $ sudo apt install -y git unzip curl cron $ sudo apt install -y php8.4-fpm php8.4-cli php8.4-mysql php8.4-mbstring \ php8.4-xml php8.4-curl php8.4-zip php8.4-gd php8.4-bcmath php8.4-intl $ sudo apt install -y mariadb-server nginx $ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - $ sudo apt install -y nodejs $ curl -sS https://getcomposer.org/installer | php $ sudo mv composer.phar /usr/local/bin/composer
Terminal$ sudo dnf install -y epel-release https://rpms.remirepo.net/enterprise/remi-release-9.rpm $ sudo dnf module reset php -y $ sudo dnf module enable php:remi-8.4 -y $ sudo dnf install -y php php-fpm php-mysqlnd php-mbstring php-xml php-gd \ php-bcmath php-intl php-imap php-pecl-zip \ mysql-server nginx git unzip cronie policycoreutils-python-utils $ curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - $ sudo dnf install -y nodejs $ curl -sS https://getcomposer.org/installer | php $ sudo mv composer.phar /usr/local/bin/composer $ sudo systemctl enable --now php-fpm mysqld nginx
-
Instalar la aplicación
El directorio de PNLCS pertenece al usuario del servidor web, y todo comando
composer,artisanynpmse ejecuta como ese usuario. La funciónpnlo hace por ti. Si el directorio pertenece a root, el asistente de instalación y las actualizaciones posteriores fallan.Elige una sola contraseña para la base de datos y úsala tanto en
CREATE USERcomo en.envpara que coincidan. La funciónpnsolo dura la sesión actual de la shell; vuelve a definirla cuando inicies sesión de nuevo.No ejecutes
db:seed. El asistente de instalación llena la base de datos y crea el administrador que elijas.Terminal$ sudo git clone https://github.com/Panelica/pnlcs.git /var/www/pnlcs $ sudo chown -R www-data:www-data /var/www/pnlcs $ cd /var/www/pnlcs $ pn() { sudo -u www-data HOME=/tmp/pnlcs-home COMPOSER_HOME=/tmp/pnlcs-home/composer "$@"; } $ pn composer install --no-dev --optimize-autoloader --no-interaction $ sudo mysql -e "CREATE DATABASE pnlcs CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'pnlcs'@'localhost' IDENTIFIED BY 'choose-a-strong-password'; GRANT ALL PRIVILEGES ON pnlcs.* TO 'pnlcs'@'localhost'; FLUSH PRIVILEGES;" $ pn cp .env.example .env $ pn sed -i 's|^APP_URL=.*|APP_URL=http://example.com|; s|^DB_PASSWORD=.*|DB_PASSWORD=choose-a-strong-password|' .env $ sudo chmod 640 .env $ pn php artisan key:generate $ pn php artisan migrate --force $ pn npm ci $ pn npm run build $ pn php artisan storage:link $ pn php artisan optimize
Terminal$ sudo git clone https://github.com/Panelica/pnlcs.git /var/www/pnlcs $ sudo chown -R apache:apache /var/www/pnlcs $ cd /var/www/pnlcs $ pn() { sudo -u apache HOME=/tmp/pnlcs-home COMPOSER_HOME=/tmp/pnlcs-home/composer "$@"; } $ pn /usr/local/bin/composer install --no-dev --optimize-autoloader --no-interaction $ sudo mysql -e "CREATE DATABASE pnlcs CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'pnlcs'@'localhost' IDENTIFIED BY 'choose-a-strong-password'; GRANT ALL PRIVILEGES ON pnlcs.* TO 'pnlcs'@'localhost'; FLUSH PRIVILEGES;" $ pn cp .env.example .env $ pn sed -i 's|^APP_URL=.*|APP_URL=http://example.com|; s|^DB_PASSWORD=.*|DB_PASSWORD=choose-a-strong-password|' .env $ sudo chmod 640 .env $ pn php artisan key:generate $ pn php artisan migrate --force $ pn npm ci $ pn npm run build $ pn php artisan storage:link $ pn php artisan optimize $ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/pnlcs/storage(/.*)?" $ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/pnlcs/bootstrap/cache(/.*)?" $ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/pnlcs/\.env" $ sudo restorecon -R /var/www/pnlcs $ sudo setsebool -P httpd_can_network_connect_db 1 $ sudo setsebool -P httpd_can_network_connect 1
-
Apuntar Nginx a public/
La raíz de documentos es
public/y nunca la raíz del proyecto: la raíz del proyecto contiene.env. Elimina el sitio por defecto para que la dirección del servidor no siga mostrando la página de bienvenida de Nginx.Apache y Caddy también funcionan, con las mismas reglas: raíz de documentos
public/, PHP a través de PHP-FPM 8.4 y toda petición que no sea un archivo reescrita aindex.php.Terminal$ sudo tee /etc/nginx/sites-available/pnlcs > /dev/null <<'EOF' server { listen 80; server_name example.com; root /var/www/pnlcs/public; index index.php; charset utf-8; client_max_body_size 64M; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/run/php/php8.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } } EOF $ sudo ln -s /etc/nginx/sites-available/pnlcs /etc/nginx/sites-enabled/ $ sudo rm -f /etc/nginx/sites-enabled/default $ sudo nginx -t && sudo systemctl reload nginx
Terminal$ sudo tee /etc/nginx/conf.d/pnlcs.conf > /dev/null <<'EOF' server { listen 80; server_name example.com; root /var/www/pnlcs/public; index index.php; charset utf-8; client_max_body_size 64M; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/run/php-fpm/www.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } } EOF $ sudo nginx -t && sudo systemctl reload nginx
-
Termina en el navegador, luego programa y protege
Abre
http://example.com/install. El asistente comprueba los requisitos, crea tu administrador y después se cierra.Una línea de cron para el usuario del servidor web se encarga de facturas, recordatorios, suspensiones, comprobaciones SSL y copias de seguridad. Los trabajos en cola no necesitan un worker aparte; la misma línea de cron los procesa.
Terminal$ cd /var/www/pnlcs $ WEB_USER=www-data # AlmaLinux, Rocky: apache $ (sudo crontab -u $WEB_USER -l 2>/dev/null; echo '* * * * * cd /var/www/pnlcs && php artisan schedule:run >> /dev/null 2>&1') | sudo crontab -u $WEB_USER - $ sudo apt install -y certbot python3-certbot-nginx # Ubuntu, Debian $ sudo certbot --nginx -d example.com $ pn sed -i 's|^APP_URL=http://|APP_URL=https://|' .env $ pn php artisan optimize
Requisitos
Una instalación pequeña funciona holgada con 2 GB de memoria y la base de datos en la misma máquina.
| PHP | 8.4 o superior |
|---|---|
| Base de datos | MySQL 8.0 o MariaDB 10.6+ |
| Servidor web | Nginx o Apache con PHP-FPM |
| Node.js | 18+ (se recomienda 20 LTS), solo para compilar el frontend |
| Composer | 2.x |
| Memoria | 1 GB basta para una instalación pequeña; con 2 GB va holgada |
| Disco | Unos 130 MB para la aplicación; deja al menos 2 GB libres, porque los datos crecen |
Después de instalar
- Lista de configuraciónDatos de la empresa, correo, una pasarela, un servidor y tu primer producto.
- Tu primera ventaDe un catálogo vacío a un pedido pagado y aprovisionado.
- Lista de seguridadHTTPS, depuración desactivada, dos pasos para el personal, copias de seguridad fuera del servidor.
- ActualizarDescarga la última versión sin perder datos.
- Copias de seguridadQué debes copiar, incluida la clave de la aplicación.
- Preguntas frecuentesDudas habituales.