Projekte

Was auf meiner Plattform läuft oder als Nächstes dazukommt. Jede Anwendung läuft in eigenen Containern und ist nur über Traefik erreichbar.

  • 2026im Aufbau

    odabas.ch

    Diese Seite: statisch mit Astro gebaut, im nginx-Container ausgeliefert und per Traefik veröffentlicht. Jeder Push auf main baut und deployt sie automatisch.

    • Astro
    • Docker
    • nginx
    • Traefik
    • GitHub Actions
  • 2026läuft

    VPS-Plattform

    Docker, Traefik, Certbot und gemeinsame Datenbanken auf einem eigenen Server, versioniert als Infrastructure as Code.

    • Docker
    • Traefik
    • nginx
    • MariaDB
  • 2026in Planung

    Spring Boot + Angular

    Eine Fullstack-Anwendung mit REST-API und Single-Page-Frontend, in getrennten Containern hinter demselben Reverse Proxy.

    • Java
    • Spring Boot
    • Angular
    • PostgreSQL
  • 2026in Planung

    Python-App

    Eine zweite Sprache auf derselben Plattform: Ein Container pro App und Routing per Traefik sind nicht an Java gebunden.

    • Python
    • Docker
    • PostgreSQL

Die Plattform dahinter

Ein VPS, Docker mit einem Container pro Dienst und Traefik als einziger Eingang. Certbot läuft direkt auf dem Host.

Aufbau der PlattformEin Browser ruft Traefik auf, den einzigen Eingang. Auf dem VPS läuft Docker mit einem Container pro Dienst, alle verbunden über das Netzwerk traefik_proxy. Für odabas.ch und waverider52.com reicht Traefik das TLS nur unverschlüsselt durch (Passthrough) an die jeweils eigenen nginx-Container, die selbst terminieren: nginx-odabas auf Port 8081, nginx-waverider auf Port 8082 — beide erhalten ihre Zertifikate direkt von Certbot per Mount, nicht über Traefik. nginx-odabas liefert seit dem Cutover die statischen Astro-Dateien aus, der frühere WordPress-Container ist gestoppt, nicht gelöscht. Dazu eine geplante Spring-Boot-Anwendung mit Angular-Frontend (eigene PostgreSQL-Datenbank) und eine geplante Python-Anwendung (nutzt dieselbe gemeinsame MariaDB wie odabas.ch und waverider52.com). Certbot muss Traefik bei jeder Zertifikatserneuerung kurz stoppen und wieder starten, damit certbot Port 80 für die eigene Prüfung frei bekommt. Beide WordPress-Datenbanken laufen in einer gemeinsamen MariaDB, deren Daten auf einem Bind-Mount liegen (./data/db-shared, ein eingehängter Host-Ordner, kein benanntes Docker-Volume). Die geplanten Anwendungen sollen eine gemeinsame PostgreSQL-Datenbank mit einem eigenen, benannten Volume nutzen. Certbot läuft direkt auf dem Host per Cron, erneuert die Zertifikate und startet Traefik dabei neu. Ausserhalb von Traefik laufen zwei Portainer-Container zur Verwaltung, direkt auf Host-Ports veröffentlicht: der aktuelle auf Port 9000, dazu ein alter, neun Monate alter Container aus einem früheren Test-Stack auf Port 9001, der noch aufgeräumt werden muss.BrowserVPSCertbotHost, per CronZertifikatestop/start bei ErneuerungDocker: jeder Kasten ist ein ContainerNetzwerk: traefik_proxyTraefikeinziger Eingang, Port 80/443:8082:8081TLS-Passthroughwaverider52.comnginxWebserverWordPressPHPodabas.chnginxPortfolioWordPressgestopptSpring Boot + AngularSpring BootBackendAngularFrontendPythonPython-AppgeplantMariaDBgemeinsamPostgreSQLgemeinsam, geplantBind-Mount: ./data/db-sharedVolumeAdmin, nicht über Traefik: direkt auf Host-Ports veröffentlichtPortaineraktuell, Host-Port 9000Portaineralt, Host-Port 9001Aufräumen offenläuftgeplant, gestoppt oder ersetztAufräumen offen

Wie odabas.ch ausgerollt wird

Ein Push auf main baut automatisch ein neues Image und rollt es auf dem bestehenden nginx-odabas-Container aus.

Deployment-Pipeline für odabas.chEin Push auf main im Repository odabas-portfolio löst GitHub Actions aus, das ein Docker-Image baut und nach ghcr.io veröffentlicht. Auf dem Server wechselt nur das Image des bestehenden Containers nginx-odabas auf dieses neue Image; Name, Port 8081, TLS-Passthrough und Traefik-Labels bleiben unverändert. nginx-odabas liefert die gebauten Astro-Dateien direkt aus, ganz ohne Datenbank oder App-Container. waverider52.com läuft unverändert mit nginx-waverider und WordPress weiter. Eine künftige weitere Anwendung aus Etappe 7 oder 8 würde denselben Weg nehmen: eigener, isolierter nginx- und App-Container. waverider52.com und die künftige Anwendung nutzen die gemeinsame MariaDB-Instanz mit einem Bind-Mount für die Daten; odabas.ch braucht dafür keine Verbindung.GitHub: odabas-portfoliogit push (main)GitHub Actionsbuild-and-deploy:baut Imageghcr.ioodabas-portfolio:latestGleiches Muster geplant für Etappe 12 (Python/Spring Boot)InternetTraefik Edge-Router (80/443)TLS-Passthrough, hostbasiertes Routingodabas.chnginx-odabasImage: ghcr.io/…/odabas-portfolioserviert Astro dist/direkt (statisch)Port 8081,kein App-/DB-ContainerKeine Datenbank — statische Seitewaverider52.comnginx-waveriderTLS: 8082 · Redirect: 18082wordpress-waveriderNetzwerke: wpnet+ traefik_proxyWeitere App(Python / Spring Boot,Etappe 7/8)nginx (isoliert)App-ContainerMariaDB (Python) odereigenes Postgres (Spring)Gemeinsame Datenbank-Instanz(mariadb-shared)Bind-Mount ./data/db-shared — getrennte Datenbanken je Appodabas.ch: statisch, per CI/CD-Image ausgeliefert, ohne Datenbank — übrige Apps: gemeinsame MariaDB-Instanz