commit 177d5859e17c91509bf8705748d32e79aab1d65b Author: Patrick Plate Date: Mon Jun 22 12:27:29 2026 +0200 Initial web presence: bilingual landing page + push-to-deploy pipeline diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..5137453 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,73 @@ +name: Deploy to plate-software.de + +# Push to main -> this self-hosted runner (cannamanage-act-runner on TrueNAS) +# rsyncs the static contents of site/ to the IONOS Apache DocumentRoot +# (/var/www/html on 82.165.206.45). No --delete is used, so unrelated +# content already on the server (downloads/, owncloud/, .well-known/, +# index.html.bak.*, etc.) is left untouched. +# +# Requires one repo secret (Settings -> Actions -> Secrets): +# IONOS_DEPLOY_KEY : private ed25519 key whose public half is in +# root@82.165.206.45:~/.ssh/authorized_keys + +on: + push: + branches: [main] + workflow_dispatch: + +concurrency: + group: ionos-web-deploy + cancel-in-progress: false + +env: + DEPLOY_HOST: 82.165.206.45 + DEPLOY_USER: root + DEPLOY_PATH: /var/www/html/ + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Check out pushed commit + uses: actions/checkout@v4 + + - name: Ensure rsync + ssh present + run: | + set -euo pipefail + if ! command -v rsync >/dev/null 2>&1; then + apt-get update -y && apt-get install -y rsync openssh-client + fi + rsync --version | head -1 + + - name: Load deploy key + run: | + set -euo pipefail + mkdir -p ~/.ssh + printf '%s\n' "${{ secrets.IONOS_DEPLOY_KEY }}" > ~/.ssh/id_deploy + chmod 600 ~/.ssh/id_deploy + ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts 2>/dev/null + chmod 600 ~/.ssh/known_hosts + + - name: Rsync site/ to IONOS DocumentRoot + run: | + set -euo pipefail + rsync -az --no-perms --no-owner --no-group --omit-dir-times \ + -e "ssh -i ~/.ssh/id_deploy -o IdentitiesOnly=yes" \ + site/ "${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}" + echo "✅ Synced site/ -> ${DEPLOY_HOST}:${DEPLOY_PATH}" + + - name: Verify live + run: | + set -euo pipefail + code=$(ssh -i ~/.ssh/id_deploy -o IdentitiesOnly=yes \ + "${DEPLOY_USER}@${DEPLOY_HOST}" \ + "curl -s -o /dev/null -w '%{http_code}' http://localhost/ -H 'Host: plate-software.de'") + echo "Local origin HTTP $code" + [ "$code" = "200" ] || { echo "❌ unexpected status"; exit 1; } + echo "✅ plate-software.de serving HTTP 200" + + - name: Summary + run: | + echo "=== plate-software.de deployed ===" + echo "Commit: ${GITHUB_SHA}" + echo "Live: https://plate-software.de" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3785c6c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.swp +.DS_Store +*.bak diff --git a/README.md b/README.md new file mode 100644 index 0000000..1bc4af0 --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# plate-software.de — Web Presence + +Static website for **https://plate-software.de** (the Apache landing page + +any additional static pages/assets). This repo is the single source of truth +for the public web presence. + +## How deployment works (push-to-deploy, zero SSH) + +``` +edit site/ → git push origin main + │ + ▼ + Gitea Actions (self-hosted runner on TrueNAS) + │ rsync over SSH (dedicated deploy key) + ▼ + IONOS Apache /var/www/html/ (82.165.206.45) + │ + ▼ + https://plate-software.de (TLS via Let's Encrypt) +``` + +Just edit files under [`site/`](site/), commit, and push to `main`. +The [`.gitea/workflows/deploy.yml`](.gitea/workflows/deploy.yml) workflow +`rsync`s the contents of `site/` to the Apache DocumentRoot. **No SSH access +to the server is needed** — the runner holds a dedicated deploy key. + +`workflow_dispatch` is also enabled, so you can re-deploy manually from the +Gitea Actions tab without a new commit. + +## Repo layout + +``` +site/ ← everything in here is published to the web root + index.html ← the bilingual (DE/EN) landing page +.gitea/workflows/ + deploy.yml ← the push-to-deploy pipeline +``` + +Add more pages by dropping files into `site/` (e.g. `site/impressum.html` +→ `https://plate-software.de/impressum.html`). Subfolders work too. + +## Safety notes + +- **Non-destructive sync.** The workflow uses `rsync` **without** `--delete`, + so other content already living on the server (`downloads/`, `owncloud/`, + `.well-known/`, ACME challenges, old `index.html.bak.*`) is never removed. + If you ever want exact mirroring, add `--delete` — but only after confirming + `site/` is the complete intended web root. +- **Subdomains are separate.** `cannamanage.`, `inspectflow.` and `git.` are + their own apps/proxies (frp → TrueNAS). This repo only owns the root domain's + static files. + +## Required secret + +`Settings → Actions → Secrets`: + +| Secret | Value | +|---|---| +| `IONOS_DEPLOY_KEY` | private ed25519 key whose public half is in `root@82.165.206.45:~/.ssh/authorized_keys` (comment `gitea-actions-plate-software-web`) | + +## Local preview + +```bash +cd site && python3 -m http.server 8000 # http://localhost:8000 +``` + +The language toggle defaults to German; English shows automatically for +`en-*` browsers, and the choice is remembered in `localStorage`. diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..09d7fe5 --- /dev/null +++ b/site/index.html @@ -0,0 +1,301 @@ + + + + + + plate-software.de — Software aus dem Homelab + + + + + + + + + + + + +
+ +
+ +
+ +
+
+ + Live aus dem Homelab betrieben + Running live from the homelab + +

+ Software, die ich selbst baue und selbst hoste. + Software I build myself and host myself. +

+

+ Ich bin Patrick Plate — Softwareentwickler. Hier entstehen praxisnahe Webanwendungen für reale Probleme: von der Verwaltung von Cannabis-Anbauvereinigungen bis zur Maschinensicherheit. Entwickelt, getestet und betrieben auf eigener Infrastruktur. + I'm Patrick Plate — software engineer. This is where practical web applications for real-world problems take shape: from cannabis club management to machine-safety inspections. Built, tested and operated on my own infrastructure. +

+ +
+
+ + +
+
+
+ Produkte & Projekte + Products & Projects +

Was hier läuft

+

What's running here

+

Jedes Projekt wird im Homelab gebaut und über eine eigene, abgesicherte Infrastruktur öffentlich bereitgestellt.

+

Each project is built in the homelab and published publicly through a dedicated, secured infrastructure chain.

+
+ +
+ +
+
🌿
+

CannaManage Alpha

+
Vereinsverwaltung für Cannabis-Clubs
+
Club management for cannabis associations
+

Komplette Verwaltungsplattform für Cannabis-Anbauvereinigungen nach dem deutschen KCanG: Mitglieder, Anbau-Tracking, Abgabe-Dokumentation, Beitragsverwaltung und DSGVO-konforme Compliance — alles an einem Ort.

+

A complete management platform for German cannabis cultivation associations under the KCanG: members, grow tracking, distribution records, fee management and GDPR-compliant reporting — all in one place.

+ cannamanage.plate-software.de ↗ +
+ + +
+
🛡️
+

InspectFlow Live

+
Maschinensicherheit & Prüfungen
+
Machine safety & inspections
+

Digitale Erfassung und Nachverfolgung von Maschinensicherheits-Prüfungen: konfigurierbare Fragebögen und Checklisten, Sicherheitsbereiche und Gefahrenstellen, lückenlose Audit-Historie und PDF-Berichte.

+

Digital capture and tracking of machine-safety inspections: configurable questionnaires and checklists, safety areas and danger points, full audit history and PDF reporting.

+ inspectflow.plate-software.de ↗ +
+ + +
+
🧬
+

Git Hosting Tool

+
Selbstgehostete Quellcode-Verwaltung
+
Self-hosted source control
+

Eigene Gitea-Instanz als zentrale Quelle der Wahrheit für sämtlichen Code. Mit integrierter CI/CD über Gitea Actions, die jede Anwendung automatisch baut und ausrollt.

+

A private Gitea instance acting as the single source of truth for all code — with integrated CI/CD via Gitea Actions that automatically builds and deploys every application.

+ git.plate-software.de ↗ +
+
+
+
+ + +
+
+
+
+ Über + About +

Vom Code bis zum Server — alles aus einer Hand

+

From code to server — end to end

+
+

Ich entwickle vollständige Anwendungen: robuste Java/Spring-Boot-Backends, moderne Next.js-Frontends und die komplette Infrastruktur, auf der sie laufen. Kein Cloud-Anbieter dazwischen — der Code wird im eigenen Homelab gebaut, in Containern verpackt und über eine selbst aufgebaute, verschlüsselte Veröffentlichungskette ins Netz gebracht.

+

I build complete applications: robust Java/Spring Boot backends, modern Next.js frontends, and the entire infrastructure they run on. No cloud middleman — code is built in my own homelab, packaged into containers, and shipped to the web through a self-built, encrypted publishing chain.

+
+ Java · Spring Boot + Next.js · React + PostgreSQL + Docker + Gitea CI/CD + TrueNAS + Linux +
+
+
+

Infrastruktur

+

Infrastructure

+
BetriebOperationsEigenes HomelabOwn homelab
+
AuslieferungDeliveryCI/CD · Docker
+
VerschlüsselungEncryptionHTTPS · Let's Encrypt
+
DatenschutzPrivacyDSGVO-konformGDPR-compliant
+
+
+
+ + +
+
+
+ Kontakt + Contact +

Interesse oder Fragen?

+

Interested or got questions?

+

Schreib mir gerne — ob zu einem der Produkte oder zu einem eigenen Software-Vorhaben.

+

Feel free to reach out — about any of the products or your own software project.

+
+ + ✉ patrick@plate-software.de + ✉ patrick@plate-software.de + +
+
+
+ + + + + +