# Co-Puzzle Web App

Mit der Co-Puzzle Web App kann man zusammen mit Freunden und Familie in Echtzeit Puzzlen. Die Applikation ist über `dsys-puzzle.network.garden` erreichbar (aus dem OST VPN). 

## Installation
Folgende Programme müssen installiert sein, um die App benutzen zu können: docker, docker compose und npm.
Alle nötigen Pakete können mit npm installiert werden:
```sh
npm install
```

## Server Umgebung
Über die Pipeline werden alle nötigen Images erstellt, die benötigten Dateien auf den Server kopiert und die Applikation dort mit dem folgenden Befehl gestartet:
```sh
docker compose -f /home/ins/puzzle/.docker/docker-compose.yaml up
```

Für die sichere Verbindung zur Webseite mit HTTPS, ist ein TLS Zertifikat nötig. Da der Server über `network.garden` gehostet wird, können keine HTTP-01 Challenges verwendet werden, stattdessen werden DNS-01 Challenges genutzt. Die entsprechenden Credentials für Let's Encrypt wurden direkt auf dem Server im File `/home/ins/puzzle/.docker/acme-dns/acme_dns.json` hinterlegt.

## Lokale Umgebung
Alternativ kann die App auch lokal gestartet werden:
```sh
docker compose -f ./.docker/docker-compose-dev.yaml up
```

Bei der lokal gestarteten Applikation ist das TLS-Zertifikat (für die HTTPS Verbindung) self-signed deshalb erscheint beim Zugriff auf `localhost` eine Warnung dies bezüglich. Das Zertifikat wurde über einen Certificate Signing Request (CSR) von einer selbst erstellten Certificate Authority (CA) ausgestellt. Es ist daher möglich den public key (`.docker/traefik/cert/rootCA.pem`) der "Root CA" im Browser zu hinterlegen, somit wäre das TLS-Zertifikat vertrauenswürdig und es würde keine Warnung mehr erscheinen.
Z.B. in Firefox:
![Hinzufügen von Zertifikat in Firefox](/doc_images/add_certificate.png)

### Trouble Shooting: 
- **Problem**: Curl auf die Image API funktioniert nicht, bzw. es werden keine (neuen) Bilder in die Datenbank geladen.
![Curl Error](/doc_images/curl_error.png)
**Fix**: Curl Command (``.docker/cron/cronjob) manuell auf einem der Service Container ausführen.

- **Problem**: Die Applikation kann nicht erfolgreich gestartet werden, da das File `/script/mongo-rs-setup-sh` nicht gefunden werden kann.
![DB Init Error](/doc_images/db_init_error.png)
**Fix**: Datenbank Setup (`.docker/mongodb/mongo-rs-setup.sh`) manuell auf dem Datenbank Container ausführen. Dies wird nur einmalig benötigt, nachdem der DB-Container das Datenverzeichnis (die Datenbank) aufgesetzt hat.

## Informationen
### Cronjob
Damit die Cronjobs korrekt laufen, muss ein initialer Eintrag in der Datenbank (Collection `cronjobs`) eingefügt werden. Die Cronjobs werden dann über diesen Eintrag synchronisiert um zu verhindern, dass derselbe Task zur selben Zeit von mehreren Service-Instanzen ausgeführt wird.

Dieser Eintrag wird automatisch bei Initialisierung der Datenbank durch ein Initialisier-Skript angelegt.

### Löschen der Puzzles
Zusätzlich wird bei der Initialisierung der Datenbank auch einen Index auf die Collection `puzzles` erstellt, welcher erstellte Puzzles nach 24 Stunden automatisch löscht (TTL).

---
Mischa Binder, Alice Glaus, Nils-Robin Grob
