From 74213351ae5013ada5c2f24bcdb84111c7af206c Mon Sep 17 00:00:00 2001 From: marci Date: Wed, 19 Aug 2026 07:20:24 +0200 Subject: [PATCH 1/2] feat(branding): Stack und Vorgaben auf SentryMail / Stack and defaults renamed to SentryMail DE: - Container heissen sentrymail-* statt humanshield-*, das Compose-Netz ebenso - Volumes behalten ihre Namen, Daten bleiben beim Update erhalten - update.sh weist auf das zurueckbleibende alte Netz hin und nennt den Loeschbefehl - Beispielwerte in allen drei .env.example auf sentrymail.example.com - install.sh schlaegt https://license.sentrymail.de als Lizenzserver vor - LICENSE_PRODUCT von humanshield.app auf sentrymail; der Lizenzserver fuehrt das Feld nur mit, die Berechtigung haengt nicht daran - Frontend-Paketname sentrymail-frontend, Theme-Schluessel sentrymail-theme mit einmaligem Uebergang vom alten Schluessel EN: - Containers are named sentrymail-* instead of humanshield-*, same for the network - Volumes keep their names, data survives the update - update.sh points out the leftover old network and prints the removal command - Sample values in all three .env.example files use sentrymail.example.com - install.sh suggests https://license.sentrymail.de as the license server - LICENSE_PRODUCT changed from humanshield.app to sentrymail; the license server only records the field, entitlement does not depend on it - Frontend package name sentrymail-frontend, theme key sentrymail-theme with a one-time migration from the old key Signed-off-by: marci --- .env.example | 8 ++++---- backend/.env.example | 8 ++++---- backend/app/config.py | 2 +- docker-compose.yml | 26 +++++++++++++------------- frontend/.env.example | 2 +- frontend/package-lock.json | 4 ++-- frontend/package.json | 2 +- frontend/src/hooks/useTheme.ts | 11 +++++++++-- install.sh | 2 +- update.sh | 10 ++++++++++ 10 files changed, 46 insertions(+), 29 deletions(-) diff --git a/.env.example b/.env.example index 0fb876a..f5fca0d 100644 --- a/.env.example +++ b/.env.example @@ -5,18 +5,18 @@ # ============================================= # === App === -APP_DOMAIN=humanshield.example.com +APP_DOMAIN=sentrymail.example.com # DE: Worauf Caddy hoert (Default: localhost). Moegliche Werte: -# - Echte Domain (z. B. "humanshield.example.com") -> automatisches Let's Encrypt. +# - Echte Domain (z. B. "sentrymail.example.com") -> automatisches Let's Encrypt. # - ":80" -> Catch-all, reines HTTP, matcht jeden Host. Sinnvoll, wenn ein vorgelagerter # Reverse Proxy (Netbird, Cloudflare, ...) TLS zum Client terminiert und uns per HTTP # mit Host=IP anspricht. TLS_DIRECTIVE leer lassen. # EN: What Caddy listens on (default: localhost). Possible values: -# - A real domain (e.g. "humanshield.example.com") -> automatic Let's Encrypt. +# - A real domain (e.g. "sentrymail.example.com") -> automatic Let's Encrypt. # - ":80" -> catch-all, plain HTTP, matches any host. Useful when an upstream reverse # proxy (Netbird, Cloudflare, ...) terminates TLS to the client and reaches us over # HTTP with Host=IP. Leave TLS_DIRECTIVE empty. -# CADDY_SITE_ADDRESS=humanshield.example.com +# CADDY_SITE_ADDRESS=sentrymail.example.com # # DE: Nur bei einer Domain als CADDY_SITE_ADDRESS relevant: erzwingt Caddys interne CA # (selbstsigniert) statt eines echten Let's-Encrypt-Zertifikats - fuer Domains, die diff --git a/backend/.env.example b/backend/.env.example index bacb061..cb321e0 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,5 +1,5 @@ # ============================================= -# HumanShield.APP Backend – Beispiel-Konfiguration / Example configuration +# SentryMail Backend – Beispiel-Konfiguration / Example configuration # DE: Nur fuer Standalone-Betrieb des Backends ausserhalb von Docker Compose # (z. B. lokales `uvicorn app.main:app --reload` im backend/-Ordner). # Im Docker-Compose-Stack kommt die Konfiguration aus der .env im Repo-Root. @@ -37,8 +37,8 @@ INITIAL_ADMIN_PASSWORD=change-me # === OIDC (optional, Zweitmethode / second method - beliebiger Provider / any provider: Authentik, Keycloak, Entra ID, Okta, ...) === # DE: Leer lassen/entfernen, um OIDC/SSO komplett zu deaktivieren. # EN: Leave empty/remove to disable OIDC/SSO entirely. -OIDC_ISSUER=https://idp.example.com/application/o/humanshield/ -OIDC_CLIENT_ID=humanshield +OIDC_ISSUER=https://idp.example.com/application/o/sentrymail/ +OIDC_CLIENT_ID=sentrymail OIDC_CLIENT_SECRET=change-me OIDC_REDIRECT_URI=http://localhost:8000/auth/callback @@ -48,7 +48,7 @@ SMTP_PORT=587 SMTP_USERNAME=noreply@example.com SMTP_PASSWORD=change-me SMTP_FROM_EMAIL=noreply@example.com -SMTP_FROM_NAME=HumanShield-Awareness +SMTP_FROM_NAME=SentryMail SMTP_TLS_MODE=starttls SMTP_VERIFY_SSL=true SMTP_BATCH_DELAY=2 diff --git a/backend/app/config.py b/backend/app/config.py index c4c72bc..024ba0c 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -92,7 +92,7 @@ def _secret_key_min_length(cls, v: str) -> str: # Lizenzierung / Add-ons (Online-Aktivierung). Leer = reiner Open-Core-Betrieb ohne Add-ons. LICENSE_SERVER_URL: str = "" LICENSE_KEY: str = "" # optionaler .env-Seed; kann auch im Dashboard gepflegt werden - LICENSE_PRODUCT: str = "humanshield.app" + LICENSE_PRODUCT: str = "sentrymail" LICENSE_REFRESH_INTERVAL_HOURS: int = 24 diff --git a/docker-compose.yml b/docker-compose.yml index 433f141..7aa8f97 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ services: postgres: image: postgres:18-alpine - container_name: humanshield-db + container_name: sentrymail-db environment: POSTGRES_DB: ${POSTGRES_DB:-phishaware} POSTGRES_USER: ${POSTGRES_USER:-phishaware} @@ -14,18 +14,18 @@ services: timeout: 5s retries: 5 networks: - - humanshield + - sentrymail redis: image: redis:8-alpine - container_name: humanshield-cache + container_name: sentrymail-cache healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - - humanshield + - sentrymail # Anhang-Pruefung fuer gemeldete Mails (Enterprise). Bewusst hinter einem # Profil und damit standardmaessig AUS: clamd haelt die Signaturdatenbank @@ -42,7 +42,7 @@ services: # Signaturdatenbank ist schlimmer als keine, weil sie Sicherheit vortaeuscht. clamav: image: clamav/clamav:stable - container_name: humanshield-clamav + container_name: sentrymail-clamav profiles: - scanning restart: unless-stopped @@ -57,13 +57,13 @@ services: volumes: - clamav_data:/var/lib/clamav networks: - - humanshield + - sentrymail backend: build: context: ./backend dockerfile: Dockerfile - container_name: humanshield-api + container_name: sentrymail-api env_file: - .env depends_on: @@ -77,7 +77,7 @@ services: # Container-Schicht und waeren nach jedem Rebuild weg. - backend_data:/app/data networks: - - humanshield + - sentrymail # Gebautes Frontend, statisch ausgeliefert. Der Port wird bewusst nicht auf # den Host veroeffentlicht - erreichbar ist das Frontend nur ueber Caddy. @@ -91,15 +91,15 @@ services: VITE_API_URL: ${VITE_API_URL:-/api} VITE_WIKI_URL: ${VITE_WIKI_URL:-} VITE_SUPPORT_EMAIL: ${VITE_SUPPORT_EMAIL:-} - container_name: humanshield-web + container_name: sentrymail-web depends_on: - backend networks: - - humanshield + - sentrymail caddy: image: caddy:2-alpine - container_name: humanshield-proxy + container_name: sentrymail-proxy # FRONTEND_BIND_ADDRESS begrenzt, auf welcher Netzwerkschnittstelle das # Dashboard ueberhaupt antwortet. Ohne Angabe hoert es auf allen - bei einer # Maschine mit oeffentlicher IP heisst das: offen im Internet. @@ -118,7 +118,7 @@ services: - backend - frontend networks: - - humanshield + - sentrymail volumes: postgres_data: @@ -130,5 +130,5 @@ volumes: clamav_data: networks: - humanshield: + sentrymail: driver: bridge \ No newline at end of file diff --git a/frontend/.env.example b/frontend/.env.example index e0e3767..9f1aca5 100644 --- a/frontend/.env.example +++ b/frontend/.env.example @@ -1,5 +1,5 @@ # ============================================= -# HumanShield.APP Frontend – Beispiel-Konfiguration / Example configuration +# SentryMail Frontend – Beispiel-Konfiguration / Example configuration # DE: Nur relevant fuer lokale Entwicklung ausserhalb von Docker Compose # (docker-compose.yml setzt VITE_API_URL bereits ueber die Root-.env). # Kopieren nach "frontend/.env" - niemals mit echten Werten committen. diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 29a2eef..db33a59 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,11 +1,11 @@ { - "name": "humanshield-frontend", + "name": "sentrymail-frontend", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "humanshield-frontend", + "name": "sentrymail-frontend", "version": "0.1.0", "dependencies": { "@simplewebauthn/browser": "^13.3.0", diff --git a/frontend/package.json b/frontend/package.json index 5877bac..68a713c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,5 +1,5 @@ { - "name": "humanshield-frontend", + "name": "sentrymail-frontend", "version": "0.1.0", "type": "module", "scripts": { diff --git a/frontend/src/hooks/useTheme.ts b/frontend/src/hooks/useTheme.ts index 028375c..206db9b 100644 --- a/frontend/src/hooks/useTheme.ts +++ b/frontend/src/hooks/useTheme.ts @@ -6,10 +6,16 @@ import { useCallback, useEffect, useState } from 'react' type Theme = 'light' | 'dark' -const STORAGE_KEY = 'phishaware-theme' +const STORAGE_KEY = 'sentrymail-theme' + +// Bis 0.47.0 lag die Auswahl unter dem Namen einer aufgegebenen Marke. Sie wird +// einmalig noch von dort gelesen, damit die Umbenennung niemandem sein Theme +// zurueckwirft - der Effekt unten schreibt sofort unter dem neuen Schluessel und +// raeumt den alten weg. Diese Konstante darf ein spaeteres Release entfernen. +const LEGACY_STORAGE_KEY = 'phishaware-theme' function getInitialTheme(): Theme { - const stored = localStorage.getItem(STORAGE_KEY) + const stored = localStorage.getItem(STORAGE_KEY) ?? localStorage.getItem(LEGACY_STORAGE_KEY) if (stored === 'light' || stored === 'dark') return stored return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' } @@ -20,6 +26,7 @@ export function useTheme() { useEffect(() => { document.documentElement.setAttribute('data-theme', theme) localStorage.setItem(STORAGE_KEY, theme) + localStorage.removeItem(LEGACY_STORAGE_KEY) }, [theme]) const toggleTheme = useCallback(() => { diff --git a/install.sh b/install.sh index db9f228..2069326 100755 --- a/install.sh +++ b/install.sh @@ -294,7 +294,7 @@ printf '\n' printf '%s%s%s\n' "$BOLD" "$(msg '7) Lizenz / Add-ons (optional)' '7) License / add-ons (optional)')" "$RESET" printf ' %s\n' "$(msg 'Leer lassen = reiner Open-Core-Betrieb ohne kostenpflichtige Add-ons.' 'Leave empty = pure Open Core without paid add-ons.')" if yesno 'Business-/Enterprise-Lizenz hinterlegen?' 'Configure a Business/Enterprise license?' n; then - ask LICENSE_SERVER_URL 'Lizenzserver-URL' 'License server URL' 'https://license.humanshield-awareness.de' >/dev/null + ask LICENSE_SERVER_URL 'Lizenzserver-URL' 'License server URL' 'https://license.sentrymail.de' >/dev/null ask LICENSE_KEY 'Lizenzschluessel' 'License key' '' >/dev/null else printf ' %s\n' "$(msg 'Ohne Lizenz (Open Core).' 'No license (Open Core).')" diff --git a/update.sh b/update.sh index 5f7215b..a86f3ad 100755 --- a/update.sh +++ b/update.sh @@ -161,7 +161,17 @@ printf '\n' printf '%s%s%s\n' "$BOLD" "$(msg '4) Stack neu bauen und starten' '4) Rebuild and restart the stack')" "$RESET" printf ' %s\n' "$(msg 'DB-Migrationen laufen automatisch beim Backend-Start.' 'DB migrations run automatically on backend start.')" if yesno 'Jetzt "docker compose up -d --build" ausfuehren?' 'Run "docker compose up -d --build" now?' y; then + # Containernamen vor dem Update merken. Sie tragen seit dem Rebranding das + # Praefix "sentrymail-" statt "humanshield-"; compose ordnet Container ueber + # Projekt- und Service-Label zu, erstellt sie also regulaer neu. Die Volumes + # heissen unveraendert (postgres_data, backend_data, ...) und bleiben damit + # samt Daten erhalten - allein das alte Netz bleibt ungenutzt zurueck. + ALT_NETZ="$(docker network ls --format '{{.Name}}' 2>/dev/null | grep -E '_humanshield$' || true)" ( cd "$SCRIPT_DIR" && docker compose up -d --build ) + if [ -n "$ALT_NETZ" ]; then + printf ' %s!%s %s\n' "$YELLOW" "$RESET" "$(msg "Die Container heissen jetzt sentrymail-*. Das alte Netz $ALT_NETZ wird nicht mehr benutzt und kann entfernt werden:" "Containers are now named sentrymail-*. The old network $ALT_NETZ is unused and can be removed:")" + printf ' %sdocker network rm %s%s\n' "$BOLD" "$ALT_NETZ" "$RESET" + fi else printf ' %s\n' "$(msg 'Uebersprungen. Spaeter:' 'Skipped. Later:')" printf ' %sdocker compose up -d --build%s\n' "$BOLD" "$RESET" From 48809fd633907cb0ef8032aa8e2ea21bb7956afe Mon Sep 17 00:00:00 2001 From: marci Date: Wed, 19 Aug 2026 07:20:48 +0200 Subject: [PATCH 2/2] docs(branding): Vorlagen und Verweise auf SentryMail / Templates and references renamed to SentryMail DE: - Sechs Issue-Vorlagen nennen SentryMail statt HumanShield - Support-Link in der Vorlagen-Konfiguration auf sentrymail.de - Verweise auf docs/license-addon-architektur.md richtiggestellt EN: - Six issue templates now say SentryMail instead of HumanShield - Support link in the template config points to sentrymail.de - References to docs/license-addon-architektur.md corrected Signed-off-by: marci --- .github/ISSUE_TEMPLATE/SECURITY.md | 2 +- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/ISSUE_TEMPLATE/config_question.md | 4 ++-- .github/ISSUE_TEMPLATE/docs_improvement.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 4 ++-- .github/ISSUE_TEMPLATE/integration_request.md | 4 ++-- backend/app/addon_loader.py | 2 +- backend/app/services/license.py | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/SECURITY.md b/.github/ISSUE_TEMPLATE/SECURITY.md index 835892a..73c6daa 100644 --- a/.github/ISSUE_TEMPLATE/SECURITY.md +++ b/.github/ISSUE_TEMPLATE/SECURITY.md @@ -25,7 +25,7 @@ Instead, please follow our responsible disclosure process: - Fix assessment: 7-14 days - Coordinated disclosure: Based on severity -**Thank you for helping keep HumanShield secure!** +**Thank you for helping keep SentryMail secure!** --- diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a1ea19e..65d0bba 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -28,7 +28,7 @@ If applicable, describe potential security implications. ## Environment - OS: [e.g., Linux, Windows] - Browser/Version: [if applicable] -- HumanShield Version: [e.g., 1.0.0] +- SentryMail Version: [e.g., 1.0.0] ## Screenshots [If applicable] \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 7650915..fa3227d 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -10,7 +10,7 @@ contact_links: url: mailto:security@sentrymail.de about: Report security vulnerabilities via email (NOT GitHub Issues) - name: Commercial Support - url: https://humanshield-awareness.de/support + url: https://sentrymail.de/support about: Enterprise support and consulting - name: BSI Compliance Question url: https://github.com/securebits-cyber/SentryMail/discussions/categories/compliance diff --git a/.github/ISSUE_TEMPLATE/config_question.md b/.github/ISSUE_TEMPLATE/config_question.md index 7c1a475..7468cb2 100644 --- a/.github/ISSUE_TEMPLATE/config_question.md +++ b/.github/ISSUE_TEMPLATE/config_question.md @@ -1,6 +1,6 @@ --- name: Configuration Question -about: Ask about HumanShield configuration, deployment, or compliance setup +about: Ask about SentryMail configuration, deployment, or compliance setup title: '[CONFIG] ' labels: question assignees: '' @@ -11,7 +11,7 @@ What are you trying to configure or set up? ## Current Setup - **Deployment type:** [e.g., Docker, Kubernetes, VPS] -- **HumanShield version:** [e.g., 1.0.0] +- **SentryMail version:** [e.g., 1.0.0] - **Environment:** [e.g., Linux Ubuntu 22.04] - **Database:** [e.g., PostgreSQL, SQLite] diff --git a/.github/ISSUE_TEMPLATE/docs_improvement.md b/.github/ISSUE_TEMPLATE/docs_improvement.md index bad1f9b..f4e0929 100644 --- a/.github/ISSUE_TEMPLATE/docs_improvement.md +++ b/.github/ISSUE_TEMPLATE/docs_improvement.md @@ -1,6 +1,6 @@ --- name: Documentation Improvement -about: Suggest improvements to HumanShield documentation +about: Suggest improvements to SentryMail documentation title: '[DOCS] ' labels: documentation assignees: '' diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index bfa204e..13b4fd0 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- name: Feature Request -about: Suggest an enhancement or new feature for HumanShield +about: Suggest an enhancement or new feature for SentryMail title: '[FEATURE] ' labels: enhancement --- @@ -13,7 +13,7 @@ Describe the solution you'd like. ## Target Audience - [ ] End Users (Security Awareness Participants) -- [ ] Administrators (HumanShield Platform Users) +- [ ] Administrators (SentryMail Platform Users) - [ ] Integrators (API/Custom Implementations) - [ ] Security Teams (Reporting/Analytics) - [ ] All of the above diff --git a/.github/ISSUE_TEMPLATE/integration_request.md b/.github/ISSUE_TEMPLATE/integration_request.md index 8e4d790..8860401 100644 --- a/.github/ISSUE_TEMPLATE/integration_request.md +++ b/.github/ISSUE_TEMPLATE/integration_request.md @@ -7,7 +7,7 @@ assignees: '' --- ## Integration Request -What system or API would you like to integrate with HumanShield? +What system or API would you like to integrate with SentryMail? ## System/Service Details - **Name:** [e.g., Slack, Microsoft Teams, Jira] @@ -18,7 +18,7 @@ What system or API would you like to integrate with HumanShield? Describe the integration scenario: ## Expected Benefits -How would this integration improve HumanShield? +How would this integration improve SentryMail? ## Scope - [ ] Notifications/Alerts diff --git a/backend/app/addon_loader.py b/backend/app/addon_loader.py index d39c3c7..6d8ca4c 100644 --- a/backend/app/addon_loader.py +++ b/backend/app/addon_loader.py @@ -14,7 +14,7 @@ hier nichts. Das Feature-Gate selbst liegt in den Add-on-Routern; dieser Loader entscheidet nur, ob ein Paket ueberhaupt vorhanden ist. -Siehe docs/lizenz-addon-architektur.md (Abschnitt 6). +Siehe docs/license-addon-architektur.md (Abschnitt 6). """ import logging from importlib.metadata import entry_points diff --git a/backend/app/services/license.py b/backend/app/services/license.py index 3c60d17..c19acb1 100644 --- a/backend/app/services/license.py +++ b/backend/app/services/license.py @@ -10,7 +10,7 @@ enthaltenen Features aktiv - auch wenn der Server zwischenzeitlich nicht erreichbar ist. Ohne Lizenz laeuft der Core als reiner Open-Core (keine Add-ons). -Siehe docs/lizenz-addon-architektur.md. +Siehe docs/license-addon-architektur.md. """ from __future__ import annotations