# Wdrozenie — weronikairafal.pl (store-and-forward na domowy serwer)

Strona slubna na tym samym VPS co poprzedni projekt. Pelne zdjecia sa trwale
przechowywane na **domowym serwerze**, a VPS pelni role publicznego bufora.

```
  GOSC (telefon)
      |  upload przez QR (HTTPS)
      v
  +-----------------------------+        WireGuard (10.50.0.0/24)
  |  VPS  (weronikairafal.pl)   |  ───────────────────────────────►  +------------------------+
  |  - web/API (gunicorn)       |   forwarder POST /recv             |  DOMOWY SERWER         |
  |  - spool pelnych zdjec      |  ◄───────────────────────────────  |  receiver.py           |
  |  - miniatury + metadane     |   proxy GET /get/<name>            |  archive/ (pelne foto) |
  |  - forwarder.py             |                                    +------------------------+
  +-----------------------------+
```

- Dom **online**  -> zdjecia od razu dopychane i kasowane z bufora VPS.
- Dom **offline** -> zdjecia czekaja w buforze VPS, dopchnie je po powrocie.
  Galeria dziala caly czas (miniatury + metadane sa na VPS); pelny podglad,
  ktorego nie ma juz lokalnie, jest proxowany z domu (gdy dom offline: 503).

Adresy: galeria `/galeria.html`, upload (QR) `/upload`, panel `/admin`.

---

## 0. Sekrety (wygeneruj raz)

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

`WR_HOME_SECRET` musi byc **identyczny** na VPS (web + forwarder) i na domowym serwerze.

---

## 1. DNS w OVH

```
@      A    51.38.131.152
www    A    51.38.131.152
```
(Potwierdz IP VPS. Propagacja do kilku godzin.)

---

## 2. WireGuard VPS <-> dom

Masz juz tunel (subnet 10.50.0.0/24). Ustal adres WG domowego serwera, np.
`10.50.0.2`, i uzyj go w `WR_HOME_URL=http://10.50.0.2:8021`. Z VPS sprawdz:

```bash
ping -c2 10.50.0.2
```

Odbiornik na domu bindujemy **tylko** na ten adres WG (nie na 0.0.0.0 publicznie).

---

## 3. DOMOWY SERWER — odbiornik zdjec

Skopiuj katalog `home_server/` do `/opt/weronikairafal-home`:

```
/opt/weronikairafal-home/
├── receiver.py
├── requirements.txt
├── weronikairafal-home.service
└── archive/          ← tu lezy docelowo PELNA biblioteka zdjec
```

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

W `weronikairafal-home.service` ustaw `User`/`Group` (wlasciciel katalogu),
`WR_HOME_SECRET`, oraz w `--bind` wpisz adres WG domu (`10.50.0.2:8021`). Potem:

```bash
sudo cp weronikairafal-home.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now weronikairafal-home
# test z VPS:  curl -s -H "X-WR-Secret: <sekret>" http://10.50.0.2:8021/health
```

Zapora: dostep do portu 8021 tylko z sieci WireGuard, np.:

```bash
sudo ufw allow in on wg0 to any port 8021 proto tcp
```

---

## 4. VPS — web + forwarder

Skopiuj reszte projektu do `/opt/weronikairafal`:

```
/opt/weronikairafal/
├── app.py
├── forwarder.py
├── requirements.txt
├── weronikairafal.service
├── weronikairafal-forwarder.service
├── site/            ← strona (index, galeria, upload, admin, style.css, image/zdjecie.jpg)
└── uploads/         ← bufor pelnych zdjec + thumbs/ (miniatury zostaja)
```

```bash
cd /opt/weronikairafal
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# HEIC z iPhone'a — gdyby pillow-heif kompilowal ze zrodel:
#   sudo apt install -y libheif-dev
```

W obu plikach `.service` ustaw te same: `WR_HOME_URL`, `WR_HOME_SECRET`.
W `weronikairafal.service` dodatkowo `WR_SECRET_KEY`, `WR_ADMIN_PASSWORD`,
`WR_BASE_URL`. Instalacja:

```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
```

Web nasluchuje na `127.0.0.1:8011`, forwarder chodzi w tle jako jeden proces.
Wgraj zdjecie pary do `site/image/zdjecie.jpg`.

---

## 5. Nginx Proxy Manager (VPS)

Proxy Host:
- **Domain Names:** `weronikairafal.pl`, `www.weronikairafal.pl`
- **Scheme:** `http`  ·  **Forward:** `127.0.0.1` : `8011`
- **Block Common Exploits:** tak
- **SSL:** Let's Encrypt + Force SSL + HTTP/2

> NPM w Dockerze: zamiast `127.0.0.1` uzyj `host.docker.internal`
> (`extra_hosts: ["host.docker.internal:host-gateway"]` w compose).

---

## 6. Jak to dziala na weselu

1. Pokaz gosciom QR (przycisk na `/galeria.html` lub obrazek `/qr.png`).
2. Gosc -> `/upload` -> wybiera zdjecia -> leca po kolei (postep, retry, Wake Lock).
3. Zdjecia od razu w galerii (miniatury z VPS), klik = pelny podglad.
4. W tle forwarder dopycha pelne pliki na dom; po potwierdzeniu kasuje je z bufora VPS.
5. Wy w `/admin` (haslo `WR_ADMIN_PASSWORD`) mozecie kasowac — kasowanie
   propaguje sie tez na dom (a gdy dom offline, trafia do kolejki i dokona sie pozniej).

---

## 7. Opcje

- **Szybki cache pelnych zdjec na VPS:** `WR_KEEP_FULL_ON_VPS=1` w forwarderze —
  pelne kopie zostaja na VPS (galeria szybsza, dom = backup). Domyslnie `0`
  (lean VPS, dom = magazyn, pelny podglad proxowany z domu).
- **Moderacja:** `WR_MODERATE=1` w web — nowe zdjecia czekaja na zatwierdzenie
  (endpoint `/api/approve` juz jest; przycisk w panelu moge dorobic).
- **Interwal forwardera:** `WR_FORWARD_INTERVAL` (sekundy, domyslnie 10).

---

## 8. Kopia zapasowa

Trwale dane sa na domu — archiwizuj tam:

```bash
tar czf wr-archiwum-$(date +%F).tar.gz /opt/weronikairafal-home/archive
```

Na VPS metadane (kto/kiedy) trzyma `wr.db`:

```bash
cp /opt/weronikairafal/wr.db wr-meta-$(date +%F).db
```

`wr.db` (VPS) + `archive/` (dom) = pelny stan galerii.
