What is the fastest way to duplicate one of my own websites (Wordpress) which currently sits on my Nginx server environment on my VPS, for testing purposes? Is there a script or a utility that will make it automatically?

Say, the full url is: || `example.com`.

and the utility will duplicate the site as to:

The website is a simple Wordpress website with 30 pages and 5 basic plugins. No customizations anywhere (system or Wordpress).

  • Likely there is no fast way. It could be developed, but it would be a big work and it is a rare problem. – peterh Nov 30 '17 at 1:59
  • Dear @peterh please see my updated question with a code I tried to write for this task and its readme file. – Arcticooling Nov 30 '17 at 8:45
  • 1
    You forgot to mention, that you have access to the file structure and to the database of the site. Your question looks like if you would want to duplicate a site to which you don't have any access. Exactly this ignorance is what drives many answerers total crazy here. – peterh Nov 30 '17 at 10:18
  • 1
    Btw, the script is good. Well-written. You are good in the command line. :-) – peterh Nov 30 '17 at 13:37
  • Hmm, sorry not to mention this clearly (I've now edited) and so much thanks! – Arcticooling Nov 30 '17 at 15:50

This is not fast, but the following code describes the approach I took. Copy paste to test, and if worked, run as one piece by putting the code in a block:

    The code...

The code

cd /var/www/html/
echo "1/3: Please enter the domain of the site you want to duplicate into a subdomain test version." && read domain
echo "2/3: Please enter the password for your Mysql root user." && read -s rps
echo "3/3: Please enter the password of the site's DB user." && read -s sps
ipa=$(ifconfig | grep -Po "inet addr:\K[^\s]+" | grep -v "^127")

rm -rf ./test/ ./test.sql
cp -r ./${domain} ./test/
sed -i "s/${domain}/test"/g ./test/wp-config.php
cp -r /etc/nginx/sites-available/${domain}.conf /etc/nginx/sites-available/test.conf
sed -i "s/${domain}/test"/g /etc/nginx/sites-available/test.conf
ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled/test.conf

echo "DROP USER IF EXISTS 'test'@'localhost';" | mysql -u root -p"${rps}"
echo "DROP database IF EXISTS test;" | mysql -u root -p"${rps}"
echo "CREATE USER 'test'@'localhost' IDENTIFIED BY \"${sps}\";" | mysql -u root -p"${rps}"
echo "CREATE database test;" | mysql -u root -p"${rps}"
echo "GRANT ALL PRIVILEGES ON test.* TO test@localhost;" | mysql -u root -p"${rps}"
mysql -u root -p"${rps}" -e "SELECT user FROM mysql.user; SHOW grants FOR "test'@'localhost"; show databases;"

mysqldump -u root -p"${rps}" "${domain}" > test.sql
mysql -u test -p"${sps}" test < ./test.sql

cd test
wp search-replace "https://${domain}" "http://test.${ipa}/test" --allow-root
# Note that https:// && http:// are needed to apply a URL rewrite rule.

cat <<-TESTCONF > /etc/nginx/sites-available/test.${domain}.conf
    server {
        root /var/www/html/test/;
        server_name ${ipa} test.${domain};

        location / {
            index index.php index.html index.htm fastcgi_index;
            try_files $uri $uri =404 $uri/ /index.php?$args;

        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;

        listen 80;

unset domain rps sps ipa

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.