Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#356 infrastruktur #38

Merged
merged 11 commits into from
Sep 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion server/.gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
key.txt
data
key*
data/*
output.yaml
letsencrypt
secrets.dev.env
Expand Down
127 changes: 127 additions & 0 deletions server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,34 @@ Deine Subdomain kannst du selber wählen in unserem Setup nutzen wir
6. Beachte, dass du eventuell eine Weiterleitung in deinen Subdomain Einstellung deines Hosters treffen musst.
Eventuell muss ein A und AAAA Record mit der IP Adresse deines Servers gesetzt werden.

# Development Journey

## Ändern des Docker Deployments

Schreibe deine Änderungen, die für die Developement Umgebung gedacht sind in
``compose.override.yaml``. Diese Datei wird mit docker-compose.yaml bei ``docker compose up`` gemergt.

``docker-compose.yaml`` dient als Basisdatei und sollte eher nicht geändert werden, da sich das auf die prod Umgebung auswirkt. Änderungen die für Prod als auch Dev gedacht sind können hier gemacht werden.

Schließt sich prod oder dev aus müssen die Änderungen entweder in ``compose.override.yaml`` (für dev) oder
in ``compose.prod.yaml`` (für prod) gemacht werden.

## Credentials

Für Prod und Dev werden andere Keys verwendet. Alle Entwickler*innen sollten einen Schlüssel für die Dev Credentials haben. Um neue Secrets hinzuzufügen wird ![sops](https://github.com/getsops/sops) auf dem Entwicklungs-PC benötigt.

Um die Datei zu bearbeiten muss folgende Umgebungsvariable gesetzt werden.
Diese zeigt auf den Schlüssel, der für die Verschlüsselung der secret Datei verwendet wurde.

```bash
SOPS_AGE_KEY_FILE: /secrets/key.txt
```

Mit ``sops edit secrets.dev.enc.env`` kann die Datei bearbeitet werden.
Nach dem Speichern und schließen der Datei wird diese wieder verschlüsselt.

Das Docker Deployment ersetzt die entschlüsselte Datei nach jedem Start, sodass Änderungen in dieser nicht übernommen werden.

# Ausführen

Mit Build:
Expand Down Expand Up @@ -51,3 +79,102 @@ docker-compose build valentin
docker-compose up -d valentin
docker-compose restart valentin
```

# Deployment auf Prod ohne nginx proxy manager

1. Erstelle in /srv und /opt einen Ordner
- Das Deployment ``compose.prod.yml`` nutzt den Ordner /srv/blickbox für die Anwendungsdaten (volumes)
- Um das Prod Deployment zu starten führe folgendes Kommando aus
``docker compose -f compose.prod.yaml up``
2. In /opt wird das Repository geladen
3. In /srv werden die Anwendungsdaten, die bei der Ausführung entstehen gespeichert
4. Die Ports der Anwendungen werden auf localhost weitergeleitet:
* Port 3000 -> Grafana
* Port 3001 -> Valentin
* Port 3002 -> API
5. Für die Service sind folgende Routen vorgesehen
* https://blickbox.maytastix.de -> Valentin
* https://blickbox.maytastix.de/api -> API
* https://blickbox.maytastix.de/grafana -> Grafana
6. Konfigurieren des Reverse Proxies
Das Deployment nutzt einen auf dem Server laufenden Nginx Reverse Proxy welcher mit der Datei blickbox.maytastix.de konfiguriert wurde
* Erstelle die Datei blickbox.maytastix.de mit folgenden Inhalt
```json
server {
listen 80;
listen [::]:80;
root /var/www/blickbox.maytastix.de;
index index.html;
server_name blickbox.maytastix.de;
}
```
* Erstelle einen Symbolic Link um die Konfiguration nginx bekannt zu machen
``ln -s /etc/nginx/sites-available/blickbox.maytastix.de /etc/nginx/sites-enabled/``
* Rufe certbot auf und erstelle ein Zertifikat für blickbox.maytastix.de
* Füge anschließend folgenden Inhalt unter die Zeilen ein.

```
root /var/www/blickbox.maytastix.de;
index index.html;
server_name blickbox.maytastix.de;
```

```json
location / {
proxy_pass http://localhost:3001/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

client_max_body_size 0;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

access_log /var/log/nginx/valentin.access.log;
error_log /var/log/nginx/valentin.error.log;
}

location /api/ {
proxy_pass http://localhost:3002/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

client_max_body_size 0;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

access_log /var/log/nginx/api.access.log;
error_log /var/log/nginx/api.error.log;
}

location /grafana/ {
proxy_pass http://localhost:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

client_max_body_size 0;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";

access_log /var/log/nginx/graphana.access.log;
error_log /var/log/nginx/graphana.error.log;
}
```

* Vergleich die Datei /server/prod/blickbox.maytastix.de mit deiner Konfiguration
* Reloade nginx ``systemctl reload nginx``
8. Deine Services solltem über folgende Links erreichbar sein
* https://blickbox.maytastix.de -> Valentin
* https://blickbox.maytastix.de/api -> API
* https://blickbox.maytastix.de/grafana -> Grafana

## Troubleshooting

Auf dem verwendeten Server wurde für /srv/blickbox/graphana_data keine schreibberechtigung gesetzt um das zu fixen muss für die Gruppe das w-flag
gesetzt werden.

```bash
chmod g+w grafana_data/
```
108 changes: 108 additions & 0 deletions server/compose.override.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
version: '3.6'

services:

sops:
image: mozilla/sops:latest
volumes:
- "./secrets:/secrets"
environment:
SOPS_AGE_KEY_FILE: /secrets/key.txt
command: >
sh -c "sops --config /secrets/.sops.yaml --decrypt /secrets/secrets.dev.enc.env
> /secrets/secrets.dev.env && chmod 600 /secrets/secrets.dev.env"

valentin:
build:
context: ./client/valentin
dockerfile: Dockerfile
restart: always

python_app:
build:
context: ./deployment/
dockerfile: Dockerfile
restart: always
links:
- influxdb
depends_on:
- influxdb

influxdb:
image: influxdb:1.8.10-alpine
container_name: influxdb
restart: always
env_file:
- path: ./secrets/secrets.dev.env
required: false
volumes:
- influxdb_data:/var/lib/influxdb

grafana:
image: grafana/grafana:latest
container_name: grafana-server
restart: always
env_file:
- path: ./secrets/secrets.dev.env
required: false
links:
- influxdb
depends_on:
- influxdb
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana

reverse-proxy:
image: 'docker.io/jc21/nginx-proxy-manager:latest'
restart: unless-stopped

ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP

# Uncomment the next line if you uncomment anything in the section
# environment:
# Uncomment this if you want to change the location of
# the SQLite DB file within the container
# DB_SQLITE_FILE: "/data/database.sqlite"

# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'

volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

redis:
image: redis:7-alpine
restart: always
ports:
- "6379:6379"
env_file:
- path: ./secrets/secrets.dev.env
required: false
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}" ]

redis-insight:
image: redis/redisinsight:latest
restart: always
ports:
- "5540:5540"
volumes:
- redis-insight:/data


volumes:
grafana_data:
influxdb_data:
data:
letsencrypt:
redis-insight:


78 changes: 78 additions & 0 deletions server/compose.prod.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
version: '3.6'

services:

sops:
image: mozilla/sops:latest
user: "${UID}:${GID}"
volumes:
- "./secrets:/secrets"
environment:
- SOPS_AGE_KEY_FILE=/secrets/key.txt
command: >
sh -c "sops --config /secrets/.sops.yaml --decrypt /secrets/secrets.prod.enc.env
> /secrets/secrets.prod.env && chmod 600 /secrets/secrets.prod.env"


valentin:
ports:
- "3001:80"
build:
context: ./client/valentin
dockerfile: Dockerfile
restart: always

python_app:
build:
context: ./deployment/
dockerfile: Dockerfile
restart: always
ports:
- "3002:5000"
links:
- influxdb
depends_on:
- influxdb

influxdb:
image: influxdb:1.8.10-alpine
container_name: influxdb
restart: always
env_file:
- path: ./secrets/secrets.prod.env
required: false
volumes:
- /srv/blickbox/influx:/var/lib/influxdb:uid=1000,gid=1000

grafana:
image: grafana/grafana:latest
container_name: grafana-server
restart: always
env_file:
- path: ./secrets/secrets.prod.env
required: false
links:
- influxdb
depends_on:
- influxdb
ports:
- "3000:3000"
volumes:
- /srv/blickbox/grafana_data:/var/lib/grafana:rw

redis:
image: redis:7-alpine
restart: always
env_file:
- path: ./secrets/secrets.prod.env
required: false
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}" ]


volumes:
grafana_data:
influxdb_data:
data:
letsencrypt:


Loading