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



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 Rachel McCollin 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:
- Verzeichnisbaum der Site
- Datenbank
- Webserverkonfiguration, z.B. Apache conf Datei
- 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:



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:



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:



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).