Probar cambios directamente en producción es receta para desastres. Esta guía te enseña a configurar un flujo profesional con entornos separados.
Por qué necesitas staging
| Sin staging | Con staging |
|---|---|
| Pruebas en producción | Pruebas aisladas |
| Usuarios ven errores | Usuarios solo ven estable |
| Rollback complicado | Deploy con confianza |
| Estrés constante | Tranquilidad |
Arquitectura de entornos
Local → Staging → Producción
↓ ↓ ↓
Desarrollo Testing Usuarios
Opción 1: Subdominios (un VPS)
staging.tudominio.com → /var/www/staging/
www.tudominio.com → /var/www/produccion/
Coste: €0 extra (mismo VPS) Riesgo: Staging puede afectar producción
Opción 2: VPS separados (recomendado)
VPS Staging → staging.tudominio.com
VPS Producción → www.tudominio.com
Coste: ~€10-20/mes extra Ventaja: Aislamiento total
Configurar staging en mismo VPS
Estructura de directorios
/var/www/
├── staging.tudominio.com/
│ └── public_html/
└── tudominio.com/
└── public_html/
Nginx para staging
# /etc/nginx/sites-available/staging.tudominio.com
server {
listen 80;
server_name staging.tudominio.com;
root /var/www/staging.tudominio.com/public_html;
# Proteger con contraseña
auth_basic "Staging";
auth_basic_user_file /etc/nginx/.htpasswd;
# Bloquear indexación
add_header X-Robots-Tag "noindex, nofollow";
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Crear contraseña para staging
# Instalar htpasswd
sudo apt install apache2-utils -y
# Crear usuario
sudo htpasswd -c /etc/nginx/.htpasswd staging
# Introducir contraseña
Base de datos separada
-- Staging
CREATE DATABASE tudominio_staging;
GRANT ALL ON tudominio_staging.* TO 'staging_user'@'localhost' IDENTIFIED BY 'password';
-- Producción (ya existe)
-- tudominio_prod
Sincronizar producción → staging
Script de sincronización
#!/bin/bash
# /root/scripts/sync-prod-to-staging.sh
echo "=== Sincronizando Producción → Staging ==="
# Variables
PROD_DIR="/var/www/tudominio.com/public_html"
STAGING_DIR="/var/www/staging.tudominio.com/public_html"
PROD_DB="tudominio_prod"
STAGING_DB="tudominio_staging"
# 1. Sincronizar archivos
echo "→ Sincronizando archivos..."
rsync -av --delete \
--exclude='wp-config.php' \
--exclude='.env' \
--exclude='uploads/' \
$PROD_DIR/ $STAGING_DIR/
# 2. Sincronizar base de datos
echo "→ Sincronizando base de datos..."
mysqldump $PROD_DB > /tmp/prod_dump.sql
mysql $STAGING_DB < /tmp/prod_dump.sql
rm /tmp/prod_dump.sql
# 3. Actualizar URLs (WordPress)
echo "→ Actualizando URLs..."
mysql $STAGING_DB -e "
UPDATE wp_options SET option_value = 'https://staging.tudominio.com'
WHERE option_name IN ('siteurl', 'home');
"
# 4. Permisos
chown -R www-data:www-data $STAGING_DIR
echo "=== Sincronización completada ==="
Deploy staging → producción
Script de deploy
#!/bin/bash
# /root/scripts/deploy-staging-to-prod.sh
set -e
STAGING_DIR="/var/www/staging.tudominio.com/public_html"
PROD_DIR="/var/www/tudominio.com/public_html"
BACKUP_DIR="/backups/pre-deploy"
DATE=$(date +%Y%m%d_%H%M%S)
echo "=== Deploy Staging → Producción ==="
# 1. Backup de producción
echo "→ Creando backup..."
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/prod_$DATE.tar.gz $PROD_DIR
mysqldump tudominio_prod > $BACKUP_DIR/db_$DATE.sql
# 2. Sincronizar archivos
echo "→ Desplegando archivos..."
rsync -av --delete \
--exclude='wp-config.php' \
--exclude='.env' \
--exclude='uploads/' \
$STAGING_DIR/ $PROD_DIR/
# 3. Limpiar caché
echo "→ Limpiando caché..."
rm -rf $PROD_DIR/wp-content/cache/*
# 4. Permisos
chown -R www-data:www-data $PROD_DIR
echo "=== Deploy completado ==="
echo "Backup guardado en: $BACKUP_DIR"
Flujo con Git
Estructura de ramas
main → Producción
develop → Staging
feature/* → Desarrollo
Deploy automático con Git hooks
# En VPS producción: /var/www/tudominio.com/.git/hooks/post-receive
#!/bin/bash
git --work-tree=/var/www/tudominio.com/public_html checkout -f main
cd /var/www/tudominio.com/public_html
composer install --no-dev
php artisan migrate --force
php artisan cache:clear
Push para deploy
# Desde local
git push production main # Deploy a producción
git push staging develop # Deploy a staging
WordPress: WP-CLI para sincronización
# Exportar BD de producción
wp db export prod.sql --path=/var/www/tudominio.com/public_html
# Importar en staging
wp db import prod.sql --path=/var/www/staging.tudominio.com/public_html
# Reemplazar URLs
wp search-replace 'tudominio.com' 'staging.tudominio.com' \
--path=/var/www/staging.tudominio.com/public_html
Variables de entorno
Archivo .env por entorno
# /var/www/tudominio.com/.env (producción)
APP_ENV=production
APP_DEBUG=false
DB_DATABASE=tudominio_prod
# /var/www/staging.tudominio.com/.env (staging)
APP_ENV=staging
APP_DEBUG=true
DB_DATABASE=tudominio_staging
WordPress wp-config.php
// Detectar entorno
if (strpos($_SERVER['HTTP_HOST'], 'staging') !== false) {
define('WP_DEBUG', true);
define('DB_NAME', 'tudominio_staging');
} else {
define('WP_DEBUG', false);
define('DB_NAME', 'tudominio_prod');
}
Checklist pre-deploy
□ Tests pasando en staging
□ Revisión visual completada
□ Performance aceptable
□ Backup de producción creado
□ Ventana de mantenimiento planificada
□ Plan de rollback preparado
Preguntas frecuentes
¿Puedo usar el mismo VPS para staging y producción?
Sí, con subdominios. Es más económico pero hay riesgo de que staging afecte producción. Para proyectos críticos, usa VPS separados.
¿Cómo manejo los uploads/media entre entornos?
No sincronices uploads frecuentemente. Staging puede apuntar a los uploads de producción vía symlink, o mantener un set de prueba.
¿Con qué frecuencia debo sincronizar staging con producción?
Antes de cada ciclo de desarrollo. Para proyectos activos, semanal o antes de features grandes.
¿Necesito SSL en staging?
Recomendado. Algunos features no funcionan sin HTTPS. Let's Encrypt es gratis, no hay excusa.
¿Cómo hago rollback si algo falla?
Restaura el backup pre-deploy. Por eso es crítico hacer backup antes de cada deploy. Con el script incluido, tienes archivos y BD respaldados.
Nuestra recomendación
Mínimo viable:
- Staging en subdominio (mismo VPS)
- Protegido con contraseña
- Script de sincronización
Profesional:
- VPS separados
- Deploy automatizado con Git
- CI/CD integrado
Siempre:
- Backup antes de deploy
- Variables de entorno separadas
- No pruebas en producción
¿Necesitas ayuda configurando entornos? La administración gestionada de Avantys incluye configuración de flujos de deploy profesionales.
Conclusión
Un flujo staging → producción ahorra dolores de cabeza. La inversión en configurarlo se paga con el primer error que evitas.
Empieza con staging básico y evoluciona según crezcan tus necesidades.
¿Quieres que lo hagamos por ti?
En Avantys gestionamos tu web, hosting y crecimiento digital de punta a punta. Tú a lo importante.