Ein Node.js- oder PHP-basierter Webserver zur Verwaltung und Bereitstellung von Gemeindebriefen (Pfarrbriefen) als PDF-Archiv.
Find a file
2026-01-06 22:20:42 +01:00
node PHP Variante ergänzt 2025-12-07 22:16:05 +01:00
php Ergänzung einer Vermeldungsfunktion in PHP 2026-01-06 22:20:42 +01:00
.gitignore init 2025-12-04 00:34:41 +01:00
LICENSE Initial commit 2025-12-03 22:53:14 +01:00
README.md Definierbarer Slug, Verbesserungen im Admin UI, CSP für iframe Einbindung in .env 2025-12-08 21:45:05 +01:00

Gemeindebrief-Server

Ein Node.js- oder PHP-basierter Webserver zur Verwaltung und Bereitstellung von Gemeindebriefen (Pfarrbriefen) als PDF-Archiv.

Features

  • 📄 PDF-Upload und -Verwaltung über Admin-Interface
  • 📅 Monatszuordnung PDFs können mehreren Monaten zugeordnet werden
  • 🔒 Sicherer Admin-Bereich mit Login und Session-Management
  • 📚 Archiv-Ansicht chronologische Übersicht nach Jahren
  • 🔗 Direkte Links zu aktuellen und vergangenen Ausgaben
  • 🛡️ Sicherheitsfeatures Rate Limiting, Helmet, Compression

Technologie-Stack

  • Runtime: Node.js (ES Modules)
  • Framework: Express.js
  • Template Engine: EJS
  • Authentifizierung: bcrypt + express-session
  • File Upload: Multer
  • Sicherheit: Helmet, Rate Limiting

Installation

Voraussetzungen

  • Node.js (Version 16+)
  • npm oder yarn

Schritte

  1. Repository klonen

    git clone <repository-url>
    cd gemeindebrief-server
    
  2. Dependencies installieren

    npm install
    
  3. Umgebungsvariablen konfigurieren

    Erstelle eine .env-Datei im Hauptverzeichnis (node) oder im darüberliegenden Verzeichnis (php):

    # Server
    PORT=3000
    
    # Session
    SESSION_SECRET=dein-sicheres-geheimnis-hier
    
    # Admin-Login
    ADMIN_USER=admin
    ADMIN_PASS_HASH=$2b$10$...dein-bcrypt-hash
    
    # Branding
    COMMUNITY_NAME=Kirchengemeinde Musterhausen
    BRIEF_NAME=Pfarrbrief
    SLUG=pfarrbrief
    
    # iFrame CSP URL
    IFRAME_URL=https://www.kirchengemeinde-musterhausen.de
    
  4. Admin-Passwort-Hash generieren

    node: Führe in einer Node.js-Console aus:

    import bcrypt from 'bcrypt';
    const hash = await bcrypt.hash('dein-passwort', 10);
    console.log(hash);
    

    php: Führe folgenden Befehl aus:

    php -r "echo password_hash('IhrPasswort', PASSWORD_DEFAULT);"
    

    Den generierten Hash in .env als ADMIN_PASS_HASH eintragen.

  5. Server starten (node)

    npm start
    

Der Server läuft nun auf http://localhost:3000

Dateistruktur

gemeindebrief-server/
├── server.js/index.php    # Hauptserver-Logik
├── package.json           # Dependencies und Scripts (node)
├── .env                   # Umgebungsvariablen
├── views/
│   ├── admin.ejs/.php         # Admin-Interface
│   ├── archiv.ejs/.php        # Öffentliche Archiv-Ansicht
│   └── login.ejs/.php         # Login-Seite
├── public/
│   ├── admin.css         # Styles für Admin
│   ├── archiv.css        # Styles für Archiv
│   └── upload.js         # Client-seitiges Upload-Handling
└── uploads/              # PDF-Speicher (wird automatisch erstellt)

Verwendung

Admin-Bereich

  1. Login: /admin/login

    • Zugangsdaten aus .env verwenden
  2. PDF hochladen:

    • Drag & Drop oder Klick auf Upload-Bereich
    • Monate auswählen (mehrere möglich)
    • Speichern
  3. PDFs löschen:

    • Im Admin-Bereich bei der Dateiliste auf "Löschen" klicken

Öffentliche Routen

  • / Archiv-Übersicht aller Gemeindebriefe
  • /pfarrbrief Aktuelle Ausgabe (automatisch ermittelt)
  • /pfarrbrief/:jahr/:monat Spezifische Ausgabe (z.B. /pfarrbrief/2025/12)

Dateinamen-Konvention

PDFs werden automatisch nach folgendem Schema benannt:

Jahr_Monat_[Jahr_Monat_...]_pfarrbrief.pdf

Beispiele:

  • 2025_12_pfarrbrief.pdf Einzelmonat Dezember 2025
  • 2025_12_2026_01_pfarrbrief.pdf Dezember 2025 und Januar 2026
  • 2025_11_12_pfarrbrief.pdf November und Dezember 2025

Sicherheitshinweise

  • Verwende ein starkes SESSION_SECRET (node)
  • HTTPS in Produktionsumgebung aktivieren (z.B. via Reverse Proxy)
  • .env-Datei niemals ins Repository committen
  • Rate Limiting für Login ist bereits konfiguriert (5 Versuche/Minute) (node)
  • Helmet.js für Security Headers ist aktiviert (node)

Deployment

Reverse Proxy (nginx)

server {
    listen 80;
    server_name deine-domain.de;
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Lizenz

Dieses Projekt steht zur freien Verfügung für kirchliche und gemeinnützige Zwecke.

Support

Bei Fragen oder Problemen erstelle bitte ein Issue im Repository.


Entwickelt für Kirchengemeinden 🕊️