2025-12-26 16:35:34 +01:00
2025-12-26 14:51:20 +01:00
2025-12-26 16:13:47 +01:00
2025-12-26 15:32:11 +01:00
2025-12-26 15:57:57 +01:00
2025-12-26 14:51:20 +01:00
2025-12-26 15:47:48 +01:00
2025-12-26 14:51:20 +01:00
2025-12-26 16:35:34 +01:00

IGMG Gebetszeiten → iCalendar (.ics) Feed (Docker + Traefik)

Dieses Projekt erzeugt aus dem IGMG-Gebetskalender (AJAX-Quelle) einen abonnierbaren iCalendar-Feed (.ics) und stellt ihn über einen Webserver bereit.
Ein separater Updater-Container aktualisiert den Feed automatisch (Standard: monatlich).

Ziel: Du kannst den Link in Google Calendar / iOS Kalender / Outlook etc. als Kalender-Abo hinzufügen und bekommst immer die aktuellen Gebetszeiten.


Überblick

  • Updater-Container (Python + Cron)

    • ruft die IGMG-AJAX-Quelle ab
    • parst die HTML-Antwort
    • schreibt atomar eine .ics Datei und eine index.html in ein Docker-Volume
  • Web-Container (nginx)

    • liefert das Volume /data via HTTP aus
    • Traefik routet von außen auf nginx

Container bauen und pushen

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t gitea.home.musaberdem.de/musabe24/igmg-ics-updater:1.0.0 \
  -t gitea.home.musaberdem.de/musabe24/igmg-ics-updater:latest \
  --push \
  ./updater
docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t gitea.home.musaberdem.de/musabe24/igmg-ics-web:1.0.0 \
  -t gitea.home.musaberdem.de/musabe24/igmg-ics-web:latest \
  --push \
  -f ./web/Dockerfile \
  .

Architektur

Internet
|
| https://gebetszeiten.musaberdem.de/igmg-20020.ics
v
Traefik (File Provider Routing)
|
v
igmg-ics-web (nginx) ---> liest /data (read-only)
|
v
Docker Volume "igmg_ics_data" <--- igmg-ics-updater schreibt /data
^
|
igmg-ics-updater (cron + python)

Warum zwei Container?

  • nginx bleibt minimal und sicher (nur statische Dateien)
  • Updater hat Schreibrechte und macht die HTTP-Requests

Dateistruktur

Beispiel-Struktur des Projekts:

igmg-ics/
docker-compose.yml
nginx.conf
.env.example
traefik/
dynamic/
igmg-ics.yml
updater/
Dockerfile
entrypoint.sh
crontab
update.py
README.md

Im Volume igmg_ics_data landen:

  • /data/<ICS_FILENAME> → abonnierbarer Kalenderfeed
  • /data/index.html → Landing-Page (Link + letzte Aktualisierung)

Konfiguration

Konfiguration erfolgt über eine .env Datei im Projektordner.

Beispiel .env

TZ=Europe/Berlin
PUID=1000
PGID=1000

CITY_ID=20020
CITY_SLUG=Blumberg_(DE)
LANG=de

ICS_FILENAME=igmg-20020.ics

Erklärung

  • TZ: Zeitzone. Wichtig für korrekte Event-Zeiten.
  • CITY_ID: ID aus der IGMG-URL (id=...)
  • CITY_SLUG: stadt=... Teil der URL (wird nur als Quell-Link genutzt)
  • LANG: de oder tr
  • ICS_FILENAME: Dateiname, unter dem der Feed ausgeliefert wird

Kalender abonnieren

Der Feed ist erreichbar unter: https://gebetszeiten.musaberdem.de/igmg-20020.ics

Optional (einige Clients bevorzugen webcal): webcal://gebetszeiten.musaberdem.de/igmg-20020.ics

Hinweise zu Kalendern

  • Google Calendar: “Andere Kalender” → “Per URL” → HTTPS-Link einfügen
  • iOS / macOS: Kalender → “Kalender hinzufügen” → “Kalenderabonnement”
  • Outlook: “Kalender hinzufügen” → “Aus dem Internet” / “Abonnieren”

Hinweis: Kalender-Abos refreshen oft nur alle paar Stunden oder 1× täglich.

Description
No description provided
Readme 39 KiB
Languages
Python 90%
Dockerfile 8.2%
Shell 1.8%