Artikel
28. Anhang
Der Anhang enthält lauffähige Beispielkonfigurationen, Beispieldaten, Prompts, Cronjobs, Systemd-Dateien, Fehlercodes und Checklisten für MVP und Produktivbetrieb.
28.1 Beispiel .env
Datei:
.env
OPENAI_API_KEY=sk-...
APP_ENV=prod
APP_TIMEZONE=Europe/Berlin
DRY_RUN=true
LINKEDIN_LOGIN_EMAIL=
LINKEDIN_LOGIN_PASSWORD=
INSTAGRAM_LOGIN_USERNAME=
INSTAGRAM_LOGIN_PASSWORD=
FACEBOOK_LOGIN_EMAIL=
FACEBOOK_LOGIN_PASSWORD=
Produktiv:
chmod 600 .env
.env gehört nicht ins Repository.
28.2 Beispiel config.yaml
app:
name: "social-publisher"
timezone: "Europe/Berlin"
mode: "dry_run"
storage:
data_path: "data"
prompts_path: "prompts"
sessions_path: "storage/sessions"
screenshots_path: "storage/screenshots"
images_path: "storage/images"
logs_path: "storage/logs"
platforms:
linkedin:
enabled: true
adapter: "linkedin"
live_confirmed: false
session_path: "storage/sessions/linkedin.json"
screenshots_path: "storage/screenshots/linkedin"
default_post_type: "text"
instagram:
enabled: false
adapter: "instagram"
live_confirmed: false
session_path: "storage/sessions/instagram.json"
screenshots_path: "storage/screenshots/instagram"
default_post_type: "image"
facebook:
enabled: false
adapter: "facebook"
live_confirmed: false
session_path: "storage/sessions/facebook.json"
screenshots_path: "storage/screenshots/facebook"
default_post_type: "text"
accounts:
linkedin:
account_name: "xyz Verlag"
account_type: "personal"
profile_url: ""
instagram:
account_name: "xyz"
account_type: "business"
facebook:
account_name: "xyz Verlag"
account_type: "page"
page_name: "xyz Verlag"
business_suite_url: "https://business.facebook.com/latest/home"
limits:
max_posts_per_day: 1
max_comments_per_day: 3
max_likes_per_day: 5
max_failures_per_day: 3
min_minutes_between_posts: 240
min_minutes_between_comments: 30
max_retry_attempts: 2
interaction_limits:
max_comment_suggestions_per_day: 10
max_approved_comments_per_day: 3
max_executed_comments_per_day: 3
max_likes_per_day: 5
max_external_comments_per_day: 1
topics:
allowed:
- "klassiker"
- "gemeinfreie-literatur"
- "verlagswerkstatt"
- "ebook-produktion"
- "ki-im-verlag"
- "buchvorstellung"
- "blogartikel"
blocked:
- "parteipolitik"
- "privates"
- "religionsstreit"
- "tagesaufreger"
topic_limits:
max_posts_per_topic_per_week: 2
max_posts_per_author_per_week: 2
max_book_promotions_per_week: 3
max_workshop_posts_per_week: 2
max_ai_posts_per_week: 2
content_mix:
linkedin:
workshop: 0.4
ai_publishing: 0.3
book_intro: 0.2
blog_summary: 0.1
instagram:
quote_card: 0.5
book_visual: 0.3
author_note: 0.2
facebook:
book_intro: 0.5
blog_summary: 0.3
quote: 0.2
posting_days:
linkedin:
- "monday"
- "wednesday"
- "friday"
instagram:
- "tuesday"
- "thursday"
- "saturday"
facebook:
- "monday"
- "friday"
posting_windows:
linkedin:
- start: "08:30"
end: "10:30"
- start: "16:00"
end: "18:00"
instagram:
- start: "11:00"
end: "13:00"
- start: "18:00"
end: "20:00"
facebook:
- start: "09:00"
end: "11:00"
- start: "17:00"
end: "19:00"
quiet_hours:
start: "21:00"
end: "07:00"
blackout_dates:
- "2026-01-01"
- "2026-12-24"
- "2026-12-25"
safety:
dry_run_required_for_new_platforms: true
stop_on_captcha: true
stop_on_login_required: true
stop_on_platform_warning: true
stop_on_unexpected_redirect: true
stop_after_consecutive_failures: 2
disable_platform_after_daily_failures: 3
require_screenshot_after_publish: true
require_screenshot_on_error: true
kill_switch:
enabled: false
reason: ""
platform_kill_switch:
linkedin:
enabled: false
reason: ""
instagram:
enabled: false
reason: ""
facebook:
enabled: false
reason: ""
blocked_actions:
- "auto_follow"
- "auto_unfollow"
- "mass_like"
- "captcha_bypass"
- "multi_account_rotation"
comment_safety:
require_manual_approval_for_external_comments: true
allow_auto_reply_to_own_comments: false
allow_sales_links_in_comments: false
max_comment_length: 600
reject_generic_comments: true
openai:
default_model: "gpt-4.1-mini"
quality_model: "gpt-4.1-mini"
comment_model: "gpt-4.1-mini"
max_output_tokens_post: 700
max_output_tokens_quality: 500
max_output_tokens_comment: 300
prompt_version: "1.0.0"
cost_estimates:
gpt-4.1-mini:
input_per_1m_tokens: 0.40
output_per_1m_tokens: 1.60
28.3 Beispiel books.json
Datei:
data/books.json
[
{
"id": "book_001",
"title": "Stolz und Vorurteil",
"author": "Jane Austen",
"language": "de",
"category": "klassiker",
"description": "Ein Gesellschaftsroman über Herkunft, Heirat, Stolz und Selbsttäuschung.",
"shop_url": "https://www.xyz.de/stolz-und-vorurteil",
"cover_image_path": "storage/images/source/stolz-und-vorurteil.jpg",
"tags": [
"klassiker",
"jane-austen",
"gesellschaftsroman"
]
},
{
"id": "book_002",
"title": "Das Paradies der Damen",
"author": "Émile Zola",
"language": "de",
"category": "klassiker",
"description": "Ein Roman über Warenhäuser, Konsum, Verführung und wirtschaftlichen Wandel.",
"shop_url": "https://www.xyz.de/das-paradies-der-damen",
"cover_image_path": "storage/images/source/das-paradies-der-damen.jpg",
"tags": [
"klassiker",
"zola",
"warenhaus",
"gesellschaftsroman"
]
}
]
28.4 Beispiel posts.json
Datei:
data/post_drafts.json
[
{
"id": "draft_20260512_093000_123456",
"source_type": "manual_topic",
"source_id": "topic_001",
"platform": "linkedin",
"post_type": "workshop",
"status": "draft",
"text": "Gemeinfreie Texte sind frei verfügbar, aber nicht automatisch verlagsfertig. OCR-Korrektur, Typografie und Metadaten bleiben echte Arbeit.",
"image_path": null,
"target_url": "https://www.xyz.de",
"prompt_name": "workshop_note",
"prompt_version": "1.0.0",
"model": "gpt-4.1-mini",
"quality_result": {
"passed": true,
"reason": "passed",
"checks": {
"hard_reject": true,
"character_limit": true,
"link": true,
"generic": true,
"duplicate": true,
"similarity": true,
"tone": true,
"sales_pressure": true,
"comment_sales_link": true
}
},
"created_at": "2026-05-12T09:30:00+02:00",
"updated_at": "2026-05-12T09:30:00+02:00"
},
{
"id": "draft_20260512_100000_654321",
"source_type": "book",
"source_id": "book_001",
"platform": "facebook",
"post_type": "book_intro",
"status": "approved",
"text": "Jane Austens Stolz und Vorurteil beobachtet gesellschaftliche Erwartungen genauer, als es eine reine Liebesgeschichte könnte. Herkunft, Vermögen und Selbsttäuschung stehen im Zentrum.",
"image_path": "storage/images/prepared/facebook/facebook_cover_book_001_1080x1080.jpg",
"target_url": "https://www.xyz.de/stolz-und-vorurteil",
"prompt_name": "book_intro",
"prompt_version": "1.0.0",
"model": "gpt-4.1-mini",
"quality_result": {
"passed": true,
"reason": "passed"
},
"created_at": "2026-05-12T10:00:00+02:00",
"updated_at": "2026-05-12T10:05:00+02:00",
"approved_at": "2026-05-12T10:05:00+02:00",
"approval_mode": "manual"
}
]
28.5 Beispiel interaction_log.json
Datei:
data/interaction_candidates.json
[
{
"id": "interaction_20260512_101500_123456",
"platform": "linkedin",
"interaction_type": "external_comment",
"source_url": "https://www.linkedin.com/feed/update/example",
"source_author": "Max Beispiel",
"source_text": "Kleine Anbieter haben oft gute Produkte, aber zu wenig Sichtbarkeit.",
"relevance_score": 0.82,
"risk_score": 0.08,
"status": "suggested",
"suggested_text": "Im Buchmarkt ist Sichtbarkeit oft der eigentliche Engpass. Eine digitale Ausgabe kann technisch sauber sein, aber ohne Metadaten, Auffindbarkeit und Wiederholung bleibt sie praktisch unsichtbar.",
"created_at": "2026-05-12T10:15:00+02:00",
"updated_at": "2026-05-12T10:16:00+02:00"
},
{
"id": "interaction_20260512_102000_654321",
"platform": "facebook",
"interaction_type": "comment_reply",
"source_url": "https://www.facebook.com/example/posts/123",
"source_author": "Erika Beispiel",
"source_text": "Sind die Bücher auch als EPUB verfügbar?",
"relevance_score": 0.91,
"risk_score": 0.02,
"status": "approved",
"suggested_text": "Ja, die aktuellen Ausgaben sind als EPUB angelegt. PDF wird nicht mehr neu produziert, weil der Pflege- und Prüfaufwand dafür im Vertrieb deutlich höher ist.",
"created_at": "2026-05-12T10:20:00+02:00",
"updated_at": "2026-05-12T10:25:00+02:00",
"approved_at": "2026-05-12T10:25:00+02:00"
}
]
Optionales Ausführungslog:
data/interaction_logs.json
[
{
"id": "interaction_log_20260512_001",
"candidate_id": "interaction_20260512_102000_654321",
"platform": "facebook",
"interaction_type": "comment_reply",
"executed_text": "Ja, die aktuellen Ausgaben sind als EPUB angelegt. PDF wird nicht mehr neu produziert, weil der Pflege- und Prüfaufwand dafür im Vertrieb deutlich höher ist.",
"status": "executed",
"screenshot_path": "storage/screenshots/facebook/interaction_20260512_102000_654321_executed.png",
"executed_at": "2026-05-12T10:30:00+02:00",
"error_message": null
}
]
28.6 Beispiel-Prompts
prompts/workshop_note.v1.txt
Du schreibst einen kurzen Werkstattbeitrag aus der Perspektive eines kleinen deutschen E-Book-Verlags.
Thema:
{{ title }}
Ausgangsmaterial:
{{ body }}
Ziel:
Der Beitrag soll einen konkreten Einblick in digitale Verlagsarbeit geben.
Stil:
- fachlich
- konkret
- ruhig
- keine Selbstinszenierung
- keine Emojis
- keine Floskeln
- keine übertriebene Dramatisierung
Regeln:
- maximal 1.000 Zeichen
- ein konkreter technischer oder verlegerischer Punkt
- keine allgemeinen Marketingphrasen
- keine erfundenen Prozessdetails
- keine direkte Ansprache mit „Du“
- kein Verkaufsdruck
Ausgabe:
Erzeuge nur den Beitragstext.
prompts/book_intro.v1.txt
Du schreibst eine kurze Buchvorstellung für einen kleinen deutschen E-Book-Verlag.
Buchtitel:
{{ book_title }}
Autor:
{{ author }}
Beschreibung:
{{ body }}
Kategorie:
{{ category }}
Shoplink:
{{ url }}
Ziel:
Die Buchvorstellung soll Interesse wecken, ohne werblich oder pathetisch zu klingen.
Stil:
- sachlich
- klar
- kultiviert
- nicht kitschig
- nicht akademisch überladen
- keine Emojis
Regeln:
- maximal 900 Zeichen
- keine Formulierungen wie „zeitloses Meisterwerk“, „unvergesslich“, „muss man gelesen haben“
- keine erfundenen historischen Angaben
- keine Inhaltsdetails behaupten, die nicht im Ausgangsmaterial stehen
- kein direkter Kaufbefehl
- ein dezenter Hinweis auf die Ausgabe ist erlaubt
Ausgabe:
Erzeuge nur den Beitragstext.
prompts/comment_suggestion.v1.txt
Du erzeugst einen Kommentarvorschlag für einen kleinen deutschen E-Book-Verlag.
Beitrag:
{{ source_text }}
Verlagskontext:
{{ publisher_context }}
Ziel:
Der Kommentar soll einen konkreten fachlichen Gedanken ergänzen.
Regeln:
- maximal 500 Zeichen
- keine Emojis
- kein Verkaufslink
- keine Eigenwerbung
- keine generischen Komplimente
- keine politische Zuspitzung
- kein Angriff
- keine private Ansprache
- nur ein konkreter Gedanke
Ausgabe:
Wenn ein sinnvoller Kommentar möglich ist, gib nur den Kommentartext zurück.
Wenn kein sinnvoller Kommentar möglich ist, gib exakt zurück:
NO_COMMENT
prompts/tone_check.v1.txt
Du prüfst die Tonalität eines Social-Media-Beitrags für einen kleinen deutschen E-Book-Verlag.
Beitrag:
{{ post_text }}
Gewünschte Tonalität:
- sachlich
- professionell
- kultiviert
- nicht werblich
- nicht generisch
- nicht anbiedernd
- keine Emojis
- keine Floskeln
- keine übertriebene Begeisterung
Unerwünschte Formulierungen:
- unbedingt lesen
- Meisterwerk
- Tauchen Sie ein
- perfekt für
- entdecken Sie jetzt
- lassen Sie sich verzaubern
- für alle Fans von
- ein Muss
Aufgabe:
Bewerte, ob der Beitrag zur gewünschten Tonalität passt.
Antworte ausschließlich im vorgegebenen JSON-Format.
28.7 Beispiel-Crontab
Dry-Run:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 8 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.generate_posts >> storage/logs/cron.log 2>&1
10 8 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.review_queue auto-approve >> storage/logs/cron.log 2>&1
*/15 8-18 * * 1-5 flock -n /tmp/social-publisher.lock bash -lc 'cd /opt/social-publisher && .venv/bin/python -m src.scheduler run' >> /opt/social-publisher/storage/logs/cron.log 2>&1
0 18 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.report daily --date $(date +\%F) >> storage/logs/reports.log 2>&1
Live:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 8 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.generate_posts >> storage/logs/cron.log 2>&1
10 8 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.review_queue auto-approve >> storage/logs/cron.log 2>&1
*/15 8-18 * * 1-5 flock -n /tmp/social-publisher.lock bash -lc 'cd /opt/social-publisher && .venv/bin/python -m src.scheduler run --live' >> /opt/social-publisher/storage/logs/cron.log 2>&1
0 18 * * 1-5 cd /opt/social-publisher && .venv/bin/python -m src.report daily --date $(date +\%F) >> storage/logs/reports.log 2>&1
28.8 Beispiel-Systemd-Service
Smoke-Test:
[Unit]
Description=Social Publisher Smoke Test
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
WorkingDirectory=/opt/social-publisher
EnvironmentFile=/opt/social-publisher/.env
ExecStart=/opt/social-publisher/.venv/bin/python -m src.main queue status
User=socialpublisher
Group=socialpublisher
[Install]
WantedBy=multi-user.target
Scheduler-Dry-Run:
[Unit]
Description=Social Publisher Scheduler Dry Run
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
WorkingDirectory=/opt/social-publisher
EnvironmentFile=/opt/social-publisher/.env
ExecStart=/opt/social-publisher/.venv/bin/python -m src.scheduler run
User=socialpublisher
Group=socialpublisher
Scheduler-Live:
[Unit]
Description=Social Publisher Scheduler Live
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
WorkingDirectory=/opt/social-publisher
EnvironmentFile=/opt/social-publisher/.env
ExecStart=/opt/social-publisher/.venv/bin/python -m src.scheduler run --live
User=socialpublisher
Group=socialpublisher
Aktivieren ist für oneshot nicht zwingend erforderlich. Cron oder Systemd-Timer startet den Dienst.
28.9 Fehlercodes
Fehlercodes sollten stabil und knapp sein.
CONFIG_MISSING
CONFIG_INVALID
ENV_MISSING
OPENAI_REQUEST_FAILED
OPENAI_EMPTY_RESPONSE
OPENAI_INVALID_JSON
QUALITY_FAILED
DUPLICATE_POST
LINK_INVALID
TEXT_TOO_LONG
IMAGE_MISSING
IMAGE_INVALID
SESSION_MISSING
LOGIN_REQUIRED
CAPTCHA_DETECTED
PLATFORM_WARNING
PLATFORM_ANOMALY
SELECTOR_NOT_FOUND
UPLOAD_FAILED
PUBLISH_FAILED
PUBLISH_STATUS_UNKNOWN
DAILY_LIMIT_REACHED
FAILURE_LIMIT_REACHED
GLOBAL_KILL_SWITCH_ENABLED
PLATFORM_KILL_SWITCH_ENABLED
INTERACTION_REJECTED
COMMENT_TOO_GENERIC
COMMENT_CONTAINS_LINK
COMMENT_TOPIC_BLOCKED
DRY_RUN_ONLY
Beispielstruktur im Fehlerlog:
{
"timestamp": "2026-05-12T09:31:00+02:00",
"level": "error",
"event": "post_failed",
"platform": "linkedin",
"reference_id": "draft_20260512_001",
"payload": {
"error_code": "SELECTOR_NOT_FOUND",
"error_type": "PlaywrightTimeoutError",
"error_message": "Post button not found.",
"screenshot_path": "storage/screenshots/linkedin/draft_20260512_001_failed.png"
}
}
Zuordnung:
CONFIG_MISSING
Konfigurationsdatei fehlt.
CONFIG_INVALID
Konfigurationsdatei ist vorhanden, aber strukturell ungültig.
ENV_MISSING
Erforderliche Umgebungsvariable fehlt.
OPENAI_REQUEST_FAILED
OpenAI-Aufruf ist fehlgeschlagen.
OPENAI_EMPTY_RESPONSE
OpenAI-Antwort enthält keinen Text.
OPENAI_INVALID_JSON
Strukturierte OpenAI-Antwort ist kein gültiges JSON.
QUALITY_FAILED
Quality-Gate hat den Beitrag abgelehnt.
DUPLICATE_POST
Beitrag ist identisch oder zu ähnlich.
LINK_INVALID
Link ist formal ungültig oder Domain nicht erlaubt.
TEXT_TOO_LONG
Text überschreitet internes Plattformlimit.
IMAGE_MISSING
Erforderliches Bild fehlt.
IMAGE_INVALID
Bilddatei existiert nicht oder hat ungültiges Format.
SESSION_MISSING
Playwright-Sessiondatei fehlt.
LOGIN_REQUIRED
Plattform verlangt erneuten Login.
CAPTCHA_DETECTED
CAPTCHA oder Sicherheitsprüfung erkannt.
PLATFORM_WARNING
Plattform zeigt Warnung.
PLATFORM_ANOMALY
Ungewöhnliche Plattformreaktion.
SELECTOR_NOT_FOUND
Button, Textbox oder Uploadfeld nicht gefunden.
UPLOAD_FAILED
Bild-Upload fehlgeschlagen.
PUBLISH_FAILED
Veröffentlichung fehlgeschlagen.
PUBLISH_STATUS_UNKNOWN
Nach Absenden ist unklar, ob veröffentlicht wurde.
DAILY_LIMIT_REACHED
Tageslimit erreicht.
FAILURE_LIMIT_REACHED
Fehlerlimit erreicht.
GLOBAL_KILL_SWITCH_ENABLED
Globaler Kill-Switch aktiv.
PLATFORM_KILL_SWITCH_ENABLED
Plattform-Kill-Switch aktiv.
INTERACTION_REJECTED
Interaktionskandidat wurde abgelehnt.
COMMENT_TOO_GENERIC
Kommentar ist zu generisch.
COMMENT_CONTAINS_LINK
Kommentar enthält Link oder Verkaufsverweis.
COMMENT_TOPIC_BLOCKED
Kommentarquelle enthält blockiertes Thema.
DRY_RUN_ONLY
Live-Ausführung nicht erlaubt.
28.10 Checkliste MVP
Projektstruktur angelegt
Python venv erstellt
requirements.txt vorhanden
Playwright installiert
Chromium installiert
.env erstellt
config.yaml erstellt
.gitignore enthält .env, .venv, storage/sessions
OpenAI-Client funktioniert
safety_identifier gesetzt
books.json vorhanden
topics.json vorhanden
post_drafts.json vorhanden
Prompts vorhanden
Content-Generator erzeugt Entwurf
Quality-Gate prüft Entwurf
Review-Queue zeigt Entwurf
Entwurf kann freigegeben werden
Entwurf kann abgelehnt werden
Dry-Run für LinkedIn funktioniert
Screenshot wird gespeichert
Logs werden geschrieben
Report kann erzeugt werden
Kill-Switch wird geprüft
Session kann gespeichert werden
Session kann geprüft werden
pytest läuft
keine echten Plattformaktionen in Unit-Tests
Cron läuft im Dry-Run
Minimaler MVP-Testlauf:
python -m src.browser_session login linkedin
python -m src.browser_session check linkedin --headed
python -m src.main generate --platform linkedin --type workshop
python -m src.main queue list --status draft
python -m src.main queue approve draft_...
python -m src.main publish draft_...
python -m src.main logs events --limit 20
python -m src.main report daily --date 2026-05-12
pytest
28.11 Checkliste Produktivbetrieb
Serververzeichnis unter /opt/social-publisher angelegt
eigener Systemnutzer eingerichtet
Dateirechte gesetzt
.env mit chmod 600 geschützt
storage/sessions mit chmod 700 geschützt
Playwright-Browser mit Dependencies installiert
LinkedIn-Session manuell erstellt
Instagram-Session nur bei Bedarf erstellt
Facebook-Session nur bei Bedarf erstellt
config.yaml auf prod geprüft
DRY_RUN zunächst aktiv
globaler Kill-Switch geprüft
Plattform-Kill-Switches geprüft
Posting-Limits geprüft
Fehlerlimits geprüft
Cron mit Lockfile eingerichtet
Smoke-Test erfolgreich
Dry-Run produktiv erfolgreich
Screenshot nach Dry-Run geprüft
Logs geprüft
erster Live-Post manuell freigegeben
erster Live-Post einzeln ausgeführt
Plattform danach manuell geprüft
Tagesreport geprüft
Backup vor Änderungen eingerichtet
Rollback-Verzeichnis vorbereitet
Monatsroutine dokumentiert
Plattformänderungen werden dokumentiert
Prompts werden versioniert
Sessions werden regelmäßig geprüft
blocked-Status wird nicht automatisch wiederholt
CAPTCHA wird nicht automatisiert behandelt
Login-Probleme werden manuell gelöst
Produktiver Start in sicherer Reihenfolge:
cd /opt/social-publisher
.venv/bin/python -m src.main queue status
.venv/bin/python -m src.browser_session check linkedin --headed
.venv/bin/python -m src.main generate --platform linkedin --type workshop
.venv/bin/python -m src.main queue list --status draft
.venv/bin/python -m src.main queue approve draft_...
.venv/bin/python -m src.main publish draft_...
.venv/bin/python -m src.main logs events --limit 20
.venv/bin/python -m src.main publish draft_... --live
.venv/bin/python -m src.main report daily --date 2026-05-12
Abschluss
Damit ist das schnelle Handbuch vollständig:
Ziel und Rahmen
Architektur
Setup
Konfiguration
Datenmodell
Content-Quellen
OpenAI-Integration
Prompt-Bibliothek
Content-Generator
Qualitätsprüfung
Review-Queue
Playwright-Grundlagen
Posting-Engine
LinkedIn
Instagram
Facebook
Bildverwaltung
Interaktionssystem
Kommentarlogik
Scheduler
Logging
Monitoring
Sicherheitslogik
CLI
Deployment
Tests
Wartung
Anhang
Das System bleibt bewusst kontrolliert:
erst erzeugen
dann prüfen
dann freigeben
dann veröffentlichen
immer loggen
immer Screenshots speichern
bei Unsicherheit stoppen
0 Kommentare