diff --git a/Documentation/Databaze.md b/Documentation/Databaze.md new file mode 100644 index 0000000..20c0195 --- /dev/null +++ b/Documentation/Databaze.md @@ -0,0 +1,281 @@ +# 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](#varianta-a-import-sql) nebo [ruční vytvoření tabulek](#varianta-b-ruční-vytvoření-tabulek). Poté pokračuj [vytvořením prvního správce](#první-administrátor) a [nastavením připojení](#připojení-aplikace). + +## 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](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](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 + +1. V XAMPP spusť Apache a MySQL. +2. Otevři `http://localhost/phpmyadmin/` a přihlas se databázovým účtem s právem vytvářet databáze a tabulky. +3. Na kartě **SQL** vytvoř databázi: + + ```sql + CREATE DATABASE `usbraidlogin` + CHARACTER SET utf8mb4 + COLLATE utf8mb4_unicode_ci; + ``` + +4. V levém panelu vyber **usbraidlogin**. Tento krok je nutný, protože dump neobsahuje příkaz `USE`. +5. Otevři **Import**, vyber `Documentation/usbraidlogin.sql`, ponech formát SQL a spusť import. +6. Ve stejné databázi znovu otevři **Import** a importuj `Documentation/share.sql`. +7. Zkontroluj, že jsou přítomné tabulky `users` a `share`. + +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](#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: + +```powershell +& '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`: + +```sh +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: + +```sql +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 + +```sql +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`: + +```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`: + +```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ář: + +1. Vyber databázi `usbraidlogin`, zvol vytvoření nové tabulky `users` a počet sloupců **7**. +2. 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)` a `upPer TINYINT(1)`. +3. U všech sloupců ponech **NULL vypnuté** a nezapínej `A_I` (AUTO_INCREMENT). Přepínačům nastav výchozí hodnotu `0`, sloupci `defPath` hodnotu `/`. `uname` a `pswd` nemají výchozí hodnotu. Pro shodu s původním dumpem nenastavuj žádný primární klíč. +4. Vyber engine **InnoDB**, porovnávání **utf8mb4_unicode_ci** a tabulku ulož. +5. Vytvoř tabulku `share` se **4** sloupci: `token CHAR(32)`, `file_path TEXT`, `expiration DATETIME` a `download_allowed TINYINT(1)`. +6. Opět vypni NULL a AUTO_INCREMENT. U `download_allowed` nastav výchozí hodnotu `0`; ostatní sloupce výchozí hodnotu nemají. Sloupci `token` nastav index **PRIMARY**. +7. Použij InnoDB a utf8mb4_unicode_ci. Po uložení na kartě **Struktura** přidej běžný index `idx_share_expiration` na sloupci `expiration`. +8. Výsledek porovnej pomocí `SHOW CREATE TABLE users;` a `SHOW 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ť: + +```sh +php -r "echo password_hash('ZVOLTE_VLASTNI_HESLO', PASSWORD_BCRYPT), PHP_EOL;" +``` + +V PowerShellu s XAMPP lze použít plnou cestu: + +```powershell +& '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é: + +```sql +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: + +```sql +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: + +```sql +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`: + +```sql +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: + +```php +$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ěř: + +```sql +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ť: + +```sql +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ěř: + +1. Přihlášení vlastním administrátorem a otevření správy účtů. +2. Správnou výchozí cestu a přístup k SFTP souborům. +3. Vytvoření sdíleného odkazu u testovacího média a jeho otevření v anonymním okně. +4. 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`. | diff --git a/Documentation/share.sql b/Documentation/share.sql new file mode 100644 index 0000000..01c10f6 --- /dev/null +++ b/Documentation/share.sql @@ -0,0 +1,12 @@ +-- Doplneni puvodniho usbraidlogin.sql o tabulku pro sdilene odkazy. +-- Nejprve vyberte databazi usbraidlogin v phpMyAdmin nebo prikazem USE. +-- Struktura odpovida INSERT/SELECT v Web/content/ftp/view.php a shared.php. + +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; diff --git a/README.md b/README.md index 37b6d05..cc22bc8 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,153 @@ -# USB-RAID-pole -Cílem práce je nalézt využití zastaralých paměťových médií jako například slabopaměťové USB flash disky s malou paměťovou kapacitou. Technologii RAID (NAS) pole v praxi implementujte na vícero RAID technologiích a vzájemně komparujte řešení. Komparujte chování navrženého systému minimálně na technologiích RAID 0, RAID 1 a RAID 5. Vytvořte vzdálené připojení na toto RAID pole s možností nahrání a stažení souborů po přihlášení uživatele (web login). K tomuto účelu vytvořte webovou aplikaci. Zabezpečte vzdálené připojení. Použité technologie: RAID, NAS, FTP, USB, Flash, HTML, PHP, MySQL. +# USB RAID Array + +Webový SFTP klient pro vzdálenou práci se soubory na RAID/NAS úložišti. Projekt vznikl jako školní práce zaměřená na využití starších USB flash disků a porovnání RAID 0, RAID 1 a RAID 5. + +Aplikace běží na PHP serveru, účty a sdílené odkazy ukládá do MySQL/MariaDB a k úložišti se připojuje přes SFTP. Statistiky vzdáleného Linux serveru získává přes SSH. Samotné vytvoření RAID pole se provádí na serveru mimo tuto webovou aplikaci. + +## Funkce + +- Přihlášení, změna hesla a správa uživatelských účtů. +- Oprávnění pro nahrávání, stahování a mazání souborů. +- Procházení adresářů, hledání v aktuální složce a filtrování souborů/složek. +- Nahrávání souborů i adresářů, drag & drop a zobrazení průběhu přenosu. +- Vytváření, přejmenování a mazání položek; stažení adresáře jako ZIP. +- Editor textových souborů, náhled obrázků, videa, audia a PDF. +- Sdílení médií odkazem s expirací a volitelným stažením. +- Přehled disků, Linux MD RAID polí, CPU, RAM a swapu. +- Společná postranní navigace, modré akcenty, světlý a tmavý režim bez závislosti na Bootstrapu. + +## Technologie a požadavky + +| Část | Požadavky | +| --- | --- | +| Webový server | Apache, například v XAMPP; pro lokální vývoj lze použít i vestavěný PHP server. | +| PHP | Projekt je lokálně ověřený na PHP 8.2.12. Používané závislosti jsou uvedené v `Web/composer.lock`. | +| Databáze | MySQL/MariaDB; původní SQL dump pochází z MySQL 8.0.41. | +| PHP moduly | `mysqli` s `mysqlnd` pro `get_result()`, `session`, `fileinfo`; `zip` pro ZIP operace. Testy vykreslení používají také `dom`. | +| Závislosti | Composer a `phpseclib/phpseclib` řady 3; v repozitáři je také adresář `Web/vendor`. | +| Úložiště | Dostupný SFTP server a účet s přístupem k požadované cestě. | +| Statistiky | SSH přístup k Linux serveru, příkazy `df`, `free`, `vmstat`, `awk`, `tail` a čitelný `/proc/mdstat` pro Linux MD RAID. | +| Prohlížeč | Moderní prohlížeč s podporou nativního ``. PDF náhled načítá PDF.js z CDN. | + +Rozbalování archivů kromě ZIP může vyžadovat další nástroje, například UnRAR, 7-Zip nebo tar podle zvoleného formátu a operačního systému. PHP musí mít zapisovatelný dočasný adresář pro práci s archivy. + +## Rychlé zprovoznění + +### 1. Stažení projektu a závislostí + +```sh +git clone https://github.com/michalcz10/USB-RAID-Array.git +cd USB-RAID-Array/Web +composer install +``` + +Pokud už projekt máš stažený, spusť `composer install` v jeho adresáři `Web`. Pro instalaci podle existujícího lock souboru používej `install`. + +### 2. Databáze a první správce + +Postup je v [dokumentaci databáze](Documentation/Databaze.md). Obsahuje dvě varianty: + +1. Import [původního SQL dumpu](Documentation/usbraidlogin.sql) a [doplnění tabulky pro sdílení](Documentation/share.sql). +2. Ruční vytvoření databáze a obou tabulek. + +Součástí návodu je vytvoření prvního administrátora s bcrypt hashem hesla. Původní dump obsahuje také uživatelská data a sám nevytváří databázi ani tabulku `share`. + +### 3. Konfigurace připojení + +V souboru `Web/config/config.php` nastav vlastní připojení. Následující hodnoty jsou příklady; nahrazují odpovídající proměnné v existujícím souboru: + +```php +$DB_HOST = 'localhost'; +$DB_USER = 'usbraid_app'; +$DB_PASS = 'DOPLNTE_HESLO_DB'; +$DB_NAME = 'usbraidlogin'; + +$SFTP_HOST = 'ADRESA_SFTP_SERVERU'; +$SFTP_USER = 'SFTP_UZIVATEL'; +$SFTP_PASS = 'DOPLNTE_HESLO_SFTP'; + +$SSH_HOST = 'ADRESA_SSH_SERVERU'; +$SSH_USER = 'SSH_UZIVATEL'; +$SSH_PASS = 'DOPLNTE_HESLO_SSH'; +``` + +SFTP a SSH mohou používat stejný server, ale mají samostatné konfigurační proměnné. Aktuální pomocné funkce používají výchozí port 22 a přihlášení heslem. Přihlašovací údaje do webu se ověřují proti tabulce `users`; jednotliví weboví uživatelé sdílejí nakonfigurované SFTP připojení. + +Výchozí vzdálená cesta se načítá z `users.defPath` po přihlášení. Nastav například `/mnt/raid` podle skutečného připojení úložiště na vzdáleném serveru. Nejde o cestu na počítači s XAMPP. SFTP účet musí mít také odpovídající oprávnění v Linuxu. + +### 4. Spuštění přes XAMPP + +1. Spusť Apache a MySQL v XAMPP Control Panelu. +2. Zpřístupni adresář `Web` jako `C:\xampp\htdocs\Web` — zkopírováním nebo již nastaveným symlinkem. +3. Otevři `http://localhost/Web/` a přihlas se vytvořeným účtem. +4. Ve správě uživatelů nastav další účty, jejich vzdálené cesty a oprávnění. + +Při úpravách projektu používej soubory, které Apache skutečně obsluhuje. U kopie v `htdocs` je potřeba změny překopírovat; symlink odkazuje přímo na pracovní adresář. + +Alternativně lze z kořene repozitáře spustit lokální PHP server: + +```sh +php -S 127.0.0.1:8080 -t Web +``` + +Pak otevři `http://127.0.0.1:8080/`. Databáze a vzdálený SFTP/SSH server musí být dostupné i v tomto režimu. + +## Struktura projektu + +```text +USB-RAID-Array/ +├── README.md +├── LICENSE +├── Documentation/ +│ ├── Databaze.md # import, ruční vytvoření tabulek a první správce +│ ├── usbraidlogin.sql # původní dump tabulky users včetně dat +│ ├── share.sql # doplnění schématu pro sdílené odkazy +│ └── ... # původní technická dokumentace a podklady +├── tests/ +│ ├── workspace_test.php +│ └── serverstats_test.php +└── Web/ + ├── index.php # přihlášení + ├── config/config.php # databáze, SFTP a SSH + ├── includes/workspace.php + ├── content/ + │ ├── adminpanel.php + │ ├── changepassword.php + │ └── ftp/ # správce souborů, náhledy a statistiky + ├── css/ # společné styly a rozložení + ├── js/ # téma a dialogy + ├── composer.json + └── vendor/ +``` + +## Kontroly + +Z kořene repozitáře: + +```sh +php tests/workspace_test.php +php tests/serverstats_test.php +node --check Web/js/theme.js +node --check Web/js/ui.js +node --check Web/content/ftp/js/index.js +``` + +PHP testy používají testovací data a nepotřebují připojení k databázi ani SSH. Kontrolují vykreslení stránek, navigaci podle role, zpracování statistik a stavy RAID polí. Node.js slouží u uvedených příkazů ke kontrole syntaxe; pro běh aplikace není potřeba. + +## Časté problémy + +| Problém | Co zkontrolovat | +| --- | --- | +| Chyba připojení k databázi | Běžící MySQL, název databáze, `$DB_*` a oprávnění databázového účtu. | +| Chybí tabulka `users` nebo `share` | Dokončení [nastavení databáze](Documentation/Databaze.md). | +| Přihlášení do webu nefunguje | `pswd` musí obsahovat bcrypt hash, nikoli samotné heslo. | +| `Login Failed` nebo `SSH login failed` | Nastavení SFTP/SSH, dostupnost serveru a vzdálená oprávnění. | +| Nefunguje upload větších souborů | `upload_max_filesize`, `post_max_size`, `max_file_uploads` a časové limity PHP/serveru. Po změně `php.ini` v XAMPP restartuj Apache. | +| Statistiky úložiště jsou stejné | `/` a uživatelská výchozí cesta mohou ležet na stejném souborovém systému. | +| RAID uvádí `Not configured` | Na připojeném serveru není v `/proc/mdstat` detekováno Linux MD pole; RAID na hostiteli virtuálního serveru se tímto způsobem nezobrazuje. | +| PDF se nenačte | Dostupnost PDF souboru, přístup přes SFTP a načtení PDF.js z CDN. | +| Zobrazuje se staré rozhraní | Obnov stránku včetně cache a ověř, že XAMPP načítá správnou kopii projektu. | + +## Licence + +Projekt je dostupný pod [licencí MIT](LICENSE). Autorem je Michal Sedlák.