Ak ma niekto poprosí aby som mu vytvoril jednoduchý web, tak na 99% siahnem po projekte WordPress (WP). Ak je to dobrý známy, tak mu ponúknem, že web môže hostovať na mojich serveroch, alebo sa môže rozhodnúť pre akúkoľvek inú komerčnú službu. Na jednom z webových serverov mám vytvorený priestor na testovacie účely WP a taktiež mám zriadenú doménu tretieho radu aby bolo možné testovanie z WAN strany.
Na produkciu webového obsahu používam webový server Apache2, ktorý sa nachádza v DMZ, čiže od ostatných sieti (LAN) je izolovaný. Pred webovým serverom je postavený reverzný proxy server Nginx. Vzhľadom k tomu, že reverzný proxy server nebeži priamo na verejnej IPv4 adrese, preto je na firewalle pfsense nastavený D-NAT (Destination NAT) s otvoreným portom 443 (HTTPS) aby bol server prístupný z internetu. Ak je to možné, tak vždy sa snažím a dbám na to aby bolo všetko pravidelne aktualizované.
Tento článok predpokladá, že webový server je už nastavený. To znamená, že pre web je nastavený VirtualHost a vytvorený adresár pre obsah webu. Samozrejmosťou je nainštalovaná mySQL, resp. MariaDB a skriptovací jazyk PHP. Ak je použitý aj reverzný proxy server, tak pre web musí byť nastavený ServerBlock vrátane TLS. Poďme sa ďalej venovať inštalácii WP, ktorá bude plne automatizovaná.
Pred záverom tohto blogu ukážem ako som inštaloval WP v minulosti.
Predpokladajme, že data pre web budeme ukladať do
/var/www/www.example.com
Názov databázy bude
example
Ešte pred vytváraním skriptu musíme zabezpečiť aby sa príkazy v skripte mohli pripojiť k databáze. V našom prípade vystupujeme v systéme ako bežný užívateľ a k databáze nemáme prístup. To môžeme vyriešiť jednoduchým spôsobom.
nano ~/.my.cnf
[mysql]
user = root
password = heslo
[mysqldump]
user = root
password = heslo
chmod 600 ~/.my.cnf
Teraz môžeme prejsť k vytvoreniu samotného skriptu. V našom domovskom adresári vytvoríme súbor, do ktorého potom vložíme obsah skriptu
nano deploy_wp_test-web.sh
Tu je celý skript, ktorý si v krátkosti popíšeme nižšie
#!/bin/bash
# Premenne
WEB_DIR="/var/www/www.example.com"
WP_URL="http://wordpress.org/latest.tar.gz"
DB_NAME="example"
DB_USER="example"
DB_PASSWORD="db_password_strong"
ESCAPED_PASSWORD=$(printf '%s\n' "$DB_PASSWORD" | sed 's/[&/\*]/\\&/g')
ADMIN_USER="admin"
ADMIN_PASS="wp_password_strong"
ADMIN_EMAIL="name@email.com"
SITE_NAME="Test-Web"
SITE_URL="https://www.example.com"
LANG="sk_SK"
# Stahujem aktualny WordPressu
echo "Stahujem WordPress..."
wget -c $WP_URL -O latest.tar.gz
# Vymazanie obsahu adresara, ak existuje
if [ -d "$WEB_DIR" ]; then
echo "Odstranujem obsah adresara $WEB_DIR..."
sudo rm -rf ${WEB_DIR:?}/*
else
echo "Adresar $WEB_DIR neexistuje. Vytvaram novy..."
sudo mkdir -p $WEB_DIR
fi
# Rozbalenie WordPressu
echo "Rozbalujem WordPress do $WEB_DIR..."
sudo tar xzf latest.tar.gz --strip-components=1 -C $WEB_DIR
# Nastavenie prav na adresar
echo "Nastavujem vlastnika pre $WEB_DIR..."
sudo chown www-data:www-data -R $WEB_DIR
# Premenovanie wp-config-sample.php na wp-config.php
echo "Premenovavam wp-config-sample.php na wp-config.php..."
sudo mv $WEB_DIR/wp-config-sample.php $WEB_DIR/wp-config.php
# Uprava wp-config.php - pridat FORCE_SSL_ADMIN a ine nastavenia
echo "Upravujem wp-config.php..."
sudo sed -i "/require_once ABSPATH . 'wp-settings.php';/i define('FORCE_SSL_ADMIN', true);\n// in some setups HTTP_X_FORWARDED_PROTO might contain\n// a comma-separated list e.g. http,https\n// so check for https existence\nif (isset(\$_SERVER['HTTP_X_FORWARDED_PROTO']) && strpos(\$_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)\n\$_SERVER['HTTPS']='on';" $WEB_DIR/wp-config.php
# Nastavenie DB_NAME, DB_USER a DB_PASSWORD v wp-config.php
echo "Nastavujem hodnoty pre DB_NAME, DB_USER a DB_PASSWORD..."
sudo sed -i "s/define( 'DB_NAME', '.*' );/define( 'DB_NAME', '$DB_NAME' );/" $WEB_DIR/wp-config.php
sudo sed -i "s/define( 'DB_USER', '.*' );/define( 'DB_USER', '$DB_USER' );/" $WEB_DIR/wp-config.php
sudo sed -i "s/define( 'DB_PASSWORD', '.*' );/define( 'DB_PASSWORD', '$ESCAPED_PASSWORD' );/" $WEB_DIR/wp-config.php
# Nastavenie jazyka
echo "Nastavujem jazyk WordPressu na $LANG..."
sudo sed -i "s/define( 'WPLANG', '.*' );/define( 'WPLANG', '$LANG' );/" $WEB_DIR/wp-config.php
# Odstranenie existujucej databazy a vytvorenie novej
echo "Odstranujem databazu $DB_NAME, ak existuje..."
mysql -e "DROP DATABASE IF EXISTS \`$DB_NAME\`"
echo "Vytvaram novu databazu $DB_NAME..."
mysql -e "CREATE DATABASE \`$DB_NAME\`"
# Odstranenie stiahnuteho balika WordPress
echo "Odstranujem stiahnuty balik WordPressu..."
rm -f latest.tar.gz
# Instalacia WordPressu pomocou wp-cli (ak je nainstalovane)
echo "Instalujem WordPress a nastavujem zakladne parametre..."
# Ak wp-cli nie je nainstalovane, nainstalujeme ho
if ! command -v wp &> /dev/null; then
echo "wp-cli nebolo najdené, instalujem ho..."
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
fi
# Spustenie instalacie WordPressu cez wp-cli
cd $WEB_DIR
wp core install --url=$SITE_URL --title="$SITE_NAME" --admin_user=$ADMIN_USER --admin_password=$ADMIN_PASS --admin_email=$ADMIN_EMAIL --locale=$LANG
# Vystup
echo "================================================================================================="
echo "| Skript dokonceny. Do oblubeneho weboveho prehliadaca zadajte URL: www.example.com/wp-admin |"
echo "================================================================================================="
V riadku 4-15 sa nachádzajú premenné. Nie je tam nič zaujímavé, okrem riadku 9, kde je premenná ESCAPED_PASSWORD. Tá zabezpečí ak bude heslo obsahovať špeciálne znaky (napr. lomítko, hviezdičku), tak aby boli tieto znaky escapované. Následne sa stiahne aktuálna ver. WP a vyprázdni sa webový adresár (ak neexistuje, tak sa vytvorí), riadky 19-29.
WP sa rozbalí do webového adresára a zmení sa vlastník na www-data. WP číta dáta z konfiguračného súboru pod názvom wp-config.php, čiže z wp-config-sample.php vytvoríme kópiu wp-config.php (riadky 32- 41).
Riadok 45 je dôležitý vtedy, ak máme WP za reverzným proxy serverom.
Riadky 48-55, nastavia v konfigurácii WP dôležité hodnoty na pripojenie k databáze a jazyk. Riadok 58-61, odstránia starú DB a vytvoria novú. V riadku 65 je príkaz na odstránenie inštalačného balíka WP.
Týmto sme ukončili prípravu na inštaláciu. Ak by tu skript skončil, tak môžeme zadať do webového prehliadača www.example.com a pokračujeme v inštalácii samotného WP. Ak sa chceme zbaviť aj samotného inštalačného procesu, tak skript pokračuje ďalej a inštaluje cely WP.
Na inštaláciu WP cez CLI (terminál) potrebujem mať nainštalovaný wp-cli. To určite nemáme, takže skript to preverí a ak wp-cli nenájde, tak ho doinštaluje (riadok 71-76). Následne (riadok 80) vezme premenne nastavené na začiatku a pomocou wp core install nainštaluje WP.
Skriptu pridelíme práva na spustenie a jednoduchým príkazom ho spustíme.
chmod +x deploy_wp_test-web.sh
./deploy_wp_test-web.sh
Ak spustím skript, tak v riadku 33 je prvý príkaz, ktorý vyžaduje sudo. To znamená, že zadáme heslo a skript pokračuje ďalej.
Ako som riešil inštaláciu ručne
Toto je inštalácia, ktorú som robil v minulosti ručným spôsobom. Využíval som na to samozrejme terminál, ale bolo to celkom pracne. Čiže poďme na to:
wget -c http://wordpress.org/latest.tar.gz
sudo rm -rf /var/www/www.example.com/*
sudo tar xvzf latest.tar.gz --strip-components=1 -C /var/www/www.example.com
sudo chown www-data:www-data -R /var/www/www.example.com
cd /var/www/www.example.com
sudo mv wp-config-sample.php wp-config.php
sudo nano /var/www/www.example.com/wp-config.php
V konfiguračnom súbore wp-config.php som ručne upravil konfiguráciu. To znamená, že som nahradil meno databázy a užívateľa + heslo
define( 'DB_NAME', 'database_name' );
define( 'DB_USER', 'db_user' );
define( 'DB_PASSWORD', 'strong_password' );
Na koniec súboru som kvôli reverznému proxy serveru pridal tento kód
define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';
Databázu som riešil cez webovú aplikáciu PHPMyadmin, alebo tiež cez terminál, týmto spôsobom
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \\g.
Your MySQL connection id is 5340 to server version: 3.23.54
Type 'help;' or '\\h' for help. Type '\\c' to clear the buffer.
mysql> CREATE DATABASE example;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE USER "username"@"hostname" IDENTIFIED BY "password";
mysql> GRANT ALL PRIVILEGES ON example.* TO "username"@"hostname";
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> EXIT
Bye
Následne som prešiel do webového prehliadača a zadal som do url, www.example.com a pokračoval som ďalej. Je jasné, že tento ručný proces trval niekoľko minút a bol náchylný na chyby, ktoré zbytočne proces inštalácie predlžovali. Ak som sa napr. pomýlil pri kopírovaní mena, alebo hesla do wp-config.php, tak inštalátor vyhodil chybu, že sa nevie pripojiť k databáze a pod. Nakoniec som cez MC odstránil inštalačný balík WP.
Záver
Čas vykonávania skriptu, vrátane sťahovania WP balíka trval neuveriteľných 5 sekúnd. Inštalácia je mimoriadne rýchla a my sa môžeme okamžite venovať konfigurácii WP. Tento skript sa hodí aj vtedy, keď sa nám pri ladení, alebo inštalácii rôznych šablón rozbije cely WP a mi nevieme čo bolo príčinou. V takomto prípade spustíme skript a začíname od nuly. Avšak pred väčšou zmenou radšej odporúčam komplet zálohu a obnovu.