[{"data":1,"prerenderedAt":2664},["ShallowReactive",2],{"navigation_docs_de":3,"-de-self-hosting-docker-compose":427,"-de-self-hosting-docker-compose-surround":2659},[4,31,117,188,238,271,310,369,378],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":30},"Erste Schritte","i-hugeicons-rocket-01","\u002Fde\u002Fgetting-started","de\u002F01.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"Was ist DDM?","\u002Fde\u002Fgetting-started\u002Fwhat-is-ddm","de\u002F01.getting-started\u002F01.what-is-ddm","i-hugeicons-information-circle",{"title":16,"path":17,"stem":18,"icon":19},"Konto und Anmeldung","\u002Fde\u002Fgetting-started\u002Fsign-in","de\u002F01.getting-started\u002F02.sign-in","i-hugeicons-key-01",{"title":21,"path":22,"stem":23,"icon":24},"KI in DDM","\u002Fde\u002Fgetting-started\u002Fai-in-ddm","de\u002F01.getting-started\u002F03.ai-in-ddm","i-hugeicons-ai-magic",{"title":26,"path":27,"stem":28,"icon":29},"Systemstatus","\u002Fde\u002Fgetting-started\u002Fsystem-status","de\u002F01.getting-started\u002F04.system-status","i-hugeicons-activity-03",false,{"title":32,"icon":33,"path":34,"stem":35,"children":36,"page":30},"CMS","i-hugeicons-dashboard-square-01","\u002Fde\u002Fcms","de\u002F02.cms",[37,42,47,52,57,62,67,72,77,82,87,92,97,102,107,112],{"title":38,"path":39,"stem":40,"icon":41},"Das CMS im Überblick","\u002Fde\u002Fcms\u002Foverview","de\u002F02.cms\u002F01.overview","i-hugeicons-compass-01",{"title":43,"path":44,"stem":45,"icon":46},"Dokumente hochladen","\u002Fde\u002Fcms\u002Fupload","de\u002F02.cms\u002F02.upload","i-hugeicons-upload-01",{"title":48,"path":49,"stem":50,"icon":51},"Kategorien","\u002Fde\u002Fcms\u002Fcategories","de\u002F02.cms\u002F03.categories","i-hugeicons-folder-tree",{"title":53,"path":54,"stem":55,"icon":56},"Dokumente bearbeiten","\u002Fde\u002Fcms\u002Fdocuments","de\u002F02.cms\u002F04.documents","i-hugeicons-file-edit",{"title":58,"path":59,"stem":60,"icon":61},"Suchen und filtern","\u002Fde\u002Fcms\u002Fsearch-and-filters","de\u002F02.cms\u002F05.search-and-filters","i-hugeicons-search-01",{"title":63,"path":64,"stem":65,"icon":66},"Gruppen und Rechte","\u002Fde\u002Fcms\u002Fgroups-and-permissions","de\u002F02.cms\u002F06.groups-and-permissions","i-hugeicons-user-multiple",{"title":68,"path":69,"stem":70,"icon":71},"Benutzer","\u002Fde\u002Fcms\u002Fusers","de\u002F02.cms\u002F07.users","i-hugeicons-user-add-01",{"title":73,"path":74,"stem":75,"icon":76},"Freigaben","\u002Fde\u002Fcms\u002Fapprovals","de\u002F02.cms\u002F08.approvals","i-hugeicons-checkmark-badge-01",{"title":78,"path":79,"stem":80,"icon":81},"Märkte und Übersetzungen","\u002Fde\u002Fcms\u002Fmarkets-and-translations","de\u002F02.cms\u002F09.markets-and-translations","i-hugeicons-globe-02",{"title":83,"path":84,"stem":85,"icon":86},"Notizvorlagen","\u002Fde\u002Fcms\u002Fnote-templates","de\u002F02.cms\u002F10.note-templates","i-hugeicons-layout-01",{"title":88,"path":89,"stem":90,"icon":91},"Nutzung und Audit-Log","\u002Fde\u002Fcms\u002Fusage-and-audit","de\u002F02.cms\u002F11.usage-and-audit","i-hugeicons-chart-column",{"title":93,"path":94,"stem":95,"icon":96},"KI-Assistent","\u002Fde\u002Fcms\u002Fassistant","de\u002F02.cms\u002F12.assistant","i-hugeicons-sparkles",{"title":98,"path":99,"stem":100,"icon":101},"Einstellungen","\u002Fde\u002Fcms\u002Fsettings","de\u002F02.cms\u002F13.settings","i-hugeicons-settings-02",{"title":103,"path":104,"stem":105,"icon":106},"Tarife","\u002Fde\u002Fcms\u002Fplans","de\u002F02.cms\u002F14.plans","i-hugeicons-package",{"title":108,"path":109,"stem":110,"icon":111},"Feature-Wünsche","\u002Fde\u002Fcms\u002Ffeature-requests","de\u002F02.cms\u002F15.feature-requests","i-hugeicons-idea-01",{"title":113,"path":114,"stem":115,"icon":116},"Fehler melden","\u002Fde\u002Fcms\u002Fbug-reports","de\u002F02.cms\u002F16.bug-reports","i-hugeicons-bug-01",{"title":118,"icon":119,"path":120,"stem":121,"children":122,"page":30},"App","i-hugeicons-smart-phone-01","\u002Fde\u002Fapp","de\u002F03.app",[123,128,133,138,143,147,152,157,162,167,170,173,176,179,184],{"title":124,"path":125,"stem":126,"icon":127},"Anmelden und zurechtfinden","\u002Fde\u002Fapp\u002Foverview","de\u002F03.app\u002F01.overview","i-hugeicons-login-03",{"title":129,"path":130,"stem":131,"icon":132},"Tabs und geteilte Ansicht","\u002Fde\u002Fapp\u002Ftabs","de\u002F03.app\u002F02.tabs","i-hugeicons-layout-2-column",{"title":134,"path":135,"stem":136,"icon":137},"Dokumente finden und lesen","\u002Fde\u002Fapp\u002Fdocuments","de\u002F03.app\u002F03.documents","i-hugeicons-file-01",{"title":139,"path":140,"stem":141,"icon":142},"Favoriten","\u002Fde\u002Fapp\u002Ffavorites","de\u002F03.app\u002F04.favorites","i-hugeicons-favourite",{"title":144,"path":145,"stem":146,"icon":61},"Suchen","\u002Fde\u002Fapp\u002Fsearch","de\u002F03.app\u002F05.search",{"title":148,"path":149,"stem":150,"icon":151},"Notizen","\u002Fde\u002Fapp\u002Fnotes","de\u002F03.app\u002F06.notes","i-hugeicons-note-edit",{"title":153,"path":154,"stem":155,"icon":156},"Kalender und Termine","\u002Fde\u002Fapp\u002Fcalendar","de\u002F03.app\u002F07.calendar","i-hugeicons-calendar-03",{"title":158,"path":159,"stem":160,"icon":161},"An Kunden senden","\u002Fde\u002Fapp\u002Foutbox","de\u002F03.app\u002F08.outbox","i-hugeicons-sent",{"title":163,"path":164,"stem":165,"icon":166},"Offline arbeiten","\u002Fde\u002Fapp\u002Foffline","de\u002F03.app\u002F09.offline","i-hugeicons-wifi-off-01",{"title":93,"path":168,"stem":169,"icon":96},"\u002Fde\u002Fapp\u002Fassistant","de\u002F03.app\u002F10.assistant",{"title":98,"path":171,"stem":172,"icon":101},"\u002Fde\u002Fapp\u002Fsettings","de\u002F03.app\u002F11.settings",{"title":108,"path":174,"stem":175,"icon":111},"\u002Fde\u002Fapp\u002Ffeature-requests","de\u002F03.app\u002F12.feature-requests",{"title":113,"path":177,"stem":178,"icon":116},"\u002Fde\u002Fapp\u002Fbug-reports","de\u002F03.app\u002F13.bug-reports",{"title":180,"path":181,"stem":182,"icon":183},"Desktop-App","\u002Fde\u002Fapp\u002Fdesktop-app","de\u002F03.app\u002F14.desktop-app","i-hugeicons-computer",{"title":185,"path":186,"stem":187,"icon":119},"Mobile App","\u002Fde\u002Fapp\u002Fmobile-app","de\u002F03.app\u002F15.mobile-app",{"title":189,"icon":190,"path":191,"stem":192,"children":193,"page":30},"Anmeldung & Verzeichnisse","i-hugeicons-security-check","\u002Fde\u002Fsign-in-and-directories","de\u002F04.sign-in-and-directories",[194,198,202,207,212,217,222,226,230,234],{"title":195,"path":196,"stem":197,"icon":19},"Anmeldeverfahren","\u002Fde\u002Fsign-in-and-directories\u002Fsign-in-methods","de\u002F04.sign-in-and-directories\u002F01.sign-in-methods",{"title":199,"path":200,"stem":201,"icon":190},"Single Sign-on","\u002Fde\u002Fsign-in-and-directories\u002Fsingle-sign-on","de\u002F04.sign-in-and-directories\u002F02.single-sign-on",{"title":203,"path":204,"stem":205,"icon":206},"Verzeichnisdienste (LDAP)","\u002Fde\u002Fsign-in-and-directories\u002Fdirectory-services","de\u002F04.sign-in-and-directories\u002F03.directory-services","i-hugeicons-hierarchy",{"title":208,"path":209,"stem":210,"icon":211},"Abgleich und Anmeldung","\u002Fde\u002Fsign-in-and-directories\u002Fdirectory-sync","de\u002F04.sign-in-and-directories\u002F04.directory-sync","i-hugeicons-refresh",{"title":213,"path":214,"stem":215,"icon":216},"Microsoft Entra ID","\u002Fde\u002Fsign-in-and-directories\u002Fmicrosoft-entra-id","de\u002F04.sign-in-and-directories\u002F05.microsoft-entra-id","i-hugeicons-building-03",{"title":218,"path":219,"stem":220,"icon":221},"Okta","\u002Fde\u002Fsign-in-and-directories\u002Fokta","de\u002F04.sign-in-and-directories\u002F06.okta","i-hugeicons-finger-print",{"title":223,"path":224,"stem":225,"icon":81},"Google Workspace","\u002Fde\u002Fsign-in-and-directories\u002Fgoogle-workspace","de\u002F04.sign-in-and-directories\u002F07.google-workspace",{"title":227,"path":228,"stem":229,"icon":119},"Zwei-Faktor-Authentifizierung","\u002Fde\u002Fsign-in-and-directories\u002Ftwo-factor-authentication","de\u002F04.sign-in-and-directories\u002F08.two-factor-authentication",{"title":231,"path":232,"stem":233,"icon":221},"Passkeys","\u002Fde\u002Fsign-in-and-directories\u002Fpasskeys","de\u002F04.sign-in-and-directories\u002F09.passkeys",{"title":235,"path":236,"stem":237,"icon":156},"Kalender-Freigabe","\u002Fde\u002Fsign-in-and-directories\u002Fcalendar-access","de\u002F04.sign-in-and-directories\u002F10.calendar-access",{"title":239,"icon":240,"path":241,"stem":242,"children":243,"page":30},"MCP-Server","i-hugeicons-ai-network","\u002Fde\u002Fmcp-server","de\u002F05.mcp-server",[244,248,253,257,262,266],{"title":245,"path":246,"stem":247,"icon":240},"Überblick","\u002Fde\u002Fmcp-server\u002Foverview","de\u002F05.mcp-server\u002F01.overview",{"title":249,"path":250,"stem":251,"icon":252},"Einrichten","\u002Fde\u002Fmcp-server\u002Fsetup","de\u002F05.mcp-server\u002F02.setup","i-hugeicons-plug-socket",{"title":254,"path":255,"stem":256,"icon":111},"Was Sie damit tun können","\u002Fde\u002Fmcp-server\u002Fuse-cases","de\u002F05.mcp-server\u002F03.use-cases",{"title":258,"path":259,"stem":260,"icon":261},"Werkzeuge","\u002Fde\u002Fmcp-server\u002Ftools","de\u002F05.mcp-server\u002F04.tools","i-hugeicons-wrench-01",{"title":263,"path":264,"stem":265,"icon":76},"Änderungen freigeben","\u002Fde\u002Fmcp-server\u002Fapproving-changes","de\u002F05.mcp-server\u002F05.approving-changes",{"title":267,"path":268,"stem":269,"icon":270},"Verwaltung & Sicherheit","\u002Fde\u002Fmcp-server\u002Fadmin-and-security","de\u002F05.mcp-server\u002F06.admin-and-security","i-hugeicons-shield-key",{"title":272,"icon":273,"path":274,"stem":275,"children":276,"page":30},"Externe Quellen","i-hugeicons-database-sync","\u002Fde\u002Fexternal-sources","de\u002F06.external-sources",[277,280,285,290,295,300,305],{"title":245,"path":278,"stem":279,"icon":273},"\u002Fde\u002Fexternal-sources\u002Foverview","de\u002F06.external-sources\u002F01.overview",{"title":281,"path":282,"stem":283,"icon":284},"SharePoint","\u002Fde\u002Fexternal-sources\u002Fsharepoint","de\u002F06.external-sources\u002F02.sharepoint","i-hugeicons-microsoft",{"title":286,"path":287,"stem":288,"icon":289},"OneDrive","\u002Fde\u002Fexternal-sources\u002Fonedrive","de\u002F06.external-sources\u002F03.onedrive","i-hugeicons-folder-cloud",{"title":291,"path":292,"stem":293,"icon":294},"Google Drive","\u002Fde\u002Fexternal-sources\u002Fgoogle-drive","de\u002F06.external-sources\u002F04.google-drive","i-hugeicons-google-drive",{"title":296,"path":297,"stem":298,"icon":299},"FTP \u002F SFTP","\u002Fde\u002Fexternal-sources\u002Fftp-sftp","de\u002F06.external-sources\u002F05.ftp-sftp","i-hugeicons-server-stack-01",{"title":301,"path":302,"stem":303,"icon":304},"REST-Schnittstelle","\u002Fde\u002Fexternal-sources\u002Frest","de\u002F06.external-sources\u002F06.rest","i-hugeicons-api",{"title":306,"path":307,"stem":308,"icon":309},"SOAP-Schnittstelle","\u002Fde\u002Fexternal-sources\u002Fsoap","de\u002F06.external-sources\u002F07.soap","i-hugeicons-source-code",{"title":311,"icon":304,"path":312,"stem":313,"children":314,"page":30},"Integrations-API","\u002Fde\u002Fintegration-api","de\u002F07.integration-api",[315,318,322,327,332,337,341,346,350,354,359,364],{"title":245,"path":316,"stem":317,"icon":14},"\u002Fde\u002Fintegration-api\u002Foverview","de\u002F07.integration-api\u002F01.overview",{"title":319,"path":320,"stem":321,"icon":19},"Authentifizierung","\u002Fde\u002Fintegration-api\u002Fauthentication","de\u002F07.integration-api\u002F02.authentication",{"title":323,"path":324,"stem":325,"icon":326},"Konventionen","\u002Fde\u002Fintegration-api\u002Fconventions","de\u002F07.integration-api\u002F03.conventions","i-hugeicons-book-open-01",{"title":328,"path":329,"stem":330,"icon":331},"Dokumente einspielen","\u002Fde\u002Fintegration-api\u002Fpushing-documents","de\u002F07.integration-api\u002F04.pushing-documents","i-hugeicons-upload-02",{"title":333,"path":334,"stem":335,"icon":336},"Inhalte abrufen","\u002Fde\u002Fintegration-api\u002Fconsuming-content","de\u002F07.integration-api\u002F05.consuming-content","i-hugeicons-download-02",{"title":338,"path":339,"stem":340,"icon":137},"Referenz: Dokumente","\u002Fde\u002Fintegration-api\u002Freference-documents","de\u002F07.integration-api\u002F06.reference-documents",{"title":342,"path":343,"stem":344,"icon":345},"Referenz: Kategorien, Schlagwörter, Märkte","\u002Fde\u002Fintegration-api\u002Freference-categories-tags","de\u002F07.integration-api\u002F07.reference-categories-tags","i-hugeicons-folder-01",{"title":347,"path":348,"stem":349,"icon":211},"Referenz: Abgleich-Manifest","\u002Fde\u002Fintegration-api\u002Freference-sync","de\u002F07.integration-api\u002F08.reference-sync",{"title":351,"path":352,"stem":353,"icon":309},"OpenAPI","\u002Fde\u002Fintegration-api\u002Fopenapi","de\u002F07.integration-api\u002F09.openapi",{"title":355,"path":356,"stem":357,"icon":358},"Änderungsprotokoll","\u002Fde\u002Fintegration-api\u002Fchangelog","de\u002F07.integration-api\u002F10.changelog","i-hugeicons-time-schedule",{"title":360,"path":361,"stem":362,"icon":363},"Referenz: Gruppen, Märkte, Zugriff","\u002Fde\u002Fintegration-api\u002Freference-groups-access","de\u002F07.integration-api\u002F11.reference-groups-access","i-hugeicons-user-lock-01",{"title":365,"path":366,"stem":367,"icon":368},"Umstieg von CMWS","\u002Fde\u002Fintegration-api\u002Fcmws","de\u002F07.integration-api\u002F12.cmws","i-hugeicons-arrow-reload-horizontal",{"title":370,"icon":371,"path":372,"stem":373,"children":374,"page":30},"Neuigkeiten","i-hugeicons-gift","\u002Fde\u002Fwhats-new","de\u002F08.whats-new",[375],{"title":355,"path":376,"stem":377,"icon":358},"\u002Fde\u002Fwhats-new\u002Fchangelog","de\u002F08.whats-new\u002F01.changelog",{"title":379,"icon":299,"path":380,"stem":381,"children":382,"page":30},"Selbst betreiben","\u002Fde\u002Fself-hosting","de\u002F09.self-hosting",[383,386,390,395,399,404,408,413,418,422],{"title":245,"path":384,"stem":385,"icon":14},"\u002Fde\u002Fself-hosting\u002Foverview","de\u002F09.self-hosting\u002F01.overview",{"title":387,"path":388,"stem":389,"icon":106},"Docker Compose","\u002Fde\u002Fself-hosting\u002Fdocker-compose","de\u002F09.self-hosting\u002F02.docker-compose",{"title":391,"path":392,"stem":393,"icon":394},"Kubernetes","\u002Fde\u002Fself-hosting\u002Fkubernetes","de\u002F09.self-hosting\u002F03.kubernetes","i-hugeicons-cloud",{"title":396,"path":397,"stem":398,"icon":101},"Konfiguration","\u002Fde\u002Fself-hosting\u002Fconfiguration","de\u002F09.self-hosting\u002F04.configuration",{"title":400,"path":401,"stem":402,"icon":403},"Lizenz","\u002Fde\u002Fself-hosting\u002Flicence","de\u002F09.self-hosting\u002F05.licence","i-hugeicons-license",{"title":405,"path":406,"stem":407,"icon":211},"Updates","\u002Fde\u002Fself-hosting\u002Fupdates","de\u002F09.self-hosting\u002F06.updates",{"title":409,"path":410,"stem":411,"icon":412},"Postgres","\u002Fde\u002Fself-hosting\u002Fpostgres","de\u002F09.self-hosting\u002F07.postgres","i-hugeicons-database",{"title":414,"path":415,"stem":416,"icon":417},"Sicherung","\u002Fde\u002Fself-hosting\u002Fbackups","de\u002F09.self-hosting\u002F08.backups","i-hugeicons-database-restore",{"title":419,"path":420,"stem":421,"icon":261},"Fehlerbehebung","\u002Fde\u002Fself-hosting\u002Ftroubleshooting","de\u002F09.self-hosting\u002F09.troubleshooting",{"title":423,"path":424,"stem":425,"icon":426},"Firewall","\u002Fde\u002Fself-hosting\u002Ffirewall","de\u002F09.self-hosting\u002F10.firewall","i-hugeicons-firewall",{"id":428,"title":387,"body":429,"description":2652,"extension":2653,"links":2654,"meta":2655,"navigation":2656,"path":388,"seo":2657,"stem":389,"__hash__":2658},"docs_de\u002Fde\u002F09.self-hosting\u002F02.docker-compose.md",{"type":430,"value":431,"toc":2643},"minimark",[432,436,441,444,507,511,518,531,1902,1909,2233,2241,2249,2253,2259,2409,2443,2449,2453,2463,2489,2493,2532,2542,2546,2563,2566,2570,2628,2639],[433,434,435],"p",{},"Auf einem einzelnen Server ist Docker Compose der einfachste Weg. Alles, was Sie dafür brauchen, steht auf dieser Seite: drei Dateien und Ihr Deploy-Token.",[437,438,440],"h2",{"id":439},"_1-bei-der-registry-anmelden","1. Bei der Registry anmelden",[433,442,443],{},"Melden Sie den Server mit dem Deploy-Token an, das Sie von uns bekommen haben:",[445,446,451],"pre",{"className":447,"code":448,"language":449,"meta":450,"style":450},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","docker login registry.gitlab.com -u \u003CName des Tokens> -p \u003CToken>\n","bash","",[452,453,454],"code",{"__ignoreMap":450},[455,456,459,463,467,470,473,477,480,483,486,490,493,496,498,501,504],"span",{"class":457,"line":458},"line",1,[455,460,462],{"class":461},"sBMFI","docker",[455,464,466],{"class":465},"sfazB"," login",[455,468,469],{"class":465}," registry.gitlab.com",[455,471,472],{"class":465}," -u",[455,474,476],{"class":475},"sMK4o"," \u003C",[455,478,479],{"class":465},"Name",[455,481,482],{"class":465}," des",[455,484,485],{"class":465}," Token",[455,487,489],{"class":488},"sTEyZ","s",[455,491,492],{"class":475},">",[455,494,495],{"class":465}," -p",[455,497,476],{"class":475},[455,499,500],{"class":465},"Toke",[455,502,503],{"class":488},"n",[455,505,506],{"class":475},">\n",[437,508,510],{"id":509},"_2-die-dateien-ablegen","2. Die Dateien ablegen",[433,512,513,514,517],{},"Legen Sie einen Ordner an, zum Beispiel ",[452,515,516],{},"\u002Fopt\u002Fddm",", und darin diese drei Dateien.",[433,519,520,526,527,530],{},[521,522,523],"strong",{},[452,524,525],{},"compose.yaml"," – die vier Dienste, ihre Volumes und Health-Checks. Sie bleibt, wie sie ist; was Sie einstellen, steht in ",[452,528,529],{},".env",".",[445,532,536],{"className":533,"code":534,"filename":525,"language":535,"meta":450,"style":450},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# DDM on one server, with Docker Compose — as the user guide describes it\n# („Selbst betreiben\" \u002F „Self-hosting\").\n#\n#     cp .env.example .env      # and fill it in\n#     docker login registry.gitlab.com   # with the deploy token you were sent\n#     docker compose up -d\n#\n# Four services: Postgres, the cms (the management app, and the API everything\n# else talks to), the render worker (text, thumbnails and PDFs of what is\n# uploaded) and the reader app. The cms and the reader app answer on two\n# hostnames, behind a reverse proxy that terminates TLS: your own, pointed at\n# the ports below, or Caddy from this file (`docker compose --profile proxy up\n# -d`, see `Caddyfile`).\n#\n# Every setting of the user guide's „Konfiguration\" \u002F „Configuration\" can go\n# into `.env`; the ones set below are fixed by this layout. The images are those of\n# the release in `DDM_VERSION`; the cms migrates the database when it starts.\nname: ddm\n\nx-app: &app\n  restart: unless-stopped\n  # Followed by Watchtower started with `--label-enable`, for an installation\n  # that updates itself (`DDM_VERSION=stable`). Not Postgres: a new major of it\n  # needs its data upgraded by hand.\n  labels:\n    com.centurylinklabs.watchtower.enable: \"true\"\n\nservices:\n  postgres:\n    # Postgres with the German dictionary DDM searches with — by its major,\n    # which only ever changes by hand.\n    image: ${DDM_REGISTRY:-registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images}\u002Fpostgres:18\n    restart: unless-stopped\n    environment:\n      POSTGRES_USER: ddm\n      POSTGRES_DB: ddm\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}\n    volumes:\n      - postgres:\u002Fvar\u002Flib\u002Fpostgresql\n    healthcheck:\n      test: [CMD, pg_isready, -U, ddm, -d, ddm]\n      interval: 5s\n      timeout: 5s\n      retries: 10\n\n  cms:\n    \u003C\u003C: *app\n    image: ${DDM_REGISTRY:-registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images}\u002Fcms:${DDM_VERSION:-latest}\n    env_file: .env\n    environment:\n      # Which version of these files this is: a release that needs newer ones\n      # says so to the administrators, rather than failing (user guide, „Updates\").\n      DDM_DEPLOY_VERSION: \"1\"\n      DATABASE_URL: postgres:\u002F\u002Fddm:${POSTGRES_PASSWORD}@postgres:5432\u002Fddm\n      BETTER_AUTH_URL: https:\u002F\u002F${DDM_CMS_HOST:?set DDM_CMS_HOST in .env}\n      CLIENT_ORIGIN: https:\u002F\u002F${DDM_APP_HOST:?set DDM_APP_HOST in .env}\n      # The documents, and the database's dumps taken before each migration\n      # (the last three) — unless `S3_ENDPOINT` names a bucket for both.\n      STORAGE_DIR: \u002Fdata\u002Fstorage\n      BACKUP_DIR: \u002Fdata\u002Fbackups\n      # Uploads are stored here and drawn by the render worker.\n      RENDER_MODE: worker\n      MAX_UPLOAD_BYTES: ${MAX_UPLOAD_BYTES:-1073741824}\n    volumes:\n      - data:\u002Fdata\n    ports:\n      - ${DDM_CMS_PORT:-127.0.0.1:3000}:3000\n    depends_on:\n      postgres:\n        condition: service_healthy\n    healthcheck:\n      test: [CMD, bun, -e, \"process.exit((await fetch('http:\u002F\u002F127.0.0.1:3000\u002Fapi\u002Fauth\u002Fok')).ok ? 0 : 1)\"]\n      interval: 10s\n      timeout: 5s\n      retries: 6\n      # Migrations first, on a new release.\n      start_period: 5m\n      start_interval: 2s\n\n  render-worker:\n    \u003C\u003C: *app\n    image: ${DDM_REGISTRY:-registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images}\u002Frender-worker:${DDM_VERSION:-latest}\n    environment:\n      DATABASE_URL: postgres:\u002F\u002Fddm:${POSTGRES_PASSWORD}@postgres:5432\u002Fddm\n      STORAGE_DRIVER: ${STORAGE_DRIVER:-}\n      STORAGE_DIR: \u002Fdata\u002Fstorage\n      S3_ENDPOINT: ${S3_ENDPOINT:-}\n      S3_BUCKET: ${S3_BUCKET:-}\n      S3_REGION: ${S3_REGION:-}\n      S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-}\n      S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-}\n      S3_FORCE_PATH_STYLE: ${S3_FORCE_PATH_STYLE:-true}\n      THUMBNAILS: ${THUMBNAILS:-on}\n      RENDER_LARGE_OFFICE: ${RENDER_LARGE_OFFICE:-on}\n    volumes:\n      - data:\u002Fdata\n    # After the cms has migrated the database to this release.\n    depends_on:\n      cms:\n        condition: service_healthy\n    # It finishes the documents in hand before it stops — LibreOffice may take\n    # minutes over a large deck.\n    stop_grace_period: 11m\n\n  client:\n    \u003C\u003C: *app\n    image: ${DDM_REGISTRY:-registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images}\u002Fclient:${DDM_VERSION:-latest}\n    environment:\n      NUXT_API_ORIGIN: http:\u002F\u002Fcms:3000\n      NUXT_PUBLIC_MGMT_URL: https:\u002F\u002F${DDM_CMS_HOST}\n      # The reader app on this installation, for the mobile app's „Server\".\n      NUXT_PUBLIC_SERVER_URL: https:\u002F\u002F${DDM_APP_HOST}\n      RENDER_MODE: worker\n      THUMBNAILS: ${THUMBNAILS:-on}\n      NUXT_PUBLIC_SSO_PROVIDERS: ${NUXT_PUBLIC_SSO_PROVIDERS:-}\n    ports:\n      - ${DDM_APP_PORT:-127.0.0.1:3001}:3000\n    depends_on:\n      cms:\n        condition: service_healthy\n    # Through to the cms: what the reader app forwards answers, too.\n    healthcheck:\n      test: [CMD, bun, -e, \"process.exit((await fetch('http:\u002F\u002F127.0.0.1:3000\u002Fapi\u002Fauth\u002Fok')).ok ? 0 : 1)\"]\n      interval: 10s\n      timeout: 5s\n      retries: 6\n      start_period: 1m\n      start_interval: 2s\n\n  # TLS and both hostnames, with certificates from Let's Encrypt: only with\n  # `--profile proxy`, for a server with nothing else on ports 80 and 443.\n  caddy:\n    image: caddy:2.10-alpine\n    profiles: [proxy]\n    restart: unless-stopped\n    environment:\n      DDM_CMS_HOST: ${DDM_CMS_HOST}\n      DDM_APP_HOST: ${DDM_APP_HOST}\n    ports:\n      - 80:80\n      - 443:443\n      - 443:443\u002Fudp\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - caddy:\u002Fdata\n    depends_on: [cms, client]\n\nvolumes:\n  postgres:\n  data:\n  caddy:\n","yaml",[452,537,538,544,550,556,562,568,574,579,585,591,597,603,609,615,620,626,632,638,651,658,673,684,690,696,702,711,728,733,741,749,755,761,772,782,790,800,810,821,829,838,846,888,899,909,921,926,934,945,955,966,973,979,985,1000,1011,1022,1033,1039,1045,1056,1067,1073,1084,1095,1102,1110,1118,1126,1134,1142,1153,1160,1193,1203,1212,1222,1228,1239,1250,1255,1263,1272,1282,1289,1298,1309,1318,1329,1340,1351,1362,1373,1384,1395,1406,1413,1420,1426,1433,1441,1450,1456,1462,1473,1478,1486,1495,1505,1512,1523,1534,1540,1551,1560,1569,1580,1587,1595,1602,1609,1618,1624,1631,1660,1669,1678,1687,1697,1706,1711,1717,1723,1731,1741,1756,1765,1772,1783,1794,1801,1809,1817,1825,1832,1840,1848,1867,1872,1880,1887,1895],{"__ignoreMap":450},[455,539,540],{"class":457,"line":458},[455,541,543],{"class":542},"sHwdD","# DDM on one server, with Docker Compose — as the user guide describes it\n",[455,545,547],{"class":457,"line":546},2,[455,548,549],{"class":542},"# („Selbst betreiben\" \u002F „Self-hosting\").\n",[455,551,553],{"class":457,"line":552},3,[455,554,555],{"class":542},"#\n",[455,557,559],{"class":457,"line":558},4,[455,560,561],{"class":542},"#     cp .env.example .env      # and fill it in\n",[455,563,565],{"class":457,"line":564},5,[455,566,567],{"class":542},"#     docker login registry.gitlab.com   # with the deploy token you were sent\n",[455,569,571],{"class":457,"line":570},6,[455,572,573],{"class":542},"#     docker compose up -d\n",[455,575,577],{"class":457,"line":576},7,[455,578,555],{"class":542},[455,580,582],{"class":457,"line":581},8,[455,583,584],{"class":542},"# Four services: Postgres, the cms (the management app, and the API everything\n",[455,586,588],{"class":457,"line":587},9,[455,589,590],{"class":542},"# else talks to), the render worker (text, thumbnails and PDFs of what is\n",[455,592,594],{"class":457,"line":593},10,[455,595,596],{"class":542},"# uploaded) and the reader app. The cms and the reader app answer on two\n",[455,598,600],{"class":457,"line":599},11,[455,601,602],{"class":542},"# hostnames, behind a reverse proxy that terminates TLS: your own, pointed at\n",[455,604,606],{"class":457,"line":605},12,[455,607,608],{"class":542},"# the ports below, or Caddy from this file (`docker compose --profile proxy up\n",[455,610,612],{"class":457,"line":611},13,[455,613,614],{"class":542},"# -d`, see `Caddyfile`).\n",[455,616,618],{"class":457,"line":617},14,[455,619,555],{"class":542},[455,621,623],{"class":457,"line":622},15,[455,624,625],{"class":542},"# Every setting of the user guide's „Konfiguration\" \u002F „Configuration\" can go\n",[455,627,629],{"class":457,"line":628},16,[455,630,631],{"class":542},"# into `.env`; the ones set below are fixed by this layout. The images are those of\n",[455,633,635],{"class":457,"line":634},17,[455,636,637],{"class":542},"# the release in `DDM_VERSION`; the cms migrates the database when it starts.\n",[455,639,641,645,648],{"class":457,"line":640},18,[455,642,644],{"class":643},"swJcz","name",[455,646,647],{"class":475},":",[455,649,650],{"class":465}," ddm\n",[455,652,654],{"class":457,"line":653},19,[455,655,657],{"emptyLinePlaceholder":656},true,"\n",[455,659,661,664,666,670],{"class":457,"line":660},20,[455,662,663],{"class":643},"x-app",[455,665,647],{"class":475},[455,667,669],{"class":668},"s7zQu"," &",[455,671,672],{"class":461},"app\n",[455,674,676,679,681],{"class":457,"line":675},21,[455,677,678],{"class":643},"  restart",[455,680,647],{"class":475},[455,682,683],{"class":465}," unless-stopped\n",[455,685,687],{"class":457,"line":686},22,[455,688,689],{"class":542},"  # Followed by Watchtower started with `--label-enable`, for an installation\n",[455,691,693],{"class":457,"line":692},23,[455,694,695],{"class":542},"  # that updates itself (`DDM_VERSION=stable`). Not Postgres: a new major of it\n",[455,697,699],{"class":457,"line":698},24,[455,700,701],{"class":542},"  # needs its data upgraded by hand.\n",[455,703,705,708],{"class":457,"line":704},25,[455,706,707],{"class":643},"  labels",[455,709,710],{"class":475},":\n",[455,712,714,717,719,722,725],{"class":457,"line":713},26,[455,715,716],{"class":643},"    com.centurylinklabs.watchtower.enable",[455,718,647],{"class":475},[455,720,721],{"class":475}," \"",[455,723,724],{"class":465},"true",[455,726,727],{"class":475},"\"\n",[455,729,731],{"class":457,"line":730},27,[455,732,657],{"emptyLinePlaceholder":656},[455,734,736,739],{"class":457,"line":735},28,[455,737,738],{"class":643},"services",[455,740,710],{"class":475},[455,742,744,747],{"class":457,"line":743},29,[455,745,746],{"class":643},"  postgres",[455,748,710],{"class":475},[455,750,752],{"class":457,"line":751},30,[455,753,754],{"class":542},"    # Postgres with the German dictionary DDM searches with — by its major,\n",[455,756,758],{"class":457,"line":757},31,[455,759,760],{"class":542},"    # which only ever changes by hand.\n",[455,762,764,767,769],{"class":457,"line":763},32,[455,765,766],{"class":643},"    image",[455,768,647],{"class":475},[455,770,771],{"class":465}," ${DDM_REGISTRY:-registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images}\u002Fpostgres:18\n",[455,773,775,778,780],{"class":457,"line":774},33,[455,776,777],{"class":643},"    restart",[455,779,647],{"class":475},[455,781,683],{"class":465},[455,783,785,788],{"class":457,"line":784},34,[455,786,787],{"class":643},"    environment",[455,789,710],{"class":475},[455,791,793,796,798],{"class":457,"line":792},35,[455,794,795],{"class":643},"      POSTGRES_USER",[455,797,647],{"class":475},[455,799,650],{"class":465},[455,801,803,806,808],{"class":457,"line":802},36,[455,804,805],{"class":643},"      POSTGRES_DB",[455,807,647],{"class":475},[455,809,650],{"class":465},[455,811,813,816,818],{"class":457,"line":812},37,[455,814,815],{"class":643},"      POSTGRES_PASSWORD",[455,817,647],{"class":475},[455,819,820],{"class":465}," ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}\n",[455,822,824,827],{"class":457,"line":823},38,[455,825,826],{"class":643},"    volumes",[455,828,710],{"class":475},[455,830,832,835],{"class":457,"line":831},39,[455,833,834],{"class":475},"      -",[455,836,837],{"class":465}," postgres:\u002Fvar\u002Flib\u002Fpostgresql\n",[455,839,841,844],{"class":457,"line":840},40,[455,842,843],{"class":643},"    healthcheck",[455,845,710],{"class":475},[455,847,849,852,854,857,860,863,866,868,871,873,876,878,881,883,885],{"class":457,"line":848},41,[455,850,851],{"class":643},"      test",[455,853,647],{"class":475},[455,855,856],{"class":475}," [",[455,858,859],{"class":465},"CMD",[455,861,862],{"class":475},",",[455,864,865],{"class":465}," pg_isready",[455,867,862],{"class":475},[455,869,870],{"class":465}," -U",[455,872,862],{"class":475},[455,874,875],{"class":465}," ddm",[455,877,862],{"class":475},[455,879,880],{"class":465}," -d",[455,882,862],{"class":475},[455,884,875],{"class":465},[455,886,887],{"class":475},"]\n",[455,889,891,894,896],{"class":457,"line":890},42,[455,892,893],{"class":643},"      interval",[455,895,647],{"class":475},[455,897,898],{"class":465}," 5s\n",[455,900,902,905,907],{"class":457,"line":901},43,[455,903,904],{"class":643},"      timeout",[455,906,647],{"class":475},[455,908,898],{"class":465},[455,910,912,915,917],{"class":457,"line":911},44,[455,913,914],{"class":643},"      retries",[455,916,647],{"class":475},[455,918,920],{"class":919},"sbssI"," 10\n",[455,922,924],{"class":457,"line":923},45,[455,925,657],{"emptyLinePlaceholder":656},[455,927,929,932],{"class":457,"line":928},46,[455,930,931],{"class":643},"  cms",[455,933,710],{"class":475},[455,935,937,940,943],{"class":457,"line":936},47,[455,938,939],{"class":475},"    \u003C\u003C:",[455,941,942],{"class":668}," *",[455,944,672],{"class":488},[455,946,948,950,952],{"class":457,"line":947},48,[455,949,766],{"class":643},[455,951,647],{"class":475},[455,953,954],{"class":465}," ${DDM_REGISTRY:-registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images}\u002Fcms:${DDM_VERSION:-latest}\n",[455,956,958,961,963],{"class":457,"line":957},49,[455,959,960],{"class":643},"    env_file",[455,962,647],{"class":475},[455,964,965],{"class":465}," .env\n",[455,967,969,971],{"class":457,"line":968},50,[455,970,787],{"class":643},[455,972,710],{"class":475},[455,974,976],{"class":457,"line":975},51,[455,977,978],{"class":542},"      # Which version of these files this is: a release that needs newer ones\n",[455,980,982],{"class":457,"line":981},52,[455,983,984],{"class":542},"      # says so to the administrators, rather than failing (user guide, „Updates\").\n",[455,986,988,991,993,995,998],{"class":457,"line":987},53,[455,989,990],{"class":643},"      DDM_DEPLOY_VERSION",[455,992,647],{"class":475},[455,994,721],{"class":475},[455,996,997],{"class":465},"1",[455,999,727],{"class":475},[455,1001,1003,1006,1008],{"class":457,"line":1002},54,[455,1004,1005],{"class":643},"      DATABASE_URL",[455,1007,647],{"class":475},[455,1009,1010],{"class":465}," postgres:\u002F\u002Fddm:${POSTGRES_PASSWORD}@postgres:5432\u002Fddm\n",[455,1012,1014,1017,1019],{"class":457,"line":1013},55,[455,1015,1016],{"class":643},"      BETTER_AUTH_URL",[455,1018,647],{"class":475},[455,1020,1021],{"class":465}," https:\u002F\u002F${DDM_CMS_HOST:?set DDM_CMS_HOST in .env}\n",[455,1023,1025,1028,1030],{"class":457,"line":1024},56,[455,1026,1027],{"class":643},"      CLIENT_ORIGIN",[455,1029,647],{"class":475},[455,1031,1032],{"class":465}," https:\u002F\u002F${DDM_APP_HOST:?set DDM_APP_HOST in .env}\n",[455,1034,1036],{"class":457,"line":1035},57,[455,1037,1038],{"class":542},"      # The documents, and the database's dumps taken before each migration\n",[455,1040,1042],{"class":457,"line":1041},58,[455,1043,1044],{"class":542},"      # (the last three) — unless `S3_ENDPOINT` names a bucket for both.\n",[455,1046,1048,1051,1053],{"class":457,"line":1047},59,[455,1049,1050],{"class":643},"      STORAGE_DIR",[455,1052,647],{"class":475},[455,1054,1055],{"class":465}," \u002Fdata\u002Fstorage\n",[455,1057,1059,1062,1064],{"class":457,"line":1058},60,[455,1060,1061],{"class":643},"      BACKUP_DIR",[455,1063,647],{"class":475},[455,1065,1066],{"class":465}," \u002Fdata\u002Fbackups\n",[455,1068,1070],{"class":457,"line":1069},61,[455,1071,1072],{"class":542},"      # Uploads are stored here and drawn by the render worker.\n",[455,1074,1076,1079,1081],{"class":457,"line":1075},62,[455,1077,1078],{"class":643},"      RENDER_MODE",[455,1080,647],{"class":475},[455,1082,1083],{"class":465}," worker\n",[455,1085,1087,1090,1092],{"class":457,"line":1086},63,[455,1088,1089],{"class":643},"      MAX_UPLOAD_BYTES",[455,1091,647],{"class":475},[455,1093,1094],{"class":465}," ${MAX_UPLOAD_BYTES:-1073741824}\n",[455,1096,1098,1100],{"class":457,"line":1097},64,[455,1099,826],{"class":643},[455,1101,710],{"class":475},[455,1103,1105,1107],{"class":457,"line":1104},65,[455,1106,834],{"class":475},[455,1108,1109],{"class":465}," data:\u002Fdata\n",[455,1111,1113,1116],{"class":457,"line":1112},66,[455,1114,1115],{"class":643},"    ports",[455,1117,710],{"class":475},[455,1119,1121,1123],{"class":457,"line":1120},67,[455,1122,834],{"class":475},[455,1124,1125],{"class":465}," ${DDM_CMS_PORT:-127.0.0.1:3000}:3000\n",[455,1127,1129,1132],{"class":457,"line":1128},68,[455,1130,1131],{"class":643},"    depends_on",[455,1133,710],{"class":475},[455,1135,1137,1140],{"class":457,"line":1136},69,[455,1138,1139],{"class":643},"      postgres",[455,1141,710],{"class":475},[455,1143,1145,1148,1150],{"class":457,"line":1144},70,[455,1146,1147],{"class":643},"        condition",[455,1149,647],{"class":475},[455,1151,1152],{"class":465}," service_healthy\n",[455,1154,1156,1158],{"class":457,"line":1155},71,[455,1157,843],{"class":643},[455,1159,710],{"class":475},[455,1161,1163,1165,1167,1169,1171,1173,1176,1178,1181,1183,1185,1188,1191],{"class":457,"line":1162},72,[455,1164,851],{"class":643},[455,1166,647],{"class":475},[455,1168,856],{"class":475},[455,1170,859],{"class":465},[455,1172,862],{"class":475},[455,1174,1175],{"class":465}," bun",[455,1177,862],{"class":475},[455,1179,1180],{"class":465}," -e",[455,1182,862],{"class":475},[455,1184,721],{"class":475},[455,1186,1187],{"class":465},"process.exit((await fetch('http:\u002F\u002F127.0.0.1:3000\u002Fapi\u002Fauth\u002Fok')).ok ? 0 : 1)",[455,1189,1190],{"class":475},"\"",[455,1192,887],{"class":475},[455,1194,1196,1198,1200],{"class":457,"line":1195},73,[455,1197,893],{"class":643},[455,1199,647],{"class":475},[455,1201,1202],{"class":465}," 10s\n",[455,1204,1206,1208,1210],{"class":457,"line":1205},74,[455,1207,904],{"class":643},[455,1209,647],{"class":475},[455,1211,898],{"class":465},[455,1213,1215,1217,1219],{"class":457,"line":1214},75,[455,1216,914],{"class":643},[455,1218,647],{"class":475},[455,1220,1221],{"class":919}," 6\n",[455,1223,1225],{"class":457,"line":1224},76,[455,1226,1227],{"class":542},"      # Migrations first, on a new release.\n",[455,1229,1231,1234,1236],{"class":457,"line":1230},77,[455,1232,1233],{"class":643},"      start_period",[455,1235,647],{"class":475},[455,1237,1238],{"class":465}," 5m\n",[455,1240,1242,1245,1247],{"class":457,"line":1241},78,[455,1243,1244],{"class":643},"      start_interval",[455,1246,647],{"class":475},[455,1248,1249],{"class":465}," 2s\n",[455,1251,1253],{"class":457,"line":1252},79,[455,1254,657],{"emptyLinePlaceholder":656},[455,1256,1258,1261],{"class":457,"line":1257},80,[455,1259,1260],{"class":643},"  render-worker",[455,1262,710],{"class":475},[455,1264,1266,1268,1270],{"class":457,"line":1265},81,[455,1267,939],{"class":475},[455,1269,942],{"class":668},[455,1271,672],{"class":488},[455,1273,1275,1277,1279],{"class":457,"line":1274},82,[455,1276,766],{"class":643},[455,1278,647],{"class":475},[455,1280,1281],{"class":465}," ${DDM_REGISTRY:-registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images}\u002Frender-worker:${DDM_VERSION:-latest}\n",[455,1283,1285,1287],{"class":457,"line":1284},83,[455,1286,787],{"class":643},[455,1288,710],{"class":475},[455,1290,1292,1294,1296],{"class":457,"line":1291},84,[455,1293,1005],{"class":643},[455,1295,647],{"class":475},[455,1297,1010],{"class":465},[455,1299,1301,1304,1306],{"class":457,"line":1300},85,[455,1302,1303],{"class":643},"      STORAGE_DRIVER",[455,1305,647],{"class":475},[455,1307,1308],{"class":465}," ${STORAGE_DRIVER:-}\n",[455,1310,1312,1314,1316],{"class":457,"line":1311},86,[455,1313,1050],{"class":643},[455,1315,647],{"class":475},[455,1317,1055],{"class":465},[455,1319,1321,1324,1326],{"class":457,"line":1320},87,[455,1322,1323],{"class":643},"      S3_ENDPOINT",[455,1325,647],{"class":475},[455,1327,1328],{"class":465}," ${S3_ENDPOINT:-}\n",[455,1330,1332,1335,1337],{"class":457,"line":1331},88,[455,1333,1334],{"class":643},"      S3_BUCKET",[455,1336,647],{"class":475},[455,1338,1339],{"class":465}," ${S3_BUCKET:-}\n",[455,1341,1343,1346,1348],{"class":457,"line":1342},89,[455,1344,1345],{"class":643},"      S3_REGION",[455,1347,647],{"class":475},[455,1349,1350],{"class":465}," ${S3_REGION:-}\n",[455,1352,1354,1357,1359],{"class":457,"line":1353},90,[455,1355,1356],{"class":643},"      S3_ACCESS_KEY_ID",[455,1358,647],{"class":475},[455,1360,1361],{"class":465}," ${S3_ACCESS_KEY_ID:-}\n",[455,1363,1365,1368,1370],{"class":457,"line":1364},91,[455,1366,1367],{"class":643},"      S3_SECRET_ACCESS_KEY",[455,1369,647],{"class":475},[455,1371,1372],{"class":465}," ${S3_SECRET_ACCESS_KEY:-}\n",[455,1374,1376,1379,1381],{"class":457,"line":1375},92,[455,1377,1378],{"class":643},"      S3_FORCE_PATH_STYLE",[455,1380,647],{"class":475},[455,1382,1383],{"class":465}," ${S3_FORCE_PATH_STYLE:-true}\n",[455,1385,1387,1390,1392],{"class":457,"line":1386},93,[455,1388,1389],{"class":643},"      THUMBNAILS",[455,1391,647],{"class":475},[455,1393,1394],{"class":465}," ${THUMBNAILS:-on}\n",[455,1396,1398,1401,1403],{"class":457,"line":1397},94,[455,1399,1400],{"class":643},"      RENDER_LARGE_OFFICE",[455,1402,647],{"class":475},[455,1404,1405],{"class":465}," ${RENDER_LARGE_OFFICE:-on}\n",[455,1407,1409,1411],{"class":457,"line":1408},95,[455,1410,826],{"class":643},[455,1412,710],{"class":475},[455,1414,1416,1418],{"class":457,"line":1415},96,[455,1417,834],{"class":475},[455,1419,1109],{"class":465},[455,1421,1423],{"class":457,"line":1422},97,[455,1424,1425],{"class":542},"    # After the cms has migrated the database to this release.\n",[455,1427,1429,1431],{"class":457,"line":1428},98,[455,1430,1131],{"class":643},[455,1432,710],{"class":475},[455,1434,1436,1439],{"class":457,"line":1435},99,[455,1437,1438],{"class":643},"      cms",[455,1440,710],{"class":475},[455,1442,1444,1446,1448],{"class":457,"line":1443},100,[455,1445,1147],{"class":643},[455,1447,647],{"class":475},[455,1449,1152],{"class":465},[455,1451,1453],{"class":457,"line":1452},101,[455,1454,1455],{"class":542},"    # It finishes the documents in hand before it stops — LibreOffice may take\n",[455,1457,1459],{"class":457,"line":1458},102,[455,1460,1461],{"class":542},"    # minutes over a large deck.\n",[455,1463,1465,1468,1470],{"class":457,"line":1464},103,[455,1466,1467],{"class":643},"    stop_grace_period",[455,1469,647],{"class":475},[455,1471,1472],{"class":465}," 11m\n",[455,1474,1476],{"class":457,"line":1475},104,[455,1477,657],{"emptyLinePlaceholder":656},[455,1479,1481,1484],{"class":457,"line":1480},105,[455,1482,1483],{"class":643},"  client",[455,1485,710],{"class":475},[455,1487,1489,1491,1493],{"class":457,"line":1488},106,[455,1490,939],{"class":475},[455,1492,942],{"class":668},[455,1494,672],{"class":488},[455,1496,1498,1500,1502],{"class":457,"line":1497},107,[455,1499,766],{"class":643},[455,1501,647],{"class":475},[455,1503,1504],{"class":465}," ${DDM_REGISTRY:-registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images}\u002Fclient:${DDM_VERSION:-latest}\n",[455,1506,1508,1510],{"class":457,"line":1507},108,[455,1509,787],{"class":643},[455,1511,710],{"class":475},[455,1513,1515,1518,1520],{"class":457,"line":1514},109,[455,1516,1517],{"class":643},"      NUXT_API_ORIGIN",[455,1519,647],{"class":475},[455,1521,1522],{"class":465}," http:\u002F\u002Fcms:3000\n",[455,1524,1526,1529,1531],{"class":457,"line":1525},110,[455,1527,1528],{"class":643},"      NUXT_PUBLIC_MGMT_URL",[455,1530,647],{"class":475},[455,1532,1533],{"class":465}," https:\u002F\u002F${DDM_CMS_HOST}\n",[455,1535,1537],{"class":457,"line":1536},111,[455,1538,1539],{"class":542},"      # The reader app on this installation, for the mobile app's „Server\".\n",[455,1541,1543,1546,1548],{"class":457,"line":1542},112,[455,1544,1545],{"class":643},"      NUXT_PUBLIC_SERVER_URL",[455,1547,647],{"class":475},[455,1549,1550],{"class":465}," https:\u002F\u002F${DDM_APP_HOST}\n",[455,1552,1554,1556,1558],{"class":457,"line":1553},113,[455,1555,1078],{"class":643},[455,1557,647],{"class":475},[455,1559,1083],{"class":465},[455,1561,1563,1565,1567],{"class":457,"line":1562},114,[455,1564,1389],{"class":643},[455,1566,647],{"class":475},[455,1568,1394],{"class":465},[455,1570,1572,1575,1577],{"class":457,"line":1571},115,[455,1573,1574],{"class":643},"      NUXT_PUBLIC_SSO_PROVIDERS",[455,1576,647],{"class":475},[455,1578,1579],{"class":465}," ${NUXT_PUBLIC_SSO_PROVIDERS:-}\n",[455,1581,1583,1585],{"class":457,"line":1582},116,[455,1584,1115],{"class":643},[455,1586,710],{"class":475},[455,1588,1590,1592],{"class":457,"line":1589},117,[455,1591,834],{"class":475},[455,1593,1594],{"class":465}," ${DDM_APP_PORT:-127.0.0.1:3001}:3000\n",[455,1596,1598,1600],{"class":457,"line":1597},118,[455,1599,1131],{"class":643},[455,1601,710],{"class":475},[455,1603,1605,1607],{"class":457,"line":1604},119,[455,1606,1438],{"class":643},[455,1608,710],{"class":475},[455,1610,1612,1614,1616],{"class":457,"line":1611},120,[455,1613,1147],{"class":643},[455,1615,647],{"class":475},[455,1617,1152],{"class":465},[455,1619,1621],{"class":457,"line":1620},121,[455,1622,1623],{"class":542},"    # Through to the cms: what the reader app forwards answers, too.\n",[455,1625,1627,1629],{"class":457,"line":1626},122,[455,1628,843],{"class":643},[455,1630,710],{"class":475},[455,1632,1634,1636,1638,1640,1642,1644,1646,1648,1650,1652,1654,1656,1658],{"class":457,"line":1633},123,[455,1635,851],{"class":643},[455,1637,647],{"class":475},[455,1639,856],{"class":475},[455,1641,859],{"class":465},[455,1643,862],{"class":475},[455,1645,1175],{"class":465},[455,1647,862],{"class":475},[455,1649,1180],{"class":465},[455,1651,862],{"class":475},[455,1653,721],{"class":475},[455,1655,1187],{"class":465},[455,1657,1190],{"class":475},[455,1659,887],{"class":475},[455,1661,1663,1665,1667],{"class":457,"line":1662},124,[455,1664,893],{"class":643},[455,1666,647],{"class":475},[455,1668,1202],{"class":465},[455,1670,1672,1674,1676],{"class":457,"line":1671},125,[455,1673,904],{"class":643},[455,1675,647],{"class":475},[455,1677,898],{"class":465},[455,1679,1681,1683,1685],{"class":457,"line":1680},126,[455,1682,914],{"class":643},[455,1684,647],{"class":475},[455,1686,1221],{"class":919},[455,1688,1690,1692,1694],{"class":457,"line":1689},127,[455,1691,1233],{"class":643},[455,1693,647],{"class":475},[455,1695,1696],{"class":465}," 1m\n",[455,1698,1700,1702,1704],{"class":457,"line":1699},128,[455,1701,1244],{"class":643},[455,1703,647],{"class":475},[455,1705,1249],{"class":465},[455,1707,1709],{"class":457,"line":1708},129,[455,1710,657],{"emptyLinePlaceholder":656},[455,1712,1714],{"class":457,"line":1713},130,[455,1715,1716],{"class":542},"  # TLS and both hostnames, with certificates from Let's Encrypt: only with\n",[455,1718,1720],{"class":457,"line":1719},131,[455,1721,1722],{"class":542},"  # `--profile proxy`, for a server with nothing else on ports 80 and 443.\n",[455,1724,1726,1729],{"class":457,"line":1725},132,[455,1727,1728],{"class":643},"  caddy",[455,1730,710],{"class":475},[455,1732,1734,1736,1738],{"class":457,"line":1733},133,[455,1735,766],{"class":643},[455,1737,647],{"class":475},[455,1739,1740],{"class":465}," caddy:2.10-alpine\n",[455,1742,1744,1747,1749,1751,1754],{"class":457,"line":1743},134,[455,1745,1746],{"class":643},"    profiles",[455,1748,647],{"class":475},[455,1750,856],{"class":475},[455,1752,1753],{"class":465},"proxy",[455,1755,887],{"class":475},[455,1757,1759,1761,1763],{"class":457,"line":1758},135,[455,1760,777],{"class":643},[455,1762,647],{"class":475},[455,1764,683],{"class":465},[455,1766,1768,1770],{"class":457,"line":1767},136,[455,1769,787],{"class":643},[455,1771,710],{"class":475},[455,1773,1775,1778,1780],{"class":457,"line":1774},137,[455,1776,1777],{"class":643},"      DDM_CMS_HOST",[455,1779,647],{"class":475},[455,1781,1782],{"class":465}," ${DDM_CMS_HOST}\n",[455,1784,1786,1789,1791],{"class":457,"line":1785},138,[455,1787,1788],{"class":643},"      DDM_APP_HOST",[455,1790,647],{"class":475},[455,1792,1793],{"class":465}," ${DDM_APP_HOST}\n",[455,1795,1797,1799],{"class":457,"line":1796},139,[455,1798,1115],{"class":643},[455,1800,710],{"class":475},[455,1802,1804,1806],{"class":457,"line":1803},140,[455,1805,834],{"class":475},[455,1807,1808],{"class":465}," 80:80\n",[455,1810,1812,1814],{"class":457,"line":1811},141,[455,1813,834],{"class":475},[455,1815,1816],{"class":465}," 443:443\n",[455,1818,1820,1822],{"class":457,"line":1819},142,[455,1821,834],{"class":475},[455,1823,1824],{"class":465}," 443:443\u002Fudp\n",[455,1826,1828,1830],{"class":457,"line":1827},143,[455,1829,826],{"class":643},[455,1831,710],{"class":475},[455,1833,1835,1837],{"class":457,"line":1834},144,[455,1836,834],{"class":475},[455,1838,1839],{"class":465}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[455,1841,1843,1845],{"class":457,"line":1842},145,[455,1844,834],{"class":475},[455,1846,1847],{"class":465}," caddy:\u002Fdata\n",[455,1849,1851,1853,1855,1857,1860,1862,1865],{"class":457,"line":1850},146,[455,1852,1131],{"class":643},[455,1854,647],{"class":475},[455,1856,856],{"class":475},[455,1858,1859],{"class":465},"cms",[455,1861,862],{"class":475},[455,1863,1864],{"class":465}," client",[455,1866,887],{"class":475},[455,1868,1870],{"class":457,"line":1869},147,[455,1871,657],{"emptyLinePlaceholder":656},[455,1873,1875,1878],{"class":457,"line":1874},148,[455,1876,1877],{"class":643},"volumes",[455,1879,710],{"class":475},[455,1881,1883,1885],{"class":457,"line":1882},149,[455,1884,746],{"class":643},[455,1886,710],{"class":475},[455,1888,1890,1893],{"class":457,"line":1889},150,[455,1891,1892],{"class":643},"  data",[455,1894,710],{"class":475},[455,1896,1898,1900],{"class":457,"line":1897},151,[455,1899,1728],{"class":643},[455,1901,710],{"class":475},[433,1903,1904,1908],{},[521,1905,1906],{},[452,1907,529],{}," – Ihre Einstellungen. Was Sie mindestens ausfüllen, steht im nächsten Schritt.",[445,1910,1912],{"className":447,"code":1911,"filename":529,"language":449,"meta":450,"style":450},"# An installation's settings, read by `compose.yaml` — copied to `.env` and\n# filled in. Every setting of the user guide's „Konfiguration\" \u002F\n# „Configuration\" may be added; these are the ones an installation needs, and\n# the ones most change.\n\n# The release to run, e.g. `0.26.0`, or `0.26` for its fixes as they come.\n# `stable` follows the releases we have promoted — for an installation that\n# updates itself (user guide, „Updates\").\nDDM_VERSION=latest\n# DDM_REGISTRY=registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\n\n# The two hostnames, each with its own certificate: the management app (and\n# API), and the reader app. DNS for both points at this server.\nDDM_CMS_HOST=cms.example.com\nDDM_APP_HOST=app.example.com\n# Their parent, so a sign-in on one counts on the other.\nAUTH_COOKIE_DOMAIN=example.com\n# …and a passkey in both apps.\nPASSKEY_RP_ID=example.com\n# Where the two apps answer on this server, for your own reverse proxy —\n# unused with `--profile proxy`.\n# DDM_CMS_PORT=127.0.0.1:3000\n# DDM_APP_PORT=127.0.0.1:3001\n\n# Secrets: `openssl rand -base64 32` for each. The database's password is\n# kept by Postgres on its first start; changing it here later locks the cms out.\nPOSTGRES_PASSWORD=\nBETTER_AUTH_SECRET=\n\n# The licence we sent you (`ddm1.…`) — needed from the first start: without\n# one, the installation is locked, and nobody can register its first account.\n# A licence entered later under Settings › Licence replaces it.\nLICENCE_KEY=\n\n# How mail leaves the installation — your own mail server.\nMAIL_DRIVER=smtp\nMAIL_FROM=ddm@example.com\nSMTP_HOST=mail.example.com\nSMTP_PORT=587\nSMTP_USER=\nSMTP_PASSWORD=\n# SMTP_ALLOW_SELF_SIGNED=true   # for an internal server with its own CA\n\n# The documents are kept on the `data` volume. To keep them in an\n# S3-compatible bucket instead (MinIO, Ceph, a cloud's), name it here; the\n# database's dumps then go to the same bucket.\n# S3_ENDPOINT=https:\u002F\u002Fs3.example.com\n# S3_BUCKET=ddm\n# S3_REGION=eu-central-1\n# S3_ACCESS_KEY_ID=\n# S3_SECRET_ACCESS_KEY=\n\n# Thumbnails and previews of uploaded documents: `off` leaves them out.\n# THUMBNAILS=on\n",[452,1913,1914,1919,1924,1929,1934,1938,1943,1948,1953,1964,1969,1973,1978,1983,1993,2003,2008,2018,2023,2032,2037,2042,2047,2052,2056,2061,2066,2074,2081,2085,2090,2095,2100,2107,2111,2116,2126,2136,2146,2156,2163,2170,2175,2179,2184,2189,2194,2199,2204,2209,2214,2219,2223,2228],{"__ignoreMap":450},[455,1915,1916],{"class":457,"line":458},[455,1917,1918],{"class":542},"# An installation's settings, read by `compose.yaml` — copied to `.env` and\n",[455,1920,1921],{"class":457,"line":546},[455,1922,1923],{"class":542},"# filled in. Every setting of the user guide's „Konfiguration\" \u002F\n",[455,1925,1926],{"class":457,"line":552},[455,1927,1928],{"class":542},"# „Configuration\" may be added; these are the ones an installation needs, and\n",[455,1930,1931],{"class":457,"line":558},[455,1932,1933],{"class":542},"# the ones most change.\n",[455,1935,1936],{"class":457,"line":564},[455,1937,657],{"emptyLinePlaceholder":656},[455,1939,1940],{"class":457,"line":570},[455,1941,1942],{"class":542},"# The release to run, e.g. `0.26.0`, or `0.26` for its fixes as they come.\n",[455,1944,1945],{"class":457,"line":576},[455,1946,1947],{"class":542},"# `stable` follows the releases we have promoted — for an installation that\n",[455,1949,1950],{"class":457,"line":581},[455,1951,1952],{"class":542},"# updates itself (user guide, „Updates\").\n",[455,1954,1955,1958,1961],{"class":457,"line":587},[455,1956,1957],{"class":488},"DDM_VERSION",[455,1959,1960],{"class":475},"=",[455,1962,1963],{"class":465},"latest\n",[455,1965,1966],{"class":457,"line":593},[455,1967,1968],{"class":542},"# DDM_REGISTRY=registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\n",[455,1970,1971],{"class":457,"line":599},[455,1972,657],{"emptyLinePlaceholder":656},[455,1974,1975],{"class":457,"line":605},[455,1976,1977],{"class":542},"# The two hostnames, each with its own certificate: the management app (and\n",[455,1979,1980],{"class":457,"line":611},[455,1981,1982],{"class":542},"# API), and the reader app. DNS for both points at this server.\n",[455,1984,1985,1988,1990],{"class":457,"line":617},[455,1986,1987],{"class":488},"DDM_CMS_HOST",[455,1989,1960],{"class":475},[455,1991,1992],{"class":465},"cms.example.com\n",[455,1994,1995,1998,2000],{"class":457,"line":622},[455,1996,1997],{"class":488},"DDM_APP_HOST",[455,1999,1960],{"class":475},[455,2001,2002],{"class":465},"app.example.com\n",[455,2004,2005],{"class":457,"line":628},[455,2006,2007],{"class":542},"# Their parent, so a sign-in on one counts on the other.\n",[455,2009,2010,2013,2015],{"class":457,"line":634},[455,2011,2012],{"class":488},"AUTH_COOKIE_DOMAIN",[455,2014,1960],{"class":475},[455,2016,2017],{"class":465},"example.com\n",[455,2019,2020],{"class":457,"line":640},[455,2021,2022],{"class":542},"# …and a passkey in both apps.\n",[455,2024,2025,2028,2030],{"class":457,"line":653},[455,2026,2027],{"class":488},"PASSKEY_RP_ID",[455,2029,1960],{"class":475},[455,2031,2017],{"class":465},[455,2033,2034],{"class":457,"line":660},[455,2035,2036],{"class":542},"# Where the two apps answer on this server, for your own reverse proxy —\n",[455,2038,2039],{"class":457,"line":675},[455,2040,2041],{"class":542},"# unused with `--profile proxy`.\n",[455,2043,2044],{"class":457,"line":686},[455,2045,2046],{"class":542},"# DDM_CMS_PORT=127.0.0.1:3000\n",[455,2048,2049],{"class":457,"line":692},[455,2050,2051],{"class":542},"# DDM_APP_PORT=127.0.0.1:3001\n",[455,2053,2054],{"class":457,"line":698},[455,2055,657],{"emptyLinePlaceholder":656},[455,2057,2058],{"class":457,"line":704},[455,2059,2060],{"class":542},"# Secrets: `openssl rand -base64 32` for each. The database's password is\n",[455,2062,2063],{"class":457,"line":713},[455,2064,2065],{"class":542},"# kept by Postgres on its first start; changing it here later locks the cms out.\n",[455,2067,2068,2071],{"class":457,"line":730},[455,2069,2070],{"class":488},"POSTGRES_PASSWORD",[455,2072,2073],{"class":475},"=\n",[455,2075,2076,2079],{"class":457,"line":735},[455,2077,2078],{"class":488},"BETTER_AUTH_SECRET",[455,2080,2073],{"class":475},[455,2082,2083],{"class":457,"line":743},[455,2084,657],{"emptyLinePlaceholder":656},[455,2086,2087],{"class":457,"line":751},[455,2088,2089],{"class":542},"# The licence we sent you (`ddm1.…`) — needed from the first start: without\n",[455,2091,2092],{"class":457,"line":757},[455,2093,2094],{"class":542},"# one, the installation is locked, and nobody can register its first account.\n",[455,2096,2097],{"class":457,"line":763},[455,2098,2099],{"class":542},"# A licence entered later under Settings › Licence replaces it.\n",[455,2101,2102,2105],{"class":457,"line":774},[455,2103,2104],{"class":488},"LICENCE_KEY",[455,2106,2073],{"class":475},[455,2108,2109],{"class":457,"line":784},[455,2110,657],{"emptyLinePlaceholder":656},[455,2112,2113],{"class":457,"line":792},[455,2114,2115],{"class":542},"# How mail leaves the installation — your own mail server.\n",[455,2117,2118,2121,2123],{"class":457,"line":802},[455,2119,2120],{"class":488},"MAIL_DRIVER",[455,2122,1960],{"class":475},[455,2124,2125],{"class":465},"smtp\n",[455,2127,2128,2131,2133],{"class":457,"line":812},[455,2129,2130],{"class":488},"MAIL_FROM",[455,2132,1960],{"class":475},[455,2134,2135],{"class":465},"ddm@example.com\n",[455,2137,2138,2141,2143],{"class":457,"line":823},[455,2139,2140],{"class":488},"SMTP_HOST",[455,2142,1960],{"class":475},[455,2144,2145],{"class":465},"mail.example.com\n",[455,2147,2148,2151,2153],{"class":457,"line":831},[455,2149,2150],{"class":488},"SMTP_PORT",[455,2152,1960],{"class":475},[455,2154,2155],{"class":465},"587\n",[455,2157,2158,2161],{"class":457,"line":840},[455,2159,2160],{"class":488},"SMTP_USER",[455,2162,2073],{"class":475},[455,2164,2165,2168],{"class":457,"line":848},[455,2166,2167],{"class":488},"SMTP_PASSWORD",[455,2169,2073],{"class":475},[455,2171,2172],{"class":457,"line":890},[455,2173,2174],{"class":542},"# SMTP_ALLOW_SELF_SIGNED=true   # for an internal server with its own CA\n",[455,2176,2177],{"class":457,"line":901},[455,2178,657],{"emptyLinePlaceholder":656},[455,2180,2181],{"class":457,"line":911},[455,2182,2183],{"class":542},"# The documents are kept on the `data` volume. To keep them in an\n",[455,2185,2186],{"class":457,"line":923},[455,2187,2188],{"class":542},"# S3-compatible bucket instead (MinIO, Ceph, a cloud's), name it here; the\n",[455,2190,2191],{"class":457,"line":928},[455,2192,2193],{"class":542},"# database's dumps then go to the same bucket.\n",[455,2195,2196],{"class":457,"line":936},[455,2197,2198],{"class":542},"# S3_ENDPOINT=https:\u002F\u002Fs3.example.com\n",[455,2200,2201],{"class":457,"line":947},[455,2202,2203],{"class":542},"# S3_BUCKET=ddm\n",[455,2205,2206],{"class":457,"line":957},[455,2207,2208],{"class":542},"# S3_REGION=eu-central-1\n",[455,2210,2211],{"class":457,"line":968},[455,2212,2213],{"class":542},"# S3_ACCESS_KEY_ID=\n",[455,2215,2216],{"class":457,"line":975},[455,2217,2218],{"class":542},"# S3_SECRET_ACCESS_KEY=\n",[455,2220,2221],{"class":457,"line":981},[455,2222,657],{"emptyLinePlaceholder":656},[455,2224,2225],{"class":457,"line":987},[455,2226,2227],{"class":542},"# Thumbnails and previews of uploaded documents: `off` leaves them out.\n",[455,2229,2230],{"class":457,"line":1002},[455,2231,2232],{"class":542},"# THUMBNAILS=on\n",[433,2234,2235,2240],{},[521,2236,2237],{},[452,2238,2239],{},"Caddyfile"," – nur für den mitgelieferten Reverse Proxy (Schritt 4).",[445,2242,2247],{"className":2243,"code":2245,"filename":2239,"language":2246,"meta":450},[2244],"language-text","# The reverse proxy of `compose.yaml`'s `proxy` profile: TLS for both\n# hostnames, with certificates Caddy fetches itself — the server has to be\n# reachable on ports 80 and 443 under both names. Caddy sets no limit on a\n# request's size, so uploads up to `MAX_UPLOAD_BYTES` pass; another proxy needs\n# it raised (nginx: `client_max_body_size 1g`).\n{$DDM_CMS_HOST} {\n    encode zstd gzip\n    reverse_proxy cms:3000\n}\n\n{$DDM_APP_HOST} {\n    encode zstd gzip\n    reverse_proxy client:3000\n}\n","text",[452,2248,2245],{"__ignoreMap":450},[437,2250,2252],{"id":2251},"_3-die-einstellungen-ausfüllen","3. Die Einstellungen ausfüllen",[433,2254,2255,2256,2258],{},"Tragen Sie in ",[452,2257,529],{}," mindestens ein:",[445,2260,2262],{"className":447,"code":2261,"language":449,"meta":450,"style":450},"DDM_VERSION=0.26          # die Version; 0.26 bekommt ihre Fehlerbehebungen\nDDM_CMS_HOST=cms.firma.de\nDDM_APP_HOST=app.firma.de\nAUTH_COOKIE_DOMAIN=firma.de\nPASSKEY_RP_ID=firma.de\n\nPOSTGRES_PASSWORD=...     # openssl rand -base64 32\nBETTER_AUTH_SECRET=...    # openssl rand -base64 32\n\nLICENCE_KEY=ddm1....      # die Lizenz von uns\n\nMAIL_DRIVER=smtp\nMAIL_FROM=ddm@firma.de\nSMTP_HOST=mail.firma.de\nSMTP_PORT=587\nSMTP_USER=...\nSMTP_PASSWORD=...\n",[452,2263,2264,2276,2285,2294,2303,2311,2315,2327,2338,2342,2354,2358,2366,2375,2384,2392,2401],{"__ignoreMap":450},[455,2265,2266,2268,2270,2273],{"class":457,"line":458},[455,2267,1957],{"class":488},[455,2269,1960],{"class":475},[455,2271,2272],{"class":465},"0.26",[455,2274,2275],{"class":542},"          # die Version; 0.26 bekommt ihre Fehlerbehebungen\n",[455,2277,2278,2280,2282],{"class":457,"line":546},[455,2279,1987],{"class":488},[455,2281,1960],{"class":475},[455,2283,2284],{"class":465},"cms.firma.de\n",[455,2286,2287,2289,2291],{"class":457,"line":552},[455,2288,1997],{"class":488},[455,2290,1960],{"class":475},[455,2292,2293],{"class":465},"app.firma.de\n",[455,2295,2296,2298,2300],{"class":457,"line":558},[455,2297,2012],{"class":488},[455,2299,1960],{"class":475},[455,2301,2302],{"class":465},"firma.de\n",[455,2304,2305,2307,2309],{"class":457,"line":564},[455,2306,2027],{"class":488},[455,2308,1960],{"class":475},[455,2310,2302],{"class":465},[455,2312,2313],{"class":457,"line":570},[455,2314,657],{"emptyLinePlaceholder":656},[455,2316,2317,2319,2321,2324],{"class":457,"line":576},[455,2318,2070],{"class":488},[455,2320,1960],{"class":475},[455,2322,2323],{"class":465},"...",[455,2325,2326],{"class":542},"     # openssl rand -base64 32\n",[455,2328,2329,2331,2333,2335],{"class":457,"line":581},[455,2330,2078],{"class":488},[455,2332,1960],{"class":475},[455,2334,2323],{"class":465},[455,2336,2337],{"class":542},"    # openssl rand -base64 32\n",[455,2339,2340],{"class":457,"line":587},[455,2341,657],{"emptyLinePlaceholder":656},[455,2343,2344,2346,2348,2351],{"class":457,"line":593},[455,2345,2104],{"class":488},[455,2347,1960],{"class":475},[455,2349,2350],{"class":465},"ddm1....",[455,2352,2353],{"class":542},"      # die Lizenz von uns\n",[455,2355,2356],{"class":457,"line":599},[455,2357,657],{"emptyLinePlaceholder":656},[455,2359,2360,2362,2364],{"class":457,"line":605},[455,2361,2120],{"class":488},[455,2363,1960],{"class":475},[455,2365,2125],{"class":465},[455,2367,2368,2370,2372],{"class":457,"line":611},[455,2369,2130],{"class":488},[455,2371,1960],{"class":475},[455,2373,2374],{"class":465},"ddm@firma.de\n",[455,2376,2377,2379,2381],{"class":457,"line":617},[455,2378,2140],{"class":488},[455,2380,1960],{"class":475},[455,2382,2383],{"class":465},"mail.firma.de\n",[455,2385,2386,2388,2390],{"class":457,"line":622},[455,2387,2150],{"class":488},[455,2389,1960],{"class":475},[455,2391,2155],{"class":465},[455,2393,2394,2396,2398],{"class":457,"line":628},[455,2395,2160],{"class":488},[455,2397,1960],{"class":475},[455,2399,2400],{"class":465},"...\n",[455,2402,2403,2405,2407],{"class":457,"line":634},[455,2404,2167],{"class":488},[455,2406,1960],{"class":475},[455,2408,2400],{"class":465},[2410,2411,2412,2421,2431],"ul",{},[2413,2414,2415,2420],"li",{},[521,2416,2417,2419],{},[452,2418,2104],{}," ist von Anfang an nötig."," Ohne Lizenz startet die Installation gesperrt, und niemand kann das erste Konto anlegen.",[2413,2422,2423,2427,2428,2430],{},[521,2424,2425],{},[452,2426,2070],{}," übernimmt Postgres beim ersten Start. Ändern Sie es danach nicht mehr in ",[452,2429,529],{}," – das CMS käme sonst nicht mehr an die Datenbank.",[2413,2432,2433,2437,2438,2442],{},[521,2434,2435],{},[452,2436,2012],{}," und ",[521,2439,2440],{},[452,2441,2027],{}," sind die gemeinsame Domain beider Hostnamen. So gelten eine Anmeldung und ein Passkey im CMS auch in der Leser-App.",[433,2444,2445,2446,530],{},"Alle weiteren Einstellungen stehen unter ",[2447,2448,396],"a",{"href":397},[437,2450,2452],{"id":2451},"_4-den-reverse-proxy-wählen","4. Den Reverse Proxy wählen",[433,2454,2455,2456,2437,2459,2462],{},"CMS und Leser-App antworten auf dem Server nur lokal, auf ",[452,2457,2458],{},"127.0.0.1:3000",[452,2460,2461],{},"127.0.0.1:3001",". Davor gehört ein Reverse Proxy, der TLS übernimmt:",[2410,2464,2465,2474],{},[2413,2466,2467,2470,2471,530],{},[521,2468,2469],{},"Der mitgelieferte Caddy",", wenn auf den Ports 80 und 443 sonst nichts läuft. Er holt die Zertifikate für beide Hostnamen selbst. Starten Sie dann mit ",[452,2472,2473],{},"--profile proxy",[2413,2475,2476,2479,2480,2482,2483,2485,2486,530],{},[521,2477,2478],{},"Ihr eigener Proxy"," (nginx, Traefik, ein Load Balancer). Leiten Sie ",[452,2481,1987],{}," auf Port 3000 und ",[452,2484,1997],{}," auf Port 3001. Erlauben Sie Anfragen bis 1 GB, sonst scheitern große Uploads – bei nginx mit ",[452,2487,2488],{},"client_max_body_size 1g;",[437,2490,2492],{"id":2491},"_5-starten","5. Starten",[445,2494,2496],{"className":447,"code":2495,"language":449,"meta":450,"style":450},"docker compose up -d                   # mit eigenem Proxy\ndocker compose --profile proxy up -d   # mit Caddy\n",[452,2497,2498,2513],{"__ignoreMap":450},[455,2499,2500,2502,2505,2508,2510],{"class":457,"line":458},[455,2501,462],{"class":461},[455,2503,2504],{"class":465}," compose",[455,2506,2507],{"class":465}," up",[455,2509,880],{"class":465},[455,2511,2512],{"class":542},"                   # mit eigenem Proxy\n",[455,2514,2515,2517,2519,2522,2525,2527,2529],{"class":457,"line":546},[455,2516,462],{"class":461},[455,2518,2504],{"class":465},[455,2520,2521],{"class":465}," --profile",[455,2523,2524],{"class":465}," proxy",[455,2526,2507],{"class":465},[455,2528,880],{"class":465},[455,2530,2531],{"class":542},"   # mit Caddy\n",[433,2533,2534,2535,2538,2539,530],{},"Beim ersten Start legt das CMS die Datenbank an. Das dauert eine Minute; ",[452,2536,2537],{},"docker compose ps"," zeigt die Dienste danach als ",[452,2540,2541],{},"healthy",[437,2543,2545],{"id":2544},"_6-das-erste-konto-anlegen","6. Das erste Konto anlegen",[433,2547,2548,2549,2437,2552,2555,2556,2558,2559,2562],{},"Öffnen Sie ",[452,2550,2551],{},"https:\u002F\u002Fcms.firma.de",[521,2553,2554],{},"registrieren Sie sich"," – mit Ihrem Namen, Ihrer Firma und Ihrer E-Mail-Adresse. Sie legen damit Ihre Organisation an und sind ihr Inhaber. Danach laden Sie Ihre Kollegen über ",[521,2557,68],{}," ein oder binden Ihr Verzeichnis unter ",[521,2560,2561],{},"Einstellungen › Verzeichnisdienste"," an.",[433,2564,2565],{},"Wie viele Organisationen Ihre Installation haben darf, steht in der Lizenz. Ist die Zahl erreicht, kann sich niemand mehr eine neue anlegen.",[437,2567,2569],{"id":2568},"die-daten","Die Daten",[2571,2572,2573,2586],"table",{},[2574,2575,2576],"thead",{},[2577,2578,2579,2583],"tr",{},[2580,2581,2582],"th",{},"Volume",[2580,2584,2585],{},"Inhalt",[2587,2588,2589,2600,2618],"tbody",{},[2577,2590,2591,2597],{},[2592,2593,2594],"td",{},[452,2595,2596],{},"ddm_postgres",[2592,2598,2599],{},"Die Datenbank.",[2577,2601,2602,2607],{},[2592,2603,2604],{},[452,2605,2606],{},"ddm_data",[2592,2608,2609,2610,2613,2614,2617],{},"Die Dokumente (",[452,2611,2612],{},"storage\u002F",") und die Sicherungen der Datenbank (",[452,2615,2616],{},"backups\u002F",").",[2577,2619,2620,2625],{},[2592,2621,2622],{},[452,2623,2624],{},"ddm_caddy",[2592,2626,2627],{},"Die Zertifikate des mitgelieferten Proxys.",[433,2629,2630,2631,2634,2635,2638],{},"Sollen die Dokumente in einem S3-Bucket liegen, tragen Sie ihn unter ",[452,2632,2633],{},"S3_ENDPOINT",", ",[452,2636,2637],{},"S3_BUCKET"," und den Schlüsseln ein. Die Sicherungen landen dann im selben Bucket.",[2640,2641,2642],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":450,"searchDepth":546,"depth":546,"links":2644},[2645,2646,2647,2648,2649,2650,2651],{"id":439,"depth":546,"text":440},{"id":509,"depth":546,"text":510},{"id":2251,"depth":546,"text":2252},{"id":2451,"depth":546,"text":2452},{"id":2491,"depth":546,"text":2492},{"id":2544,"depth":546,"text":2545},{"id":2568,"depth":546,"text":2569},"DDM auf einem Server einrichten, mit Docker Compose – vom Login in die Registry bis zum ersten Konto.","md",null,{},{"icon":106},{"title":387,"description":2652},"CVN8Q5o211-lmsVbRdCnovMPYdOiBoAlV1P2tdXzduU",[2660,2662],{"title":245,"path":384,"stem":385,"description":2661,"icon":14,"children":-1},"DDM auf Ihren eigenen Servern – was dazugehört, was Sie brauchen und wie es mit uns verbunden bleibt.",{"title":391,"path":392,"stem":393,"description":2663,"icon":394,"children":-1},"DDM in einem Kubernetes-Cluster – eine Datei mit allem, zwei mit Ihren Einstellungen und ein Secret für die Registry.",1793617730993]