Gestionas webs de múltiples clientes. ¿Cómo organizar tu VPS de forma profesional, segura y rentable?
Esta guía cubre todo lo que necesitas.
¿VPS propio o reseller hosting?
| Opción | Pros | Contras |
|---|---|---|
| VPS propio | Control total, mayor margen | Más trabajo |
| Reseller | Gestión fácil, soporte incluido | Menos control, menor margen |
Recomendación: VPS propio si tienes +5 clientes y conocimientos técnicos.
Estructura recomendada
Organización de archivos
/var/www/
├── cliente1.com/
│ └── public_html/
├── cliente2.com/
│ └── public_html/
├── cliente3.com/
│ └── public_html/
└── tuagencia.com/
└── public_html/
Un usuario por cliente (recomendado)
# Crear usuario para cliente
sudo adduser cliente1 --disabled-password
sudo usermod -aG www-data cliente1
# Crear directorio
sudo mkdir -p /var/www/cliente1.com/public_html
sudo chown -R cliente1:www-data /var/www/cliente1.com
sudo chmod -R 750 /var/www/cliente1.com
Ventajas de usuarios separados
- Aislamiento de permisos
- Acceso SFTP individual
- Fácil identificar quién hace qué
- Un cliente comprometido no afecta a otros
Panel de control: opciones
CyberPanel (gratis, recomendado)
sh <(curl https://cyberpanel.net/install.sh || wget -O - https://cyberpanel.net/install.sh)
Incluye:
- Crear sitios fácilmente
- SSL automático
- Gestión de emails
- Backups
- LiteSpeed (rápido)
CloudPanel (gratis)
curl -sSL https://installer.cloudpanel.io/ce/v2/install.sh | sudo bash
Incluye:
- Interfaz moderna
- Nginx optimizado
- Sin email (usar externo)
Plesk/cPanel (pago)
Si prefieres panel comercial con más soporte:
- Plesk: ~€10-15/mes
- cPanel: ~€15-25/mes
Configuración Nginx multi-sitio
Virtual host por cliente
# /etc/nginx/sites-available/cliente1.com
server {
listen 80;
server_name cliente1.com www.cliente1.com;
root /var/www/cliente1.com/public_html;
index index.php index.html;
access_log /var/log/nginx/cliente1.access.log;
error_log /var/log/nginx/cliente1.error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm-cliente1.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
PHP-FPM pool por cliente
# /etc/php/8.2/fpm/pool.d/cliente1.conf
[cliente1]
user = cliente1
group = www-data
listen = /run/php/php8.2-fpm-cliente1.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
php_admin_value[open_basedir] = /var/www/cliente1.com/:/tmp/
Ventaja: Si un sitio tiene problemas o consume mucho, no afecta a otros.
Base de datos por cliente
# Crear base de datos
mysql -u root -p
CREATE DATABASE cliente1_wp;
CREATE USER 'cliente1'@'localhost' IDENTIFIED BY 'password_seguro';
GRANT ALL PRIVILEGES ON cliente1_wp.* TO 'cliente1'@'localhost';
FLUSH PRIVILEGES;
Convención de nombres
Bases de datos: cliente1_wp, cliente1_tienda
Usuarios DB: cliente1, cliente2, etc.
Acceso SFTP por cliente
Configurar SFTP chroot
# /etc/ssh/sshd_config
Match Group sftp-users
ChrootDirectory /var/www/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
# Añadir cliente al grupo
sudo groupadd sftp-users
sudo usermod -aG sftp-users cliente1
# Permisos correctos para chroot
sudo chown root:root /var/www/cliente1
sudo chmod 755 /var/www/cliente1
# El cliente escribe en public_html, no en el directorio raíz
Credenciales para cliente
Host: tuservidor.com
Puerto: 22 (o personalizado)
Usuario: cliente1
Contraseña: [la que asignaste]
Directorio: /public_html/
Backups por cliente
Script de backup individual
#!/bin/bash
# /root/scripts/backup-cliente.sh
CLIENTE=$1
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backups/clientes/$CLIENTE"
mkdir -p $BACKUP_DIR
# Base de datos
mysqldump ${CLIENTE}_wp > $BACKUP_DIR/db_$DATE.sql
# Archivos
tar -czf $BACKUP_DIR/files_$DATE.tar.gz /var/www/$CLIENTE.com/
# Limpiar antiguos (30 días)
find $BACKUP_DIR -mtime +30 -delete
echo "Backup $CLIENTE completado"
Programar para todos los clientes
# crontab -e
0 2 * * * /root/scripts/backup-cliente.sh cliente1
0 2 * * * /root/scripts/backup-cliente.sh cliente2
0 2 * * * /root/scripts/backup-cliente.sh cliente3
Monitorización
Por cliente
# Ver recursos por sitio
# Logs de acceso
tail -f /var/log/nginx/cliente1.access.log
# Uso de disco por cliente
du -sh /var/www/*/
# Uso de BD por cliente
mysql -e "SELECT table_schema,
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
GROUP BY table_schema;"
Alertas
Configura alertas para:
- Disco >80% por cliente
- Sitio caído
- Certificado SSL por expirar
Facturación y rentabilidad
Modelo de precios sugerido
| Tipo de cliente | Coste tuyo | Precio cliente | Margen |
|---|---|---|---|
| Web simple | ~€5/mes | €15-25/mes | 200-400% |
| WordPress medio | ~€10/mes | €30-50/mes | 200-400% |
| WooCommerce | ~€15/mes | €50-100/mes | 230-560% |
Calcular coste por cliente
VPS €40/mes ÷ 10 clientes = €4/cliente base
+ Backup externo: €1/cliente
+ Tu tiempo: €5-10/cliente
= Coste real: €10-15/cliente
Dimensionamiento del VPS
| Clientes | RAM | CPU | Disco |
|---|---|---|---|
| 5-10 | 4GB | 2 cores | 80GB |
| 10-20 | 8GB | 4 cores | 160GB |
| 20-50 | 16GB | 6 cores | 300GB |
| 50+ | 32GB+ | 8+ cores | 500GB+ |
Onboarding de nuevo cliente
Checklist
□ Crear usuario sistema
□ Crear directorio web
□ Crear base de datos
□ Configurar virtual host Nginx
□ Configurar pool PHP-FPM
□ Instalar SSL (Let's Encrypt)
□ Configurar DNS del cliente
□ Crear acceso SFTP
□ Añadir a script de backup
□ Documentar credenciales
□ Enviar datos al cliente
Script de onboarding
#!/bin/bash
# /root/scripts/nuevo-cliente.sh
DOMINIO=$1
USUARIO=$2
# Crear usuario
adduser $USUARIO --disabled-password
# Crear estructura
mkdir -p /var/www/$DOMINIO/public_html
chown -R $USUARIO:www-data /var/www/$DOMINIO
# Crear BD
mysql -e "CREATE DATABASE ${USUARIO}_wp;"
mysql -e "CREATE USER '${USUARIO}'@'localhost' IDENTIFIED BY 'CAMBIAR';"
mysql -e "GRANT ALL ON ${USUARIO}_wp.* TO '${USUARIO}'@'localhost';"
# Crear virtual host (template)
cp /root/templates/nginx-site.conf /etc/nginx/sites-available/$DOMINIO
sed -i "s/DOMINIO/$DOMINIO/g" /etc/nginx/sites-available/$DOMINIO
sed -i "s/USUARIO/$USUARIO/g" /etc/nginx/sites-available/$DOMINIO
ln -s /etc/nginx/sites-available/$DOMINIO /etc/nginx/sites-enabled/
# SSL
certbot --nginx -d $DOMINIO -d www.$DOMINIO --non-interactive --agree-tos -m [email protected]
nginx -t && systemctl reload nginx
echo "Cliente $DOMINIO creado"
Preguntas frecuentes
¿Cuántos sitios puedo alojar en un VPS?
Depende del tipo de sitios. WordPress simples: 20-30 en 4GB RAM. WooCommerce: 5-10. La clave es monitorizar recursos y escalar cuando sea necesario.
¿Debo usar panel de control o configurar manualmente?
Para agencias, un panel gratuito como CyberPanel ahorra mucho tiempo. La configuración manual da más control pero requiere más trabajo. Evalúa tu tiempo vs complejidad.
¿Cómo aíslo a los clientes entre sí?
Usuarios separados, pools PHP-FPM individuales, bases de datos separadas, y open_basedir configurado. Así un cliente comprometido no afecta a otros.
¿Qué hago si un cliente consume demasiados recursos?
Configura límites en su pool PHP-FPM, revisa si hay problemas en su código, o considera moverlo a su propio VPS si es persistente.
¿Es legal revender hosting así?
Sí, es legal. Eres responsable del servicio que ofreces a tus clientes. Asegúrate de tener términos de servicio claros y backups fiables.
Nuestra recomendación
Para empezar (5-15 clientes):
- VPS 4-8GB
- CyberPanel o CloudPanel
- Usuarios y pools separados
- Backups diarios
Para escalar (15+ clientes):
- VPS 16GB+ o múltiples VPS
- Automatización con scripts
- Monitorización activa
- Considerar administración gestionada
¿Buscas VPS para tu agencia? Explora los VPS de Avantys con recursos garantizados y soporte técnico en español.
Conclusión
Un VPS bien organizado puede alojar decenas de clientes de forma rentable. La clave es aislamiento, automatización y monitorización.
Empieza con estructura sólida y escala según crezca tu agencia.
¿Quieres que lo hagamos por ti?
En Avantys gestionamos tu web, hosting y crecimiento digital de punta a punta. Tú a lo importante.