Xamma Derived - PHP Podcast framework: nasazení krok za krokem na Apache, HTTPS a MariaDB
Zobrazení: 9
Praktický návod k nasazení balíku Xamma Derived: veřejný kořen public, práva Apache, HTTPS virtual host, databáze, soubor .env, administrátor a bezpečný API přihlašovací klíč. Článek spoluvytvořil Chat GPT.
Xamma Derived je samostatně nasaditelná distribuce publikačního systému Xamma určená pro podcasty, články, galerie a správu obsahu ve Studiu. Tento návod popisuje celé nasazení od rozbalení balíku přes Apache, HTTPS a databázi až po vytvoření prvního administrátora a API přihlašovacího klíče. Vychází z reálného nasazení na Debianu s Apachem, PHP 8.4 a MariaDB.
V příkladech používám projekt /mnt/flash1/project/xamma-derived, HTTPS port 4438, databázi xamma_derived a lokální databázový účet rpi1_local. Tyto hodnoty si přizpůsobte svému serveru. Hesla, hodnotu APP_KEY ani API klíč nikdy nevkládejte do veřejného článku, repozitáře nebo běžného logu.
1. Co balík obsahuje a co vyžaduje
Veřejným kořenem projektu je výhradně adresář public. Zdrojové kódy, konfigurace, soubor .env, šablony a privátní úložiště musí zůstat mimo veřejný kořen. Balík vyžaduje PHP 8.2 nebo novější, rozšíření PDO, PDO MySQL, Fileinfo, JSON a OpenSSL, webový server Apache 2.4 s moduly rewrite, headers a ssl a databázi MySQL nebo MariaDB.
PROJECT=/mnt/flash1/project/xamma-derived
PUBLIC=$PROJECT/public
PORT=4438
Po rozbalení zkontrolujte základní soubory:
test -f "$PROJECT/composer.json"
test -f "$PROJECT/vendor/autoload.php"
test -f "$PROJECT/bootstrap/app.php"
test -f "$PUBLIC/index.php"
test -f "$PUBLIC/.htaccess"
2. Ověření PHP a projektu
Než začnete měnit Apache, ověřte verzi PHP, syntaxi vstupních souborů, Composer autoloader a dodaný smoke test:
php -v
php -m | grep -E 'PDO|pdo_mysql|fileinfo|json|openssl'
php -l "$PUBLIC/index.php"
php -l "$PROJECT/bootstrap/app.php"
cd "$PROJECT"
composer validate --no-interaction --no-check-publish
php tests/smoke.php
Smoke test může přeskočit databázovou část, pokud není nastaveno testovací PDO připojení. To při prvním spuštění není chyba. Aplikace je navržena tak, aby bez databáze zobrazila instalační stránku místo obecné chyby serveru.
3. Nastavení vlastníka a zapisovatelných adresářů
Apache obvykle běží jako uživatel www-data. Zdrojové soubory mu stačí číst, ale musí zapisovat do privátního úložiště a do adresářů pro nahrávaná média.
sudo chgrp -R www-data "$PROJECT"
sudo chmod -R g+rX "$PROJECT"
sudo find "$PROJECT" -type d -exec chmod g+s {} +
for DIR in \
"$PROJECT/storage/cache" \
"$PROJECT/storage/logs" \
"$PROJECT/storage/sessions" \
"$PROJECT/public/uploads/audio" \
"$PROJECT/public/uploads/images"
do
sudo install -d -o zbynek -g www-data -m 2770 "$DIR"
sudo chmod -R u+rwX,g+rwX,o-rwx "$DIR"
done
Práva ověřte přímo jako uživatel Apache:
sudo -u www-data touch "$PROJECT/storage/cache/.test" && sudo rm "$PROJECT/storage/cache/.test"
sudo -u www-data touch "$PROJECT/storage/sessions/.test" && sudo rm "$PROJECT/storage/sessions/.test"
Chybná práva se typicky projeví chybou 500, nemožností vytvořit session, cache nebo log. Chyba 403 naopak většinou znamená chybný DocumentRoot, neprůchozí práva některého nadřazeného adresáře nebo zákaz v konfiguraci Apache.
4. Zapnutí potřebných modulů Apache
sudo a2enmod ssl
sudo a2enmod rewrite
sudo a2enmod headers
sudo apache2ctl configtest
Výsledek posledního příkazu musí být Syntax OK.
5. HTTPS virtual host na samostatném portu
V tomto příkladu aplikace běží na portu 4438. Do /etc/apache2/ports.conf přidejte pouze jeden řádek, pokud tam ještě není:
Listen 4438
Vytvořte soubor /etc/apache2/sites-available/xamma-derived-4438.conf:
<IfModule mod_ssl.c>
<VirtualHost *:4438>
ServerName 46.13.178.180
ServerAlias 192.168.1.131 rpi1
DocumentRoot /mnt/flash1/project/xamma-derived/public
DirectoryIndex index.php
SSLEngine on
SSLCertificateFile /etc/ssl/certs/xamma-derived-4438.crt
SSLCertificateKeyFile /etc/ssl/private/xamma-derived-4438.key
<Directory /mnt/flash1/project/xamma-derived/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/xamma-derived-4438-error.log
CustomLog ${APACHE_LOG_DIR}/xamma-derived-4438-access.log combined
</VirtualHost>
</IfModule>
Nejdůležitější je, aby DocumentRoot ukazoval do public, nikoli do kořene projektu.
6. Certifikát pro testovací nasazení
Pro lokální nebo dočasné testování lze vytvořit self-signed certifikát. Pro veřejný produkční web použijte důvěryhodný certifikát, například od Let's Encrypt. Self-signed certifikát vyvolá v prohlížeči bezpečnostní varování.
sudo openssl req \
-x509 \
-nodes \
-newkey rsa:2048 \
-sha256 \
-days 825 \
-keyout /etc/ssl/private/xamma-derived-4438.key \
-out /etc/ssl/certs/xamma-derived-4438.crt \
-subj "/C=CZ/O=Xamma Derived/CN=46.13.178.180" \
-addext "subjectAltName=IP:46.13.178.180,IP:192.168.1.131,DNS:rpi1" \
-addext "basicConstraints=critical,CA:FALSE" \
-addext "keyUsage=critical,digitalSignature,keyEncipherment" \
-addext "extendedKeyUsage=serverAuth"
sudo chmod 600 /etc/ssl/private/xamma-derived-4438.key
sudo chmod 644 /etc/ssl/certs/xamma-derived-4438.crt
Hodnota CA:FALSE je důležitá: certifikát je serverový certifikát, nikoli certifikační autorita.
7. Zapnutí webu, firewall a první test
sudo a2ensite xamma-derived-4438.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
sudo ufw allow 4438/tcp
Potom ověřte odpověď serveru:
curl -k -I https://46.13.178.180:4438/
Před nastavením databáze má aplikace vrátit HTTP 200 a zobrazit stránku Installation guide s informací, že databáze zatím není připravena. To je očekávaný bezpečný první start.
8. Vytvoření souboru .env
Soubor .env musí ležet v kořeni projektu, tedy vedle composer.json, a nesmí být veřejně dostupný:
cd /mnt/flash1/project/xamma-derived
cp .env.example .env
chmod 640 .env
Základní konfigurace může vypadat takto:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://46.13.178.180:4438
APP_NAME="Xamma Podcast"
APP_TIMEZONE=Europe/Prague
APP_KEY=SEM_VLOZTE_NAHODNY_RETEZEC_ALESPON_32_ZNAKU
DB_DSN="mysql:host=127.0.0.1;port=3306;dbname=xamma_derived;charset=utf8mb4"
DB_USER=rpi1_local
DB_PASSWORD=SEM_VLOZTE_HESLO
SESSION_NAME=xamma_session
SESSION_LIFETIME=7200
APP_KEY musí mít nejméně 32 znaků a musí být pro každé nasazení jedinečný. Bezpečnou hodnotu lze vygenerovat příkazem:
openssl rand -hex 32
Změna APP_KEY později zneplatní dříve zašifrované API přihlašovací údaje. Hodnotu proto nejprve definitivně nastavte a teprve potom generujte API credential.
9. Databáze a účty
V našem nasazení jsme použili databázi xamma_derived, lokální účet rpi1_local a vzdálený účet rpi1_remote. Účty už existovaly, takže jsme jim pouze přidělili práva:
CREATE DATABASE IF NOT EXISTS xamma_derived
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON xamma_derived.* TO 'rpi1_local'@'localhost';
GRANT ALL PRIVILEGES ON xamma_derived.* TO 'rpi1_local'@'127.0.0.1';
GRANT ALL PRIVILEGES ON xamma_derived.* TO 'rpi1_remote'@'%';
FLUSH PRIVILEGES;
Vzdálený účet s hostitelem % zpřístupňuje databázi z libovolné adresy, pokud tomu nebrání firewall. V produkci je bezpečnější omezit hostitele i firewall na konkrétní IP adresu.
10. Import databázových tabulek
Balík obsahuje tři SQL soubory. Pokud používáte vlastní název databáze xamma_derived, databázi vytvořte ručně podle předchozího kroku a importujte modulová schémata přímo do ní:
cd /mnt/flash1/project/xamma-derived
mysql -u root -p xamma_derived < database/10-main-module.sql
mysql -u root -p xamma_derived < database/20-media-module.sql
Soubor 00-create-database.sql v původním balíku může vytvářet databázi s výchozím názvem xamma. Pokud chcete používat jiný název, nespouštějte jej beze změny. Vždy zkontrolujte jeho obsah nebo databázi vytvořte vlastním příkazem.
Po importu zkontrolujte tabulky:
mysql -u root -p -e \
"SELECT TABLE_NAME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='xamma_derived'
ORDER BY TABLE_NAME;"
11. Vytvoření prvního administrátora
Administrátor se vytváří až po dokončení databázového schématu:
cd /mnt/flash1/project/xamma-derived
php bin/create-admin publisher@example.com "Jméno vydavatele"
Skript si vyžádá heslo interaktivně, takže heslo nemusí být součástí příkazu ani historie shellu. Použijte alespoň 12 znaků. Pokud příkaz hlásí chybějící tabulku nebo selhání připojení, vraťte se ke konfiguraci DB_DSN, uživateli, heslu a importu obou SQL schémat.
12. Vytvoření API přihlašovacího klíče
API přihlášení používá dvě různé tajné hodnoty:
APP_KEYv souboru.env, nejméně 32 znaků;- samotný API přihlašovací klíč, nejméně 24 znaků.
Nejdříve vygenerujte dlouhý náhodný klíč:
openssl rand -hex 24
Potom spusťte generátor se dvěma argumenty: API klíčem a e-mailem existujícího administrátora:
php bin/create-api-key \
'SEM_VLOZTE_API_KLIC_NEJMENE_24_ZNAKU' \
publisher@example.com
Skript vypíše řádek ve tvaru:
credential_0123456789abcdef="ZASIFROVANA_HODNOTA"
Tento řádek vložte do sekce [credentials] v souboru config/apikey.ini. Původní zkušební credential odstraňte. V souboru se neukládá otevřený API klíč ani otevřený e-mail; obě hodnoty jsou zašifrované pomocí AES-256-GCM a klíče APP_KEY.
Přihlašovací adresa má tvar:
https://vas-server.example:4438/admin/signin/VAS_API_KLIC
Protože je klíč součástí URL, může se objevit v historii prohlížeče a přístupovém logu webového serveru. Zacházejte s celou adresou jako s heslem.
13. Dokončení instalace
Po nastavení .env, importu databáze a vytvoření administrátora obnovte stránku. Není nutné restartovat Apache, pokud jste měnili pouze .env a databázi. Instalační stránka zmizí, jakmile se aplikace úspěšně připojí a najde všechny požadované tabulky.
curl -k -I https://46.13.178.180:4438/
Očekávaný výsledek je HTTP 200. Zkontrolujte také přihlášení do Studia, vytvoření článku nebo podcastového kanálu, upload obrázku a zápis session.
14. Nejčastější problémy
403 Forbidden
Zkontrolujte, zda virtual host míří do PROJECT_ROOT/public, zda Apache může projít všemi nadřazenými adresáři a zda sekce <Directory> obsahuje Require all granted.
500 Server error
Podívejte se do samostatného Apache logu a do storage/logs. Častými příčinami jsou špatná práva adresářů, nečitelný .env, chybný DSN, chybějící tabulky nebo neplatný PHP soubor.
tail -n 200 /var/log/apache2/xamma-derived-4438-error.log
find /mnt/flash1/project/xamma-derived/storage/logs -maxdepth 1 -type f -print
Požadavek na 24 nebo 32 znaků
Nejde o stejnou hodnotu. APP_KEY musí mít alespoň 32 znaků. API klíč předávaný skriptu create-api-key musí mít alespoň 24 znaků. Skript navíc vyžaduje jako druhý argument platný e-mail administrátora.
Instalační stránka nezmizela
Aplikace buď nemá platné databázové údaje, nedokáže se připojit, nebo v databázi chybí část schématu. Ověřte DB_DSN, DB_USER, DB_PASSWORD a import souborů 10-main-module.sql a 20-media-module.sql.
15. Produkční kontrolní seznam
- Veřejným kořenem je pouze adresář
public. - Soubor
.envnení dostupný z webu a má omezená práva. APP_DEBUG=false.APP_KEYje náhodný a má nejméně 32 znaků.- Výchozí API credential byl odstraněn.
- API klíč má nejméně 24 znaků a je bezpečně uložen.
- Databázový účet má práva pouze k databázi aplikace.
- Vzdálený přístup k MariaDB je omezen firewallem.
- Self-signed certifikát byl na veřejném webu nahrazen důvěryhodným certifikátem.
- Adresáře
storageapublic/uploadsjsou zapisovatelné pro Apache, ostatní části projektu pouze čitelné. - Apache
configtest, smoke test a HTTP test končí úspěšně.
Závěr
Xamma Derived se dá spustit bezpečně ještě před vytvořením databáze. Klíčem k bezproblémovému nasazení je správný veřejný kořen public, oddělení privátní konfigurace, přesně nastavená práva provozních adresářů, vlastní databáze a dva správně rozlišené klíče: APP_KEY pro šifrování a dlouhý API klíč pro přihlášení. Pokud jednotlivé kroky provádíte v uvedeném pořadí a po každém kroku kontrolujete logy, lze většinu chyb odhalit ještě před zpřístupněním webu uživatelům.
Poznámka: Balík Xamma Derived je ke stažení v sekci Download.
- Předchozí článek: Radioserver na Raspberry PI: webová část
- Následující článek: Xamma Basic - Original PHP Podcast framework: Nasazení krok za krokem
- Všechny články rubriky
Napište komentář
jaký šel, takového potkal
Jak se dnešní přísloví odráží v našem životě a jak naše chování a postoje ovlivňují lidi, které potkáváme?
Rozhovor s Michalem o Betwindu, část 1
Rozhovor s Michalem Králem o kapele Betwind jako pokračování mojí kytarové cesty. V první části nahrávka písně Figure
Kráva zajíce nedohoní
Dnešní přísloví pojednává o realistických očekáváních a limitech schopností a o důležitosti přizpůsobení nároků reálným možnostem.
Dvakrát měř, jednou řež, aneb v podstatě, prostě, tedy a vlastně
Podívejme se na význam přísloví „Dvakrát měř, jednou řež“. Kdy se unáhlené kroky ukazují jako chyby? Proč je někdy lepší chvíli přemýšlet, než jednat?
Přání k Vánocům
Vánoční přání a nahrávka Chtíc, aby spal
Kiksylend na Portě
Jaké to bylo na letošní portě? Působení Kiksylendu na legendárním hudebním festivalu, nahrávky písní Kavárenský povaleč, Kateřina a MDŽ a dále…
Rozhovor s Michalem o Betwindu, část 2
Rozhovor s Michalem Králem o kapele Betwind jako pokračování mojí kytarové cesty. Ve druhé části píseň Ophelia
Vzpomínky nejen školní, část 1: Gymnázium
Úsměvné vzpomínky na léta nejen školní. Přeji příjemný poslech
Drzé čelo lepší než poplužní dvůr
Co je vlastně drzé čelo a co přesně poplužní dvůr? A proč by mělo býti lepší? Málo známé přísloví ovšem opět velmi aktuální
Vzpomínky nejen školní, část 4: Gymnázium naposledy
Závěrečný díl školních vzpomínek
Foto z koncertů skupiny NAŠKRK, část I.
Galerie mých fotografií z koncertu skupiny NAŠKRK pořízené 15. 11. 2002. Foto: Roman Vokurek
Foto z koncertů skupiny NAŠKRK, část II.
Galerie mých fotografií z koncertu skupiny NAŠKRK v sále hotelu v Moravském Krumlově pořízené 7. března 2003. Foto: Roman Vokurek
K pramenům řeky Rokytné II.
Druhá výprava k pramenům posvátné řeky Rokytné tentokráte vedoucí z Moravského Krumlova do Tulešic. Průzkum proveden 19. 5. 2023. Autorem fotografií…
Mariánská kaple v zimě
Fotky z lokality zvané jako Mariánská studánka mezi obcemi Moravský Krumlov a Rokytná, tentokráte pod sněhovou pokrývkou. Fotky pořízeny 10. 12. 2023…
Výstup na Velký Lopeník
Druhá hřebenová výprava v nejkrásnějších horách světa, tedy v Bílých Karpatech, tentokráte zasvěcena dobytí Velkého Lopeníku (911 mnm). Výstup po…
Zima v Moravském Krumlově, část II.
Výběr zimních fotografií z Moravského Krumlova. Snímky pořízeny 2. 12. 2023. Foto: Petra
K pramenům řeky Rokytné III.
Třetí výprava k pramenům posvátné řeky Rokytné tentokráte vedoucí z Tulešic do Tavíkovic. Průzkum neprobádanou, neprostupnou, nedotčenou, divokou,…
Podzim v Moravském Krumlově, část II.
Výběr podzimních fotografií z Moravského Krumlova. Snímky pořízeny 12. 11. 2023. Foto: Petra
K pramenům řeky Rokytné I.
Výprava k pramenům řeky Rokytné, část první od soutoku s Jihlavou v Ivančicích do Moravského Krumlova. Průzkum proveden 22. 4. 2022. Autorem…
Jaro v Moravském Krumlově, část II.
Jarní galerie pořízená z moravskokrumlovského zámeckého parku 5. 5. 2024. Foto: Petra
Vražda Reeny Virk
V roce 1997 zmizela čtrnáctiletá Reena Virk z jihoasijské rodiny ve Victorii na ostrově Vancouver. Rekonstruujeme osudnou noc, vyšetřování, soudy s…
Vražda Pauly Gallant
V této epizodě se ponoříme do případu vraždy Pauly Gallant. Prozkoumáme, jak vyšetřovatelé využili kontroverzní policejní taktiku známou jako "Mr.…
Zvrhlý pár Paul Bernardo a Karla Homolka
V této mrazivé epizodě se ponoříme do jednoho z nejděsivějších případů kanadské kriminalistiky. Paul Bernardo a Karla Homolka byli na první pohled…
Vraždící policista
Jednoho chladného zářijového dne roku 1918 Mary Wilsonová, mladá nastávající matka, za podezřelých okolností krátce po příjezdu do Saskatoonu zmizí.…
Vražda Wayna Millarda
Epizoda o záhadné vraždě Wayna Millarda, úspěšného kanadského podnikatele a otce známého Delenna Millarda. Prozkoumáme okolnosti jeho smrti, která…
Zmizení Laury Babcock
V této epizodě se ponoříme do případu vraždy Laury Babcock, mladé ženy z Toronta, která záhadně zmizela v roce 2012. Prozkoumáme okolnosti jejího…
Vražda Tima Bosmy
Tim Bosma, kanadský otec a manžel, zmizel v květnu 2013 poté, co s dvěma neznámými muži odjel na testovací jízdu svého nákladního vozu, který…
Zločiny Russella Williamse
Na konci ledna 2010 ze svého domu beze stopy zmizela sedmadvacetiletá Jessica Lloyd. Kdo je za tento čin zodpovědný? Na policii je zavolán muž, aby…
Vraždy Roberta Picktona
Během osmdesátých a devadesátých let minulého století se začali ztrácet ženy z místa známého jako Downtown Eastside v kanadské metropoli Vancouver v…
Vyvraždění rodiny Johnson-Bentley
V srpnu 1982 se šest členů jedné rodiny vydalo na dvoutýdenní kempování na odlehlé místo ve Wells Parku v Britské Kolumbii. O měsíc později byly…
Výlet do neznáma
Píseň z alba Rozpaky, inspirovaná neznámou dívkou v modrém... Text i hudba byli napsány 9. 12. 2018.
Podzim
Báseň a píseň z alba Rozpaky vydaná v roce 2019. Báseň byla napsána za letní noci 21. 8. 2016, nevzpomínám si přesně, ale myslím, že nad sklenkou whisky.
Třešně a led
Píseň z alba Rozpaky inspirovaná událostmi prvních lednových dní roku 2003. Píseň patří všem, kteří toho roku tragicky zahynuli... Text byl napsán 4. 7. 2016. Hudba byla napsána 27. 8. 2016.
Světem vcelku
Píseň z alba Rozpaky. Inspirace všeobímající, tak trochu osobní výpověď. Pojednání o věcech těžko pochopitelných. Text byl napsán 29. 11. 2015. Hudba byla napsána v lednu 2016.
Změna
Píseň z alba Rozpaky inspirovaná podzimními událostmi roku 2003. Text byl napsán 24. 8. 2016. Hudba byla napsána 20. 12. 2018.
Čumísek
Píseň z alba Rozpaky inspirovaná událostmi roku 2003. Text byl napsán 9. 7. 2016. Hudba byla napsána 17. 12. 2018.
Takový jako tento
Píseň z alba Rozpaky inspirovaná jak jinak nešťastnou láskou. Hudba původně z anglickým textem byla napsána v září 2003. Text byl napsán 20. 2. 2016.
Služby zdarma
Píseň z alba Rozpaky inspirovaná nehynoucí touhou všelijakých obchodníků prodat vám cokoli. Text i hudba byli napsány 10. 5. 2017.
Málem omylem
Vzpomínka na první červencové dny roku 2003. Pokud se vám náhodou něco někdy nepovede, nesahejte na alkohol, je to velice zlý pán a nemá slitování. Text písně byl napsán 8. 5. 2017.
Tak dávno
Vzpomínka na první červencové dny roku 2003. Text i hudba byli napsány 10. 5. 2017.






Komentáře: 0