# Instrukcja krok po kroku — strona ślubna weronikairafal.pl

Pełne wdrożenie od zera: strona ślubna + galeria store-and-forward
(pełne zdjęcia trzymane na domowym serwerze, VPS jako publiczny bufor).

Maszyny:
- **VPS** — publiczny, `weronikairafal.pl`: strona, API, bufor zdjęć, forwarder.
- **DOM** — domowy serwer (przez WireGuard): trwałe archiwum pełnych zdjęć.

Legenda placeholderów do podmiany:
- `SEKRET_KEY` — losowy sekret sesji (krok 1)
- `HASLO_ADMINA` — Twoje hasło do panelu `/admin`
- `HOME_SECRET` — wspólny sekret VPS↔dom (krok 1)
- `10.50.0.2` — adres WireGuard domowego serwera (ustalisz w kroku 3)
- `uzytkownik` — konto na danym serwerze

---

## Krok 1 — Wygeneruj sekrety

Na dowolnej maszynie:

```bash
python3 -c "import secrets; print('SEKRET_KEY  =', secrets.token_hex(32))"
python3 -c "import secrets; print('HASLO_ADMINA= (wpisz wlasne)')"
python3 -c "import secrets; print('HOME_SECRET =', secrets.token_hex(24))"
```

Zapisz te trzy wartości — będą potrzebne w kilku miejscach.
`HOME_SECRET` musi być **identyczny** na VPS i na domu.

---

## Krok 2 — DNS w OVH

W panelu OVH dla `weronikairafal.pl` dodaj rekordy A na adres VPS:

```
@      A    51.38.131.152
www    A    51.38.131.152
```

(Potwierdź IP swojego VPS. Propagacja DNS bywa do kilku godzin —
możesz iść dalej i wrócić do certyfikatu SSL, gdy domena się rozpropaguje.)

Sprawdzenie:
```bash
dig +short weronikairafal.pl     # powinno zwrócić IP VPS
```

---

## Krok 3 — Ustal adres WireGuard domowego serwera

Na **domowym serwerze**:

```bash
sudo wg show          # zobacz interfejs (np. wg0) i adresy
ip -4 addr show wg0   # adres z podsieci 10.50.0.0/24, np. 10.50.0.2
```

Zanotuj ten adres (dalej w instrukcji: `10.50.0.2`).

Z **VPS** sprawdź łączność tunelem:
```bash
ping -c2 10.50.0.2    # muszą chodzić odpowiedzi
```

---

## Krok 4 — Rozpakuj projekt i rozłóż pliki

Pobierz `weronikairafal.zip` na swój komputer. W środku:

```
weronikairafal/
├── app.py, forwarder.py, requirements.txt        ← na VPS
├── weronikairafal.service, weronikairafal-forwarder.service  ← na VPS
├── site/                                          ← na VPS (cała strona)
├── uploads/                                       ← na VPS (bufor)
└── home_server/                                   ← na DOM
    ├── receiver.py, requirements.txt
    └── weronikairafal-home.service
```

Wyślij na serwery (z komputera, podmień użytkowników/adresy):

```bash
# na VPS:
scp -r weronikairafal uzytkownik@51.38.131.152:/tmp/wr

# na DOM (jeśli ma publiczny SSH lub przez WireGuard 10.50.0.2):
scp -r weronikairafal/home_server uzytkownik@10.50.0.2:/tmp/wr-home
```

---

## Krok 5 — DOMOWY SERWER: odbiornik zdjęć

Zaloguj się na dom przez SSH.

```bash
sudo mv /tmp/wr-home /opt/weronikairafal-home
cd /opt/weronikairafal-home
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
mkdir -p archive
```

Edytuj usługę:
```bash
sudo nano weronikairafal-home.service
```
Ustaw w niej:
- `User=` i `Group=` na właściciela katalogu (Twój użytkownik),
- `WR_HOME_SECRET=HOME_SECRET`,
- w linii `ExecStart` w `--bind` wpisz adres WG domu: `10.50.0.2:8021`.

Zainstaluj i uruchom:
```bash
sudo cp weronikairafal-home.service /etc/systemd/system/
sudo chown -R uzytkownik:uzytkownik /opt/weronikairafal-home
sudo systemctl daemon-reload
sudo systemctl enable --now weronikairafal-home
sudo systemctl status weronikairafal-home      # powinno być "active (running)"
```

Zapora — wpuść port 8021 tylko z tunelu WireGuard:
```bash
sudo ufw allow in on wg0 to any port 8021 proto tcp
```

**Punkt kontrolny** (z VPS):
```bash
curl -s -H "X-WR-Secret: HOME_SECRET" http://10.50.0.2:8021/health
# oczekiwane: {"ok":true}
```

---

## Krok 6 — VPS: strona + API + forwarder

Zaloguj się na VPS przez SSH.

```bash
sudo mv /tmp/wr /opt/weronikairafal
cd /opt/weronikairafal
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```

Jeśli `pillow-heif` (obsługa HEIC z iPhone'a) próbowałby kompilować ze źródeł
i zgłosił błąd:
```bash
sudo apt update && sudo apt install -y libheif-dev
pip install -r requirements.txt
```

Edytuj usługę web:
```bash
sudo nano weronikairafal.service
```
Ustaw:
- `WR_SECRET_KEY=SEKRET_KEY`
- `WR_ADMIN_PASSWORD=HASLO_ADMINA`
- `WR_BASE_URL=https://weronikairafal.pl`
- `WR_HOME_URL=http://10.50.0.2:8021`
- `WR_HOME_SECRET=HOME_SECRET`

Edytuj usługę forwardera:
```bash
sudo nano weronikairafal-forwarder.service
```
Ustaw:
- `WR_HOME_URL=http://10.50.0.2:8021`
- `WR_HOME_SECRET=HOME_SECRET`
- `WR_KEEP_FULL_ON_VPS=0`  (0 = dom magazynem, VPS chudy; 1 = pełne kopie też na VPS jako cache)

Zainstaluj obie usługi:
```bash
sudo cp weronikairafal.service weronikairafal-forwarder.service /etc/systemd/system/
sudo chown -R www-data:www-data /opt/weronikairafal/uploads
sudo systemctl daemon-reload
sudo systemctl enable --now weronikairafal weronikairafal-forwarder
sudo systemctl status weronikairafal weronikairafal-forwarder
```

**Punkt kontrolny** (na VPS):
```bash
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8011/        # 200
curl -s http://127.0.0.1:8011/qr.png --output /tmp/qr.png && echo "QR OK"
```

---

## Krok 7 — Nginx Proxy Manager (HTTPS)

W panelu NPM → **Proxy Hosts → Add Proxy Host**:

- **Domain Names:** `weronikairafal.pl`, `www.weronikairafal.pl`
- **Scheme:** `http`
- **Forward Hostname/IP:** `127.0.0.1`  (jeśli NPM działa w Dockerze → `host.docker.internal`)
- **Forward Port:** `8011`
- **Block Common Exploits:** zaznacz
- Zakładka **SSL:** *Request a new SSL Certificate* (Let's Encrypt) → **Force SSL** + **HTTP/2 Support**

> NPM w Dockerze a `host.docker.internal`: w compose NPM dodaj
> `extra_hosts: ["host.docker.internal:host-gateway"]`, potem restart NPM.

Po wydaniu certyfikatu wejdź na `https://weronikairafal.pl` — zobaczysz stronę główną.

---

## Krok 8 — Test od początku do końca

1. Wejdź na `https://weronikairafal.pl` → klikaj kafelki (Galeria, Bingo, Harmonogram, Menu, Usługodawcy, Ankieta).
2. Galeria → **Pokaż kod QR** → zeskanuj telefonem (lub wejdź na `/upload`).
3. Wgraj 1–2 zdjęcia (też HEIC z iPhone'a). Powinny od razu pojawić się w galerii.
4. Sprawdź, że forwarder dopchnął je na dom:
   ```bash
   # VPS:
   journalctl -u weronikairafal-forwarder -n 20 --no-pager
   ls /opt/weronikairafal/uploads          # pełne pliki znikają po wysłaniu (przy KEEP=0)
   ls /opt/weronikairafal/uploads/thumbs   # miniatury zostają
   # DOM:
   ls /opt/weronikairafal-home/archive     # tu pojawiają się pełne zdjęcia
   ```
5. Wejdź na `https://weronikairafal.pl/admin`, zaloguj się hasłem `HASLO_ADMINA`,
   skasuj testowe zdjęcie. Powinno zniknąć z galerii i z `archive/` na domu.

**Test odporności na offline domu:** zatrzymaj odbiornik na domu
(`sudo systemctl stop weronikairafal-home`), wgraj zdjęcie — pojawi się w galerii
(miniatura z VPS), a forwarder będzie czekał. Po `start` odbiornika zdjęcie samo
dopchnie się na dom w ciągu kilkunastu sekund.

---

## Krok 9 — Twoja personalizacja (na VPS, w `/opt/weronikairafal/site/`)

- **Zdjęcie pary** (strona główna): wgraj plik jako
  `/opt/weronikairafal/site/image/zdjecie.jpg`.
- **Bingo** (`site/bingo.html`): zmień treść pól `<div class="bingo-cell">...`.
- **Harmonogram** (`site/harmonogram.html`): godziny i punkty programu.
- **Menu** (`site/menu.html`): nazwy dań w sekcjach.
- **Usługodawcy** (`site/uslugodawcy.html`): nazwy i linki.
- **Imiona/teksty**: w `site/index.html` (nagłówek „Weronika & Rafał").
- **Ankieta** (`site/ankieta.html`): teraz pokazuje podziękowanie po stronie
  klienta. Aby zbierać odpowiedzi, podłącz formularz do backendu (mogę dorobić
  endpoint zapisujący RSVP do `wr.db`).

Pliki statyczne są serwowane od razu — po edycji wystarczy odświeżyć stronę
(ewentualnie wyczyść cache przeglądarki). Nie trzeba restartować usługi po zmianie HTML/CSS.

---

## Krok 10 — Eksploatacja, backup, diagnostyka

Logi:
```bash
journalctl -u weronikairafal -f             # web/API
journalctl -u weronikairafal-forwarder -f   # forwarder
journalctl -u weronikairafal-home -f        # dom (na domowym serwerze)
```

Restart po zmianie ustawień w `.service`:
```bash
sudo systemctl daemon-reload
sudo systemctl restart weronikairafal weronikairafal-forwarder
```

Kopia zapasowa (pełny stan = metadane z VPS + archiwum z domu):
```bash
# DOM — pełne zdjęcia:
tar czf wr-archiwum-$(date +%F).tar.gz /opt/weronikairafal-home/archive
# VPS — metadane:
cp /opt/weronikairafal/wr.db wr-meta-$(date +%F).db
```

Najczęstsze problemy:
- **`/api/upload` zwraca 413** → plik większy niż limit; podnieś `MAX_CONTENT_LENGTH` w `app.py`.
- **Pełny podgląd 503** → dom offline i brak lokalnej kopii; wróci, gdy dom wstanie
  (lub ustaw `WR_KEEP_FULL_ON_VPS=1`, by trzymać kopie na VPS).
- **Odbiornik na domu nie startuje** → WireGuard nie był jeszcze podniesiony przy
  starcie; usługa sama ponawia (Restart=on-failure). Sprawdź `sudo wg show`.
- **NPM w Dockerze nie łączy z 127.0.0.1** → użyj `host.docker.internal` (patrz krok 7).
```
