| Server IP : 146.190.157.162 / Your IP : 216.73.217.6 Web Server : Apache System : Linux ubuntu-s-2vcpu-4gb-amd-sfo3-01-KIT-DIGITAL 6.5.0-44-generic #44-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 7 15:10:09 UTC 2024 x86_64 User : businessweek ( 639) PHP Version : 8.2.10-2ubuntu2.2 Disable Function : exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_signal,pcntl_signal_dispatch,pcntl_getpriority,pcntl_setpriority,dl,putenv,parse_ini_file,show_source MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/html/wordpress-manager/resources/scripts/ |
Upload File : |
#!/bin/bash
# Cargar variables de entorno desde el archivo .env
set -a
source /var/www/html/wordpress-manager/.env
set +a
# Archivo de log
LOG_FILE="/var/www/html/wordpress-manager/storage/logs/wordpress_duplicate.log"
exec > >(tee -a ${LOG_FILE} ) 2>&1
set -e
echo "Ejecutando duplicación de template."
# Parámetros
template="$1"
project="$2"
mysqlhost=$WEB_HOST
mysqldb="$3"
mysqluser="$3"
mysqlpassword=$(openssl rand -base64 16 | tr -d '/+=' | head -c 12)$(date +%s | sha256sum | head -c 4 | tr '0-9' 'A-Z')$(echo $RANDOM | tr -dc '0-9' | head -c 4)\!
template_url="$4"
mysqlroothost=$MYSQL_ROOT_HOST
mysqlrootusername=$MYSQL_ROOT_USERNAME
mysqlrootpassword=$MYSQL_ROOT_PASSWORD
# Validar parámetros
if [ -z "$template" ]; then
echo "Error: El parámetro 'template' no fue proporcionado."
exit 1
elif [ -z "$project" ]; then
echo "Error: El parámetro 'project' no fue proporcionado."
exit 1
elif [ -z "$mysqldb" ]; then
echo "Error: El parámetro 'mysqldb' no fue proporcionado."
exit 1
elif [ -z "$mysqluser" ]; then
echo "Error: El parámetro 'mysqluser' no fue proporcionado."
exit 1
elif [ -z "$mysqlpassword" ]; then
echo "Error: El parámetro 'mysqlpassword' no fue proporcionado."
exit 1
elif [ -z "$template_url" ]; then
echo "Error: El parámetro 'template_url' no fue proporcionado."
exit 1
fi
echo "Continuando proceso."
# Copiar el template
echo "Copiando el template $template a $project..."
cp -r /var/www/html/"$template" /var/www/html/"$project"
if [ $? -ne 0 ]; then
echo "Error copiando el template."
exit 1
fi
# Cambiar permisos
echo "Cambiando permisos..."
sudo chown -R www-data:www-data /var/www/html/"$project"
if [ $? -ne 0 ]; then
echo "Error cambiando la propiedad de archivos."
exit 1
fi
sudo find /var/www/html/"$project" -type d -exec chmod 750 {} \;
if [ $? -ne 0 ]; then
echo "Error ajustando permisos de directorios."
exit 1
fi
sudo find /var/www/html/"$project" -type f -exec chmod 640 {} \;
if [ $? -ne 0 ]; then
echo "Error ajustando permisos de archivos."
exit 1
fi
# Cambiar a directorio del proyecto
echo "Cambiando al directorio del proyecto..."
cd /var/www/html/"$project"
if [ $? -ne 0 ]; then
echo "Error cambiando al directorio del proyecto."
exit 1
fi
#////////////////////////////////////////////////////////////////////////////////////////////
# === Crear DB + usuario (idempotente) y limitar privilegios a esa DB ===
echo "Diagnóstico rápido de instancia MySQL..."
mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" -e \
"SELECT @@hostname AS host, @@port AS port, @@version AS version;
SHOW DATABASES LIKE '$mysqldb';" || { echo "No puedo conectar a MySQL con root"; exit 1; }
# Crear DB (no rompe si ya existe)
echo "Creando la base de datos $mysqldb (si no existe)..."
mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" -e \
"CREATE DATABASE IF NOT EXISTS \`$mysqldb\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# Crear usuario para '%' (idempotente) y asegurar password
echo "Creando/actualizando usuario '$mysqluser'@'%'..."
mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" -e \
"CREATE USER IF NOT EXISTS '$mysqluser'@'%' IDENTIFIED BY '$mysqlpassword';
ALTER USER '$mysqluser'@'%' IDENTIFIED BY '$mysqlpassword';"
# (Opcional pero recomendado) también para 'localhost' por si WP usa socket
echo "Creando/actualizando usuario '$mysqluser'@'localhost'..."
mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" -e \
"CREATE USER IF NOT EXISTS '$mysqluser'@'localhost' IDENTIFIED BY '$mysqlpassword';
ALTER USER '$mysqluser'@'localhost' IDENTIFIED BY '$mysqlpassword';"
# Conceder privilegios SOLO sobre esa base
echo "Asignando privilegios SOLO sobre \`$mysqldb\`..."
mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" -e \
"GRANT ALL PRIVILEGES ON \`$mysqldb\`.* TO '$mysqluser'@'%';
GRANT ALL PRIVILEGES ON \`$mysqldb\`.* TO '$mysqluser'@'localhost';
FLUSH PRIVILEGES;"
# Verificación
echo "Verificando grants y presencia de la DB..."
mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" -e \
"SHOW GRANTS FOR '$mysqluser'@'%';
SHOW GRANTS FOR '$mysqluser'@'localhost';
SHOW DATABASES LIKE '$mysqldb';"
# === Actualizar wp-config.php con las nuevas credenciales ===
echo "Actualizando wp-config.php con DB, usuario y contraseña..."
db_host_effective="$mysqlroothost"
if [ "$db_host_effective" = "localhost" ] || [ -z "$db_host_effective" ]; then
db_host_effective="127.0.0.1"
fi
sudo sed -i -E "s/define\(\s*'DB_NAME'\s*,\s*'[^']*'\s*\);/define( 'DB_NAME', '$mysqldb' );/g" wp-config.php || { echo "Error actualizando DB_NAME en wp-config.php"; exit 1; }
sudo sed -i -E "s/define\(\s*'DB_USER'\s*,\s*'[^']*'\s*\);/define( 'DB_USER', '$mysqluser' );/g" wp-config.php || { echo "Error actualizando DB_USER en wp-config.php"; exit 1; }
sudo sed -i -E "s/define\(\s*'DB_PASSWORD'\s*,\s*'[^']*'\s*\);/define( 'DB_PASSWORD', '$mysqlpassword' );/g" wp-config.php || { echo "Error actualizando DB_PASSWORD en wp-config.php"; exit 1; }
sudo sed -i -E "s/define\(\s*'DB_HOST'\s*,\s*'[^']*'\s*\);/define( 'DB_HOST', '$db_host_effective' );/g" wp-config.php || { echo "Error actualizando DB_HOST en wp-config.php"; exit 1; }
if ! grep -q "define( 'DB_HOST'" wp-config.php; then
sudo sed -i "/require_once/s/^/define( 'DB_HOST', '$db_host_effective' );\n/" wp-config.php
fi
# Test de conexión
echo "Testeando conexión MySQL con las credenciales de wp-config.php..."
db_name=$(grep -E "define\(\s*'DB_NAME'" wp-config.php | sed -E "s/.*'DB_NAME',\s*'([^']+)'.*/\1/")
db_user=$(grep -E "define\(\s*'DB_USER'" wp-config.php | sed -E "s/.*'DB_USER',\s*'([^']+)'.*/\1/")
db_pass=$(grep -E "define\(\s*'DB_PASSWORD'" wp-config.php | sed -E "s/.*'DB_PASSWORD',\s*'([^']+)'.*/\1/")
db_host=$(grep -E "define\(\s*'DB_HOST'" wp-config.php | sed -E "s/.*'DB_HOST',\s*'([^']+)'.*/\1/")
mysql -h "$db_host" -u "$db_user" -p"$db_pass" -e "USE \`$db_name\`; SELECT 1;" \
|| { echo "❌ Fallo la conexión MySQL con credenciales de WP"; exit 1; }
#////////////////////////////////////////////////////////////////////////////////////////////
# # Actualizar wp-config.php
# echo "Actualizando wp-config.php..."
# sudo sed -i "s/\(define( 'DB_NAME', '\)[^']*\(' );\)/\1$mysqldb\2/" wp-config.php
# if [ $? -ne 0 ]; then
# echo "Error actualizando wp-config.php (reemplazo de template por project)."
# exit 1
# fi
# sudo sed -i "s/\(define( 'DB_USER', '\)[^']*\(' );\)/\1$mysqluser\2/" wp-config.php
# if [ $? -ne 0 ]; then
# echo "Error actualizando wp-config.php (reemplazo de user por project)."
# exit 1
# fi
# sudo sed -i "s/\(define( 'DB_PASSWORD', '\)[^']*\(' );\)/\1$mysqlpassword\2/" wp-config.php
# if [ $? -ne 0 ]; then
# echo "Error actualizando wp-config.php (reemplazo de pass por project)."
# exit 1
# fi
# # Crear la base de datos
# echo "Creando la base de datos $mysqldb..."
# mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" -e "CREATE DATABASE $mysqldb;"
# if [ $? -ne 0 ]; then
# echo "Error creando la base de datos."
# exit 1
# fi
# # Crear el usuario para la base
# echo "Creando el usuario $mysqluser para la base $mysqldb..."
# mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" -e "CREATE USER $mysqluser@'%' IDENTIFIED BY '$mysqlpassword';"
# if [ $? -ne 0 ]; then
# echo "Error creando al crear el usuario $mysqluser para la base $mysqldb."
# exit 1
# fi
# # Asignando privilegios al usuario
# echo "Asignando privilegios al usuario $mysqluser para la base $mysqldb..."
# mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" -e "GRANT ALL PRIVILEGES ON $mysqldb.* TO $mysqluser@'%';"
# if [ $? -ne 0 ]; then
# echo "Error al asignar privilegios al usuario $mysqluser para la base $mysqldb."
# exit 1
# fi
# # Flush Privilegios
# echo "Flush Privilegios al usuario $mysqluser para la base $mysqldb..."
# mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" -e "FLUSH PRIVILEGES;"
# if [ $? -ne 0 ]; then
# echo "Error en Flush Privilegios"
# exit 1
# fi
#////////////////////////////////////////////////////////////////////////////////////////////
# Hacer un dump de la base de datos del template
echo "Haciendo dump de la base de datos del template..."
mysqldump -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" "$template" > "$template.sql"
if [ $? -ne 0 ]; then
echo "Error haciendo dump de la base de datos del template."
exit 1
fi
# Importar el dump en la nueva base de datos
echo "Importando el dump en la nueva base de datos..."
mysql -h "$mysqlroothost" -u "$mysqlrootusername" -p"$mysqlrootpassword" "$mysqldb" < "$template.sql"
if [ $? -ne 0 ]; then
echo "Error importando el dump en la nueva base de datos."
exit 1
fi
# Eliminar el archivo dump
echo "Eliminando el archivo de dump..."
rm "$template.sql"
if [ $? -ne 0 ]; then
echo "Error eliminando el archivo de dump."
exit 1
fi
# Actualizar las URLs en la base de datos
echo "Actualizando las URLs en la base de datos..."
mysql -h "$mysqlroothost" -u "$mysqluser" -p"$mysqlpassword" "$mysqldb" -e "
UPDATE wp_options SET option_value = 'https://$project.devuocloud.com' WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET guid = replace(guid, 'http://$template_url.devuocloud.com','https://$project.devuocloud.com');
UPDATE wp_posts SET guid = replace(guid, 'https://$template_url.devuocloud.com','https://$project.devuocloud.com');
UPDATE wp_posts SET post_content = replace(post_content, 'http://$template_url.devuocloud.com', 'https://$project.devuocloud.com');
UPDATE wp_posts SET post_content = replace(post_content, 'https://$template_url.devuocloud.com', 'https://$project.devuocloud.com');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://$template_url.devuocloud.com','https://$project.devuocloud.com');
UPDATE wp_postmeta SET meta_value = replace(meta_value,'https://$template_url.devuocloud.com','https://$project.devuocloud.com');
"
if [ $? -ne 0 ]; then
echo "Error actualizando las URLs en la base de datos."
exit 1
fi
# Crear la configuración de Apache
echo "Creando la configuración de Apache para $project..."
sudo touch /etc/apache2/sites-available/"$project.conf"
if [ $? -ne 0 ]; then
echo "Error creando el archivo de configuración de Apache."
exit 1
fi
echo "
<VirtualHost *:80>
ServerAdmin dev@uosolutions.com
ServerName $project.devuocloud.com
DocumentRoot /var/www/html/$project
<Directory /var/www/html/$project>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
SSLCertificateFile /etc/apache2/certs/devuocloud.com.crt
SSLCertificateKeyFile /etc/apache2/certs/devuocloud.com.key
ErrorLog /var/log/apache2/$project-error.log
CustomLog /var/log/apache2/$project-access.log combined
</VirtualHost>" | sudo tee /etc/apache2/sites-available/"$project.conf" > /dev/null
if [ $? -ne 0 ]; then
echo "Error escribiendo la configuración de Apache."
exit 1
fi
# Habilitar el sitio en Apache y recargar el servicio
echo "Habilitando el sitio en Apache..."
sudo a2ensite "$project.conf"
if [ $? -ne 0 ]; then
echo "Error habilitando el sitio en Apache."
exit 1
fi
echo "Crea usuario:grupo y corrige permisos del direstorio"
/var/www/html/wordpress-manager/resources/scripts/user-new.sh $project
echo "Recargando Apache..."
sudo systemctl reload apache2
if [ $? -ne 0 ]; then
echo "Error recargando Apache."
exit 1
fi
echo "Verificando si ya existe un certificado SSL para $project.devuocloud.com..."
# Verifica si el certificado ya está emitido
if sudo certbot certificates | grep -q "$project.devuocloud.com"; then
echo "✅ El certificado SSL para $project.devuocloud.com ya está instalado. No se realizará una nueva instalación."
else
echo "⚙️ Instalando SSL para $project.devuocloud.com..."
sudo certbot --apache -d $project.devuocloud.com
if [ $? -ne 0 ]; then
echo "❌ Error instalando SSL para $project.devuocloud.com."
exit 1
else
echo "✅ SSL instalado correctamente para $project.devuocloud.com."
fi
fi
echo "Instalación completada exitosamente."