Readme update
This commit is contained in:
73
README.md
73
README.md
@@ -1,11 +1,10 @@
|
||||
# Übersicht
|
||||
|
||||
Enthält einen in Python geschriebenen Alpine Bits Server zur Übertragung von Buchungsanfragen von Landingpages an Partnerhotels. Ein Fastapi Endpoint empfängt Anfrageformulare von den wix.com landingpages, und speichert sie in die Datenbank ab. Der Alpine Bits Server stellt diese dann Hotels auf dem Endpoint `www.99tales.net/api/alpinebits/server-2024-10` zu Verfügung.
|
||||
|
||||
Enthält einen in Python geschriebenen Alpine Bits Server zur Übertragung von Buchungsanfragen von Landingpages an Partnerhotels. Ein Fastapi Endpoint empfängt Anfrageformulare von den wix.com landingpages, und speichert sie in die Datenbank ab. Der Alpine Bits Server stellt diese dann Hotels auf dem Endpoint `www.99tales.net/api/alpinebits/server-2024-10` zu Verfügung.
|
||||
|
||||
## Entwicklung
|
||||
|
||||
Auf dem Entwicklungsystem muss git und der uv python package manager installiert sein.
|
||||
Auf dem Entwicklungsystem muss git und der uv python package manager installiert sein.
|
||||
|
||||
### Git Authentification
|
||||
|
||||
@@ -21,7 +20,7 @@ Erfolgt über zwei yaml files. Zu konfigurieren ist die Verbindung zur Datenbank
|
||||
|
||||
```yaml
|
||||
database:
|
||||
url: "sqlite+aiosqlite:///alpinebits.db" # For local dev, use SQLite. For prod, override with PostgreSQL URL.
|
||||
url: "sqlite+aiosqlite:///alpinebits.db" # For local dev, use SQLite. For prod, override with PostgreSQL URL.
|
||||
# url: "postgresql://user:password@host:port/dbname" # Example for Postgres
|
||||
|
||||
alpine_bits_auth:
|
||||
@@ -43,18 +42,20 @@ ALICE_PASSWORD: "supersecretpassword123"
|
||||
|
||||
## Deployment
|
||||
|
||||
Die Applikation wird in einem Dockercontainer deployed. Um das Container Image zu erstellen ist folgender Befehl notwendig
|
||||
Die Applikation wird in einem Dockercontainer deployed. Um das Container Image zu erstellen ist folgender Befehl notwendig
|
||||
|
||||
```bash
|
||||
uv sync
|
||||
docker build . -t gitea.linter-home.com/jonas/asa_api:master
|
||||
```
|
||||
Dieser Befehl muss im Wurzelverzeichnis der Repository ausgeführt werden. `pwd` sollte irgendwas/alpinebits_python ergeben. Der Punkt hinter dem docker build befehl verweißt nämlich auf das lokale Dockerfile. "-t" steht für tag. In diesem Beispiel wird das Image mit dem Tag `gitea.linter-home.com/jonas/asa_api:master` versehen.
|
||||
|
||||
Ideal wäre eine Build Pipeline in Gitea selbst aber dies aufzusetzen ist etwas schwierig und es ist gut möglich das die Hetzner VM das nicht herhat. Lokal bei mir zuhause ist dies aufgesetzt. War alles andere als leicht.
|
||||
Dieser Build Befehl bezieht sich noch auf die Automatische Buildpipeline in meinem Heimsystem. Eine solche Pipeline habe ich auf dem 99tales.net server noch nicht eingerichtet weils lästiges Zeug isch.
|
||||
|
||||
Am besten einfach direkt auf dem Zielsystem den Container bauen und im Docker Compose File dann auf dieses Image referenzieren.
|
||||
Dieser Befehl muss im Wurzelverzeichnis der Repository ausgeführt werden. `pwd` sollte irgendwas/alpinebits_python ergeben. Der Punkt hinter dem docker build befehl verweißt nämlich auf das lokale Dockerfile. "-t" steht für tag. In diesem Beispiel wird das Image mit dem Tag `gitea.linter-home.com/jonas/asa_api:master` versehen.
|
||||
|
||||
Ideal wäre eine Build Pipeline in Gitea selbst aber dies aufzusetzen ist etwas schwierig und es ist gut möglich das die Hetzner VM das nicht herhat. Lokal bei mir zuhause ist dies aufgesetzt. War alles andere als leicht.
|
||||
|
||||
Am besten einfach direkt auf dem Zielsystem den Container bauen und im Docker Compose File dann auf dieses Image referenzieren.
|
||||
|
||||
### Docker Compose Beispiel mit Traefik Reverse Proxy
|
||||
|
||||
@@ -64,19 +65,19 @@ services:
|
||||
image: gitea.linter-home.com/jonas/asa_api:master
|
||||
container_name: asa_connector
|
||||
restart: unless-stopped
|
||||
|
||||
|
||||
# Environment variables via .env file
|
||||
env_file:
|
||||
- asa_connector.env
|
||||
|
||||
|
||||
networks:
|
||||
- external
|
||||
|
||||
|
||||
# Only expose internally - Traefik will handle external access
|
||||
expose:
|
||||
- "8000"
|
||||
|
||||
user: "1000:1000" # Run as user with UID 1000 and GID 1000
|
||||
user: "1000:1000" # Run as user with UID 1000 and GID 1000
|
||||
|
||||
environment:
|
||||
- ALPINEBITS_CONFIG_DIR=/config
|
||||
@@ -85,8 +86,6 @@ services:
|
||||
- /home/jonas/asa_connector_logs:/app/src/logs
|
||||
- /home/jonas/alpinebits_config:/config
|
||||
|
||||
|
||||
|
||||
# Traefik labels for automatic service discovery
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
@@ -96,12 +95,12 @@ services:
|
||||
- "traefik.http.routers.asa_connector.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.services.asa_connector.loadbalancer.server.port=8000"
|
||||
- "traefik.http.routers.asa_connector.priority=100"
|
||||
|
||||
|
||||
# Redirect middleware for non-API paths
|
||||
- "traefik.http.middlewares.redirect-to-99tales-it.redirectregex.regex=^https://99tales\\.net/(.*)$$"
|
||||
- "traefik.http.middlewares.redirect-to-99tales-it.redirectregex.replacement=https://99tales.it/$${1}"
|
||||
- "traefik.http.middlewares.redirect-to-99tales-it.redirectregex.permanent=true"
|
||||
|
||||
|
||||
# Catch-all router for non-API paths on 99tales.net (lower priority)
|
||||
- "traefik.http.routers.redirect-router.rule=Host(`99tales.net`)"
|
||||
- "traefik.http.routers.redirect-router.entrypoints=https"
|
||||
@@ -121,16 +120,14 @@ services:
|
||||
networks:
|
||||
- external
|
||||
|
||||
volumes:
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
|
||||
traefik:
|
||||
image: traefik:latest
|
||||
container_name: traefik
|
||||
restart: unless-stopped
|
||||
|
||||
|
||||
environment:
|
||||
- DOCKER_HOST=dockerproxy
|
||||
|
||||
@@ -138,18 +135,22 @@ services:
|
||||
- external
|
||||
|
||||
ports:
|
||||
- "80:80" # HTTP
|
||||
- "443:443" # HTTPS
|
||||
- "22:22" # SSH for Gitea
|
||||
|
||||
- "80:80" # HTTP
|
||||
- "443:443" # HTTPS
|
||||
- "22:22" # SSH for Gitea
|
||||
|
||||
volumes:
|
||||
- /home/jonas/traefik:/etc/traefik # Traefik configuration files
|
||||
- /home/jonas/traefik:/etc/traefik # Traefik configuration files
|
||||
|
||||
|
||||
|
||||
# Health check
|
||||
healthcheck:
|
||||
test: ["CMD", "python", "-c", "import requests; requests.get('http://localhost:8000/health', timeout=5)"]
|
||||
test:
|
||||
[
|
||||
"CMD",
|
||||
"python",
|
||||
"-c",
|
||||
"import requests; requests.get('http://localhost:8000/health', timeout=5)",
|
||||
]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
@@ -163,20 +164,6 @@ networks: # custom bridge network named 'external'
|
||||
|
||||
Damit das ganze auch funktioniert müssen dns Einträge auf die Virtuelle Machine zeigen in der das ganze läuft. Wurde bei Hostinger für 99tales.net eingerichtet.
|
||||
|
||||
Wie in dem Beispiel ersichtlich wird sowohl ein Log Ordner als auch ein Config ordner in den Container gemapped. Diesen am besten auf dem Host vor Erstellung des Containers erstellen.
|
||||
|
||||
Die Umgebungsvariable `ALPINEBITS_CONFIG_DIR` sagt dann dem Programm wo es die Config finden soll. In dem Ordner kann man die obens erwähnten Konfigurationsdateien speichern. Falls sqlite als Datenbank verwendet wird, findet man dort auch die Datenbank nach erstem ausführen.
|
||||
|
||||
|
||||
|
||||
# TODO Liste
|
||||
|
||||
Need a table in the database that stores requests that have already been acknowledged by the client. Should contain client_id + a list of all acked unique_ids
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Wie in dem Beispiel ersichtlich wird sowohl ein Log Ordner als auch ein Config ordner in den Container gemapped. Diesen am besten auf dem Host vor Erstellung des Containers erstellen.
|
||||
|
||||
Die Umgebungsvariable `ALPINEBITS_CONFIG_DIR` sagt dann dem Programm wo es die Config finden soll. In dem Ordner kann man die obens erwähnten Konfigurationsdateien speichern. Falls sqlite als Datenbank verwendet wird, findet man dort auch die Datenbank nach erstem ausführen.
|
||||
|
||||
Reference in New Issue
Block a user