# Salonio 1.0.0, instalacja

To pierwsza wersja, więc nie ma z czego aktualizować. Poniżej instalacja od zera.

## Czego potrzebujesz

- hosting z PHP 8.2 lub nowszym i MySQL 8 albo MariaDB 10.6+
- pusta baza danych, z loginem i hasłem
- certyfikat SSL na domenie
- możliwość dodania zadania cron

## Krok po kroku

### 1. Wgraj pliki

Rozpakuj paczkę i wgraj zawartość katalogu `salonio/` na serwer.

Docelowy układ, jeśli hosting pozwala trzymać pliki poza katalogiem publicznym:

```
/home/uzytkownik/
  app/  bin/  config/  db/  docs/  storage/  tests/
  CHANGELOG.md  VERSION
  public_html/        <- katalog wskazywany przez domenę
```

Jeśli hosting wymaga, żeby wszystko leżało w `public_html`, wgraj całość tam. Katalogi `app`, `bin`, `config`, `db` i `storage` mają własne pliki `.htaccess`, które blokują dostęp z przeglądarki, a instalator to sprawdza.

### 2. Ustaw uprawnienia

```
chmod 755 storage storage/logs storage/cache storage/uploads storage/backups
chmod 755 config
```

Katalog `config` musi być zapisywalny na czas instalacji, bo powstaje w nim plik konfiguracji.

### 3. Uruchom instalator

Otwórz w przeglądarce `https://twojadomena.pl/instalacja` i przejdź pięć kroków:

1. wymagania
2. dane bazy danych
3. konto operatora, czyli Twoje, do `/admin`
4. pierwszy salon i konto właścicielki
5. adres aplikacji i poczta wychodząca

Konto operatora i konto właścicielki muszą mieć różne adresy e-mail. To dwa osobne światy i system tego pilnuje.

Po zakończeniu instalator blokuje się sam, tworząc `config/installed.lock`.

### 4. Dodaj cron

To jedyny krok, którego instalator nie zrobi za Ciebie. Bez niego nie działa kolejka zadań ani kopie zapasowe.

```cron
* * * * * /usr/bin/php /home/uzytkownik/bin/cron.php >> /home/uzytkownik/storage/logs/cron.log 2>&1
```

Gotową linię z prawdziwymi ścieżkami pokazuje ostatni ekran instalatora.

Jeśli hosting pozwala tylko na cron co 5 minut, system działa, tylko z opóźnieniem. Cron rzadszy niż co 15 minut to już problem.

### 5. Sprawdź

- `/version` pokazuje `Salonio 1.0.0`
- `/version.json` pokazuje zgodne `version` i `db_version`
- `/changelog` pokazuje listę zmian
- `/admin/health` świeci na zielono, także w sekcji `cron` i `backup`

Sekcje `sms_provider` i `stripe` mają status `pozniej`, bo te moduły wchodzą w etapach 5 i 6. To jest oczekiwane.

Pierwsze sprawdzenie kopii zapasowej wypadnie na czerwono, dopóki nie wykona się pierwsza kopia. Możesz ją wymusić od razu:

```
php bin/backup.php
```

### 6. Zaloguj się

- panel salonu: `/logowanie`, dane właścicielki podane w kroku 4
- panel operatora: `/admin/logowanie`, dane z kroku 3

## Po instalacji

### Kopie zapasowe poza serwerem

Kopia leży w `storage/backups` na tym samym dysku co baza, więc nie chroni przed awarią dysku. Ustaw wysyłkę tych plików na inny serwer albo do przestrzeni S3. Opis w `docs/11-instalacja-i-srodowisko.md`.

### Monitoring zewnętrzny

`/admin/health` wymaga zalogowania. Dla monitoringu jest osobne wejście z tokenem:

```
https://twojadomena.pl/admin/health-token?token=TOKEN
```

Token znajdziesz w `config/config.php` pod kluczem `security.health_token`. Adres zwraca kod 503, gdy coś jest nie tak, więc wystarczy pilnować kodu odpowiedzi.

### Testy

```
php tests/run.php
```

70 sprawdzeń: izolacja salonów, strefy czasowe, numery telefonów, kolejka, migrator, uprawnienia. Warto uruchomić po wgraniu każdej kolejnej wersji.

## Gdyby coś poszło nie tak

| Objaw | Przyczyna i co zrobić |
|---|---|
| Biała strona | Sprawdź `storage/logs/error-*.log`. Najczęściej brak uprawnień do zapisu w `storage` |
| Adresy dają 404 poza stroną główną | Brak `mod_rewrite` albo `AllowOverride None` w konfiguracji serwera |
| Instalator nie zapisuje konfiguracji | Katalog `config` nie jest zapisywalny |
| `/admin/health` pokazuje błąd w sekcji cron | Cron nie został dodany albo ścieżka do PHP jest inna. Sprawdź `storage/logs/cron.log` |
| Nie przychodzą e-maile | Puste dane SMTP. Wiadomości lądują wtedy w `storage/logs/app-*.log` zamiast w skrzynce |
| Chcesz zainstalować od nowa | Usuń `config/config.php`, `config/installed.lock` i wyczyść bazę |

## Co dalej

Etap 2 wnosi pracowników z uprawnieniami i grafikiem, usługi z cennikiem oraz klientki z kartą i importem z CSV. Pełny plan jest w `docs/10-etapy-wdrozenia.md`.
