From 2fa84c1e2bbb56446790fc8bec14f2b5c578d507 Mon Sep 17 00:00:00 2001 From: olaf Date: Mon, 14 Jul 2025 18:41:28 +0000 Subject: [PATCH] Setup: Make Docker Compose, Scheduler, and Simclient fully operational --- docker-compose.yml | 41 +++++++++++++++++++++++++++++++++++--- scheduler/Dockerfile | 6 ++++++ scheduler/requirements.txt | 4 ++++ scheduler/scheduler.py | 20 +++++++++++++++++++ simclient/Dockerfile | 6 ++++++ simclient/requirements.txt | 1 + simclient/simclient.py | 24 ++++++++++++++++++++++ 7 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 scheduler/Dockerfile create mode 100644 scheduler/requirements.txt create mode 100644 scheduler/scheduler.py create mode 100644 simclient/Dockerfile create mode 100644 simclient/requirements.txt create mode 100644 simclient/simclient.py diff --git a/docker-compose.yml b/docker-compose.yml index dab87ad..25b8235 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,8 +10,8 @@ services: - "80:80" - "443:443" volumes: - - ./nginx.conf:/etc/nginx/nginx.conf:ro - - ./certs:/etc/nginx/certs:ro + - ${PWD}/nginx.conf:/etc/nginx/nginx.conf:ro + - ${PWD}/certs:/etc/nginx/certs:ro depends_on: - server - dashboard @@ -121,5 +121,40 @@ services: retries: 3 start_period: 30s + scheduler: + build: + context: ./scheduler + dockerfile: Dockerfile + image: infoscreen-scheduler:latest + container_name: infoscreen-scheduler + restart: unless-stopped + depends_on: + db: + condition: service_healthy + mqtt: + condition: service_healthy + environment: + DB_CONN: "mysql+pymysql://${DB_USER}:${DB_PASSWORD}@db/${DB_NAME}" + MQTT_BROKER_URL: mqtt + MQTT_PORT: 1883 + networks: + - infoscreen-net + + simclient: + build: + context: ./simclient + dockerfile: Dockerfile + image: infoscreen-simclient:latest + container_name: infoscreen-simclient + restart: unless-stopped + depends_on: + mqtt: + condition: service_healthy + environment: + MQTT_BROKER_URL: mqtt + MQTT_PORT: 1883 + networks: + - infoscreen-net + volumes: - db-data: \ No newline at end of file + db-data: diff --git a/scheduler/Dockerfile b/scheduler/Dockerfile new file mode 100644 index 0000000..11e0684 --- /dev/null +++ b/scheduler/Dockerfile @@ -0,0 +1,6 @@ +FROM python:3.13-slim +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt +COPY . . +CMD ["python", "scheduler.py"] diff --git a/scheduler/requirements.txt b/scheduler/requirements.txt new file mode 100644 index 0000000..f866e8a --- /dev/null +++ b/scheduler/requirements.txt @@ -0,0 +1,4 @@ +paho-mqtt +sqlalchemy +pymysql +python-dotenv diff --git a/scheduler/scheduler.py b/scheduler/scheduler.py new file mode 100644 index 0000000..c7372be --- /dev/null +++ b/scheduler/scheduler.py @@ -0,0 +1,20 @@ +# scheduler/scheduler.py +import time +import paho.mqtt.client as mqtt + + +def main(): + # Fix für die veraltete API - explizit callback_api_version setzen + client = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION2) + + # Im Docker-Netzwerk: Hostname des MQTT-Brokers ist "mqtt", nicht "localhost" + client.connect("mqtt", 1883) + + while True: + # Hier später: Events aus DB lesen und MQTT-Nachricht senden + print("Scheduler läuft...") + time.sleep(10) + + +if __name__ == "__main__": + main() diff --git a/simclient/Dockerfile b/simclient/Dockerfile new file mode 100644 index 0000000..99c954b --- /dev/null +++ b/simclient/Dockerfile @@ -0,0 +1,6 @@ +FROM python:3.13-slim +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt +COPY . . +CMD ["python", "simclient.py"] diff --git a/simclient/requirements.txt b/simclient/requirements.txt new file mode 100644 index 0000000..8579e8b --- /dev/null +++ b/simclient/requirements.txt @@ -0,0 +1 @@ +paho-mqtt diff --git a/simclient/simclient.py b/simclient/simclient.py new file mode 100644 index 0000000..a19ea61 --- /dev/null +++ b/simclient/simclient.py @@ -0,0 +1,24 @@ +# simclient/simclient.py +import time +import paho.mqtt.client as mqtt + + +def on_message(client, userdata, msg): + print(f"Empfangen: {msg.topic} {msg.payload.decode()}") + + +def main(): + client = mqtt.Client() + client.on_message = on_message + # Im Docker-Netzwerk: Hostname des MQTT-Brokers ist "mqtt" + client.connect("mqtt", 1883) + client.subscribe("infoscreen/+/now") + while True: + # Heartbeat senden + client.publish("infoscreen/client1/heartbeat", "alive") + client.loop(timeout=1.0) + time.sleep(5) + + +if __name__ == "__main__": + main()