🛡️ HestiaCP
Hestia Control Panel (HestiaCP) es un panel de control potente y ligero diseñado para administradores de servidores que buscan una interfaz intuitiva y eficiente.
[!WARNING] Compatibilidad de SO: Antes de iniciar, confirme que su sistema operativo sea Ubuntu 22.04 LTS. La versión 1.9.x de HestiaCP no es compatible con Ubuntu 24.04 LTS.
Este tutorial está ajustado a la versión 1.9.4
🛠️ 1. Preparación del Sistema
Actualice el sistema e instale los paquetes base necesarios.
# Actualizar repositorios
sudo apt update && sudo apt upgrade -y
# Instalar herramientas esenciales
sudo apt install -y curl zip unzip openssl git wget
# Soporte de idiomas (puedes revisar los disponibles con 'locale -a')
sudo apt install -y language-pack-{es,it,en,pt,de,fr}
📋 2. Definición de Variables
Configure las siguientes variables en su terminal para facilitar el proceso de instalación automatizada. Reemplace los valores por los de su servidor.
export HESTIA_ADMIN_USER="admin"
export HESTIA_DOMAIN="sample.com"
export HESTIA_EMAIL="admin@sample.com"
export HESTIA_PASSWORD="hestiacp8083pass"
[!TIP] Si su proveedor de hosting es OVH, se recomienda utilizar el nombre del VPS proporcionado por el proveedor como
HESTIA_DOMAIN.
🚀 3. Instalación
Los siguientes comandos están optimizados para un uso estándar de PiecesPHP. Si desea una instalación más personalizada, visite la herramienta de Instalación de HestiaCP.
Descarga del instalador
Opción A: Instalación estándar (Recomendada)
Esta opción incluye soporte Multi-PHP y cuotas de disco, desactivando ClamAV para ahorrar recursos.
sudo bash hst-install.sh \
--hostname $HESTIA_DOMAIN \
--email $HESTIA_EMAIL \
--password $HESTIA_PASSWORD \
--multiphp yes \
--clamav no \
--quota yes
Opción B: Instalación completa (Personalizada)
Si requiere control total sobre todos los servicios:
sudo bash hst-install.sh \
--apache yes \
--phpfpm yes \
--multiphp '7.3,7.4,8.0,8.1,8.2,8.4,8.5' \
--vsftpd yes \
--proftpd no \
--named yes \
--mysql yes \
--mysql8 no \
--postgresql no \
--exim yes \
--dovecot yes \
--clamav no \
--spamassassin yes \
--iptables yes \
--fail2ban yes \
--quota yes \
--api yes \
--lang es \
--interactive yes \
--hostname $HESTIA_DOMAIN \
--email $HESTIA_EMAIL \
--password $HESTIA_PASSWORD \
--username $HESTIA_ADMIN_USER \
--webterminal yes \
--sieve no \
--force
🔑 4. Acceso y Recomendaciones
Acceso al Panel
Una vez finalizada la instalación, podrá acceder a través de:
* URL: https://TU_DOMINIO:8083 (o la IP del servidor)
* Puerto por defecto: 8083
Recomendaciones Post-Instalación
- Seguridad: Al crear su primer dominio, cree un usuario con permisos limitados y habilite el acceso Bash únicamente si es estrictamente necesario.
- Gestión de archivos: Utilice FileZilla o cualquier gestor SFTP para la carga y gestión de archivos.
🛠️ Otros Ajustes Necesarios
Módulos PHP y Apache (Recomendados para PiecesPHP)
# Instalar módulos necesarios para múltiples versiones
sudo apt install -y php*-{common,pdo,xml,ctype,mbstring,fileinfo,gd,mysqli,sqlite3,zip,xsl,xmlwriter,xmlreader,curl,intl}
# Activar módulos de Apache vitales
sudo a2enmod rewrite headers ssl
# Reiniciar servicios
sudo systemctl restart apache2
Configuración de Base de Datos
Gestión de Paquetes PHP (Composer)
Instale Composer de manera global:
cd ~
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer
📂 Herramientas de Base de Datos
- PHPMyAdmin
- Adminer — Alternativa ligera y recomendada.
⚙️ Optimizaciones Sugeridas (Stack)
Para un rendimiento óptimo con aplicaciones PiecesPHP, se sugieren los siguientes valores en el servidor:
PHP
| Parámetro | Valor Sugerido | Razón |
|---|---|---|
max_execution_time |
600 |
Evita timeouts en procesos largos o reportes. |
max_input_time |
600 |
Tiempo máximo para procesar datos de entrada. |
max_input_vars |
5000 |
Vital para formularios extensos o grids dinámicos. |
post_max_size |
100M |
Ajustado para permitir margen sobre el upload. |
upload_max_filesize |
80M |
Capacidad para carga de archivos pesados. |
memory_limit |
1024M |
Memoria suficiente para procesamiento pesado. |
MySQL (MariaDB)
| Parámetro | Valor Sugerido | Razón |
|---|---|---|
wait_timeout |
600 |
Libera conexiones inactivas eficientemente. |
interactive_timeout |
600 |
Tiempo de espera para clientes interactivos. |
max_allowed_packet |
64M |
Permite el manejo de paquetes de datos grandes. |
Nginx (Proxy)
| Parámetro | Valor Sugerido | Razón |
|---|---|---|
client_max_body_size |
100M |
Debe ser igual o mayor a post_max_size. |
proxy_read_timeout |
600 |
Tiempo de espera para la respuesta del backend. |
proxy_connect_timeout |
600 |
Tiempo para establecer conexión con el backend. |
proxy_send_timeout |
600 |
Tiempo para enviar la petición al backend. |
Apache
| Parámetro | Valor Sugerido | Razón |
|---|---|---|
Timeout |
600 |
Sincronizado con los tiempos de PHP. |
KeepAliveTimeout |
5 |
Libera slots de conexión rápidamente. |
MaxKeepAliveRequests |
100 |
Límite de peticiones por conexión persistente. |
📦 Respaldos Incrementales (Restic + Rclone)
HestiaCP permite migrar del sistema tradicional de archivos .tar (que consume mucho espacio y CPU) hacia un sistema de respaldos incrementales utilizando Restic. Esta configuración on-premise permite mantener el control total de los datos sin depender de proveedores de nube externos.
1. Estrategias de Almacenamiento
Dependiendo de su disponibilidad de hardware, elija una de estas dos rutas:
- Ruta A: Almacenamiento Externo (Recomendado): Utilice un segundo disco físico (ej. montado en
/mnt/backup_incremental), un NAS o un NFS. Esto protege los datos ante un fallo total del disco principal. - Ruta B: Mismo Disco (Sin montajes nuevos): Puede usar una carpeta dentro de su disco actual (ej.
/backup_incremental). Aunque no protege contra fallos físicos del disco, obtiene todos los beneficios de velocidad y ahorro de espacio de Restic.
2. Configurar Rclone (Puente Local)
Aunque Restic es nativo, usar Rclone como puente es el método más estable en HestiaCP.
- Ejecute la configuración interactiva:
- Siga estos pasos en el menú interactivo:
- Elija
npara un nuevo remoto. - name:
almacenamiento_local - Storage: Escriba
local(o el número correspondiente a Local Disk). - Edit advanced config?
n(No) - Keep this remote?
y(Sí) - Finalizar: Elija
qpara salir.
- Elija
3. Vinculación con HestiaCP
Use el comando v-add-backup-host-restic indicando el remoto de Rclone (almacenamiento_local) seguido de la ruta absoluta elegida en el paso 1.
Ejemplo para Disco Externo:
Ejemplo para Mismo Disco (Sin montajes):
# Crear la carpeta primero si no existe
mkdir -p /backup_incremental
v-add-backup-host-restic 'rclone:almacenamiento_local:/backup_incremental/' 30 8 5 3 -1
[!NOTE] Los números representan la política de retención: Días (30), Semanas (8), Meses (5), Años (3) y Total de instantáneas (-1 para ilimitado).
[!CAUTION] Error de Inicialización: Si el respaldo falla indicando que el repositorio no existe, deberá inicializarlo manualmente una sola vez con:
restic init -r /mnt/backups/.
4. Consideraciones Críticas
- ⚡ Rendimiento: Al ser local, la velocidad es drásticamente superior y puede lograr ahorros de almacenamiento de hasta 25:1 gracias a la deduplicación.
- 💾 Espacio de Caché: Restic usa cache temporal en
/root/.cache/restic. Asegúrese de tener espacio en el disco principal para evitar fallos durante la purga. - 🔑 Claves de Cifrado: HestiaCP cifra los datos por defecto. Es obligatorio resguardar los archivos
restic.confubicados en/usr/local/hestia/data/users/[usuario]/. Sin estos archivos, sus respaldos en el NAS serán ilegibles e irrecuperables.
5. Programación y Automatización (Cron)
HestiaCP no activa automáticamente el cronjob para Restic al añadir el host. Debe realizar los siguientes pasos adicionales para que el sistema sea autónomo:
-
Habilitar en el Paquete:
- Vaya a Packages (Paquetes) y edite el paquete que usan sus usuarios (ej.
default). - Asegúrese de que el soporte para backups esté activo y, si aparece la opción específica, habilite los respaldos incrementales.
- Vaya a Packages (Paquetes) y edite el paquete que usan sus usuarios (ej.
-
Añadir el Cron Job Específico:
- Vaya a la sección Cron del panel de HestiaCP (como admin).
- Añada una nueva tarea con el comando:
v-backup-users-restic - Programe la hora (se recomienda una hora distinta a la de los backups tradicionales, por ejemplo:
30 05 * * *).
-
Prueba Manual Final:
- Siempre verifique la conexión y el primer envío manualmente:
-
¿Se pueden eliminar los .tar al 100%? (Realidad Técnica):
- Lamentablemente, HestiaCP requiere que el valor de Backups en el paquete sea al menos
1para que el proceso capture datos reales. Si se pone en0, los respaldos de Restic resultarán en carpetas vacías. - Si se desactiva el backup local globalmente (
local = no), la pestaña de Backups desaparecerá de la interfaz.
- Lamentablemente, HestiaCP requiere que el valor de Backups en el paquete sea al menos
[!IMPORTANT] La recomendación final: Para mantener la pestaña activa en la interfaz y que los respaldos contengan datos, lo ideal es configurar
Backups = 1en el paquete y aceptar la existencia de un único archivo.tarresidual. Es el pequeño precio a pagar por mantener la comodidad de la gestión vía web.
🔒 Seguridad de Archivos Estáticos (Nginx Bypass)
Por defecto, HestiaCP configura Nginx para servir una amplia lista de extensiones de forma directa (Proxy Static Extensions). Esto mejora el rendimiento, pero genera una brecha de seguridad crítica: Nginx ignora las reglas del archivo .htaccess de Apache.
Si un archivo como composer.json o un backup .sql.gz coincide con una extensión en la lista de Nginx, cualquier persona podrá descargarlo incluso si Apache tiene prohibido el acceso.
Configuración Recomendada
Para solucionar esto, edite la configuración de su Web Domain en HestiaCP y refine la lista de Proxy Static Extensions eliminando las extensiones sensibles.
✅ Mantener en Nginx (Seguro)
Estas extensiones no suelen contener datos sensibles y se benefician del rendimiento de Nginx:
css, js, mjs, png, jpg, jpeg, gif, webp, svg, ico, avif, woff, woff2, ttf, otf, eot, mp3, mp4, ogg, webm
O:
none Para que Apache maneje todas las extensiones.
❌ Eliminar de Nginx (Pasar a Apache)
Estas extensiones deben ser manejadas por Apache para que el .htaccess o el framework (ServerStatics) puedan protegerlas:
json, xml, txt, gz, zip, rar, 7z, tar, tgz, sql, log, doc, docx, xls, xlsx, pdf
Interacción con ServerStatics.php
La clase ServerStatics.php de PiecesPHP tiene su propio sistema de delegación. Si desea seguridad máxima para archivos específicos (por ejemplo, PDFs protegidos por login):
1. Asegúrese de que la extensión NO esté en la lista de Nginx del panel.
2. La clase detectará si el archivo está en una ruta protegida y lo servirá vía PHP mediante el ProtectFileMiddleware, ignorando la delegación web.
🔍 Solución de Problemas (Troubleshooting)
Error: "User admin exists"
Si la instalación falla porque el usuario admin ya existe:
- Abra el archivo de grupos:
sudo nano /etc/group - Elimine la línea
admin:x:117:(o similar). - Guarde los cambios y reintente la instalación.