Esta página explica la instalación de KingCMS X1.0.0-alpha, la primera visita, las actualizaciones en línea, las copias de seguridad y las tareas programadas. La raíz del sitio debe apuntar al directorio public/ del paquete. La base de datos se crea automáticamente en la primera visita; no hay un instalador por pasos.
1. Requisitos
- PHP 8.2 o superior. Los ejemplos usan PHP 8.4 de Debian 13.
- Extensiones PHP:
pdo_sqlite,sqlite3,sodium,mbstring,intl,curl,gd,xml,ctype,json,openssl. Las imágenes necesitangd, las copias en líneasqlite3y las copias con archivos subidos la extensiónzip. - SQLite 3 (la línea de comandos
sqlite3se usa para copias manuales). - nginx (mostrado aquí) o Apache, con PHP a través de PHP-FPM.
- Un directorio
data/escribible. Allí viven la base SQLite,app.key, la caché y las subidas.
app/ y data/ deben quedar fuera de la raíz del sitio y no ser accesibles desde el navegador. Solo public/ es la raíz.
2. Descarga y verificación
Página de descarga: https://download.kingcms.com/. Versión actual X1.0.0-alpha (publicada el 2026-10-20), unos 16,4 MB, firmada.
wget https://update.kingcms.com/stable/kingcms-x1-X1.0.0-alpha.zip
sha256sum kingcms-x1-X1.0.0-alpha.zip
La suma debe ser:
278bdb5d4a1cb1ca480b7e0802cc8773d69664f58194eb72ee59546a29490767
Si no coincide, no lo despliegue; descárguelo de nuevo.
3. Instalar paquetes
sudo apt update
sudo apt install -y \
nginx \
php8.4-fpm php8.4-cli php8.4-sqlite3 php8.4-mbstring \
php8.4-intl php8.4-curl php8.4-gd php8.4-xml \
sqlite3
sodium viene en el paquete common de PHP 8.4.
Comprobar extensiones
for ext in pdo_sqlite sqlite3 sodium mbstring intl curl gd xml ctype json openssl; do
php -r 'exit(extension_loaded($argv[1]) ? 0 : 1);' "$ext" \
|| echo "falta la extensión: $ext"
done
Sin salida, todas están presentes. Si instaló extensiones después, reinicie PHP-FPM:
sudo systemctl restart php8.4-fpm
4. Subir y descomprimir
sudo mkdir -p /var/www/kingcms
sudo unzip kingcms-x1-X1.0.0-alpha.zip -d /var/www/kingcms
El paquete contiene app/, bin/, modules/, public/, resources/, themes/ y vendor/. Las dependencias están incluidas, no hace falta composer install.
Apunte la raíz del sitio a /var/www/kingcms/public, no a /var/www/kingcms ni a app/.
Se recomienda activar OPcache:
opcache.enable=1
opcache.memory_consumption=128
opcache.validate_timestamps=1
5. Permisos de directorio
cd /var/www/kingcms
sudo mkdir -p data/uploads data/cache
sudo chown -R www-data:www-data data
sudo find data -type d -exec chmod 750 {} \;
sudo find data -type f -exec chmod 640 {} \;
En la primera visita se crea data/app.key con permisos 0600. Confirme:
sudo chmod 600 /var/www/kingcms/data/app.key
sudo ls -l /var/www/kingcms/data/app.key
app.key cifra los ajustes secretos. No lo borre ni lo reemplace; sin él los valores cifrados no se pueden recuperar.
6. nginx
Coloque la zona de límite en /etc/nginx/conf.d/kingcms-limit.conf (limit_req_zone solo es válido en el contexto http):
limit_req_zone $binary_remote_addr zone=kingcms:10m rate=10r/s;
Configuración del sitio /etc/nginx/sites-available/kingcms:
server {
listen 80;
server_name cms.example.com;
root /var/www/kingcms/public;
index index.php;
client_max_body_size 20m;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location /media/ {
alias /var/www/kingcms/data/uploads/;
add_header Cache-Control "public, max-age=2592000";
location ~ \.php$ {
return 404;
}
location ~ /\. {
deny all;
}
}
location ~ /\.(?!well-known) {
deny all;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
limit_req zone=kingcms burst=20 nodelay;
}
}
sudo ln -s /etc/nginx/sites-available/kingcms /etc/nginx/sites-enabled/kingcms
sudo nginx -t
sudo systemctl reload nginx
Configure HTTPS antes de publicar. Las devoluciones de WeChat/Alipay y las cookies Secure lo requieren.
Límites de subida de PHP
upload_max_filesize = 20M
post_max_size = 20M
Deben ser iguales o mayores que client_max_body_size de nginx; luego reinicie PHP-FPM.
7. Reescritura en Apache
Active mod_rewrite (a2enmod rewrite y reinicie Apache) y permita .htaccess (AllowOverride All).
<VirtualHost *:80>
ServerName cms.example.com
DocumentRoot /var/www/kingcms/public
<Directory /var/www/kingcms/public>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
El .htaccess incluido en public/ envía archivos y directorios inexistentes a index.php, conservando la cadena de consulta:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
8. Base de datos en la primera visita
Abra el sitio en el navegador. Si data/kingcms.sqlite no existe, el programa crea la base SQLite, ejecuta las migraciones del núcleo y de los módulos, escribe los ajustes por defecto y genera data/app.key. No hay que importar SQL.
9. Crear el administrador
Mientras no exista un administrador, todas las páginas redirigen a /admin/setup (excepto /assets/ y /healthz). El formulario único pide:
- nombre de usuario (obligatorio, hasta 64 caracteres);
- contraseña (mínimo 8 caracteres);
- confirmación de contraseña;
- opcionalmente, crear contenido de ejemplo;
- aceptación del acuerdo de licencia.
Tras crearlo, inicia sesión y redirige a /admin; /admin/setup devuelve 404 de forma permanente. El acceso es /admin/login. Para restablecer la contraseña:
cd /var/www/kingcms
sudo -u www-data php bin/kingcms admin:reset-password
10. Actualizaciones en línea
Las actualizaciones en línea están disponibles. La página de actualización del panel lee https://update.kingcms.com/stable/latest.json, la compara con la versión instalada y muestra notas y sumas de verificación.
- Haga copia de la base de datos y de
app.keyprimero. - La actualización reemplaza los archivos del programa y conserva
data/. - Con OPcache y
validate_timestamps=0, recargue PHP-FPM después. - También puede descargar el paquete nuevo, verificarlo como en la sección 2 y sobrescribir los archivos, conservando
data/.
11. Copias de seguridad
Copie juntos la base SQLite y app.key.
sudo install -d -m 700 /var/backups/kingcms
sudo sqlite3 /var/www/kingcms/data/kingcms.sqlite \
".backup '/var/backups/kingcms/kingcms-$(date +%F).sqlite'"
sudo install -m 600 /var/www/kingcms/data/app.key \
/var/backups/kingcms/app.key
Use sqlite3 .backup en lugar de copiar un .sqlite en uso. La página de copias del panel también permite copiar, descargar, borrar y restaurar, y programar copias diarias o semanales.
Nota: para respaldar un sitio en funcionamiento, use la función de copias del panel o sqlite3 .backup en lugar de copiar el archivo de base de datos en uso; respalde la base de datos junto con app.key.
12. cron
php bin/kingcms cron:run ejecuta los ganchos por minuto de los módulos activos y las tareas pendientes (liberar reservas de stock, avisos ntfy, resúmenes de estadísticas). Añada a /etc/cron.d/kingcms:
SHELL=/bin/sh
PATH=/usr/local/bin:/usr/bin:/bin
* * * * * www-data /usr/bin/php /var/www/kingcms/bin/kingcms cron:run >/dev/null 2>&1
13. Prueba local rápida
php -S 127.0.0.1:8080 -t public public/index.php
Abra http://127.0.0.1:8080. La primera visita crea data/, data/kingcms.sqlite y data/app.key, y redirige a /admin/setup. El servidor integrado es solo para pruebas locales, no para producción.
14. Preguntas frecuentes
La portada funciona, las páginas internas dan 404. La reescritura no está activa. En nginx revise try_files ... /index.php?$query_string; en Apache, mod_rewrite y AllowOverride All.
La portada también da 404. Compruebe que la raíz apunta a public/ y que existe public/index.php.
Las imágenes subidas no cargan. Están en data/uploads/, fuera de la raíz; configure el alias /media/ y desactive PHP allí.
Las URL antiguas fallan tras renombrar. El programa guarda redirecciones 301 automáticamente.
15. Licencia
Eliminar el enlace Powered by KingCMS del front-end requiere una licencia; consulte Precios y licencias.