Hosting Equipo Avantys 4 min

Staging y Producción en VPS: Flujo Profesional

Cómo configurar entornos de staging y producción en VPS. Separación, sincronización, testing antes de deploy y mejores prácticas.

// Compartir

Staging y Producción en VPS: Flujo Profesional
Staging y producción en VPS

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 stagingCon staging
Pruebas en producciónPruebas aisladas
Usuarios ven erroresUsuarios solo ven estable
Rollback complicadoDeploy con confianza
Estrés constanteTranquilidad

Arquitectura de entornos

Flujo staging a producción
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 entornos en 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.

Hablar con Avantys
// Boletín

Suscríbete al boletín

Guías nuevas, sin spam. Cancela cuando quieras.