Hromadné zakládání webů – příprava na migraci

Někde je potřeba zpracovat více stejných/podobných úkonů najednou. Chystáme se migrovat necelých 200 webů na VestaCP a v tomto návodu k tomu budeme ladit skript, abychom vše nemuseli klikat v administraci.

Celý VespaCP je v tuto chvíli veřejnosti nepřístupný.

Výchozí bod

Většinu webů budeme zakládat pod jedním uživatelem, proto nepracujeme se zakládáním uživatelů v příkazové řádce. Pro každý web potřebujeme web-virtual, ssl certifikát, zápis Dns, jednu MySQL databázi a nastavení AVstats.

Nováčkovský výzkum

Namísto dlouhého studování jsme založili web se vším příslušenstvím přes GUI a spouštěné skripty odposlechly z logu. Cesty k logům už jsme pro jeden návod hledali a jsou k vidění v Zálohování souborů nastavení VestaCP serveru. Zkoumáme tedy log:

# prohlidka logu
nano +9999 /var/log/vesta/system.log

Něco jsme umazali, něco přidali a pro nový web nám vyšlo toto:

# vytvoreni web-virtualu
/usr/local/vesta/bin/v-add-web-domain  'UZIVATEL' 'DOMENA' '10.11.0.80' 'no' '' 'jpeg,jpg,png,gif,bmp,ico,svg,tif,tiff,css,js,htm,html,ttf,otf,webp,woff,txt,csv,rtf,doc,docx,xls,xlsx,ppt,pptx,odf,odp,ods,odt,pdf,psd,ai,eot,eps,ps,zip,tar,tgz,gz,rar,bz2,7z,aac,m4a,mp3,mp4,ogg,wav,wma,3gp,avi,flv,m4v,mkv,mov,mpeg,mpg,wmv,exe,iso,dmg,swf'

# umazani prebytecneho aliasu
/usr/local/vesta/bin/v-delete-web-domain-alias  'UZIVATEL' 'DOMENA' 'www.DOMENA.cz' 'no'

# vychozi DNS zaznamy
/usr/local/vesta/bin/v-add-dns-domain  'UZIVATEL' 'DOMENA' '185.136.110.4' '' '' '' '' '' '' '' '' ''

# vytvoreni DB
/usr/local/vesta/bin/v-add-database  'UZIVATEL' 'ex2d2acz' 'ex2d2acz' 'HESLO' 'mysql' 'localhost' 'utf8'

# vygenerovani certifikatu
/usr/local/vesta/bin/v-generate-ssl-cert 'DOMENA' 'instalace@d2a.cz' 'CZ' 'Czech Republic' 'Nezamyslice' 'Marketing D2A s.r.o.' 'IT' '' 'shell'

# po vygenerovani certifikatu odchytavame na konci vystupu cestu k tmp souboru certif.
# Directory: /tmp/tmp.nnB7lqSTVp

# prirazeni certifikatu k domene
/usr/local/vesta/bin/v-add-web-domain-ssl  'UZIVATEL' 'DOMENA' '/tmp/tmp.nnB7lqSTVp' 'single' 'no'

# pridani statistik
v-add-web-domain-stats  'UZIVATEL' 'DOMENA' 'awstats'

# pridani uzivatele pro prohlizeni avstats
/usr/local/vesta/bin/v-add-web-domain-stats-user  'UZIVATEL' 'DOMENA' 'JMENO-PRO-AVSTATS' 'HESLO-PRO-AVSTATS'

Existující úpravy

Protože jsme trošku líní už dříve jsme propojili VestaCP s vytvořeným FreeNas serverem a nasdíleli si nějaké ty windowsovské složky – více v návodu: Propojení VestaCP a FreeNas (přesuny souborů a skriptů).

Existují tedy tyto tři adresáře:

  • /d2a-sdilene-skripty – složka na FreeNasu (virtuálního na Proxmoxu) sdílená a propojená na VestaCP
  • /d2a-skripty – lokální složka pro věci, které musí šlapat i když bude nedostupný FreeNas
  • /d2a-zalohy-nas01 – složka FreeNasu (fyzického uložiště) sdílená a propojená na VestaCP

Skládáme skript

nano /d2a-sdilene-skripty/novy-web.bash

Samotný skript

#!/bin/bash

# mazu sklo
clear

# novy-web
#
#   Sublime Text nastaveni
#     Tabsize: 2
#     Viev -> Line endings -> UNIX
#   Nastaveni prav pro spusteni
#     chmod u+x /d2a-sdilene-skripty/novy-web.bash
#   Pouziti skriptu
#     /d2a-sdilene-skripty/novy-web.bash uzivatel='jmeno' domena='domena' ssl='self' db='a' dns='a' awstats='a' db_nazev='nazev' db_jm='jmeno' db_hes='heslo' awstats_jm='jmeno' awstats_hes='heslo'

#######################################################################
#
#
# Nastavovaci promenne
#
#
#######################################################################

# vystup - urcuje kam se ma zapisovat prubeh skriptu (kriticke chyby se zapisuji vzdy)
#       na-sklo
#       do-logu
#       vsude
#       nikde
vystup="vsude"

#######################################################################
#
#
# Staticke promenne - neupravovat
#
#
#######################################################################

# nazev skriptu (udava se bez .bash)
nazev_skriptu="novy-web"

# systemova nastaveni barev výstupu na sklo
c="\033[31m"
z="\033[32m"
tr="\033[0m"

# koren_logu - urcuje zakladni koren pro ukladani logu skriptu (nesmi obsahovat lomitko na konci)
#   default: /d2a-sdilene-skripty/log 
koren_logu="/d2a-sdilene-skripty/log"

# razitko datumu a casu
cas_raz=$(date '+%Y%m%d_%H%M%S_%N')
rok=$(date '+%Y')
mesic=$(date '+%m')
den=$(date '+%d')
hodina=$(date '+%H')

# jmeno a ip adresa masiny na ktere je spusteno
jmeno_host=$(hostname)
ip_host=$(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')

# cesta logu (nesmi obsahovat lomitko na konci)
adresar_logu="${koren_logu}/${nazev_skriptu}/${rok}"
soubor_logu="${adresar_logu}/${jmeno_host}_T${cas_raz}_IP${ip_host//./_}.log"

# docasny adresar pro odkladani souboru (nesmi obsahovat lomitko na konci)
docasny_adresar="/tmp/${nazev_skriptu}"

# prednastaveni ziskavanych promennych
uzivatel="n"
domena="n"
ssl="n"
db="n"
dns="n"
awstats="n"
db_jm="n"
db_nazev="n"
db_hes="n"
awstats_jm="n"
awstats_hes="n"

# ziskani vstupu
for ARGUMENT in "$@"
do
  KEY=$(echo $ARGUMENT | cut -f1 -d=)
  VALUE=$(echo $ARGUMENT | cut -f2 -d=)   
  case "$KEY" in
		uzivatel)               uzivatel=${VALUE} ;;
		domena)                 domena=${VALUE} ;;
		ssl)                    ssl=${VALUE} ;;
		db)                     db=${VALUE} ;;
		dns)                    dns=${VALUE} ;;
		awstats)                awstats=${VALUE} ;;
		db_nazev)               db_nazev=${VALUE} ;;
		db_jm)                  db_jm=${VALUE} ;;
		db_hes)                 db_hes=${VALUE} ;;
		awstats_jm)             awstats_jm=${VALUE} ;;
		awstats_hes)            awstats_hes=${VALUE} ;;
	*)   
  esac    
done

#######################################################################
#
#
# funkce vypisu na sklo / do logu / oboje
#
#
#######################################################################

function _ {
	cas="$(date '+%H:%M:%S')\t"
	if [ "${vystup}" == "na-sklo" ] || [ "${vystup}" == "vsude" ]; then
		printf "${cas}$* \n";
	fi
	if [ "${vystup}" == "do-logu" ] || [ "${vystup}" == "vsude" ]; then
		echo -e "${cas}$*" | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" >> "${soubor_logu}"
	fi  
}

#######################################################################
#
#
# funkce vytvoreni adresare pro logovani souboru
#
#
#######################################################################

function priprav_log_dir {
	max_pocet_pokusu=5
	prodleva_mezi_pokusy="1m"
	pocet_selhani=0
	for (( _i=1; _i<=max_pocet_pokusu; _i++ ))
	do
		printf "Overuji adresar logu ${1} (pokus ${_i} z ${max_pocet_pokusu}).\n"
		if [ -d "${1}" ]; then
			printf "${z}Ok:${tr} Adresar pro logovani existuje.\n"
			break
		else
			printf "${c}Er:${tr} Adresar pro logovani neexistuje.\n"
			printf "Cekam ${prodleva_mezi_pokusy}.\n"
			sleep "${prodleva_mezi_pokusy}"
			printf "Zahajuji pokus o vytvoreni adresare.\n"
			mkdir -p "${1}"
			pocet_selhani=${_i}
		fi
	done
	if [ ${pocet_selhani} = ${max_pocet_pokusu}  ]; then
		printf "${c}Chyba:${tr} Nepodarilo se vytvorit adresar logu. Lze ocekavat dalsi chyby. Koncim skript.\n"
		exit 1
	fi
}

#######################################################################
#
#
# funkce testovani promennych
# kriticka_promenna [nazev promenne] [zakazana hodnota] [chybova hlaska]
#
#
#######################################################################

function kriticka_promenna {
	promenna=$1
	zakazana_hodnota=$2
	chybova_hlaska=$3
	# promenna nenastavena
	if [ "${!promenna}" == "${zakazana_hodnota}" ]; then
		_ "${c}Chyba:${tr} Promenna ${promenna} nenastavena. ${chybova_hlaska} | Koncim skript."
		exit 1
	fi
}

#######################################################################
#
#
# funkce testovani promennych
# doporucena_promenna [nazev promenne] [zakazana hodnota] [chybova hlaska]
#
#
#######################################################################

function doporucena_promenna {
	promenna=$1
	zakazana_hodnota=$2
	chybova_hlaska=$3
	# promenna nenastavena
	if [ "${!promenna}" == "${zakazana_hodnota}" ]; then
		_ "${c}Upozorneni:${tr} Promenna ${promenna} nenastavena. ${chybova_hlaska} | Skript pokracuje."
	fi
}

#######################################################################
#
#
# pripravne prace
#
#
#######################################################################

# pokus o vytvoreni adresare pro log
priprav_log_dir ${adresar_logu}

#######################################################################
#
#
# zahajeni skriptu
#
#
#######################################################################

_ "${z}Spoustim skript ${nazev_skriptu}.bash.${tr}"
_ ""
_ "Uziti: novy-web.bash uzivatel='jmeno' domena='domena' ssl='self' db='a' dns='a' awstats='a' db_nazev='nazev' db_jm='jmeno' db_hes='heslo' awstats_jm='jmeno' awstats_hes='heslo'"
_ ""
_ "Vypisuji zadani:"
_ "  uzivatel: ${uzivatel}"
_ "  domena: ${domena}"
_ "  ssl: ${ssl}"
_ "  db: ${db}"
_ "  dns: ${dns}"
_ "  awstats: ${awstats}"
_ "  db_nazev: ${db_nazev} (bude doplneno prefixem uzivatel_)"
_ "  db_jm: ${db_jm} (bude doplneno prefixem uzivatel_)"
_ "  db_hes: ${db_hes}"
_ "  awstats_jm: ${awstats_jm}"
_ "  awstats_hes: ${awstats_hes}"
_ ""
_ "Zahajuji kontroly"

kriticka_promenna "uzivatel" "n" "Nevim pod kym ostatni kroky realizovat."
kriticka_promenna "domena" "n" "Bez nazvu domeny nejde pokracovat."
doporucena_promenna "ssl" "n" ""
doporucena_promenna "db" "n" ""
if [ ! "${db}" == "n" ]; then
	kriticka_promenna "db_nazev" "n" "Požadujes DB, ale tento udaj k vytvoreni chybi."
	kriticka_promenna "db_jm" "n" "Požadujes DB, ale tento udaj k vytvoreni chybi."
	kriticka_promenna "db_hes" "n" "Požadujes DB, ale tento udaj k vytvoreni chybi."
fi
doporucena_promenna "dns" "n" ""
doporucena_promenna "awstats" "n" ""
if [ ! "${awstats}" == "n" ]; then
	kriticka_promenna "awstats_jm" "n" "Požadujes awstats, ale tento udaj k vytvoreni chybi."
	kriticka_promenna "awstats_hes" "n" "Požadujes awstats, ale tento udaj k vytvoreni chybi."
fi

_ "Kontroly dokonceny"

#######################################################################
#
#
# hlavni cast skriptu
#
#
#######################################################################

# vygenerovani certifikatu
if [ "${ssl}" == "self" ]; then
	_ "Vytvarim SSL certifikat."
	ssl_cesta="$(/usr/local/vesta/bin/v-generate-ssl-cert ${domena} 'instalace@d2a.cz' 'CZ' 'Czech Republic' 'Nezamyslice' 'Marketing D2A s.r.o.' 'IT' '' 'shell' 2>>/dev/null | tail -1)"
	ssl_cesta="${ssl_cesta//Directory: /}"
	if [[ $ssl_cesta == "/tmp/tmp."* ]]; then
	  _ "  SSL cesta vytvorena: ${ssl_cesta}"
	else
		_ "  ${c}Chyba:${tr} Nepodarilo se ziskat cestu k SSL certifikatu. | Koncim skript."
		exit 1
	fi
fi

# vytvoreni web-virtualu
if [ ! "${domena}" == "n" ]; then
	_ "Vytvarim web-virtual."
	_	"$(/usr/local/vesta/bin/v-add-web-domain  ${uzivatel} ${domena} ${ip_host} 'no' '' 'jpeg,jpg,png,gif,bmp,ico,svg,tif,tiff,css,js,htm,html,ttf,otf,webp,woff,txt,csv,rtf,doc,docx,xls,xlsx,ppt,pptx,odf,odp,ods,odt,pdf,psd,ai,eot,eps,ps,zip,tar,tgz,gz,rar,bz2,7z,aac,m4a,mp3,mp4,ogg,wav,wma,3gp,avi,flv,m4v,mkv,mov,mpeg,mpg,wmv,exe,iso,dmg,swf')"
fi

# prirazeni certifikatu k domene
if [ "${ssl}" == "self" ]; then
	_ "Prirazuji SSL certifikat."
	_	"$(/usr/local/vesta/bin/v-add-web-domain-ssl  ${uzivatel} ${domena} ${ssl_cesta} 'single' 'no')"
fi

# zjistuji pocet tecek v nazvu domeny
q="$(echo "${domena}" | awk -F"." '{print NF-1}')"
if (( "${q}" > 1 )); then
	_ "Umazavam nesmyslny alias (www.)."
	# umazani prebytecneho aliasu
	_	"$(/usr/local/vesta/bin/v-delete-web-domain-alias  ${uzivatel} ${domena} www.${domena} 'no')"
fi

# vychozi DNS zaznamy
if [ "${dns}" == "a" ]; then
	_ "Nastavuji DNS."
	_	"$(/usr/local/vesta/bin/v-add-dns-domain  ${uzivatel} ${domena} '185.136.110.4' '' '' '' '' '' '' '' '' '')"
fi

# vytvoreni DB
if [ "${db}" == "a" ]; then
	_ "Vytvářím DB."
	_	"$(/usr/local/vesta/bin/v-add-database  ${uzivatel} ${db_nazev} ${db_jm} ${db_hes} 'mysql' 'localhost' 'utf8')"
fi

# pridani statistik
if [ "${db}" == "a" ]; then
	_ "Přidávám AwStats."
	_	"$(/usr/local/vesta/bin/v-add-web-domain-stats  ${uzivatel} ${domena} 'awstats')"
	_	"$(/usr/local/vesta/bin/v-add-web-domain-stats-user  ${uzivatel} ${domena} ${awstats_jm} ${awstats_hes})"
fi

#######################################################################
#
#
# exit
#
#
#######################################################################

_ "${z}Koncim skript${tr}"
exit 0
;;

Hotovo

Máme jednoduchý skript na vytvoření všeho potřebného. Nyní je chvíle na přípravu tabulky, která nageneruje volání tohoto skriptu a uchová přístupová data – tedy jeden web = jeden řádek se všemi přístupovými údaji a v posledním sloupci textový řetězec na volání tohoto skriptu se všemi parametry.

Martin Horák

Martin Horák má na svědomí 29 příspěvků

Již nějakou chvíli se věnuji tvorbě webů, copywritingu a všem těm drobným a nepodstatným věcem okolo toho.

Najmout si mě můžete přes horní lištu a klikátko kontakty.

Diskuze

Vaše emailová adresa nebude publikována. Povinné údaje jsou označeny *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>