Advertisement
  1. Code
  2. WordPress

Klonen Sie WordPress unter Linux

Scroll to top
Read Time: 17 min

() translation by (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Das Duplizieren von WordPress scheint nie einfach zu sein

Ich möchte oft eine neue WordPress-Site basierend auf einer vorhandenen Site als Vorlage entwerfen. Die Konfigurationen für Themen, Plugins und Einstellungen können zunächst sehr nützlich sein, im Gegensatz zu einer Neuinstallation, bei der Sie alles von Anfang an wiederholen müssen.

Beim Erstellen eines App-Images für den Wiederverkauf bei Digital Ocean ging ich durch die Konstruktion eines installierbaren, vorkonfigurierten und voroptimierten WordPress-Tröpfchens. Im Wesentlichen handelt es sich um ein Digital Ocean-Image, mit dem eine vollständig geladene WordPress-Site in wenigen Minuten gestartet werden kann. Aber öfter möchte ich eine WordPress-Site zu einem meiner bereits vorhandenen Server hinzufügen.

Es gibt eine Reihe von Möglichkeiten, dies zu tun, aber ich finde oft, dass sie einen spezifischen und detaillierten Ansatz erfordern, den ich jedes Mal neu lernen muss. Ich entschied, dass es Zeit war, ein Linux-Shell-Skript zu entwickeln, das alles in wenigen Minuten für mich erledigen würde.

In diesem Tutorial werde ich Sie durch meine Recherchen und das daraus resultierende Klonskript für WordPress führen. Ich hoffe es gefällt dir - ich dachte, es hat ziemlich gut funktioniert, als ich damit fertig war.

Bevor wir anfangen, denken Sie bitte daran, dass ich versuche, an den folgenden Diskussionen teilzunehmen. Wenn Sie eine Frage oder einen Themenvorschlag haben, schreiben Sie bitte unten einen Kommentar oder kontaktieren Sie mich auf Twitter @reifman. Sie können mir auch direkt eine E-Mail senden. Ich gehe davon aus, dass einige von Ihnen bessere Ideen und Verbesserungen für dieses Skript haben werden. Ich würde mich freuen, von Ihnen zu hören.

Andere Ansätze zur WordPress-Migration

Oft können Sie eine neue Website starten, indem Sie eine vorhandene auf einen neuen Server migrieren, sie im Wesentlichen kopieren und auf der Kopie aufbauen, während die Quellwebsite intakt bleibt. Hierfür gibt es eine Reihe von Ansätzen.

Beim Verschieben von WordPress auf einen neuen Server, der mit WordPress veröffentlicht wird, habe ich über die Verwendung des Duplicator-Plugins geschrieben, aber ich habe festgestellt, dass der Vorgang umständlich ist. Es war auch schwierig, mich jedes Mal mit Duplicator vertraut zu machen, wenn ich eine Site verschieben muss.

Kürzlich habe ich darüber in Sichern und Wiederherstellen Ihrer WordPress-Site mit CodeGuard für Envato Tuts+ geschrieben. Es ist ein Service, der diesen Prozess ein bisschen einfacher macht. In Kürze wird die Vereinfachung der Verwaltung mehrerer WordPress-Sites veröffentlicht, in der eine Reihe leistungsstarker Vorteile bei der Verwendung von ManageWP beschrieben werden. Es verfügt über eine Klonfunktion, erfordert jedoch FTP. Aus Sicherheitsgründen vermeide ich die Ausführung von FTP auf meinen Servern.

Es gibt auch zweiteilige Envato Tuts+ Serie: Verschieben von WordPress: Eine Einführung und Verschieben von WordPress: Verwendung von Plugins zum Verschieben Ihrer Website. Und es gibt dieses Tutorial bei WPBeginner, das BackupBuddy verwendet. Schließlich benötigt WPClone kein FTP, sondern eine saubere WordPress-Installation, um darauf aufzubauen.

Sie können aus all diesen Tutorials und Diensten viel lernen, aber ich wollte sehen, ob ich ein Befehlszeilenskript erstellen kann, mit dem eine WordPress-Site jedes Mal schneller und einfacher geklont werden kann.

Planen des Skripts

Um dieses Tutorial zu schreiben, habe ich mich sehr auf frühere Arbeiten anderer verlassen, um mein Wissen über Bash-Skripte und die Manipulation von WordPress-Sites zu erweitern. Ich habe mich nie als erfahrener Linux-Systemadministrator betrachtet. Letztendlich habe ich beschlossen, mein Klonskript auf Brian Gallagher WordPress Bash Install Script aufzubauen.

Hinweis: Dies sind Debian-basierte Setup-Skripte. Andere Linux-Varianten wie RedHat und CentOS haben unterschiedliche Pfade für Apache und unterschiedliche Dienstprogramme.

Hier ist Gallaghers Beschreibung seines Basisskripts:

Lädt die neueste WP-Version herunter, aktualisiert wp-config mit dem vom Benutzer angegebenen DB-Namen, Benutzernamen und Passwort, erstellt und lädt das Upload-Verzeichnis von CHMOD, kopiert alle Dateien in das Stammverzeichnis, aus dem Sie das Skript ausführen, und löscht sich dann selbst!

Zunächst gibt es hier eine Menge gut organisierter Skripte, aber ich wollte etwas erstellen, das eine aktive Site klonen kann. Lassen Sie uns die Architektur einer typischen WordPress-Konfiguration überprüfen.

Die Anfangskomponenten einer WordPress-Site

Eine typische WordPress-Installation enthält vier Hauptkomponenten zum Klonen:

  1. Verzeichnisbaum der Site
  2. Datenbank
  3. Webserverkonfiguration, z.B. Apache conf Datei
  4. Domänenzuordnung

Es gibt auch Informationen, Zugriff und Sicherheitseinstellungen, die wir benötigen:

  • Serververwaltungskonto und Kennwort
  • Benutzername und Passwort des MySQL-Servers
  • Quellverzeichnis der Site
  • Konfigurationsdatei des Webservers der Site
  • Datenbankname, Benutzername und Passwort

Folgendes müssen wir für die geklonte Site angeben:

  • Zielverzeichnis der geklonten Site
  • Name, Benutzername und Passwort der geklonten Datenbank
  • Webserver-Konfigurationsdatei geklonter Sites

Was das Skript tun muss

  • Erfassen Sie alle Einstellungen über Konfigurationsvariablen oder Benutzereingaben.
  • Kopieren Sie das Site-Verzeichnis und stellen Sie es in einem Zielverzeichnis wieder her.
  • Exportieren Sie die Quellendatenbank und importieren Sie sie in eine Zieldatenbank.
  • Stellen Sie die richtigen Berechtigungen für diese Verzeichnisse sicher.
  • Kopieren Sie die Serverkonfigurationsdatei und aktualisieren Sie die Domänen- und Verzeichniseinstellungen.
  • Laden Sie den Webserver neu.

Manuell müssen wir das DNS für die neue Zieldomäne aktualisieren. Ich empfehle, DNS-Einträge zu erstellen, bevor Sie beginnen, damit sie nach dem Klonen Ihrer Site bereit sind. Es gibt nichts Schöneres, als eine Site zu klonen und den Domainnamen nicht testen zu können, weil Sie auf den DNS warten.

Der Ansatz des Klonskripts

Jetzt können wir durchgehen, wie die Architektur des Skripts funktioniert. Wieder habe ich zunächst das WordPress-Installationsskript von Gallagher genutzt, und Sie benötigen diese erste Bash-Zeile oben:

1
#!/bin/bash -e

2
# Clone a WordPress site via Bash script

3
clear
4
echo "==================================================="
5
echo "Clone WordPress Script"
6
echo "==================================================="

Vorbereiten Ihrer DNS-Einstellungen

Bevor Sie eine Site duplizieren, müssen Sie das DNS für die geklonte Site konfigurieren. Informationen zur DNS-Konfiguration für eine neue WordPress-Site finden Sie hier. Ich freue mich auch über dieses Envato Tuts+ Tutorial, eine Einführung in das Lernen und Verwenden von DNS-Einträgen.

Grundsätzlich müssen Sie einen A-Datensatz oder CNAME erstellen, der Ihre gewünschte Klon-URL an den Server weiterleitet, auf dem wir duplizieren.

Berechtigungen festlegen

Auf meinem Server erstelle ich ein Bash-Skript namens clonewp.sh. Es werden ausführbare Berechtigungen benötigt:

1
chmod +x clonewp.sh

Sobald es fertig ist, können Sie es wie folgt ausführen:

1
sudo bash clonewp.sh

Ich empfehle, das Skript als sudo auszuführen, damit Sie nicht auf Probleme mit Dateiberechtigungen stoßen.

Standardeinstellungen festlegen

Zu Testzwecken habe ich die Möglichkeit erstellt, das Skript mit den Standardeinstellungen vorzuladen. Es hat mir geholfen, die Tests wiederholt zu durchlaufen, ohne alles immer wieder eingeben zu müssen. Ich dachte auch, dass es für Leute nützlich sein könnte, die das Skript später ändern oder auf andere Weise verwenden möchten.

Hier sind alle Standardeinstellungen:

1
# Set Default Settings (helpful for testing)

2
default_mysql_user=$"root-admin"
3
default_mysql_pass=$"super-strong-password"
4
default_source_domain=$"gardening.io"
5
default_target_domain=$"cycling.io"
6
default_source_directory=$"/var/www/gardening"
7
default_target_directory=$"/var/www/cycling"
8
default_apache_directory=$"/etc/apache2/sites-available"
9
default_source_conf=$"gardening.conf"
10
default_target_conf=$"cycling.conf"
11
default_source_dbname=$"gardening"
12
default_source_dbuser=$"user_for_garden"
13
default_source_dbpass=$"pwd_garden"
14
default_target_dbname=$"cycling"
15
default_target_dbuser=$"user_for_cycling"
16
default_target_dbpass=$"pwd_cycling"
17
NOW=$(date +"%Y-%m-%d-%H%M")

Ich weiß, es scheint viel zu sein, aber ich fand es nützlich, einen Master-MySQL-Benutzer und ein Kennwort für Datenbanksicherungen, Datenbankerstellung und Importe zu haben. Es war jedoch auch nützlich, den standortspezifischen Datenbankbenutzer und die Kennwörter zum Festlegen der Zieldatenbankberechtigungen sowie zum Suchen und Ersetzen in der Datei wp-config.php zu haben. Dies macht den ultimativen Klonprozess sehr nahtlos.

Ich habe den NOW-Zeitstempel verwendet, um sicherzustellen, dass die von uns erstellten Archive eindeutig sind.

Einstellungen anfordern

Der folgende Code zeigt dem Benutzer die Standardeinstellung an und ermöglicht es ihm, diese zu akzeptieren (Rücktaste drücken) oder zu ersetzen:

1
# Request Source Settings

2
read -p "Source Domain (e.g. "$default_source_domain"): " source_domain
3
source_domain=${source_domain:-$default_source_domain}
4
echo $source_domain
5
read -p "Source Directory (no trailing slash e.g. "$default_source_directory"): " source_directory
6
source_directory=${source_directory:-$default_source_directory}
7
echo $source_directory
8
read -p "Source Database Name (e.g. "$default_source_dbname"): " source_dbname
9
source_dbname=${source_dbname:-$default_source_dbname}
10
echo $source_dbname
11
read -p "Source Database User (e.g. "$default_source_dbuser"): " source_dbuser
12
source_dbuser=${source_dbuser:-$default_source_dbuser}
13
echo $source_dbuser
14
read -p "Source Database Pass (e.g. "$default_source_dbpass"): " source_dbpass
15
source_dbpass=${source_dbpass:-$default_source_dbpass}
16
echo $source_dbpass
17
# Request Source Settings

18
read -p "Source Conf File (e.g. "$default_source_conf"): " source_conf
19
source_conf=${source_conf:-$default_source_conf}
20
echo $source_conf
21
# Request Target Settings

22
read -p "Target Domain (e.g. "$default_target_domain"): " target_domain
23
target_domain=${target_domain:-$default_target_domain}
24
echo $target_domain
25
read -p "Target Directory (no trailing slash e.g. "$default_target_directory"): " target_directory
26
target_directory=${target_directory:-$default_target_directory}
27
echo $target_directory
28
read -p "Target Database Name (e.g. "$default_target_dbname"): " target_dbname
29
target_dbname=${target_dbname:-$default_target_dbname}
30
echo $target_dbname
31
read -p "Target Database User (e.g. "$default_target_dbuser"): " target_dbuser
32
target_dbuser=${target_dbuser:-$default_target_dbuser}
33
echo $target_dbuser
34
read -p "Target Database Pass (e.g. "$default_target_dbpass"): " target_dbpass
35
target_dbpass=${target_dbpass:-$default_target_dbpass}
36
echo $target_dbpass
37
read -p "Target Conf File (e.g. "$default_target_conf"): " target_conf
38
target_conf=${target_conf:-$default_target_conf}
39
echo $target_conf

Sobald wir alle Einstellungen vom Benutzer gesammelt haben, fragen wir ihn, ob er beginnen möchte:

1
echo "Clone now? (y/n)"
2
read -e run
3
if [ "$run" == n ] ; then

4
exit

5
else

6
echo "==================================================="
7
echo "WordPress Cloning is Beginning"
8
echo "==================================================="

Kopieren des Verzeichnisbaums

Jetzt geht es etwas schneller. Wir erstellen Tarballs der Quellsite, erstellen ein Zielverzeichnis und extrahieren dort den Tarball:

1
#backup source_directory

2
cd $source_directory
3
# add -v option to these if you want to see verbose file listings

4
tar -czf source_clone_$NOW.tar.gz .
5
#unzip clone in target directory

6
mkdir -p $target_directory
7
tar -xzf source_clone_$NOW.tar.gz -C $target_directory
8
#remove tarball of source

9
rm source_clone_$NOW.tar.gz
10
cd $target_directory

Wir führen auch die Standard-Dateiberechtigungen für WordPress aus, um sicherzustellen, dass alles ordnungsgemäß und sicher eingerichtet ist:

1
# Reset Directory Permissions

2
find $target_directory -type d -exec chmod 755 {} \;
3
find $target_directory -type f -exec chmod 644 {} \;

Aktualisieren Sie die WP-Config-Datei

Als Nächstes verwenden wir Perl, um die Quelldatenbankauthentifizierung zu suchen und durch die Zieldatenbankinformationen zu ersetzen:

1
#set database details with perl find and replace

2
perl -pi -e "s/$source_dbname/$target_dbname/g" wp-config.php
3
perl -pi -e "s/$source_dbuser/$target_dbuser/g" wp-config.php
4
perl -pi -e "s/$source_dbpass/$target_dbpass/g" wp-config.php
5
echo "define('RELOCATE',true);" | tee -a wp-config.php
6
#echo "define('WP_HOME','http://$target_domain');" | tee -a wp-config.php

7
#echo "define('WP_SITEURL','http://$target_domain');" | tee -a wp-config.php

8
echo "================================"
9
echo "Directory duplicated"
10
echo "================================"

Ich füge auch die Einstellung RELOCATE am Ende der Datei hinzu. Wenn Sie möchten, können Sie dies durch statische Einstellungen für WP_HOME und WP_SITEURL ersetzen.

Kopieren Sie die Datenbank

Als Nächstes sichern wir die Datenbank, erstellen eine neue Datenbank mit den vom Benutzer angegebenen Berechtigungen und importieren die Datenbank in diese Datenbank:

1
# Begin Database Duplication

2
# Export the database

3
mysqldump -u$mysql_user -p$mysql_pass $source_dbname > $target_directory/clone_$NOW.sql
4
# Create the target database and permissions

5
mysql -u$mysql_user -p$mysql_pass -e "create database $target_dbname; GRANT ALL PRIVILEGES ON $target_dbname.* TO '$target_dbuser'@'localhost' IDENTIFIED BY '$target_dbpass'"
6
# Import the source database into the target

7
mysql -u$mysql_user -p$mysql_pass $target_dbname < $target_directory/clone_$NOW.sql
8
echo "================================"
9
echo "Database duplicated"
10
echo "================================"

Wiederum fand ich es am besten, die Master-MySQL-Authentifizierung für diese Aktivitäten zu verwenden, während die Datenbankeinstellungen basierend auf den Einstellungen für den Quellstandort und den Einzelstandortklon konfiguriert wurden.

Kopieren Sie die Webserverkonfiguration

Schließlich sind wir bereit, die Dinge zusammenzufassen und den Startknopf zu drücken. Es ist selten, dass diese Art von Skripten den zusätzlichen Schritt für die Webserverkonfiguration verwalten. Also wollte ich das auch machen.

Ich habe die Apache .conf-Datei der Quellsite in eine neue .conf-Datei für den Klon kopiert. Ich habe Perl als Zeichenfolgenersatz für die Domänen und die Verzeichnispfade verwendet. Dann habe ich die Site mit Apache aktiviert und den Webserver neu geladen:

1
#Activate Web Configuration

2
cp $default_apache_directory/$source_conf $default_apache_directory/$target_conf
3
#set database details with perl find and replace

4
perl -pi -e "s/$source_domain/$target_domain/g" $default_apache_directory/$target_conf
5
perl -pi -e "s|${source_directory}|${target_directory}|g" $default_apache_directory/$target_conf
6
a2ensite $target_conf
7
service apache2 reload
8
echo "================================"
9
echo "Web configuration added"
10
echo "================================"
11
echo "Clone is complete."
12
echo "Test at http://"$target_domain
13
echo "================================"
14
fi

Und das ist es. So sieht ein Durchlauf des Skripts im wirklichen Leben aus:

1
===================================================
2
Clone WordPress Script
3
===================================================
4
MySQL Master Username (e.g. root-admin): harry_potter
5
harry_potter
6
MySQL Master Password (e.g. super-strong-password): voldemoort~jenny7!
7
voldemoort~jenny7!
8
Source Domain (e.g. gardening.io): 
9
gardening.io
10
Source Directory (no trailing slash e.g. /var/www/gardening): 
11
/var/www/gardening
12
Source Database Name (e.g. gardening): database_gardening
13
database_gardening
14
Source Database User (e.g. user_for_garden): hermione
15
hermione
16
Source Database Pass (e.g. pwd_garden): !987654321abcdefgh#
17
!987654321abcdefgh#
18
Source Conf File (e.g. gardening.conf): gardening.conf
19
gardening.conf
20
Target Domain (e.g. cycling.io): 
21
cycling.io
22
Target Directory (no trailing slash e.g. /var/www/cycling): /var/www/cycling
23
/var/www/cycling
24
Target Database Name (e.g. cycling): database_cycling
25
database_cycling
26
Target Database User (e.g. user_for_cycling): hedwig
27
hedwig
28
Target Database Pass (e.g. pwd_cycling): 
29
pwd_for_cycling_not_hogwartz
30
Target Conf File (e.g. cycling.conf): 0007b-cycling.conf               
31
0007b-cycling.conf
32
Clone now? (y/n)
33
y
34
===================================================
35
WordPress Cloning is Beginning
36
===================================================
37
tar: .: file changed as we read it
38
define('RELOCATE',true);
39
================================
40
Directory duplicated
41
================================
42
================================
43
Database duplicated
44
================================
45
Enabling site 0007b-cycling.
46
To activate the new configuration, you need to run:
47
  service apache2 reload
48
 * Reloading web server apache2                                                                                     * 
49
================================
50
Web configuration added
51
================================
52
Clone is complete.
53
Test at http://cycling.io
54
================================

Auf meinen kleinen WordPress-Sites dauerte das Duplizieren nur 30 bis 90 Sekunden!

Kleingedrucktes

Es gibt noch ein paar Dinge, die Sie wissen müssen.

Direkter Anmeldepfad zuerst

Um sich bei Ihrer geklonten Site anzumelden, müssen Sie zunächst den Pfad wp-login.php anstelle von wp-admin verwenden, der zur URL der Quellsite umleitet, z.B. http://clone.io/wp-login.php wie unten gezeigt:

Clone WordPress Use the wp-login php pathClone WordPress Use the wp-login php pathClone WordPress Use the wp-login php path

Domains wechseln

Da WordPress einen Großteil Ihrer Quelldomäne in der Datenbank fest codiert, habe ich festgestellt, dass die Verwendung der Einstellung RELOCATE in wp-config.php es einfach macht, diese über Allgemein > Einstellungen zu aktualisieren. Sie speichern das Formular einfach mit der neuen Ziel-URL:

Clone WordPress General Domain SettingsClone WordPress General Domain SettingsClone WordPress General Domain Settings

Sobald Sie die geklonte Ziel-URL gespeichert haben, können Sie die Einstellung RELOCATE manuell aus wp-config.php entfernen.

Ein Kollege schlägt jedoch vor, dass Sie möglicherweise ein Werkzeug wie InterconnectITs Suchen und Ersetzen für WordPress-Datenbanken verwenden möchten. Es wurde auch bei Envato Tuts+ unter Migrieren von WordPress über Hosts, Server und URL dokumentiert.

Das endgültige Drehbuch

Hier ist das endgültige Skript für wpclone.sh - Feel frei, um die Standardeinstellungen zu ändern:

1
#!/bin/bash -e

2
# Clone a WordPress site via Bash script

3
clear
4
echo "==================================================="
5
echo "Clone WordPress Script"
6
echo "==================================================="
7
# Set Default Settings (helpful for testing)

8
default_mysql_user=$"root-admin"
9
default_mysql_pass=$"super-strong-password"
10
default_source_domain=$"gardening.io"
11
default_target_domain=$"cycling.io"
12
default_source_directory=$"/var/www/gardening"
13
default_target_directory=$"/var/www/cycling"
14
default_apache_directory=$"/etc/apache2/sites-available"
15
default_source_conf=$"gardening.conf"
16
default_target_conf=$"cycling.conf"
17
default_source_dbname=$"gardening"
18
default_source_dbuser=$"user_for_garden"
19
default_source_dbpass=$"pwd_garden"
20
default_target_dbname=$"cycling"
21
default_target_dbuser=$"user_for_cycling"
22
default_target_dbpass=$"pwd_cycling"
23
NOW=$(date +"%Y-%m-%d-%H%M")
24
25
#Request MySQL Admin

26
read -p "MySQL Master Username (e.g. "$default_mysql_user"): " mysql_user
27
mysql_user=${mysql_user:-$default_mysql_user}
28
echo $mysql_user
29
read -p "MySQL Master Password (e.g. "$default_mysql_pass"): " mysql_pass
30
mysql_pass=${mysql_pass:-$default_mysql_pass}
31
echo $mysql_pass
32
33
# Request Source Settings

34
read -p "Source Domain (e.g. "$default_source_domain"): " source_domain
35
source_domain=${source_domain:-$default_source_domain}
36
echo $source_domain
37
read -p "Source Directory (no trailing slash e.g. "$default_source_directory"): " source_directory
38
source_directory=${source_directory:-$default_source_directory}
39
echo $source_directory
40
read -p "Source Database Name (e.g. "$default_source_dbname"): " source_dbname
41
source_dbname=${source_dbname:-$default_source_dbname}
42
echo $source_dbname
43
read -p "Source Database User (e.g. "$default_source_dbuser"): " source_dbuser
44
source_dbuser=${source_dbuser:-$default_source_dbuser}
45
echo $source_dbuser
46
read -p "Source Database Pass (e.g. "$default_source_dbpass"): " source_dbpass
47
source_dbpass=${source_dbpass:-$default_source_dbpass}
48
echo $source_dbpass
49
# Request Source Settings

50
read -p "Source Conf File (e.g. "$default_source_conf"): " source_conf
51
source_conf=${source_conf:-$default_source_conf}
52
echo $source_conf
53
# Request Target Settings

54
read -p "Target Domain (e.g. "$default_target_domain"): " target_domain
55
target_domain=${target_domain:-$default_target_domain}
56
echo $target_domain
57
read -p "Target Directory (no trailing slash e.g. "$default_target_directory"): " target_directory
58
target_directory=${target_directory:-$default_target_directory}
59
echo $target_directory
60
read -p "Target Database Name (e.g. "$default_target_dbname"): " target_dbname
61
target_dbname=${target_dbname:-$default_target_dbname}
62
echo $target_dbname
63
read -p "Target Database User (e.g. "$default_target_dbuser"): " target_dbuser
64
target_dbuser=${target_dbuser:-$default_target_dbuser}
65
echo $target_dbuser
66
read -p "Target Database Pass (e.g. "$default_target_dbpass"): " target_dbpass
67
target_dbpass=${target_dbpass:-$default_target_dbpass}
68
echo $target_dbpass
69
read -p "Target Conf File (e.g. "$default_target_conf"): " target_conf
70
target_conf=${target_conf:-$default_target_conf}
71
echo $target_conf
72
echo "Clone now? (y/n)"
73
read -e run
74
if [ "$run" == n ] ; then

75
exit

76
else

77
echo "==================================================="
78
echo "WordPress Cloning is Beginning"
79
echo "==================================================="
80
#backup source_directory

81
cd $source_directory
82
# add -v option to these if you want to see verbose file listings

83
tar -czf source_clone_$NOW.tar.gz .
84
#unzip clone in target directory

85
mkdir -p $target_directory
86
tar -xzf source_clone_$NOW.tar.gz -C $target_directory
87
#remove tarball of source

88
rm source_clone_$NOW.tar.gz
89
cd $target_directory
90
# Reset Directory Permissions

91
find $target_directory -type d -exec chmod 755 {} \;
92
find $target_directory -type f -exec chmod 644 {} \;
93
#set database details with perl find and replace

94
perl -pi -e "s/$source_dbname/$target_dbname/g" wp-config.php
95
perl -pi -e "s/$source_dbuser/$target_dbuser/g" wp-config.php
96
perl -pi -e "s/$source_dbpass/$target_dbpass/g" wp-config.php
97
echo "define('RELOCATE',true);" | tee -a wp-config.php
98
#echo "define('WP_HOME','http://$target_domain');" | tee -a wp-config.php

99
#echo "define('WP_SITEURL','http://$target_domain');" | tee -a wp-config.php

100
echo "================================"
101
echo "Directory duplicated"
102
echo "================================"
103
# Begin Database Duplication

104
# Export the database

105
mysqldump -u$mysql_user -p$mysql_pass $source_dbname > $target_directory/clone_$NOW.sql
106
# Create the target database and permissions

107
mysql -u$mysql_user -p$mysql_pass -e "create database $target_dbname; GRANT ALL PRIVILEGES ON $target_dbname.* TO '$target_dbuser'@'localhost' IDENTIFIED BY '$target_dbpass'"
108
# Import the source database into the target

109
mysql -u$mysql_user -p$mysql_pass $target_dbname < $target_directory/clone_$NOW.sql
110
echo "================================"
111
echo "Database duplicated"
112
echo "================================"
113
#Activate Web Configuration

114
cp $default_apache_directory/$source_conf $default_apache_directory/$target_conf
115
#set database details with perl find and replace

116
perl -pi -e "s/$source_domain/$target_domain/g" $default_apache_directory/$target_conf
117
perl -pi -e "s|${source_directory}|${target_directory}|g" $default_apache_directory/$target_conf
118
a2ensite $target_conf
119
service apache2 reload
120
echo "================================"
121
echo "Web configuration added"
122
echo "================================"
123
echo "Clone is complete."
124
echo "Test at http://"$target_domain
125
echo "================================"
126
fi

Wenn Sie Vorschläge und Anpassungen haben, lassen Sie es mich bitte wissen. Veröffentlichen Sie Ihre Gedanken unten in den Kommentaren.

Bereinigung für erweiterte Tests

Die folgenden Zeilen können hilfreich sein, um von Ihnen geklonte Testseiten zu löschen und rückgängig zu machen. Sie können es an Ihre Bedürfnisse anpassen:

1
  sudo rm -ifr /var/www/clone
2
  sudo a2dissite clone.conf 
3
  sudo service apache2 reload
4
  sudo rm /etc/apache2/sites-available/clone.conf
5
  mysql -u root -p -e "drop database clone;"

Ändern der Sicherheitsschlüssel in Wp-Config.php

Sie können Ihre neue WordPress-Site auch besser sichern, indem Sie die Authentifizierungsschlüssel und -salze in der wp-config.php der Zielsite manuell ersetzen:

1
/**#@+

2
 * Authentication Unique Keys and Salts.
3
 *
4
 * Change these to different unique phrases!
5
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key 
6
service}
7
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have 
8
to log in again.
9
 *
10
 * @since 2.6.0
11
 */
12
define('AUTH_KEY',         '+9%S?YVnr%5Vr!Et4J,@9/Z^.kT_Lu~5SGwr9=|Y &D-ARSWf$mF#J_3U:/iE>-R');
13
define('SECURE_AUTH_KEY',  'e3Wr7%Aa7H1,f<SR[Sp&g.kJw,.)bR-9jz{uU&[R{[J]ITK8q>:!5@y:Q;c01dL ');
14
define('LOGGED_IN_KEY',    '1I%pW%UyjRMqy__Da)siA)+V]Ur$9uXPmxv|eBjM~-m&-<WEy&+XXb43uh8&aP+U');
15
define('NONCE_KEY',        'A9]+PFgvxYa^<B}_.F?9A,!&i-.b6E.I?&?U*)X.Vh+fq`SfE[XJG+MG|pg;y%Ah');
16
define('AUTH_SALT',        'gT (4]L{mm!|>9kC<%59rB7sbe1)jW0GCnfupJT+8z-z#%o@b|[QH=i@h|-/t!9S');
17
define('SECURE_AUTH_SALT', 'ON8K<,WSy8+F ~XaQpCwC8(a/{HksMh<T)QLD]s[-:yv+fx8!`<!*~mgB32X:w5k');
18
define('LOGGED_IN_SALT',   'vHJ%{=X6$ue>ZIo|%|cisp1R}9cJ< Rz-J;H|:O2A7$+*aGXMH!+KvD+tZ/I*U5$');
19
define('NONCE_SALT',       '[ytQ;C)BvgU!#>a,,g|)~EKBQUig7Uv.-8?q%lmFte,P>,]f#.}i`Wx8S+_S@&.(');
20
/**#@-*/

Sie können einfach https://api.wordpress.org/secret-key/1.1/salt/ besuchen und sie ausschneiden und in Ihre Datei wp-config.php einfügen:

WordPress Authentication Key and Salt GeneratorWordPress Authentication Key and Salt GeneratorWordPress Authentication Key and Salt Generator

Wenn Sie ein Purist für Linux-Skripte sind, können Sie Gallaghers WordPress Bash-Installationsskript aktualisieren. Sein Skript wurde über die Standard-WordPress-Datei wp-config.php kopiert, sodass er vorhersehbare Quellzeichenfolgen haben würde, die durch Schlüssel ersetzt werden könnten, die sein Skript generiert hat:

1
#set WP salts

2
perl -i -pe'

3
  BEGIN {

4
    @chars = ("a" .. "z", "A" .. "Z", 0 .. 9);

5
    push @chars, split //, "!@#$%^&*()-_ []{}<>~\`+=,.;:/?|";

6
    sub salt { join "", map $chars[ rand @chars ], 1 .. 64 }

7
  }

8
  s/put your unique phrase here/salt()/ge

9
' wp-config.php

Ich habe nie einen regulären Ausdruck geschrieben, um die Schlüsselwerte in dynamischen, bereits vorhandenen wp-config.php-Dateien unserer Quellwebsites zu ersetzen. Wenn Sie sich dazu entschließen, teilen Sie dies bitte in den Kommentaren mit und bedanken Sie sich im Voraus.

Fragen?

Ich habe es sehr genossen, dieses Skript zum Laufen zu bringen. Oder ich sollte zumindest sagen, dass ich es genossen habe, es zu betreiben, als ich fertig war. Ich wünschte, ich hätte es vor langer Zeit erstellt, da es unglaublich effektiv und effizient ist. Ich könnte kleine WordPress-Sites klonen und sie in etwa 60 Sekunden auf meinem Server laufen lassen. Keines der anderen Plugins oder Duplizierungsoptionen ist so nahtlos.

Wenn Sie Fragen haben, posten Sie diese bitte unten. Oder Sie können mich auf Twitter @reifman kontaktieren oder mir direkt eine E-Mail senden. Auf meiner Envato Tuts+ Instructor-Seite finden Sie weitere Tutorials, die ich geschrieben habe, z. B. meine Startup-Serie (Building Your Startup With PHP).

verwandte Links

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.