Expand README with application features, requirements, XAMPP setup, connection configuration, project structure and troubleshooting. Add Czech database documentation covering SQL import, manual SQL and phpMyAdmin table setup, bcrypt administrator creation, database permissions and verification. Provide the missing share table schema as a separate SQL supplement and explain its relationship to the original users dump.
14 KiB
Nastavení databáze
Tento návod popisuje databázi webové aplikace USB RAID Array pro MySQL/MariaDB. Lze použít phpMyAdmin v XAMPP nebo příkazový klient mysql.
Vyber jednu ze dvou cest: import SQL nebo ruční vytvoření tabulek. Poté pokračuj vytvořením prvního správce a nastavením připojení.
Co aplikace ukládá
| Tabulka | Účel | Používají ji |
|---|---|---|
users |
Webové účty, hashe hesel, role, vzdálené cesty a oprávnění. | login.php, adminpanel.php, changepassword.php |
share |
Tokeny sdílených médií, cesta k souboru, expirace a povolení stažení. | ftp/view.php, ftp/shared.php |
Obsah souborů zůstává na SFTP serveru. Databáze uchovává jen účty a metadata sdílení.
Původní SQL soubor a doplnění
usbraidlogin.sql je původní dump z phpMyAdmin. Obsahuje vytvoření tabulky users a vložení uživatelských dat. Neobsahuje CREATE DATABASE, USE ani tabulku share. Tabulka users v tomto dumpu nemá primární ani unikátní klíč.
share.sql doplňuje strukturu, kterou aktuální kód potřebuje pro sdílené odkazy. Je odvozená z dotazů v view.php a shared.php, nikoli z původního dumpu. Neobsahuje testovací odkazy ani uživatelská data. IF NOT EXISTS při opakovaném spuštění nevytvoří druhou tabulku, ale také neopraví již existující nekompatibilní schéma.
Obě varianty níže používají databázi usbraidlogin, InnoDB a utf8mb4_unicode_ci podle původního SQL. Import původního dumpu prováděj do nové databáze; na existující tabulce users by CREATE TABLE skončilo chybou.
Varianta A: import SQL
Přes phpMyAdmin
-
V XAMPP spusť Apache a MySQL.
-
Otevři
http://localhost/phpmyadmin/a přihlas se databázovým účtem s právem vytvářet databáze a tabulky. -
Na kartě SQL vytvoř databázi:
CREATE DATABASE `usbraidlogin` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -
V levém panelu vyber usbraidlogin. Tento krok je nutný, protože dump neobsahuje příkaz
USE. -
Otevři Import, vyber
Documentation/usbraidlogin.sql, ponech formát SQL a spusť import. -
Ve stejné databázi znovu otevři Import a importuj
Documentation/share.sql. -
Zkontroluj, že jsou přítomné tabulky
usersashare.
Původní dump vkládá i účty s hashi hesel. Z hashe nelze zjistit původní heslo. Pro vlastní instalaci vytvoř vlastní účet podle kapitoly První administrátor. Importované účty před zpřístupněním instalace zkontroluj a ponech jen ty, které chceš používat.
Přes příkazový řádek
V PowerShellu otevři klienta z XAMPP:
& 'C:\xampp\mysql\bin\mysql.exe' -u root -p
Použij jméno svého správce databáze místo root, pokud se liší. Heslo se zadává až do výzvy klienta. Jestli má lokální účet prázdné heslo, potvrď výzvu Enterem.
Na Linuxu nebo pokud je klient v PATH:
mysql -u root -p
V klientovi spusť následující příkazy. Cesty uprav podle umístění repozitáře; v příkladu pro Windows jsou použité dopředné lomítka:
CREATE DATABASE `usbraidlogin`
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE `usbraidlogin`;
SOURCE C:/cesta/USB-RAID-Array/Documentation/usbraidlogin.sql;
SOURCE C:/cesta/USB-RAID-Array/Documentation/share.sql;
SHOW TABLES;
SOURCE je příkaz klienta mysql. V phpMyAdmin používej kartu Import. Na Linuxu nahraď cesty například /cesta/USB-RAID-Array/Documentation/usbraidlogin.sql a odpovídající cestou k share.sql.
Varianta B: ruční vytvoření tabulek
Tato varianta vytvoří prázdné tabulky bez importovaných účtů. Následující SQL vlož do karty SQL v phpMyAdmin nebo do klienta mysql. Původní dump už v této variantě neimportuj.
1. Databáze
CREATE DATABASE `usbraidlogin`
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE `usbraidlogin`;
Pokud databáze už existuje, vyber ji příkazem USE a přeskoč CREATE DATABASE. Před vytvořením tabulek ověř jejich existenci pomocí SHOW TABLES; existující tabulky nemaž kvůli opakování návodu.
2. Tabulka users
Struktura přesně odpovídá tabulce v původním usbraidlogin.sql:
CREATE TABLE `users` (
`uname` varchar(255) NOT NULL,
`pswd` varchar(60) NOT NULL,
`admin` tinyint(1) NOT NULL DEFAULT '0',
`defPath` varchar(255) NOT NULL DEFAULT '/',
`delPer` tinyint(1) NOT NULL DEFAULT '0',
`downPer` tinyint(1) NOT NULL DEFAULT '0',
`upPer` tinyint(1) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
| Sloupec | Význam |
|---|---|
uname |
Přihlašovací jméno. Každý účet vytvářej s odlišným jménem. |
pswd |
Bcrypt hash hesla vytvořený PHP, dlouhý 60 znaků. |
admin |
1 pro správce, 0 pro běžný účet; správce má přístup ke správě účtů a statistikám serveru. |
defPath |
Absolutní vzdálená cesta na SFTP serveru, například /mnt/raid. |
delPer |
1 povoluje mazání souborů a adresářů. |
downPer |
1 povoluje stahování v rozhraní. |
upPer |
1 povoluje nahrávání a úpravy, například vytváření, přejmenování, editaci a rozbalování archivů. |
Hodnoty oprávnění zadávej jako 0 nebo 1. Role správce a souborová oprávnění jsou samostatné sloupce; pro plný přístup nastav prvnímu správci všechny čtyři přepínače na 1.
Věrná kopie původního schématu nemá unikátní index pro uname. Administrace duplicity ověřuje při přidávání účtu, ale při ručním SQL je musíš zkontrolovat sám.
3. Tabulka share
Stejnou tabulku vytváří doplňující soubor share.sql:
CREATE TABLE IF NOT EXISTS `share` (
`token` char(32) NOT NULL,
`file_path` text NOT NULL,
`expiration` datetime NOT NULL,
`download_allowed` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`token`),
KEY `idx_share_expiration` (`expiration`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
| Sloupec | Význam |
|---|---|
token |
Identifikátor odkazu v URL; aplikace generuje 32 hexadecimálních znaků pomocí bin2hex(random_bytes(16)). |
file_path |
Vzdálená cesta ke sdílenému souboru. |
expiration |
Datum a čas konce platnosti. Dotaz v shared.php vyžaduje expiration > NOW(). |
download_allowed |
1 povoluje stažení přes sdílený odkaz, 0 pouze náhled. |
Primární klíč zajišťuje jedinečnost tokenu, index idx_share_expiration usnadňuje dotazy podle expirace. Mezi tabulkami není cizí klíč: současný kód u odkazu neukládá autora ani ID uživatele.
Alternativa: naklikání tabulek v phpMyAdmin
Místo spuštění uvedených CREATE TABLE můžeš stejné tabulky vytvořit přes formulář:
- Vyber databázi
usbraidlogin, zvol vytvoření nové tabulkyusersa počet sloupců 7. - Zadej názvy a datové typy podle SQL výše:
uname VARCHAR(255),pswd VARCHAR(60),admin TINYINT(1),defPath VARCHAR(255),delPer TINYINT(1),downPer TINYINT(1)aupPer TINYINT(1). - U všech sloupců ponech NULL vypnuté a nezapínej
A_I(AUTO_INCREMENT). Přepínačům nastav výchozí hodnotu0, sloupcidefPathhodnotu/.unameapswdnemají výchozí hodnotu. Pro shodu s původním dumpem nenastavuj žádný primární klíč. - Vyber engine InnoDB, porovnávání utf8mb4_unicode_ci a tabulku ulož.
- Vytvoř tabulku
sharese 4 sloupci:token CHAR(32),file_path TEXT,expiration DATETIMEadownload_allowed TINYINT(1). - Opět vypni NULL a AUTO_INCREMENT. U
download_allowednastav výchozí hodnotu0; ostatní sloupce výchozí hodnotu nemají. Sloupcitokennastav index PRIMARY. - Použij InnoDB a utf8mb4_unicode_ci. Po uložení na kartě Struktura přidej běžný index
idx_share_expirationna sloupciexpiration. - Výsledek porovnej pomocí
SHOW CREATE TABLE users;aSHOW CREATE TABLE share;s uvedenými SQL definicemi.
První administrátor
1. Vytvoření hashe hesla
Heslo do pswd neukládej jako prostý text ani jako MD5/SHA hash. Přihlášení používá PHP password_verify() a aplikace vytváří hesla pomocí PASSWORD_BCRYPT.
Pokud je PHP v PATH, spusť:
php -r "echo password_hash('ZVOLTE_VLASTNI_HESLO', PASSWORD_BCRYPT), PHP_EOL;"
V PowerShellu s XAMPP lze použít plnou cestu:
& 'C:\xampp\php\php.exe' -r "echo password_hash('ZVOLTE_VLASTNI_HESLO', PASSWORD_BCRYPT), PHP_EOL;"
ZVOLTE_VLASTNI_HESLO před spuštěním nahraď vlastním heslem. Zvol alespoň 8 znaků, jednu číslici a jedno velké písmeno, aby odpovídalo pravidlům správy účtů. Výstup bude bcrypt hash začínající například $2y$10$. Každé spuštění může pro stejné heslo vytvořit jiný platný hash.
Pokud nechceš heslo uvést v historii příkazové řádky, spusť php -a a zavolej password_hash() v interaktivním PHP shellu. Příkaz s vlastním heslem ani jeho výstup neukládej do veřejných ukázek dokumentace.
2. Vložení účtu
Nejprve ověř, zda zvolené jméno už není použité:
USE `usbraidlogin`;
SELECT `uname`, `admin`, `defPath` FROM `users` WHERE `uname` = 'spravce';
Pokud dotaz nic nevrátí, vlož účet. Text SEM_VLOZTE_BCRYPT_HASH nahraď celým skutečným hashem z předchozího kroku a /mnt/raid skutečnou cestou na SFTP serveru:
INSERT INTO `users`
(`uname`, `pswd`, `admin`, `defPath`, `delPer`, `downPer`, `upPer`)
VALUES
('spravce', 'SEM_VLOZTE_BCRYPT_HASH', 1, '/mnt/raid', 1, 1, 1);
Tento SQL příkaz je šablona — placeholder není platný hash. Do přihlašovacího formuláře následně zadávej jméno spravce a původní heslo, ze kterého jsi hash vytvořil. Další účty už lze přidávat přes User management.
Pokud jméno existuje, další stejné nevkládej. Pro obnovení přístupu ke svému účtu lze v phpMyAdmin nahradit pouze jeho hash:
UPDATE `users`
SET `pswd` = 'SEM_VLOZTE_BCRYPT_HASH'
WHERE `uname` = 'spravce';
Připojení aplikace
Pro aplikaci vytvoř samostatný databázový účet. Následující příklad předpokládá, že se PHP připojuje k databázi lokálně jako usbraid_app na hostiteli localhost:
CREATE USER 'usbraid_app'@'localhost' IDENTIFIED BY 'DOPLNTE_VLASTNI_HESLO_DB';
GRANT SELECT, INSERT, UPDATE, DELETE ON `usbraidlogin`.* TO 'usbraid_app'@'localhost';
DDL příkazy pro vytvoření tabulek spouštěj správcovským databázovým účtem. Aplikace pro běžný provoz nepotřebuje práva CREATE ani DROP. Pokud účet již existuje, CREATE USER neopakuj; nastav mu potřebná práva. Pro vzdálenou databázi použij hostitele odpovídajícího umístění PHP serveru místo localhost.
V existujícím Web/config/config.php nastav:
$DB_HOST = 'localhost';
$DB_USER = 'usbraid_app';
$DB_PASS = 'DOPLNTE_VLASTNI_HESLO_DB';
$DB_NAME = 'usbraidlogin';
Účet MySQL, webový účet z tabulky users a SFTP/SSH účet jsou tři různé věci. Změna hesla ve webové aplikaci mění pouze hash v users.pswd.
Časové pásmo sdílených odkazů
view.php počítá expiraci v Europe/Prague, zatímco databázový dotaz ji porovnává s NOW(). Databázový čas musí odpovídat tomuto pásmu, jinak může odkaz vypršet dříve nebo později. Ověř:
SELECT NOW() AS database_time,
@@global.time_zone AS global_time_zone,
@@session.time_zone AS session_time_zone,
@@system_time_zone AS system_time_zone;
Pokud databáze používá SYSTEM, ověř časové pásmo systému databázového serveru. U spravované instalace lze nakonfigurovat časové pásmo MySQL na Europe/Prague, pokud má server načtené tabulky časových pásem. Jednorázové SET time_zone v phpMyAdmin mění pouze jeho spojení a nevyřeší nastavení nových spojení aplikace. Pevný posun +01:00 nepokrývá český letní čas.
Ověření instalace
V databázi spusť:
USE `usbraidlogin`;
SHOW TABLES;
DESCRIBE `users`;
DESCRIBE `share`;
SELECT `uname`, `admin`, `defPath`, `delPer`, `downPer`, `upPer`,
CHAR_LENGTH(`pswd`) AS hash_length
FROM `users`;
Výsledek má obsahovat obě tabulky. U účtu vytvořeného podle návodu má mít hash_length hodnotu 60. Délka sama o sobě ještě nepotvrzuje správnost hesla; tu ověří přihlášení.
V aplikaci pak ověř:
- Přihlášení vlastním administrátorem a otevření správy účtů.
- Správnou výchozí cestu a přístup k SFTP souborům.
- Vytvoření sdíleného odkazu u testovacího média a jeho otevření v anonymním okně.
- Platnost odkazu a chování volby stažení.
Změny role, cesty a oprávnění provedené přímo v databázi se do existujícího webového přihlášení nepromítnou okamžitě — hodnoty se načítají do session při přihlášení. Po takové změně se odhlas a znovu přihlas.
Řešení chyb
| Chyba | Příčina a řešení |
|---|---|
Unknown database 'usbraidlogin' |
Vytvoř databázi a zkontroluj $DB_NAME. |
No database selected při importu |
Před importem vyber databázi v phpMyAdmin nebo spusť USE usbraidlogin. |
Table 'users' already exists |
Dump se importuje do již vytvořeného schématu. Zkontroluj existující tabulku a nepokračuj slepým mazáním dat. |
Table 'usbraidlogin.share' doesn't exist |
Importuj share.sql nebo tabulku vytvoř ručně podle návodu. |
Access denied for user |
Zkontroluj $DB_USER, $DB_PASS, hostitele a přidělená práva. |
| Přihlášení hlásí nesprávné údaje | Ověř jméno a bcrypt hash; do formuláře patří původní heslo. |
| Sdílený odkaz ihned expiruje | Zkontroluj časové pásmo a NOW() na databázovém serveru. |
| Čeština se ukládá nesprávně | Tabulky používají utf8mb4; současný helper v config.php nastavuje spojení na utf8. Pro plné čtyřbajtové znaky, například emoji, je potřeba sjednotit i spojení na utf8mb4. |