[{"data":1,"prerenderedAt":5065},["ShallowReactive",2],{"navigation_docs_en":3,"-en-self-hosting-kubernetes":427,"-en-self-hosting-kubernetes-surround":5060},[4,31,117,188,238,271,310,369,378],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":30},"Getting started","i-hugeicons-rocket-01","\u002Fen\u002Fgetting-started","en\u002F01.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"What is DDM?","\u002Fen\u002Fgetting-started\u002Fwhat-is-ddm","en\u002F01.getting-started\u002F01.what-is-ddm","i-hugeicons-information-circle",{"title":16,"path":17,"stem":18,"icon":19},"Account and sign-in","\u002Fen\u002Fgetting-started\u002Fsign-in","en\u002F01.getting-started\u002F02.sign-in","i-hugeicons-key-01",{"title":21,"path":22,"stem":23,"icon":24},"AI in DDM","\u002Fen\u002Fgetting-started\u002Fai-in-ddm","en\u002F01.getting-started\u002F03.ai-in-ddm","i-hugeicons-ai-magic",{"title":26,"path":27,"stem":28,"icon":29},"System status","\u002Fen\u002Fgetting-started\u002Fsystem-status","en\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","\u002Fen\u002Fcms","en\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},"The CMS at a glance","\u002Fen\u002Fcms\u002Foverview","en\u002F02.cms\u002F01.overview","i-hugeicons-compass-01",{"title":43,"path":44,"stem":45,"icon":46},"Uploading documents","\u002Fen\u002Fcms\u002Fupload","en\u002F02.cms\u002F02.upload","i-hugeicons-upload-01",{"title":48,"path":49,"stem":50,"icon":51},"Categories","\u002Fen\u002Fcms\u002Fcategories","en\u002F02.cms\u002F03.categories","i-hugeicons-folder-tree",{"title":53,"path":54,"stem":55,"icon":56},"Editing documents","\u002Fen\u002Fcms\u002Fdocuments","en\u002F02.cms\u002F04.documents","i-hugeicons-file-edit",{"title":58,"path":59,"stem":60,"icon":61},"Searching and filtering","\u002Fen\u002Fcms\u002Fsearch-and-filters","en\u002F02.cms\u002F05.search-and-filters","i-hugeicons-search-01",{"title":63,"path":64,"stem":65,"icon":66},"Groups and permissions","\u002Fen\u002Fcms\u002Fgroups-and-permissions","en\u002F02.cms\u002F06.groups-and-permissions","i-hugeicons-user-multiple",{"title":68,"path":69,"stem":70,"icon":71},"Users","\u002Fen\u002Fcms\u002Fusers","en\u002F02.cms\u002F07.users","i-hugeicons-user-add-01",{"title":73,"path":74,"stem":75,"icon":76},"Approvals","\u002Fen\u002Fcms\u002Fapprovals","en\u002F02.cms\u002F08.approvals","i-hugeicons-checkmark-badge-01",{"title":78,"path":79,"stem":80,"icon":81},"Markets and translations","\u002Fen\u002Fcms\u002Fmarkets-and-translations","en\u002F02.cms\u002F09.markets-and-translations","i-hugeicons-globe-02",{"title":83,"path":84,"stem":85,"icon":86},"Note templates","\u002Fen\u002Fcms\u002Fnote-templates","en\u002F02.cms\u002F10.note-templates","i-hugeicons-layout-01",{"title":88,"path":89,"stem":90,"icon":91},"Usage and audit log","\u002Fen\u002Fcms\u002Fusage-and-audit","en\u002F02.cms\u002F11.usage-and-audit","i-hugeicons-chart-column",{"title":93,"path":94,"stem":95,"icon":96},"AI assistant","\u002Fen\u002Fcms\u002Fassistant","en\u002F02.cms\u002F12.assistant","i-hugeicons-sparkles",{"title":98,"path":99,"stem":100,"icon":101},"Settings","\u002Fen\u002Fcms\u002Fsettings","en\u002F02.cms\u002F13.settings","i-hugeicons-settings-02",{"title":103,"path":104,"stem":105,"icon":106},"Plans","\u002Fen\u002Fcms\u002Fplans","en\u002F02.cms\u002F14.plans","i-hugeicons-package",{"title":108,"path":109,"stem":110,"icon":111},"Feature requests","\u002Fen\u002Fcms\u002Ffeature-requests","en\u002F02.cms\u002F15.feature-requests","i-hugeicons-idea-01",{"title":113,"path":114,"stem":115,"icon":116},"Report a bug","\u002Fen\u002Fcms\u002Fbug-reports","en\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","\u002Fen\u002Fapp","en\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},"Signing in and finding your way","\u002Fen\u002Fapp\u002Foverview","en\u002F03.app\u002F01.overview","i-hugeicons-login-03",{"title":129,"path":130,"stem":131,"icon":132},"Tabs and split view","\u002Fen\u002Fapp\u002Ftabs","en\u002F03.app\u002F02.tabs","i-hugeicons-layout-2-column",{"title":134,"path":135,"stem":136,"icon":137},"Finding and reading documents","\u002Fen\u002Fapp\u002Fdocuments","en\u002F03.app\u002F03.documents","i-hugeicons-file-01",{"title":139,"path":140,"stem":141,"icon":142},"Favorites","\u002Fen\u002Fapp\u002Ffavorites","en\u002F03.app\u002F04.favorites","i-hugeicons-favourite",{"title":144,"path":145,"stem":146,"icon":61},"Searching","\u002Fen\u002Fapp\u002Fsearch","en\u002F03.app\u002F05.search",{"title":148,"path":149,"stem":150,"icon":151},"Notes","\u002Fen\u002Fapp\u002Fnotes","en\u002F03.app\u002F06.notes","i-hugeicons-note-edit",{"title":153,"path":154,"stem":155,"icon":156},"Calendar and appointments","\u002Fen\u002Fapp\u002Fcalendar","en\u002F03.app\u002F07.calendar","i-hugeicons-calendar-03",{"title":158,"path":159,"stem":160,"icon":161},"Sending to customers","\u002Fen\u002Fapp\u002Foutbox","en\u002F03.app\u002F08.outbox","i-hugeicons-sent",{"title":163,"path":164,"stem":165,"icon":166},"Working offline","\u002Fen\u002Fapp\u002Foffline","en\u002F03.app\u002F09.offline","i-hugeicons-wifi-off-01",{"title":93,"path":168,"stem":169,"icon":96},"\u002Fen\u002Fapp\u002Fassistant","en\u002F03.app\u002F10.assistant",{"title":98,"path":171,"stem":172,"icon":101},"\u002Fen\u002Fapp\u002Fsettings","en\u002F03.app\u002F11.settings",{"title":108,"path":174,"stem":175,"icon":111},"\u002Fen\u002Fapp\u002Ffeature-requests","en\u002F03.app\u002F12.feature-requests",{"title":113,"path":177,"stem":178,"icon":116},"\u002Fen\u002Fapp\u002Fbug-reports","en\u002F03.app\u002F13.bug-reports",{"title":180,"path":181,"stem":182,"icon":183},"Desktop app","\u002Fen\u002Fapp\u002Fdesktop-app","en\u002F03.app\u002F14.desktop-app","i-hugeicons-computer",{"title":185,"path":186,"stem":187,"icon":119},"Mobile app","\u002Fen\u002Fapp\u002Fmobile-app","en\u002F03.app\u002F15.mobile-app",{"title":189,"icon":190,"path":191,"stem":192,"children":193,"page":30},"Sign-in & directories","i-hugeicons-security-check","\u002Fen\u002Fsign-in-and-directories","en\u002F04.sign-in-and-directories",[194,198,202,207,212,217,222,226,230,234],{"title":195,"path":196,"stem":197,"icon":19},"Sign-in methods","\u002Fen\u002Fsign-in-and-directories\u002Fsign-in-methods","en\u002F04.sign-in-and-directories\u002F01.sign-in-methods",{"title":199,"path":200,"stem":201,"icon":190},"Single sign-on","\u002Fen\u002Fsign-in-and-directories\u002Fsingle-sign-on","en\u002F04.sign-in-and-directories\u002F02.single-sign-on",{"title":203,"path":204,"stem":205,"icon":206},"Directory services (LDAP)","\u002Fen\u002Fsign-in-and-directories\u002Fdirectory-services","en\u002F04.sign-in-and-directories\u002F03.directory-services","i-hugeicons-hierarchy",{"title":208,"path":209,"stem":210,"icon":211},"Synchronisation and sign-in","\u002Fen\u002Fsign-in-and-directories\u002Fdirectory-sync","en\u002F04.sign-in-and-directories\u002F04.directory-sync","i-hugeicons-refresh",{"title":213,"path":214,"stem":215,"icon":216},"Microsoft Entra ID","\u002Fen\u002Fsign-in-and-directories\u002Fmicrosoft-entra-id","en\u002F04.sign-in-and-directories\u002F05.microsoft-entra-id","i-hugeicons-building-03",{"title":218,"path":219,"stem":220,"icon":221},"Okta","\u002Fen\u002Fsign-in-and-directories\u002Fokta","en\u002F04.sign-in-and-directories\u002F06.okta","i-hugeicons-finger-print",{"title":223,"path":224,"stem":225,"icon":81},"Google Workspace","\u002Fen\u002Fsign-in-and-directories\u002Fgoogle-workspace","en\u002F04.sign-in-and-directories\u002F07.google-workspace",{"title":227,"path":228,"stem":229,"icon":119},"Two-factor authentication","\u002Fen\u002Fsign-in-and-directories\u002Ftwo-factor-authentication","en\u002F04.sign-in-and-directories\u002F08.two-factor-authentication",{"title":231,"path":232,"stem":233,"icon":221},"Passkeys","\u002Fen\u002Fsign-in-and-directories\u002Fpasskeys","en\u002F04.sign-in-and-directories\u002F09.passkeys",{"title":235,"path":236,"stem":237,"icon":156},"Calendar access","\u002Fen\u002Fsign-in-and-directories\u002Fcalendar-access","en\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","\u002Fen\u002Fmcp-server","en\u002F05.mcp-server",[244,248,253,257,262,266],{"title":245,"path":246,"stem":247,"icon":240},"Overview","\u002Fen\u002Fmcp-server\u002Foverview","en\u002F05.mcp-server\u002F01.overview",{"title":249,"path":250,"stem":251,"icon":252},"Setup","\u002Fen\u002Fmcp-server\u002Fsetup","en\u002F05.mcp-server\u002F02.setup","i-hugeicons-plug-socket",{"title":254,"path":255,"stem":256,"icon":111},"What you can do with it","\u002Fen\u002Fmcp-server\u002Fuse-cases","en\u002F05.mcp-server\u002F03.use-cases",{"title":258,"path":259,"stem":260,"icon":261},"Tools","\u002Fen\u002Fmcp-server\u002Ftools","en\u002F05.mcp-server\u002F04.tools","i-hugeicons-wrench-01",{"title":263,"path":264,"stem":265,"icon":76},"Approving changes","\u002Fen\u002Fmcp-server\u002Fapproving-changes","en\u002F05.mcp-server\u002F05.approving-changes",{"title":267,"path":268,"stem":269,"icon":270},"Administration & security","\u002Fen\u002Fmcp-server\u002Fadmin-and-security","en\u002F05.mcp-server\u002F06.admin-and-security","i-hugeicons-shield-key",{"title":272,"icon":273,"path":274,"stem":275,"children":276,"page":30},"External sources","i-hugeicons-database-sync","\u002Fen\u002Fexternal-sources","en\u002F06.external-sources",[277,280,285,290,295,300,305],{"title":245,"path":278,"stem":279,"icon":273},"\u002Fen\u002Fexternal-sources\u002Foverview","en\u002F06.external-sources\u002F01.overview",{"title":281,"path":282,"stem":283,"icon":284},"SharePoint","\u002Fen\u002Fexternal-sources\u002Fsharepoint","en\u002F06.external-sources\u002F02.sharepoint","i-hugeicons-microsoft",{"title":286,"path":287,"stem":288,"icon":289},"OneDrive","\u002Fen\u002Fexternal-sources\u002Fonedrive","en\u002F06.external-sources\u002F03.onedrive","i-hugeicons-folder-cloud",{"title":291,"path":292,"stem":293,"icon":294},"Google Drive","\u002Fen\u002Fexternal-sources\u002Fgoogle-drive","en\u002F06.external-sources\u002F04.google-drive","i-hugeicons-google-drive",{"title":296,"path":297,"stem":298,"icon":299},"FTP \u002F SFTP","\u002Fen\u002Fexternal-sources\u002Fftp-sftp","en\u002F06.external-sources\u002F05.ftp-sftp","i-hugeicons-server-stack-01",{"title":301,"path":302,"stem":303,"icon":304},"REST interface","\u002Fen\u002Fexternal-sources\u002Frest","en\u002F06.external-sources\u002F06.rest","i-hugeicons-api",{"title":306,"path":307,"stem":308,"icon":309},"SOAP interface","\u002Fen\u002Fexternal-sources\u002Fsoap","en\u002F06.external-sources\u002F07.soap","i-hugeicons-source-code",{"title":311,"icon":304,"path":312,"stem":313,"children":314,"page":30},"Integration API","\u002Fen\u002Fintegration-api","en\u002F07.integration-api",[315,318,322,327,332,337,341,346,350,354,359,364],{"title":245,"path":316,"stem":317,"icon":14},"\u002Fen\u002Fintegration-api\u002Foverview","en\u002F07.integration-api\u002F01.overview",{"title":319,"path":320,"stem":321,"icon":19},"Authentication","\u002Fen\u002Fintegration-api\u002Fauthentication","en\u002F07.integration-api\u002F02.authentication",{"title":323,"path":324,"stem":325,"icon":326},"Conventions","\u002Fen\u002Fintegration-api\u002Fconventions","en\u002F07.integration-api\u002F03.conventions","i-hugeicons-book-open-01",{"title":328,"path":329,"stem":330,"icon":331},"Pushing documents","\u002Fen\u002Fintegration-api\u002Fpushing-documents","en\u002F07.integration-api\u002F04.pushing-documents","i-hugeicons-upload-02",{"title":333,"path":334,"stem":335,"icon":336},"Consuming content","\u002Fen\u002Fintegration-api\u002Fconsuming-content","en\u002F07.integration-api\u002F05.consuming-content","i-hugeicons-download-02",{"title":338,"path":339,"stem":340,"icon":137},"Reference: documents","\u002Fen\u002Fintegration-api\u002Freference-documents","en\u002F07.integration-api\u002F06.reference-documents",{"title":342,"path":343,"stem":344,"icon":345},"Reference: categories, tags, markets","\u002Fen\u002Fintegration-api\u002Freference-categories-tags","en\u002F07.integration-api\u002F07.reference-categories-tags","i-hugeicons-folder-01",{"title":347,"path":348,"stem":349,"icon":211},"Reference: sync manifest","\u002Fen\u002Fintegration-api\u002Freference-sync","en\u002F07.integration-api\u002F08.reference-sync",{"title":351,"path":352,"stem":353,"icon":309},"OpenAPI","\u002Fen\u002Fintegration-api\u002Fopenapi","en\u002F07.integration-api\u002F09.openapi",{"title":355,"path":356,"stem":357,"icon":358},"Changelog","\u002Fen\u002Fintegration-api\u002Fchangelog","en\u002F07.integration-api\u002F10.changelog","i-hugeicons-time-schedule",{"title":360,"path":361,"stem":362,"icon":363},"Reference: groups, markets, access","\u002Fen\u002Fintegration-api\u002Freference-groups-access","en\u002F07.integration-api\u002F11.reference-groups-access","i-hugeicons-user-lock-01",{"title":365,"path":366,"stem":367,"icon":368},"Moving from CMWS","\u002Fen\u002Fintegration-api\u002Fcmws","en\u002F07.integration-api\u002F12.cmws","i-hugeicons-arrow-reload-horizontal",{"title":370,"icon":371,"path":372,"stem":373,"children":374,"page":30},"What's new","i-hugeicons-gift","\u002Fen\u002Fwhats-new","en\u002F08.whats-new",[375],{"title":355,"path":376,"stem":377,"icon":358},"\u002Fen\u002Fwhats-new\u002Fchangelog","en\u002F08.whats-new\u002F01.changelog",{"title":379,"icon":299,"path":380,"stem":381,"children":382,"page":30},"Self-hosting","\u002Fen\u002Fself-hosting","en\u002F09.self-hosting",[383,386,390,395,399,404,408,413,418,422],{"title":245,"path":384,"stem":385,"icon":14},"\u002Fen\u002Fself-hosting\u002Foverview","en\u002F09.self-hosting\u002F01.overview",{"title":387,"path":388,"stem":389,"icon":106},"Docker Compose","\u002Fen\u002Fself-hosting\u002Fdocker-compose","en\u002F09.self-hosting\u002F02.docker-compose",{"title":391,"path":392,"stem":393,"icon":394},"Kubernetes","\u002Fen\u002Fself-hosting\u002Fkubernetes","en\u002F09.self-hosting\u002F03.kubernetes","i-hugeicons-cloud",{"title":396,"path":397,"stem":398,"icon":101},"Configuration","\u002Fen\u002Fself-hosting\u002Fconfiguration","en\u002F09.self-hosting\u002F04.configuration",{"title":400,"path":401,"stem":402,"icon":403},"Licence","\u002Fen\u002Fself-hosting\u002Flicence","en\u002F09.self-hosting\u002F05.licence","i-hugeicons-license",{"title":405,"path":406,"stem":407,"icon":211},"Updates","\u002Fen\u002Fself-hosting\u002Fupdates","en\u002F09.self-hosting\u002F06.updates",{"title":409,"path":410,"stem":411,"icon":412},"Postgres","\u002Fen\u002Fself-hosting\u002Fpostgres","en\u002F09.self-hosting\u002F07.postgres","i-hugeicons-database",{"title":414,"path":415,"stem":416,"icon":417},"Backups","\u002Fen\u002Fself-hosting\u002Fbackups","en\u002F09.self-hosting\u002F08.backups","i-hugeicons-database-restore",{"title":419,"path":420,"stem":421,"icon":261},"Troubleshooting","\u002Fen\u002Fself-hosting\u002Ftroubleshooting","en\u002F09.self-hosting\u002F09.troubleshooting",{"title":423,"path":424,"stem":425,"icon":426},"Firewall","\u002Fen\u002Fself-hosting\u002Ffirewall","en\u002F09.self-hosting\u002F10.firewall","i-hugeicons-firewall",{"id":428,"title":391,"body":429,"description":5053,"extension":5054,"links":5055,"meta":5056,"navigation":5057,"path":392,"seo":5058,"stem":393,"__hash__":5059},"docs_en\u002Fen\u002F09.self-hosting\u002F03.kubernetes.md",{"type":430,"value":431,"toc":5043},"minimark",[432,450,455,550,554,648,652,665,832,850,927,932,975,979,985,1027,4773,4777,4816,4823,4827,4836,4931,4935,4942,4978,4982,5003,5039],[433,434,435,436,440,441,445,446,449],"p",{},"For Kubernetes there is ",[437,438,439],"strong",{},"one file with everything"," the installation needs – ",[442,443,444],"code",{},"ddm.yaml"," – and ",[437,447,448],{},"two files with your settings",". All three are on this page.",[451,452,454],"h2",{"id":453},"what-ddmyaml-creates","What ddm.yaml creates",[456,457,458,471],"table",{},[459,460,461],"thead",{},[462,463,464,468],"tr",{},[465,466,467],"th",{},"Object",[465,469,470],{},"Note",[472,473,474,486,504,514,524,539],"tbody",{},[462,475,476,483],{},[477,478,479,482],"td",{},[442,480,481],{},"postgres"," (StatefulSet)",[477,484,485],{},"With its own volume. If you already run a Postgres database, you can use it instead – see below.",[462,487,488,494],{},[477,489,490,493],{},[442,491,492],{},"cms"," (Deployment)",[477,495,496,499,500,503],{},[437,497,498],{},"Exactly one instance",", updated with ",[442,501,502],{},"Recreate",": the CMS applies the migrations and runs the scheduled tasks.",[462,505,506,511],{},[477,507,508,493],{},[442,509,510],{},"render-worker",[477,512,513],{},"Can grow to several instances.",[462,515,516,521],{},[477,517,518,493],{},[442,519,520],{},"client",[477,522,523],{},"The reader app.",[462,525,526,532],{},[477,527,528,531],{},[442,529,530],{},"ddm-data"," (PersistentVolumeClaim)",[477,533,534,535,538],{},"Documents and backups, shared by the CMS and the render worker – ",[437,536,537],{},"ReadWriteMany",", unless the documents are in an S3 bucket.",[462,540,541,547],{},[477,542,543,546],{},[442,544,545],{},"ddm"," (Ingress)",[477,548,549],{},"Both host names, for ingress-nginx with uploads up to 1 GB.",[451,551,553],{"id":552},"_1-create-the-namespace-and-the-registry-secret","1. Create the namespace and the registry secret",[555,556,561],"pre",{"className":557,"code":558,"language":559,"meta":560,"style":560},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","kubectl create namespace ddm\nkubectl -n ddm create secret docker-registry ddm-registry \\\n  --docker-server=registry.gitlab.com \\\n  --docker-username=\u003Ctoken name> --docker-password=\u003Ctoken>\n","bash","",[442,562,563,582,608,616],{"__ignoreMap":560},[564,565,568,572,576,579],"span",{"class":566,"line":567},"line",1,[564,569,571],{"class":570},"sBMFI","kubectl",[564,573,575],{"class":574},"sfazB"," create",[564,577,578],{"class":574}," namespace",[564,580,581],{"class":574}," ddm\n",[564,583,585,587,590,593,595,598,601,604],{"class":566,"line":584},2,[564,586,571],{"class":570},[564,588,589],{"class":574}," -n",[564,591,592],{"class":574}," ddm",[564,594,575],{"class":574},[564,596,597],{"class":574}," secret",[564,599,600],{"class":574}," docker-registry",[564,602,603],{"class":574}," ddm-registry",[564,605,607],{"class":606},"sTEyZ"," \\\n",[564,609,611,614],{"class":566,"line":610},3,[564,612,613],{"class":574},"  --docker-server=registry.gitlab.com",[564,615,607],{"class":606},[564,617,619,622,626,629,632,635,638,641,643,645],{"class":566,"line":618},4,[564,620,621],{"class":574},"  --docker-username=",[564,623,625],{"class":624},"sMK4o","\u003C",[564,627,628],{"class":574},"token",[564,630,631],{"class":574}," nam",[564,633,634],{"class":606},"e",[564,636,637],{"class":624},">",[564,639,640],{"class":574}," --docker-password=",[564,642,625],{"class":624},[564,644,628],{"class":574},[564,646,647],{"class":624},">\n",[451,649,651],{"id":650},"_2-create-the-settings","2. Create the settings",[433,653,654,659,660,664],{},[437,655,656],{},[442,657,658],{},"config.env"," – your settings, the same as with ",[661,662,387],"a",{"href":663},"\u002Fen\u002Fself-hosting\u002Fdocker-compose#3-fill-in-the-settings",":",[555,666,668],{"className":557,"code":667,"filename":658,"language":559,"meta":560,"style":560},"# The installation's settings, made into the ConfigMap `ddm`:\n#     kubectl -n ddm create configmap ddm --from-env-file=config.env\n# Every setting of the user guide's „Konfiguration\" \u002F „Configuration\" may be\n# added. Secrets go in `secrets.env`.\nDDM_CMS_HOST=cms.example.com\nDDM_APP_HOST=app.example.com\nAUTH_COOKIE_DOMAIN=example.com\nPASSKEY_RP_ID=example.com\n\nMAIL_DRIVER=smtp\nMAIL_FROM=ddm@example.com\nSMTP_HOST=mail.example.com\nSMTP_PORT=587\nSMTP_USER=ddm\n\n# The documents in an S3-compatible bucket instead of the `ddm-data` volume\n# (its keys in `secrets.env`).\n# S3_ENDPOINT=https:\u002F\u002Fs3.example.com\n# S3_BUCKET=ddm\n# S3_REGION=eu-central-1\n",[442,669,670,676,681,686,691,703,714,725,735,742,753,764,775,786,797,802,808,814,820,826],{"__ignoreMap":560},[564,671,672],{"class":566,"line":567},[564,673,675],{"class":674},"sHwdD","# The installation's settings, made into the ConfigMap `ddm`:\n",[564,677,678],{"class":566,"line":584},[564,679,680],{"class":674},"#     kubectl -n ddm create configmap ddm --from-env-file=config.env\n",[564,682,683],{"class":566,"line":610},[564,684,685],{"class":674},"# Every setting of the user guide's „Konfiguration\" \u002F „Configuration\" may be\n",[564,687,688],{"class":566,"line":618},[564,689,690],{"class":674},"# added. Secrets go in `secrets.env`.\n",[564,692,694,697,700],{"class":566,"line":693},5,[564,695,696],{"class":606},"DDM_CMS_HOST",[564,698,699],{"class":624},"=",[564,701,702],{"class":574},"cms.example.com\n",[564,704,706,709,711],{"class":566,"line":705},6,[564,707,708],{"class":606},"DDM_APP_HOST",[564,710,699],{"class":624},[564,712,713],{"class":574},"app.example.com\n",[564,715,717,720,722],{"class":566,"line":716},7,[564,718,719],{"class":606},"AUTH_COOKIE_DOMAIN",[564,721,699],{"class":624},[564,723,724],{"class":574},"example.com\n",[564,726,728,731,733],{"class":566,"line":727},8,[564,729,730],{"class":606},"PASSKEY_RP_ID",[564,732,699],{"class":624},[564,734,724],{"class":574},[564,736,738],{"class":566,"line":737},9,[564,739,741],{"emptyLinePlaceholder":740},true,"\n",[564,743,745,748,750],{"class":566,"line":744},10,[564,746,747],{"class":606},"MAIL_DRIVER",[564,749,699],{"class":624},[564,751,752],{"class":574},"smtp\n",[564,754,756,759,761],{"class":566,"line":755},11,[564,757,758],{"class":606},"MAIL_FROM",[564,760,699],{"class":624},[564,762,763],{"class":574},"ddm@example.com\n",[564,765,767,770,772],{"class":566,"line":766},12,[564,768,769],{"class":606},"SMTP_HOST",[564,771,699],{"class":624},[564,773,774],{"class":574},"mail.example.com\n",[564,776,778,781,783],{"class":566,"line":777},13,[564,779,780],{"class":606},"SMTP_PORT",[564,782,699],{"class":624},[564,784,785],{"class":574},"587\n",[564,787,789,792,794],{"class":566,"line":788},14,[564,790,791],{"class":606},"SMTP_USER",[564,793,699],{"class":624},[564,795,796],{"class":574},"ddm\n",[564,798,800],{"class":566,"line":799},15,[564,801,741],{"emptyLinePlaceholder":740},[564,803,805],{"class":566,"line":804},16,[564,806,807],{"class":674},"# The documents in an S3-compatible bucket instead of the `ddm-data` volume\n",[564,809,811],{"class":566,"line":810},17,[564,812,813],{"class":674},"# (its keys in `secrets.env`).\n",[564,815,817],{"class":566,"line":816},18,[564,818,819],{"class":674},"# S3_ENDPOINT=https:\u002F\u002Fs3.example.com\n",[564,821,823],{"class":566,"line":822},19,[564,824,825],{"class":674},"# S3_BUCKET=ddm\n",[564,827,829],{"class":566,"line":828},20,[564,830,831],{"class":674},"# S3_REGION=eu-central-1\n",[433,833,834,839,840,843,844,849],{},[437,835,836],{},[442,837,838],{},"secrets.env"," – passwords, ",[442,841,842],{},"BETTER_AUTH_SECRET"," and ",[437,845,846],{},[442,847,848],{},"LICENCE_KEY",". This file belongs in no version control – or only encrypted, for example with SOPS.",[555,851,853],{"className":557,"code":852,"filename":838,"language":559,"meta":560,"style":560},"# The installation's secrets, made into the Secret `ddm`:\n#     kubectl -n ddm create secret generic ddm --from-env-file=secrets.env\n# Copy this file to `secrets.env`, fill it in, and keep it out of version\n# control. `openssl rand -base64 32` for each. The database's password is kept by\n# Postgres on its first start; changing it here later locks the cms out.\nPOSTGRES_PASSWORD=\nBETTER_AUTH_SECRET=\nSMTP_PASSWORD=\n# The licence we sent you (`ddm1.…`) — needed from the first start; one\n# entered later under Settings › Licence replaces it.\nLICENCE_KEY=\n# S3_ACCESS_KEY_ID=\n# S3_SECRET_ACCESS_KEY=\n",[442,854,855,860,865,870,875,880,888,894,901,906,911,917,922],{"__ignoreMap":560},[564,856,857],{"class":566,"line":567},[564,858,859],{"class":674},"# The installation's secrets, made into the Secret `ddm`:\n",[564,861,862],{"class":566,"line":584},[564,863,864],{"class":674},"#     kubectl -n ddm create secret generic ddm --from-env-file=secrets.env\n",[564,866,867],{"class":566,"line":610},[564,868,869],{"class":674},"# Copy this file to `secrets.env`, fill it in, and keep it out of version\n",[564,871,872],{"class":566,"line":618},[564,873,874],{"class":674},"# control. `openssl rand -base64 32` for each. The database's password is kept by\n",[564,876,877],{"class":566,"line":693},[564,878,879],{"class":674},"# Postgres on its first start; changing it here later locks the cms out.\n",[564,881,882,885],{"class":566,"line":705},[564,883,884],{"class":606},"POSTGRES_PASSWORD",[564,886,887],{"class":624},"=\n",[564,889,890,892],{"class":566,"line":716},[564,891,842],{"class":606},[564,893,887],{"class":624},[564,895,896,899],{"class":566,"line":727},[564,897,898],{"class":606},"SMTP_PASSWORD",[564,900,887],{"class":624},[564,902,903],{"class":566,"line":737},[564,904,905],{"class":674},"# The licence we sent you (`ddm1.…`) — needed from the first start; one\n",[564,907,908],{"class":566,"line":744},[564,909,910],{"class":674},"# entered later under Settings › Licence replaces it.\n",[564,912,913,915],{"class":566,"line":755},[564,914,848],{"class":606},[564,916,887],{"class":624},[564,918,919],{"class":566,"line":766},[564,920,921],{"class":674},"# S3_ACCESS_KEY_ID=\n",[564,923,924],{"class":566,"line":777},[564,925,926],{"class":674},"# S3_SECRET_ACCESS_KEY=\n",[433,928,929,930,664],{},"They become the ConfigMap and the Secret ",[442,931,545],{},[555,933,935],{"className":557,"code":934,"language":559,"meta":560,"style":560},"kubectl -n ddm create configmap ddm --from-env-file=config.env\nkubectl -n ddm create secret generic ddm --from-env-file=secrets.env\n",[442,936,937,955],{"__ignoreMap":560},[564,938,939,941,943,945,947,950,952],{"class":566,"line":567},[564,940,571],{"class":570},[564,942,589],{"class":574},[564,944,592],{"class":574},[564,946,575],{"class":574},[564,948,949],{"class":574}," configmap",[564,951,592],{"class":574},[564,953,954],{"class":574}," --from-env-file=config.env\n",[564,956,957,959,961,963,965,967,970,972],{"class":566,"line":584},[564,958,571],{"class":570},[564,960,589],{"class":574},[564,962,592],{"class":574},[564,964,575],{"class":574},[564,966,597],{"class":574},[564,968,969],{"class":574}," generic",[564,971,592],{"class":574},[564,973,974],{"class":574}," --from-env-file=secrets.env\n",[451,976,978],{"id":977},"_3-adapt-ddmyaml","3. Adapt ddm.yaml",[433,980,981,982,984],{},"Save the file as ",[442,983,444],{}," and change two things in it:",[986,987,988,1015],"ul",{},[989,990,991,994,995,998,999,1001,1002,843,1004,1006,1007,1010,1011,1014],"li",{},[437,992,993],{},"The version:"," ",[442,996,997],{},":latest"," for ",[442,1000,492],{},", ",[442,1003,510],{},[442,1005,520],{}," becomes the version you run – for example ",[442,1008,1009],{},":0.26",". Postgres stays at ",[442,1012,1013],{},":18",".",[989,1016,1017,994,1020,843,1023,1026],{},[437,1018,1019],{},"Your host names:",[442,1021,1022],{},"cms.example.com",[442,1024,1025],{},"app.example.com"," in the Ingress at the end of the file.",[555,1028,1032],{"className":1029,"code":1030,"filename":444,"language":1031,"meta":560,"style":560},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# DDM on Kubernetes — everything an installation runs, in one file:\n#\n#     kubectl create namespace ddm\n#     kubectl -n ddm create secret docker-registry ddm-registry \\\n#       --docker-server=registry.gitlab.com --docker-username=\u003Ctoken name> --docker-password=\u003Ctoken>\n#     kubectl -n ddm create configmap ddm --from-env-file=config.env\n#     kubectl -n ddm create secret generic ddm --from-env-file=secrets.env\n#     kubectl -n ddm apply -f ddm.yaml\n#\n# Before applying, set in this file:\n#   - the release, the same for cms, render-worker and client: `:latest`\n#     below, e.g. `:0.26` (Postgres stays at its major, 18). The comment\n#     behind each of those lines is where Flux writes a new version, when it\n#     updates the installation (`ddm-updates.yaml`); without Flux it does nothing;\n#   - your two hostnames, for `cms.example.com` and `app.example.com` in the\n#     Ingress at the end.\n#\n# The settings are in the ConfigMap `ddm` and the Secret `ddm`, made from\n# `config.env` and `secrets.env`. After changing them, restart the apps:\n#     kubectl -n ddm rollout restart deployment\n#\n# The cms runs once, and is replaced, not rolled: its scheduled tasks and the\n# migrations it runs on start are one process's. The documents are on a\n# volume the cms and the render worker share (ReadWriteMany), unless the\n# configuration names an S3 bucket.\n\n---\n# Postgres with the German dictionary DDM searches with, by its major — never\n# updated with the rest: a new major needs its data upgraded by hand.\napiVersion: v1\nkind: Service\nmetadata:\n  name: postgres\nspec:\n  selector:\n    app.kubernetes.io\u002Fname: postgres\n  ports:\n    - name: postgres\n      port: 5432\n---\napiVersion: apps\u002Fv1\nkind: StatefulSet\nmetadata:\n  name: postgres\nspec:\n  serviceName: postgres\n  replicas: 1\n  selector:\n    matchLabels:\n      app.kubernetes.io\u002Fname: postgres\n  template:\n    metadata:\n      labels:\n        app.kubernetes.io\u002Fname: postgres\n    spec:\n      imagePullSecrets:\n        - name: ddm-registry\n      # As the image's `postgres` user (70) from the start — no root to drop\n      # from — the volume made its group's.\n      securityContext:\n        runAsNonRoot: true\n        runAsUser: 70\n        runAsGroup: 70\n        fsGroup: 70\n        seccompProfile:\n          type: RuntimeDefault\n      containers:\n        - name: postgres\n          image: registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Fpostgres:18\n          # Postgres' own fixes come under the same tag: a restart brings them (user guide, „Postgres\").\n          imagePullPolicy: Always\n          securityContext:\n            allowPrivilegeEscalation: false\n            readOnlyRootFilesystem: true\n            capabilities:\n              drop: [ALL]\n          env:\n            - name: POSTGRES_USER\n              value: ddm\n            - name: POSTGRES_DB\n              value: ddm\n            - name: POSTGRES_PASSWORD\n              valueFrom:\n                secretKeyRef:\n                  name: ddm\n                  key: POSTGRES_PASSWORD\n          ports:\n            - name: postgres\n              containerPort: 5432\n          readinessProbe:\n            exec:\n              command: [pg_isready, -U, ddm, -d, ddm]\n            periodSeconds: 5\n          resources:\n            requests:\n              cpu: 250m\n              memory: 512Mi\n            limits:\n              memory: 2Gi\n          volumeMounts:\n            - name: postgres\n              mountPath: \u002Fvar\u002Flib\u002Fpostgresql\n            # Writable besides its data: the socket, and scratch.\n            - name: run\n              mountPath: \u002Fvar\u002Frun\u002Fpostgresql\n            - name: tmp\n              mountPath: \u002Ftmp\n      volumes:\n        - name: run\n          emptyDir: {}\n        - name: tmp\n          emptyDir: {}\n  volumeClaimTemplates:\n    - metadata:\n        name: postgres\n      spec:\n        accessModes: [ReadWriteOnce]\n        resources:\n          requests:\n            storage: 20Gi\n---\n# The documents, and the database's dumps taken before each migration (the\n# last three): read and written by the cms and the render worker, which may\n# run on different nodes. With an S3 bucket configured (`S3_ENDPOINT`) nothing\n# is kept here, and its size may be small.\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: ddm-data\nspec:\n  accessModes: [ReadWriteMany]\n  resources:\n    requests:\n      storage: 100Gi\n---\n# The management app, and the API the reader app, the render worker's\n# documents and every integration go through. One replica, replaced rather\n# than rolled: it runs the scheduled tasks, and migrates the database to its\n# release before it answers.\napiVersion: v1\nkind: Service\nmetadata:\n  name: cms\nspec:\n  selector:\n    app.kubernetes.io\u002Fname: cms\n  ports:\n    - name: http\n      port: 3000\n      targetPort: http\n---\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: cms\nspec:\n  replicas: 1\n  strategy:\n    type: Recreate\n  selector:\n    matchLabels:\n      app.kubernetes.io\u002Fname: cms\n  template:\n    metadata:\n      labels:\n        app.kubernetes.io\u002Fname: cms\n    spec:\n      imagePullSecrets:\n        - name: ddm-registry\n      securityContext:\n        runAsNonRoot: true\n        runAsUser: 1000\n        runAsGroup: 1000\n        fsGroup: 1000\n      containers:\n        - name: cms\n          image: registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Fcms:latest # {\"$imagepolicy\": \"flux-system:ddm-cms\"}\n          # Asked anew at every start: a tag that moves (`stable`, `0.26`) brings its newest image.\n          imagePullPolicy: Always\n          securityContext:\n            allowPrivilegeEscalation: false\n            readOnlyRootFilesystem: true\n            capabilities:\n              drop: [ALL]\n          envFrom:\n            - configMapRef:\n                name: ddm\n            - secretRef:\n                name: ddm\n          env:\n            # Which version of this file this is: a release that needs a newer\n            # one says so to the administrators, rather than failing (user guide, „Updates\").\n            - name: DDM_DEPLOY_VERSION\n              value: \"1\"\n            - name: DATABASE_URL\n              value: postgres:\u002F\u002Fddm:$(POSTGRES_PASSWORD)@postgres:5432\u002Fddm\n            - name: BETTER_AUTH_URL\n              value: https:\u002F\u002F$(DDM_CMS_HOST)\n            - name: CLIENT_ORIGIN\n              value: https:\u002F\u002F$(DDM_APP_HOST)\n            - name: STORAGE_DIR\n              value: \u002Fdata\u002Fstorage\n            - name: BACKUP_DIR\n              value: \u002Fdata\u002Fbackups\n            # Uploads are stored here and drawn by the render worker.\n            - name: RENDER_MODE\n              value: worker\n          ports:\n            - name: http\n              containerPort: 3000\n          # Migrations first, on a new release: up to five minutes.\n          startupProbe:\n            httpGet:\n              path: \u002Fapi\u002Fauth\u002Fok\n              port: http\n            periodSeconds: 2\n            failureThreshold: 150\n          readinessProbe:\n            httpGet:\n              path: \u002Fapi\u002Fauth\u002Fok\n              port: http\n            periodSeconds: 10\n          livenessProbe:\n            httpGet:\n              path: \u002Fapi\u002Fauth\u002Fok\n              port: http\n            periodSeconds: 30\n            timeoutSeconds: 5\n          resources:\n            requests:\n              cpu: 250m\n              memory: 512Mi\n            limits:\n              memory: 2Gi\n          volumeMounts:\n            - name: data\n              mountPath: \u002Fdata\n            # The one place written besides `\u002Fdata`: uploads on their way, LibreOffice's profiles.\n            - name: tmp\n              mountPath: \u002Ftmp\n      volumes:\n        - name: data\n          persistentVolumeClaim:\n            claimName: ddm-data\n        - name: tmp\n          emptyDir: {}\n---\n# Reads the text, draws the thumbnails and converts the Office files of what\n# is uploaded, sharing the work through the database: more replicas for more\n# imports. Each finishes the documents in hand before it stops — LibreOffice\n# may take minutes over a large deck.\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: render-worker\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app.kubernetes.io\u002Fname: render-worker\n  template:\n    metadata:\n      labels:\n        app.kubernetes.io\u002Fname: render-worker\n    spec:\n      imagePullSecrets:\n        - name: ddm-registry\n      securityContext:\n        runAsNonRoot: true\n        runAsUser: 1000\n        runAsGroup: 1000\n        fsGroup: 1000\n      terminationGracePeriodSeconds: 660\n      containers:\n        - name: render-worker\n          image: registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Frender-worker:latest # {\"$imagepolicy\": \"flux-system:ddm-render-worker\"}\n          imagePullPolicy: Always\n          securityContext:\n            allowPrivilegeEscalation: false\n            readOnlyRootFilesystem: true\n            capabilities:\n              drop: [ALL]\n          envFrom:\n            - configMapRef:\n                name: ddm\n            - secretRef:\n                name: ddm\n          env:\n            - name: DATABASE_URL\n              value: postgres:\u002F\u002Fddm:$(POSTGRES_PASSWORD)@postgres:5432\u002Fddm\n            - name: STORAGE_DIR\n              value: \u002Fdata\u002Fstorage\n            - name: RENDER_LARGE_OFFICE\n              value: \"on\"\n          resources:\n            requests:\n              cpu: 500m\n              memory: 1Gi\n            limits:\n              memory: 3Gi\n          volumeMounts:\n            - name: data\n              mountPath: \u002Fdata\n            # The one place written besides `\u002Fdata`: uploads on their way, LibreOffice's profiles.\n            - name: tmp\n              mountPath: \u002Ftmp\n      volumes:\n        - name: data\n          persistentVolumeClaim:\n            claimName: ddm-data\n        - name: tmp\n          emptyDir: {}\n---\n# The reader app: its pages, and everything under \u002Fapi forwarded to the cms.\napiVersion: v1\nkind: Service\nmetadata:\n  name: client\nspec:\n  selector:\n    app.kubernetes.io\u002Fname: client\n  ports:\n    - name: http\n      port: 3000\n      targetPort: http\n---\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: client\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app.kubernetes.io\u002Fname: client\n  template:\n    metadata:\n      labels:\n        app.kubernetes.io\u002Fname: client\n    spec:\n      imagePullSecrets:\n        - name: ddm-registry\n      securityContext:\n        runAsNonRoot: true\n        runAsUser: 1000\n        runAsGroup: 1000\n      containers:\n        - name: client\n          image: registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Fclient:latest # {\"$imagepolicy\": \"flux-system:ddm-client\"}\n          imagePullPolicy: Always\n          securityContext:\n            allowPrivilegeEscalation: false\n            readOnlyRootFilesystem: true\n            capabilities:\n              drop: [ALL]\n          envFrom:\n            - configMapRef:\n                name: ddm\n          env:\n            - name: NUXT_API_ORIGIN\n              value: http:\u002F\u002Fcms:3000\n            - name: NUXT_PUBLIC_MGMT_URL\n              value: https:\u002F\u002F$(DDM_CMS_HOST)\n            # The reader app on this installation, for the mobile app's „Server\".\n            - name: NUXT_PUBLIC_SERVER_URL\n              value: https:\u002F\u002F$(DDM_APP_HOST)\n            - name: RENDER_MODE\n              value: worker\n          ports:\n            - name: http\n              containerPort: 3000\n          # Through to the cms: what the reader app forwards answers, too.\n          readinessProbe:\n            httpGet:\n              path: \u002Fapi\u002Fauth\u002Fok\n              port: http\n            periodSeconds: 10\n          resources:\n            requests:\n              cpu: 100m\n              memory: 128Mi\n            limits:\n              memory: 512Mi\n          volumeMounts:\n            - name: tmp\n              mountPath: \u002Ftmp\n      volumes:\n        - name: tmp\n          emptyDir: {}\n---\n# Both hostnames — replace `cms.example.com` and `app.example.com` with yours —\n# with TLS from the Secret `ddm-tls`, or from cert-manager with its\n# annotation added here. Uploads are up to 1 GiB and may take a while:\n# ingress-nginx's limits raised; another controller needs its own.\napiVersion: networking.k8s.io\u002Fv1\nkind: Ingress\nmetadata:\n  name: ddm\n  annotations:\n    nginx.ingress.kubernetes.io\u002Fproxy-body-size: 1g\n    nginx.ingress.kubernetes.io\u002Fproxy-read-timeout: \"600\"\n    nginx.ingress.kubernetes.io\u002Fproxy-send-timeout: \"600\"\n    nginx.ingress.kubernetes.io\u002Fproxy-request-buffering: \"off\"\nspec:\n  tls:\n    - hosts: [cms.example.com, app.example.com]\n      secretName: ddm-tls\n  rules:\n    - host: cms.example.com\n      http:\n        paths:\n          - path: \u002F\n            pathType: Prefix\n            backend:\n              service:\n                name: cms\n                port:\n                  name: http\n    - host: app.example.com\n      http:\n        paths:\n          - path: \u002F\n            pathType: Prefix\n            backend:\n              service:\n                name: client\n                port:\n                  name: http\n","yaml",[442,1033,1034,1039,1044,1049,1054,1059,1063,1067,1072,1076,1081,1086,1091,1096,1101,1106,1111,1115,1120,1125,1130,1135,1141,1147,1153,1159,1164,1170,1176,1182,1194,1205,1214,1225,1233,1241,1251,1259,1272,1284,1289,1299,1309,1316,1325,1332,1342,1353,1360,1368,1378,1386,1394,1402,1412,1420,1428,1441,1447,1453,1461,1473,1484,1494,1504,1512,1523,1531,1542,1553,1559,1570,1578,1589,1599,1607,1624,1632,1645,1655,1667,1676,1688,1696,1704,1714,1724,1732,1743,1753,1761,1769,1803,1814,1822,1830,1841,1852,1860,1870,1878,1889,1900,1906,1918,1928,1940,1950,1958,1969,1980,1991,2000,2008,2018,2028,2036,2051,2059,2067,2078,2083,2089,2095,2101,2107,2116,2126,2133,2143,2150,2164,2172,2180,2191,2196,2202,2208,2214,2220,2229,2238,2245,2255,2262,2269,2278,2285,2297,2307,2317,2322,2331,2341,2348,2357,2364,2373,2381,2392,2399,2406,2415,2422,2429,2436,2445,2452,2459,2470,2477,2486,2496,2505,2514,2521,2532,2545,2551,2560,2567,2576,2585,2592,2605,2613,2623,2633,2643,2652,2659,2665,2671,2683,2699,2711,2721,2733,2743,2755,2765,2777,2787,2799,2809,2815,2827,2837,2844,2855,2864,2870,2878,2886,2897,2907,2917,2928,2935,2942,2951,2960,2970,2978,2985,2994,3003,3013,3023,3030,3037,3046,3055,3062,3071,3078,3090,3100,3106,3117,3126,3133,3144,3152,3162,3173,3182,3187,3193,3199,3205,3211,3220,3229,3236,3246,3253,3262,3269,3276,3285,3292,3299,3306,3315,3322,3329,3340,3347,3356,3365,3374,3383,3394,3401,3412,3425,3434,3441,3450,3459,3466,3479,3486,3495,3504,3513,3522,3529,3540,3549,3560,3569,3581,3595,3602,3609,3619,3629,3636,3646,3653,3664,3673,3678,3689,3698,3705,3716,3723,3732,3743,3752,3757,3763,3772,3781,3788,3798,3805,3812,3821,3828,3839,3848,3857,3862,3871,3880,3887,3896,3903,3912,3919,3926,3935,3942,3949,3956,3965,3972,3979,3990,3997,4006,4015,4024,4031,4042,4055,4064,4071,4080,4089,4096,4109,4116,4125,4134,4141,4153,4163,4175,4184,4190,4202,4211,4222,4231,4238,4249,4258,4264,4271,4278,4287,4296,4305,4312,4319,4329,4339,4346,4355,4362,4373,4382,4389,4400,4409,4414,4420,4426,4432,4438,4448,4458,4465,4474,4482,4493,4508,4522,4537,4544,4552,4573,4584,4592,4605,4613,4621,4635,4646,4654,4662,4671,4679,4688,4700,4707,4714,4725,4734,4741,4748,4757,4764],{"__ignoreMap":560},[564,1035,1036],{"class":566,"line":567},[564,1037,1038],{"class":674},"# DDM on Kubernetes — everything an installation runs, in one file:\n",[564,1040,1041],{"class":566,"line":584},[564,1042,1043],{"class":674},"#\n",[564,1045,1046],{"class":566,"line":610},[564,1047,1048],{"class":674},"#     kubectl create namespace ddm\n",[564,1050,1051],{"class":566,"line":618},[564,1052,1053],{"class":674},"#     kubectl -n ddm create secret docker-registry ddm-registry \\\n",[564,1055,1056],{"class":566,"line":693},[564,1057,1058],{"class":674},"#       --docker-server=registry.gitlab.com --docker-username=\u003Ctoken name> --docker-password=\u003Ctoken>\n",[564,1060,1061],{"class":566,"line":705},[564,1062,680],{"class":674},[564,1064,1065],{"class":566,"line":716},[564,1066,864],{"class":674},[564,1068,1069],{"class":566,"line":727},[564,1070,1071],{"class":674},"#     kubectl -n ddm apply -f ddm.yaml\n",[564,1073,1074],{"class":566,"line":737},[564,1075,1043],{"class":674},[564,1077,1078],{"class":566,"line":744},[564,1079,1080],{"class":674},"# Before applying, set in this file:\n",[564,1082,1083],{"class":566,"line":755},[564,1084,1085],{"class":674},"#   - the release, the same for cms, render-worker and client: `:latest`\n",[564,1087,1088],{"class":566,"line":766},[564,1089,1090],{"class":674},"#     below, e.g. `:0.26` (Postgres stays at its major, 18). The comment\n",[564,1092,1093],{"class":566,"line":777},[564,1094,1095],{"class":674},"#     behind each of those lines is where Flux writes a new version, when it\n",[564,1097,1098],{"class":566,"line":788},[564,1099,1100],{"class":674},"#     updates the installation (`ddm-updates.yaml`); without Flux it does nothing;\n",[564,1102,1103],{"class":566,"line":799},[564,1104,1105],{"class":674},"#   - your two hostnames, for `cms.example.com` and `app.example.com` in the\n",[564,1107,1108],{"class":566,"line":804},[564,1109,1110],{"class":674},"#     Ingress at the end.\n",[564,1112,1113],{"class":566,"line":810},[564,1114,1043],{"class":674},[564,1116,1117],{"class":566,"line":816},[564,1118,1119],{"class":674},"# The settings are in the ConfigMap `ddm` and the Secret `ddm`, made from\n",[564,1121,1122],{"class":566,"line":822},[564,1123,1124],{"class":674},"# `config.env` and `secrets.env`. After changing them, restart the apps:\n",[564,1126,1127],{"class":566,"line":828},[564,1128,1129],{"class":674},"#     kubectl -n ddm rollout restart deployment\n",[564,1131,1133],{"class":566,"line":1132},21,[564,1134,1043],{"class":674},[564,1136,1138],{"class":566,"line":1137},22,[564,1139,1140],{"class":674},"# The cms runs once, and is replaced, not rolled: its scheduled tasks and the\n",[564,1142,1144],{"class":566,"line":1143},23,[564,1145,1146],{"class":674},"# migrations it runs on start are one process's. The documents are on a\n",[564,1148,1150],{"class":566,"line":1149},24,[564,1151,1152],{"class":674},"# volume the cms and the render worker share (ReadWriteMany), unless the\n",[564,1154,1156],{"class":566,"line":1155},25,[564,1157,1158],{"class":674},"# configuration names an S3 bucket.\n",[564,1160,1162],{"class":566,"line":1161},26,[564,1163,741],{"emptyLinePlaceholder":740},[564,1165,1167],{"class":566,"line":1166},27,[564,1168,1169],{"class":570},"---\n",[564,1171,1173],{"class":566,"line":1172},28,[564,1174,1175],{"class":674},"# Postgres with the German dictionary DDM searches with, by its major — never\n",[564,1177,1179],{"class":566,"line":1178},29,[564,1180,1181],{"class":674},"# updated with the rest: a new major needs its data upgraded by hand.\n",[564,1183,1185,1189,1191],{"class":566,"line":1184},30,[564,1186,1188],{"class":1187},"swJcz","apiVersion",[564,1190,664],{"class":624},[564,1192,1193],{"class":574}," v1\n",[564,1195,1197,1200,1202],{"class":566,"line":1196},31,[564,1198,1199],{"class":1187},"kind",[564,1201,664],{"class":624},[564,1203,1204],{"class":574}," Service\n",[564,1206,1208,1211],{"class":566,"line":1207},32,[564,1209,1210],{"class":1187},"metadata",[564,1212,1213],{"class":624},":\n",[564,1215,1217,1220,1222],{"class":566,"line":1216},33,[564,1218,1219],{"class":1187},"  name",[564,1221,664],{"class":624},[564,1223,1224],{"class":574}," postgres\n",[564,1226,1228,1231],{"class":566,"line":1227},34,[564,1229,1230],{"class":1187},"spec",[564,1232,1213],{"class":624},[564,1234,1236,1239],{"class":566,"line":1235},35,[564,1237,1238],{"class":1187},"  selector",[564,1240,1213],{"class":624},[564,1242,1244,1247,1249],{"class":566,"line":1243},36,[564,1245,1246],{"class":1187},"    app.kubernetes.io\u002Fname",[564,1248,664],{"class":624},[564,1250,1224],{"class":574},[564,1252,1254,1257],{"class":566,"line":1253},37,[564,1255,1256],{"class":1187},"  ports",[564,1258,1213],{"class":624},[564,1260,1262,1265,1268,1270],{"class":566,"line":1261},38,[564,1263,1264],{"class":624},"    -",[564,1266,1267],{"class":1187}," name",[564,1269,664],{"class":624},[564,1271,1224],{"class":574},[564,1273,1275,1278,1280],{"class":566,"line":1274},39,[564,1276,1277],{"class":1187},"      port",[564,1279,664],{"class":624},[564,1281,1283],{"class":1282},"sbssI"," 5432\n",[564,1285,1287],{"class":566,"line":1286},40,[564,1288,1169],{"class":570},[564,1290,1292,1294,1296],{"class":566,"line":1291},41,[564,1293,1188],{"class":1187},[564,1295,664],{"class":624},[564,1297,1298],{"class":574}," apps\u002Fv1\n",[564,1300,1302,1304,1306],{"class":566,"line":1301},42,[564,1303,1199],{"class":1187},[564,1305,664],{"class":624},[564,1307,1308],{"class":574}," StatefulSet\n",[564,1310,1312,1314],{"class":566,"line":1311},43,[564,1313,1210],{"class":1187},[564,1315,1213],{"class":624},[564,1317,1319,1321,1323],{"class":566,"line":1318},44,[564,1320,1219],{"class":1187},[564,1322,664],{"class":624},[564,1324,1224],{"class":574},[564,1326,1328,1330],{"class":566,"line":1327},45,[564,1329,1230],{"class":1187},[564,1331,1213],{"class":624},[564,1333,1335,1338,1340],{"class":566,"line":1334},46,[564,1336,1337],{"class":1187},"  serviceName",[564,1339,664],{"class":624},[564,1341,1224],{"class":574},[564,1343,1345,1348,1350],{"class":566,"line":1344},47,[564,1346,1347],{"class":1187},"  replicas",[564,1349,664],{"class":624},[564,1351,1352],{"class":1282}," 1\n",[564,1354,1356,1358],{"class":566,"line":1355},48,[564,1357,1238],{"class":1187},[564,1359,1213],{"class":624},[564,1361,1363,1366],{"class":566,"line":1362},49,[564,1364,1365],{"class":1187},"    matchLabels",[564,1367,1213],{"class":624},[564,1369,1371,1374,1376],{"class":566,"line":1370},50,[564,1372,1373],{"class":1187},"      app.kubernetes.io\u002Fname",[564,1375,664],{"class":624},[564,1377,1224],{"class":574},[564,1379,1381,1384],{"class":566,"line":1380},51,[564,1382,1383],{"class":1187},"  template",[564,1385,1213],{"class":624},[564,1387,1389,1392],{"class":566,"line":1388},52,[564,1390,1391],{"class":1187},"    metadata",[564,1393,1213],{"class":624},[564,1395,1397,1400],{"class":566,"line":1396},53,[564,1398,1399],{"class":1187},"      labels",[564,1401,1213],{"class":624},[564,1403,1405,1408,1410],{"class":566,"line":1404},54,[564,1406,1407],{"class":1187},"        app.kubernetes.io\u002Fname",[564,1409,664],{"class":624},[564,1411,1224],{"class":574},[564,1413,1415,1418],{"class":566,"line":1414},55,[564,1416,1417],{"class":1187},"    spec",[564,1419,1213],{"class":624},[564,1421,1423,1426],{"class":566,"line":1422},56,[564,1424,1425],{"class":1187},"      imagePullSecrets",[564,1427,1213],{"class":624},[564,1429,1431,1434,1436,1438],{"class":566,"line":1430},57,[564,1432,1433],{"class":624},"        -",[564,1435,1267],{"class":1187},[564,1437,664],{"class":624},[564,1439,1440],{"class":574}," ddm-registry\n",[564,1442,1444],{"class":566,"line":1443},58,[564,1445,1446],{"class":674},"      # As the image's `postgres` user (70) from the start — no root to drop\n",[564,1448,1450],{"class":566,"line":1449},59,[564,1451,1452],{"class":674},"      # from — the volume made its group's.\n",[564,1454,1456,1459],{"class":566,"line":1455},60,[564,1457,1458],{"class":1187},"      securityContext",[564,1460,1213],{"class":624},[564,1462,1464,1467,1469],{"class":566,"line":1463},61,[564,1465,1466],{"class":1187},"        runAsNonRoot",[564,1468,664],{"class":624},[564,1470,1472],{"class":1471},"sfNiH"," true\n",[564,1474,1476,1479,1481],{"class":566,"line":1475},62,[564,1477,1478],{"class":1187},"        runAsUser",[564,1480,664],{"class":624},[564,1482,1483],{"class":1282}," 70\n",[564,1485,1487,1490,1492],{"class":566,"line":1486},63,[564,1488,1489],{"class":1187},"        runAsGroup",[564,1491,664],{"class":624},[564,1493,1483],{"class":1282},[564,1495,1497,1500,1502],{"class":566,"line":1496},64,[564,1498,1499],{"class":1187},"        fsGroup",[564,1501,664],{"class":624},[564,1503,1483],{"class":1282},[564,1505,1507,1510],{"class":566,"line":1506},65,[564,1508,1509],{"class":1187},"        seccompProfile",[564,1511,1213],{"class":624},[564,1513,1515,1518,1520],{"class":566,"line":1514},66,[564,1516,1517],{"class":1187},"          type",[564,1519,664],{"class":624},[564,1521,1522],{"class":574}," RuntimeDefault\n",[564,1524,1526,1529],{"class":566,"line":1525},67,[564,1527,1528],{"class":1187},"      containers",[564,1530,1213],{"class":624},[564,1532,1534,1536,1538,1540],{"class":566,"line":1533},68,[564,1535,1433],{"class":624},[564,1537,1267],{"class":1187},[564,1539,664],{"class":624},[564,1541,1224],{"class":574},[564,1543,1545,1548,1550],{"class":566,"line":1544},69,[564,1546,1547],{"class":1187},"          image",[564,1549,664],{"class":624},[564,1551,1552],{"class":574}," registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Fpostgres:18\n",[564,1554,1556],{"class":566,"line":1555},70,[564,1557,1558],{"class":674},"          # Postgres' own fixes come under the same tag: a restart brings them (user guide, „Postgres\").\n",[564,1560,1562,1565,1567],{"class":566,"line":1561},71,[564,1563,1564],{"class":1187},"          imagePullPolicy",[564,1566,664],{"class":624},[564,1568,1569],{"class":574}," Always\n",[564,1571,1573,1576],{"class":566,"line":1572},72,[564,1574,1575],{"class":1187},"          securityContext",[564,1577,1213],{"class":624},[564,1579,1581,1584,1586],{"class":566,"line":1580},73,[564,1582,1583],{"class":1187},"            allowPrivilegeEscalation",[564,1585,664],{"class":624},[564,1587,1588],{"class":1471}," false\n",[564,1590,1592,1595,1597],{"class":566,"line":1591},74,[564,1593,1594],{"class":1187},"            readOnlyRootFilesystem",[564,1596,664],{"class":624},[564,1598,1472],{"class":1471},[564,1600,1602,1605],{"class":566,"line":1601},75,[564,1603,1604],{"class":1187},"            capabilities",[564,1606,1213],{"class":624},[564,1608,1610,1613,1615,1618,1621],{"class":566,"line":1609},76,[564,1611,1612],{"class":1187},"              drop",[564,1614,664],{"class":624},[564,1616,1617],{"class":624}," [",[564,1619,1620],{"class":574},"ALL",[564,1622,1623],{"class":624},"]\n",[564,1625,1627,1630],{"class":566,"line":1626},77,[564,1628,1629],{"class":1187},"          env",[564,1631,1213],{"class":624},[564,1633,1635,1638,1640,1642],{"class":566,"line":1634},78,[564,1636,1637],{"class":624},"            -",[564,1639,1267],{"class":1187},[564,1641,664],{"class":624},[564,1643,1644],{"class":574}," POSTGRES_USER\n",[564,1646,1648,1651,1653],{"class":566,"line":1647},79,[564,1649,1650],{"class":1187},"              value",[564,1652,664],{"class":624},[564,1654,581],{"class":574},[564,1656,1658,1660,1662,1664],{"class":566,"line":1657},80,[564,1659,1637],{"class":624},[564,1661,1267],{"class":1187},[564,1663,664],{"class":624},[564,1665,1666],{"class":574}," POSTGRES_DB\n",[564,1668,1670,1672,1674],{"class":566,"line":1669},81,[564,1671,1650],{"class":1187},[564,1673,664],{"class":624},[564,1675,581],{"class":574},[564,1677,1679,1681,1683,1685],{"class":566,"line":1678},82,[564,1680,1637],{"class":624},[564,1682,1267],{"class":1187},[564,1684,664],{"class":624},[564,1686,1687],{"class":574}," POSTGRES_PASSWORD\n",[564,1689,1691,1694],{"class":566,"line":1690},83,[564,1692,1693],{"class":1187},"              valueFrom",[564,1695,1213],{"class":624},[564,1697,1699,1702],{"class":566,"line":1698},84,[564,1700,1701],{"class":1187},"                secretKeyRef",[564,1703,1213],{"class":624},[564,1705,1707,1710,1712],{"class":566,"line":1706},85,[564,1708,1709],{"class":1187},"                  name",[564,1711,664],{"class":624},[564,1713,581],{"class":574},[564,1715,1717,1720,1722],{"class":566,"line":1716},86,[564,1718,1719],{"class":1187},"                  key",[564,1721,664],{"class":624},[564,1723,1687],{"class":574},[564,1725,1727,1730],{"class":566,"line":1726},87,[564,1728,1729],{"class":1187},"          ports",[564,1731,1213],{"class":624},[564,1733,1735,1737,1739,1741],{"class":566,"line":1734},88,[564,1736,1637],{"class":624},[564,1738,1267],{"class":1187},[564,1740,664],{"class":624},[564,1742,1224],{"class":574},[564,1744,1746,1749,1751],{"class":566,"line":1745},89,[564,1747,1748],{"class":1187},"              containerPort",[564,1750,664],{"class":624},[564,1752,1283],{"class":1282},[564,1754,1756,1759],{"class":566,"line":1755},90,[564,1757,1758],{"class":1187},"          readinessProbe",[564,1760,1213],{"class":624},[564,1762,1764,1767],{"class":566,"line":1763},91,[564,1765,1766],{"class":1187},"            exec",[564,1768,1213],{"class":624},[564,1770,1772,1775,1777,1779,1782,1785,1788,1790,1792,1794,1797,1799,1801],{"class":566,"line":1771},92,[564,1773,1774],{"class":1187},"              command",[564,1776,664],{"class":624},[564,1778,1617],{"class":624},[564,1780,1781],{"class":574},"pg_isready",[564,1783,1784],{"class":624},",",[564,1786,1787],{"class":574}," -U",[564,1789,1784],{"class":624},[564,1791,592],{"class":574},[564,1793,1784],{"class":624},[564,1795,1796],{"class":574}," -d",[564,1798,1784],{"class":624},[564,1800,592],{"class":574},[564,1802,1623],{"class":624},[564,1804,1806,1809,1811],{"class":566,"line":1805},93,[564,1807,1808],{"class":1187},"            periodSeconds",[564,1810,664],{"class":624},[564,1812,1813],{"class":1282}," 5\n",[564,1815,1817,1820],{"class":566,"line":1816},94,[564,1818,1819],{"class":1187},"          resources",[564,1821,1213],{"class":624},[564,1823,1825,1828],{"class":566,"line":1824},95,[564,1826,1827],{"class":1187},"            requests",[564,1829,1213],{"class":624},[564,1831,1833,1836,1838],{"class":566,"line":1832},96,[564,1834,1835],{"class":1187},"              cpu",[564,1837,664],{"class":624},[564,1839,1840],{"class":574}," 250m\n",[564,1842,1844,1847,1849],{"class":566,"line":1843},97,[564,1845,1846],{"class":1187},"              memory",[564,1848,664],{"class":624},[564,1850,1851],{"class":574}," 512Mi\n",[564,1853,1855,1858],{"class":566,"line":1854},98,[564,1856,1857],{"class":1187},"            limits",[564,1859,1213],{"class":624},[564,1861,1863,1865,1867],{"class":566,"line":1862},99,[564,1864,1846],{"class":1187},[564,1866,664],{"class":624},[564,1868,1869],{"class":574}," 2Gi\n",[564,1871,1873,1876],{"class":566,"line":1872},100,[564,1874,1875],{"class":1187},"          volumeMounts",[564,1877,1213],{"class":624},[564,1879,1881,1883,1885,1887],{"class":566,"line":1880},101,[564,1882,1637],{"class":624},[564,1884,1267],{"class":1187},[564,1886,664],{"class":624},[564,1888,1224],{"class":574},[564,1890,1892,1895,1897],{"class":566,"line":1891},102,[564,1893,1894],{"class":1187},"              mountPath",[564,1896,664],{"class":624},[564,1898,1899],{"class":574}," \u002Fvar\u002Flib\u002Fpostgresql\n",[564,1901,1903],{"class":566,"line":1902},103,[564,1904,1905],{"class":674},"            # Writable besides its data: the socket, and scratch.\n",[564,1907,1909,1911,1913,1915],{"class":566,"line":1908},104,[564,1910,1637],{"class":624},[564,1912,1267],{"class":1187},[564,1914,664],{"class":624},[564,1916,1917],{"class":574}," run\n",[564,1919,1921,1923,1925],{"class":566,"line":1920},105,[564,1922,1894],{"class":1187},[564,1924,664],{"class":624},[564,1926,1927],{"class":574}," \u002Fvar\u002Frun\u002Fpostgresql\n",[564,1929,1931,1933,1935,1937],{"class":566,"line":1930},106,[564,1932,1637],{"class":624},[564,1934,1267],{"class":1187},[564,1936,664],{"class":624},[564,1938,1939],{"class":574}," tmp\n",[564,1941,1943,1945,1947],{"class":566,"line":1942},107,[564,1944,1894],{"class":1187},[564,1946,664],{"class":624},[564,1948,1949],{"class":574}," \u002Ftmp\n",[564,1951,1953,1956],{"class":566,"line":1952},108,[564,1954,1955],{"class":1187},"      volumes",[564,1957,1213],{"class":624},[564,1959,1961,1963,1965,1967],{"class":566,"line":1960},109,[564,1962,1433],{"class":624},[564,1964,1267],{"class":1187},[564,1966,664],{"class":624},[564,1968,1917],{"class":574},[564,1970,1972,1975,1977],{"class":566,"line":1971},110,[564,1973,1974],{"class":1187},"          emptyDir",[564,1976,664],{"class":624},[564,1978,1979],{"class":624}," {}\n",[564,1981,1983,1985,1987,1989],{"class":566,"line":1982},111,[564,1984,1433],{"class":624},[564,1986,1267],{"class":1187},[564,1988,664],{"class":624},[564,1990,1939],{"class":574},[564,1992,1994,1996,1998],{"class":566,"line":1993},112,[564,1995,1974],{"class":1187},[564,1997,664],{"class":624},[564,1999,1979],{"class":624},[564,2001,2003,2006],{"class":566,"line":2002},113,[564,2004,2005],{"class":1187},"  volumeClaimTemplates",[564,2007,1213],{"class":624},[564,2009,2011,2013,2016],{"class":566,"line":2010},114,[564,2012,1264],{"class":624},[564,2014,2015],{"class":1187}," metadata",[564,2017,1213],{"class":624},[564,2019,2021,2024,2026],{"class":566,"line":2020},115,[564,2022,2023],{"class":1187},"        name",[564,2025,664],{"class":624},[564,2027,1224],{"class":574},[564,2029,2031,2034],{"class":566,"line":2030},116,[564,2032,2033],{"class":1187},"      spec",[564,2035,1213],{"class":624},[564,2037,2039,2042,2044,2046,2049],{"class":566,"line":2038},117,[564,2040,2041],{"class":1187},"        accessModes",[564,2043,664],{"class":624},[564,2045,1617],{"class":624},[564,2047,2048],{"class":574},"ReadWriteOnce",[564,2050,1623],{"class":624},[564,2052,2054,2057],{"class":566,"line":2053},118,[564,2055,2056],{"class":1187},"        resources",[564,2058,1213],{"class":624},[564,2060,2062,2065],{"class":566,"line":2061},119,[564,2063,2064],{"class":1187},"          requests",[564,2066,1213],{"class":624},[564,2068,2070,2073,2075],{"class":566,"line":2069},120,[564,2071,2072],{"class":1187},"            storage",[564,2074,664],{"class":624},[564,2076,2077],{"class":574}," 20Gi\n",[564,2079,2081],{"class":566,"line":2080},121,[564,2082,1169],{"class":570},[564,2084,2086],{"class":566,"line":2085},122,[564,2087,2088],{"class":674},"# The documents, and the database's dumps taken before each migration (the\n",[564,2090,2092],{"class":566,"line":2091},123,[564,2093,2094],{"class":674},"# last three): read and written by the cms and the render worker, which may\n",[564,2096,2098],{"class":566,"line":2097},124,[564,2099,2100],{"class":674},"# run on different nodes. With an S3 bucket configured (`S3_ENDPOINT`) nothing\n",[564,2102,2104],{"class":566,"line":2103},125,[564,2105,2106],{"class":674},"# is kept here, and its size may be small.\n",[564,2108,2110,2112,2114],{"class":566,"line":2109},126,[564,2111,1188],{"class":1187},[564,2113,664],{"class":624},[564,2115,1193],{"class":574},[564,2117,2119,2121,2123],{"class":566,"line":2118},127,[564,2120,1199],{"class":1187},[564,2122,664],{"class":624},[564,2124,2125],{"class":574}," PersistentVolumeClaim\n",[564,2127,2129,2131],{"class":566,"line":2128},128,[564,2130,1210],{"class":1187},[564,2132,1213],{"class":624},[564,2134,2136,2138,2140],{"class":566,"line":2135},129,[564,2137,1219],{"class":1187},[564,2139,664],{"class":624},[564,2141,2142],{"class":574}," ddm-data\n",[564,2144,2146,2148],{"class":566,"line":2145},130,[564,2147,1230],{"class":1187},[564,2149,1213],{"class":624},[564,2151,2153,2156,2158,2160,2162],{"class":566,"line":2152},131,[564,2154,2155],{"class":1187},"  accessModes",[564,2157,664],{"class":624},[564,2159,1617],{"class":624},[564,2161,537],{"class":574},[564,2163,1623],{"class":624},[564,2165,2167,2170],{"class":566,"line":2166},132,[564,2168,2169],{"class":1187},"  resources",[564,2171,1213],{"class":624},[564,2173,2175,2178],{"class":566,"line":2174},133,[564,2176,2177],{"class":1187},"    requests",[564,2179,1213],{"class":624},[564,2181,2183,2186,2188],{"class":566,"line":2182},134,[564,2184,2185],{"class":1187},"      storage",[564,2187,664],{"class":624},[564,2189,2190],{"class":574}," 100Gi\n",[564,2192,2194],{"class":566,"line":2193},135,[564,2195,1169],{"class":570},[564,2197,2199],{"class":566,"line":2198},136,[564,2200,2201],{"class":674},"# The management app, and the API the reader app, the render worker's\n",[564,2203,2205],{"class":566,"line":2204},137,[564,2206,2207],{"class":674},"# documents and every integration go through. One replica, replaced rather\n",[564,2209,2211],{"class":566,"line":2210},138,[564,2212,2213],{"class":674},"# than rolled: it runs the scheduled tasks, and migrates the database to its\n",[564,2215,2217],{"class":566,"line":2216},139,[564,2218,2219],{"class":674},"# release before it answers.\n",[564,2221,2223,2225,2227],{"class":566,"line":2222},140,[564,2224,1188],{"class":1187},[564,2226,664],{"class":624},[564,2228,1193],{"class":574},[564,2230,2232,2234,2236],{"class":566,"line":2231},141,[564,2233,1199],{"class":1187},[564,2235,664],{"class":624},[564,2237,1204],{"class":574},[564,2239,2241,2243],{"class":566,"line":2240},142,[564,2242,1210],{"class":1187},[564,2244,1213],{"class":624},[564,2246,2248,2250,2252],{"class":566,"line":2247},143,[564,2249,1219],{"class":1187},[564,2251,664],{"class":624},[564,2253,2254],{"class":574}," cms\n",[564,2256,2258,2260],{"class":566,"line":2257},144,[564,2259,1230],{"class":1187},[564,2261,1213],{"class":624},[564,2263,2265,2267],{"class":566,"line":2264},145,[564,2266,1238],{"class":1187},[564,2268,1213],{"class":624},[564,2270,2272,2274,2276],{"class":566,"line":2271},146,[564,2273,1246],{"class":1187},[564,2275,664],{"class":624},[564,2277,2254],{"class":574},[564,2279,2281,2283],{"class":566,"line":2280},147,[564,2282,1256],{"class":1187},[564,2284,1213],{"class":624},[564,2286,2288,2290,2292,2294],{"class":566,"line":2287},148,[564,2289,1264],{"class":624},[564,2291,1267],{"class":1187},[564,2293,664],{"class":624},[564,2295,2296],{"class":574}," http\n",[564,2298,2300,2302,2304],{"class":566,"line":2299},149,[564,2301,1277],{"class":1187},[564,2303,664],{"class":624},[564,2305,2306],{"class":1282}," 3000\n",[564,2308,2310,2313,2315],{"class":566,"line":2309},150,[564,2311,2312],{"class":1187},"      targetPort",[564,2314,664],{"class":624},[564,2316,2296],{"class":574},[564,2318,2320],{"class":566,"line":2319},151,[564,2321,1169],{"class":570},[564,2323,2325,2327,2329],{"class":566,"line":2324},152,[564,2326,1188],{"class":1187},[564,2328,664],{"class":624},[564,2330,1298],{"class":574},[564,2332,2334,2336,2338],{"class":566,"line":2333},153,[564,2335,1199],{"class":1187},[564,2337,664],{"class":624},[564,2339,2340],{"class":574}," Deployment\n",[564,2342,2344,2346],{"class":566,"line":2343},154,[564,2345,1210],{"class":1187},[564,2347,1213],{"class":624},[564,2349,2351,2353,2355],{"class":566,"line":2350},155,[564,2352,1219],{"class":1187},[564,2354,664],{"class":624},[564,2356,2254],{"class":574},[564,2358,2360,2362],{"class":566,"line":2359},156,[564,2361,1230],{"class":1187},[564,2363,1213],{"class":624},[564,2365,2367,2369,2371],{"class":566,"line":2366},157,[564,2368,1347],{"class":1187},[564,2370,664],{"class":624},[564,2372,1352],{"class":1282},[564,2374,2376,2379],{"class":566,"line":2375},158,[564,2377,2378],{"class":1187},"  strategy",[564,2380,1213],{"class":624},[564,2382,2384,2387,2389],{"class":566,"line":2383},159,[564,2385,2386],{"class":1187},"    type",[564,2388,664],{"class":624},[564,2390,2391],{"class":574}," Recreate\n",[564,2393,2395,2397],{"class":566,"line":2394},160,[564,2396,1238],{"class":1187},[564,2398,1213],{"class":624},[564,2400,2402,2404],{"class":566,"line":2401},161,[564,2403,1365],{"class":1187},[564,2405,1213],{"class":624},[564,2407,2409,2411,2413],{"class":566,"line":2408},162,[564,2410,1373],{"class":1187},[564,2412,664],{"class":624},[564,2414,2254],{"class":574},[564,2416,2418,2420],{"class":566,"line":2417},163,[564,2419,1383],{"class":1187},[564,2421,1213],{"class":624},[564,2423,2425,2427],{"class":566,"line":2424},164,[564,2426,1391],{"class":1187},[564,2428,1213],{"class":624},[564,2430,2432,2434],{"class":566,"line":2431},165,[564,2433,1399],{"class":1187},[564,2435,1213],{"class":624},[564,2437,2439,2441,2443],{"class":566,"line":2438},166,[564,2440,1407],{"class":1187},[564,2442,664],{"class":624},[564,2444,2254],{"class":574},[564,2446,2448,2450],{"class":566,"line":2447},167,[564,2449,1417],{"class":1187},[564,2451,1213],{"class":624},[564,2453,2455,2457],{"class":566,"line":2454},168,[564,2456,1425],{"class":1187},[564,2458,1213],{"class":624},[564,2460,2462,2464,2466,2468],{"class":566,"line":2461},169,[564,2463,1433],{"class":624},[564,2465,1267],{"class":1187},[564,2467,664],{"class":624},[564,2469,1440],{"class":574},[564,2471,2473,2475],{"class":566,"line":2472},170,[564,2474,1458],{"class":1187},[564,2476,1213],{"class":624},[564,2478,2480,2482,2484],{"class":566,"line":2479},171,[564,2481,1466],{"class":1187},[564,2483,664],{"class":624},[564,2485,1472],{"class":1471},[564,2487,2489,2491,2493],{"class":566,"line":2488},172,[564,2490,1478],{"class":1187},[564,2492,664],{"class":624},[564,2494,2495],{"class":1282}," 1000\n",[564,2497,2499,2501,2503],{"class":566,"line":2498},173,[564,2500,1489],{"class":1187},[564,2502,664],{"class":624},[564,2504,2495],{"class":1282},[564,2506,2508,2510,2512],{"class":566,"line":2507},174,[564,2509,1499],{"class":1187},[564,2511,664],{"class":624},[564,2513,2495],{"class":1282},[564,2515,2517,2519],{"class":566,"line":2516},175,[564,2518,1528],{"class":1187},[564,2520,1213],{"class":624},[564,2522,2524,2526,2528,2530],{"class":566,"line":2523},176,[564,2525,1433],{"class":624},[564,2527,1267],{"class":1187},[564,2529,664],{"class":624},[564,2531,2254],{"class":574},[564,2533,2535,2537,2539,2542],{"class":566,"line":2534},177,[564,2536,1547],{"class":1187},[564,2538,664],{"class":624},[564,2540,2541],{"class":574}," registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Fcms:latest",[564,2543,2544],{"class":674}," # {\"$imagepolicy\": \"flux-system:ddm-cms\"}\n",[564,2546,2548],{"class":566,"line":2547},178,[564,2549,2550],{"class":674},"          # Asked anew at every start: a tag that moves (`stable`, `0.26`) brings its newest image.\n",[564,2552,2554,2556,2558],{"class":566,"line":2553},179,[564,2555,1564],{"class":1187},[564,2557,664],{"class":624},[564,2559,1569],{"class":574},[564,2561,2563,2565],{"class":566,"line":2562},180,[564,2564,1575],{"class":1187},[564,2566,1213],{"class":624},[564,2568,2570,2572,2574],{"class":566,"line":2569},181,[564,2571,1583],{"class":1187},[564,2573,664],{"class":624},[564,2575,1588],{"class":1471},[564,2577,2579,2581,2583],{"class":566,"line":2578},182,[564,2580,1594],{"class":1187},[564,2582,664],{"class":624},[564,2584,1472],{"class":1471},[564,2586,2588,2590],{"class":566,"line":2587},183,[564,2589,1604],{"class":1187},[564,2591,1213],{"class":624},[564,2593,2595,2597,2599,2601,2603],{"class":566,"line":2594},184,[564,2596,1612],{"class":1187},[564,2598,664],{"class":624},[564,2600,1617],{"class":624},[564,2602,1620],{"class":574},[564,2604,1623],{"class":624},[564,2606,2608,2611],{"class":566,"line":2607},185,[564,2609,2610],{"class":1187},"          envFrom",[564,2612,1213],{"class":624},[564,2614,2616,2618,2621],{"class":566,"line":2615},186,[564,2617,1637],{"class":624},[564,2619,2620],{"class":1187}," configMapRef",[564,2622,1213],{"class":624},[564,2624,2626,2629,2631],{"class":566,"line":2625},187,[564,2627,2628],{"class":1187},"                name",[564,2630,664],{"class":624},[564,2632,581],{"class":574},[564,2634,2636,2638,2641],{"class":566,"line":2635},188,[564,2637,1637],{"class":624},[564,2639,2640],{"class":1187}," secretRef",[564,2642,1213],{"class":624},[564,2644,2646,2648,2650],{"class":566,"line":2645},189,[564,2647,2628],{"class":1187},[564,2649,664],{"class":624},[564,2651,581],{"class":574},[564,2653,2655,2657],{"class":566,"line":2654},190,[564,2656,1629],{"class":1187},[564,2658,1213],{"class":624},[564,2660,2662],{"class":566,"line":2661},191,[564,2663,2664],{"class":674},"            # Which version of this file this is: a release that needs a newer\n",[564,2666,2668],{"class":566,"line":2667},192,[564,2669,2670],{"class":674},"            # one says so to the administrators, rather than failing (user guide, „Updates\").\n",[564,2672,2674,2676,2678,2680],{"class":566,"line":2673},193,[564,2675,1637],{"class":624},[564,2677,1267],{"class":1187},[564,2679,664],{"class":624},[564,2681,2682],{"class":574}," DDM_DEPLOY_VERSION\n",[564,2684,2686,2688,2690,2693,2696],{"class":566,"line":2685},194,[564,2687,1650],{"class":1187},[564,2689,664],{"class":624},[564,2691,2692],{"class":624}," \"",[564,2694,2695],{"class":574},"1",[564,2697,2698],{"class":624},"\"\n",[564,2700,2702,2704,2706,2708],{"class":566,"line":2701},195,[564,2703,1637],{"class":624},[564,2705,1267],{"class":1187},[564,2707,664],{"class":624},[564,2709,2710],{"class":574}," DATABASE_URL\n",[564,2712,2714,2716,2718],{"class":566,"line":2713},196,[564,2715,1650],{"class":1187},[564,2717,664],{"class":624},[564,2719,2720],{"class":574}," postgres:\u002F\u002Fddm:$(POSTGRES_PASSWORD)@postgres:5432\u002Fddm\n",[564,2722,2724,2726,2728,2730],{"class":566,"line":2723},197,[564,2725,1637],{"class":624},[564,2727,1267],{"class":1187},[564,2729,664],{"class":624},[564,2731,2732],{"class":574}," BETTER_AUTH_URL\n",[564,2734,2736,2738,2740],{"class":566,"line":2735},198,[564,2737,1650],{"class":1187},[564,2739,664],{"class":624},[564,2741,2742],{"class":574}," https:\u002F\u002F$(DDM_CMS_HOST)\n",[564,2744,2746,2748,2750,2752],{"class":566,"line":2745},199,[564,2747,1637],{"class":624},[564,2749,1267],{"class":1187},[564,2751,664],{"class":624},[564,2753,2754],{"class":574}," CLIENT_ORIGIN\n",[564,2756,2758,2760,2762],{"class":566,"line":2757},200,[564,2759,1650],{"class":1187},[564,2761,664],{"class":624},[564,2763,2764],{"class":574}," https:\u002F\u002F$(DDM_APP_HOST)\n",[564,2766,2768,2770,2772,2774],{"class":566,"line":2767},201,[564,2769,1637],{"class":624},[564,2771,1267],{"class":1187},[564,2773,664],{"class":624},[564,2775,2776],{"class":574}," STORAGE_DIR\n",[564,2778,2780,2782,2784],{"class":566,"line":2779},202,[564,2781,1650],{"class":1187},[564,2783,664],{"class":624},[564,2785,2786],{"class":574}," \u002Fdata\u002Fstorage\n",[564,2788,2790,2792,2794,2796],{"class":566,"line":2789},203,[564,2791,1637],{"class":624},[564,2793,1267],{"class":1187},[564,2795,664],{"class":624},[564,2797,2798],{"class":574}," BACKUP_DIR\n",[564,2800,2802,2804,2806],{"class":566,"line":2801},204,[564,2803,1650],{"class":1187},[564,2805,664],{"class":624},[564,2807,2808],{"class":574}," \u002Fdata\u002Fbackups\n",[564,2810,2812],{"class":566,"line":2811},205,[564,2813,2814],{"class":674},"            # Uploads are stored here and drawn by the render worker.\n",[564,2816,2818,2820,2822,2824],{"class":566,"line":2817},206,[564,2819,1637],{"class":624},[564,2821,1267],{"class":1187},[564,2823,664],{"class":624},[564,2825,2826],{"class":574}," RENDER_MODE\n",[564,2828,2830,2832,2834],{"class":566,"line":2829},207,[564,2831,1650],{"class":1187},[564,2833,664],{"class":624},[564,2835,2836],{"class":574}," worker\n",[564,2838,2840,2842],{"class":566,"line":2839},208,[564,2841,1729],{"class":1187},[564,2843,1213],{"class":624},[564,2845,2847,2849,2851,2853],{"class":566,"line":2846},209,[564,2848,1637],{"class":624},[564,2850,1267],{"class":1187},[564,2852,664],{"class":624},[564,2854,2296],{"class":574},[564,2856,2858,2860,2862],{"class":566,"line":2857},210,[564,2859,1748],{"class":1187},[564,2861,664],{"class":624},[564,2863,2306],{"class":1282},[564,2865,2867],{"class":566,"line":2866},211,[564,2868,2869],{"class":674},"          # Migrations first, on a new release: up to five minutes.\n",[564,2871,2873,2876],{"class":566,"line":2872},212,[564,2874,2875],{"class":1187},"          startupProbe",[564,2877,1213],{"class":624},[564,2879,2881,2884],{"class":566,"line":2880},213,[564,2882,2883],{"class":1187},"            httpGet",[564,2885,1213],{"class":624},[564,2887,2889,2892,2894],{"class":566,"line":2888},214,[564,2890,2891],{"class":1187},"              path",[564,2893,664],{"class":624},[564,2895,2896],{"class":574}," \u002Fapi\u002Fauth\u002Fok\n",[564,2898,2900,2903,2905],{"class":566,"line":2899},215,[564,2901,2902],{"class":1187},"              port",[564,2904,664],{"class":624},[564,2906,2296],{"class":574},[564,2908,2910,2912,2914],{"class":566,"line":2909},216,[564,2911,1808],{"class":1187},[564,2913,664],{"class":624},[564,2915,2916],{"class":1282}," 2\n",[564,2918,2920,2923,2925],{"class":566,"line":2919},217,[564,2921,2922],{"class":1187},"            failureThreshold",[564,2924,664],{"class":624},[564,2926,2927],{"class":1282}," 150\n",[564,2929,2931,2933],{"class":566,"line":2930},218,[564,2932,1758],{"class":1187},[564,2934,1213],{"class":624},[564,2936,2938,2940],{"class":566,"line":2937},219,[564,2939,2883],{"class":1187},[564,2941,1213],{"class":624},[564,2943,2945,2947,2949],{"class":566,"line":2944},220,[564,2946,2891],{"class":1187},[564,2948,664],{"class":624},[564,2950,2896],{"class":574},[564,2952,2954,2956,2958],{"class":566,"line":2953},221,[564,2955,2902],{"class":1187},[564,2957,664],{"class":624},[564,2959,2296],{"class":574},[564,2961,2963,2965,2967],{"class":566,"line":2962},222,[564,2964,1808],{"class":1187},[564,2966,664],{"class":624},[564,2968,2969],{"class":1282}," 10\n",[564,2971,2973,2976],{"class":566,"line":2972},223,[564,2974,2975],{"class":1187},"          livenessProbe",[564,2977,1213],{"class":624},[564,2979,2981,2983],{"class":566,"line":2980},224,[564,2982,2883],{"class":1187},[564,2984,1213],{"class":624},[564,2986,2988,2990,2992],{"class":566,"line":2987},225,[564,2989,2891],{"class":1187},[564,2991,664],{"class":624},[564,2993,2896],{"class":574},[564,2995,2997,2999,3001],{"class":566,"line":2996},226,[564,2998,2902],{"class":1187},[564,3000,664],{"class":624},[564,3002,2296],{"class":574},[564,3004,3006,3008,3010],{"class":566,"line":3005},227,[564,3007,1808],{"class":1187},[564,3009,664],{"class":624},[564,3011,3012],{"class":1282}," 30\n",[564,3014,3016,3019,3021],{"class":566,"line":3015},228,[564,3017,3018],{"class":1187},"            timeoutSeconds",[564,3020,664],{"class":624},[564,3022,1813],{"class":1282},[564,3024,3026,3028],{"class":566,"line":3025},229,[564,3027,1819],{"class":1187},[564,3029,1213],{"class":624},[564,3031,3033,3035],{"class":566,"line":3032},230,[564,3034,1827],{"class":1187},[564,3036,1213],{"class":624},[564,3038,3040,3042,3044],{"class":566,"line":3039},231,[564,3041,1835],{"class":1187},[564,3043,664],{"class":624},[564,3045,1840],{"class":574},[564,3047,3049,3051,3053],{"class":566,"line":3048},232,[564,3050,1846],{"class":1187},[564,3052,664],{"class":624},[564,3054,1851],{"class":574},[564,3056,3058,3060],{"class":566,"line":3057},233,[564,3059,1857],{"class":1187},[564,3061,1213],{"class":624},[564,3063,3065,3067,3069],{"class":566,"line":3064},234,[564,3066,1846],{"class":1187},[564,3068,664],{"class":624},[564,3070,1869],{"class":574},[564,3072,3074,3076],{"class":566,"line":3073},235,[564,3075,1875],{"class":1187},[564,3077,1213],{"class":624},[564,3079,3081,3083,3085,3087],{"class":566,"line":3080},236,[564,3082,1637],{"class":624},[564,3084,1267],{"class":1187},[564,3086,664],{"class":624},[564,3088,3089],{"class":574}," data\n",[564,3091,3093,3095,3097],{"class":566,"line":3092},237,[564,3094,1894],{"class":1187},[564,3096,664],{"class":624},[564,3098,3099],{"class":574}," \u002Fdata\n",[564,3101,3103],{"class":566,"line":3102},238,[564,3104,3105],{"class":674},"            # The one place written besides `\u002Fdata`: uploads on their way, LibreOffice's profiles.\n",[564,3107,3109,3111,3113,3115],{"class":566,"line":3108},239,[564,3110,1637],{"class":624},[564,3112,1267],{"class":1187},[564,3114,664],{"class":624},[564,3116,1939],{"class":574},[564,3118,3120,3122,3124],{"class":566,"line":3119},240,[564,3121,1894],{"class":1187},[564,3123,664],{"class":624},[564,3125,1949],{"class":574},[564,3127,3129,3131],{"class":566,"line":3128},241,[564,3130,1955],{"class":1187},[564,3132,1213],{"class":624},[564,3134,3136,3138,3140,3142],{"class":566,"line":3135},242,[564,3137,1433],{"class":624},[564,3139,1267],{"class":1187},[564,3141,664],{"class":624},[564,3143,3089],{"class":574},[564,3145,3147,3150],{"class":566,"line":3146},243,[564,3148,3149],{"class":1187},"          persistentVolumeClaim",[564,3151,1213],{"class":624},[564,3153,3155,3158,3160],{"class":566,"line":3154},244,[564,3156,3157],{"class":1187},"            claimName",[564,3159,664],{"class":624},[564,3161,2142],{"class":574},[564,3163,3165,3167,3169,3171],{"class":566,"line":3164},245,[564,3166,1433],{"class":624},[564,3168,1267],{"class":1187},[564,3170,664],{"class":624},[564,3172,1939],{"class":574},[564,3174,3176,3178,3180],{"class":566,"line":3175},246,[564,3177,1974],{"class":1187},[564,3179,664],{"class":624},[564,3181,1979],{"class":624},[564,3183,3185],{"class":566,"line":3184},247,[564,3186,1169],{"class":570},[564,3188,3190],{"class":566,"line":3189},248,[564,3191,3192],{"class":674},"# Reads the text, draws the thumbnails and converts the Office files of what\n",[564,3194,3196],{"class":566,"line":3195},249,[564,3197,3198],{"class":674},"# is uploaded, sharing the work through the database: more replicas for more\n",[564,3200,3202],{"class":566,"line":3201},250,[564,3203,3204],{"class":674},"# imports. Each finishes the documents in hand before it stops — LibreOffice\n",[564,3206,3208],{"class":566,"line":3207},251,[564,3209,3210],{"class":674},"# may take minutes over a large deck.\n",[564,3212,3214,3216,3218],{"class":566,"line":3213},252,[564,3215,1188],{"class":1187},[564,3217,664],{"class":624},[564,3219,1298],{"class":574},[564,3221,3223,3225,3227],{"class":566,"line":3222},253,[564,3224,1199],{"class":1187},[564,3226,664],{"class":624},[564,3228,2340],{"class":574},[564,3230,3232,3234],{"class":566,"line":3231},254,[564,3233,1210],{"class":1187},[564,3235,1213],{"class":624},[564,3237,3239,3241,3243],{"class":566,"line":3238},255,[564,3240,1219],{"class":1187},[564,3242,664],{"class":624},[564,3244,3245],{"class":574}," render-worker\n",[564,3247,3249,3251],{"class":566,"line":3248},256,[564,3250,1230],{"class":1187},[564,3252,1213],{"class":624},[564,3254,3256,3258,3260],{"class":566,"line":3255},257,[564,3257,1347],{"class":1187},[564,3259,664],{"class":624},[564,3261,1352],{"class":1282},[564,3263,3265,3267],{"class":566,"line":3264},258,[564,3266,1238],{"class":1187},[564,3268,1213],{"class":624},[564,3270,3272,3274],{"class":566,"line":3271},259,[564,3273,1365],{"class":1187},[564,3275,1213],{"class":624},[564,3277,3279,3281,3283],{"class":566,"line":3278},260,[564,3280,1373],{"class":1187},[564,3282,664],{"class":624},[564,3284,3245],{"class":574},[564,3286,3288,3290],{"class":566,"line":3287},261,[564,3289,1383],{"class":1187},[564,3291,1213],{"class":624},[564,3293,3295,3297],{"class":566,"line":3294},262,[564,3296,1391],{"class":1187},[564,3298,1213],{"class":624},[564,3300,3302,3304],{"class":566,"line":3301},263,[564,3303,1399],{"class":1187},[564,3305,1213],{"class":624},[564,3307,3309,3311,3313],{"class":566,"line":3308},264,[564,3310,1407],{"class":1187},[564,3312,664],{"class":624},[564,3314,3245],{"class":574},[564,3316,3318,3320],{"class":566,"line":3317},265,[564,3319,1417],{"class":1187},[564,3321,1213],{"class":624},[564,3323,3325,3327],{"class":566,"line":3324},266,[564,3326,1425],{"class":1187},[564,3328,1213],{"class":624},[564,3330,3332,3334,3336,3338],{"class":566,"line":3331},267,[564,3333,1433],{"class":624},[564,3335,1267],{"class":1187},[564,3337,664],{"class":624},[564,3339,1440],{"class":574},[564,3341,3343,3345],{"class":566,"line":3342},268,[564,3344,1458],{"class":1187},[564,3346,1213],{"class":624},[564,3348,3350,3352,3354],{"class":566,"line":3349},269,[564,3351,1466],{"class":1187},[564,3353,664],{"class":624},[564,3355,1472],{"class":1471},[564,3357,3359,3361,3363],{"class":566,"line":3358},270,[564,3360,1478],{"class":1187},[564,3362,664],{"class":624},[564,3364,2495],{"class":1282},[564,3366,3368,3370,3372],{"class":566,"line":3367},271,[564,3369,1489],{"class":1187},[564,3371,664],{"class":624},[564,3373,2495],{"class":1282},[564,3375,3377,3379,3381],{"class":566,"line":3376},272,[564,3378,1499],{"class":1187},[564,3380,664],{"class":624},[564,3382,2495],{"class":1282},[564,3384,3386,3389,3391],{"class":566,"line":3385},273,[564,3387,3388],{"class":1187},"      terminationGracePeriodSeconds",[564,3390,664],{"class":624},[564,3392,3393],{"class":1282}," 660\n",[564,3395,3397,3399],{"class":566,"line":3396},274,[564,3398,1528],{"class":1187},[564,3400,1213],{"class":624},[564,3402,3404,3406,3408,3410],{"class":566,"line":3403},275,[564,3405,1433],{"class":624},[564,3407,1267],{"class":1187},[564,3409,664],{"class":624},[564,3411,3245],{"class":574},[564,3413,3415,3417,3419,3422],{"class":566,"line":3414},276,[564,3416,1547],{"class":1187},[564,3418,664],{"class":624},[564,3420,3421],{"class":574}," registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Frender-worker:latest",[564,3423,3424],{"class":674}," # {\"$imagepolicy\": \"flux-system:ddm-render-worker\"}\n",[564,3426,3428,3430,3432],{"class":566,"line":3427},277,[564,3429,1564],{"class":1187},[564,3431,664],{"class":624},[564,3433,1569],{"class":574},[564,3435,3437,3439],{"class":566,"line":3436},278,[564,3438,1575],{"class":1187},[564,3440,1213],{"class":624},[564,3442,3444,3446,3448],{"class":566,"line":3443},279,[564,3445,1583],{"class":1187},[564,3447,664],{"class":624},[564,3449,1588],{"class":1471},[564,3451,3453,3455,3457],{"class":566,"line":3452},280,[564,3454,1594],{"class":1187},[564,3456,664],{"class":624},[564,3458,1472],{"class":1471},[564,3460,3462,3464],{"class":566,"line":3461},281,[564,3463,1604],{"class":1187},[564,3465,1213],{"class":624},[564,3467,3469,3471,3473,3475,3477],{"class":566,"line":3468},282,[564,3470,1612],{"class":1187},[564,3472,664],{"class":624},[564,3474,1617],{"class":624},[564,3476,1620],{"class":574},[564,3478,1623],{"class":624},[564,3480,3482,3484],{"class":566,"line":3481},283,[564,3483,2610],{"class":1187},[564,3485,1213],{"class":624},[564,3487,3489,3491,3493],{"class":566,"line":3488},284,[564,3490,1637],{"class":624},[564,3492,2620],{"class":1187},[564,3494,1213],{"class":624},[564,3496,3498,3500,3502],{"class":566,"line":3497},285,[564,3499,2628],{"class":1187},[564,3501,664],{"class":624},[564,3503,581],{"class":574},[564,3505,3507,3509,3511],{"class":566,"line":3506},286,[564,3508,1637],{"class":624},[564,3510,2640],{"class":1187},[564,3512,1213],{"class":624},[564,3514,3516,3518,3520],{"class":566,"line":3515},287,[564,3517,2628],{"class":1187},[564,3519,664],{"class":624},[564,3521,581],{"class":574},[564,3523,3525,3527],{"class":566,"line":3524},288,[564,3526,1629],{"class":1187},[564,3528,1213],{"class":624},[564,3530,3532,3534,3536,3538],{"class":566,"line":3531},289,[564,3533,1637],{"class":624},[564,3535,1267],{"class":1187},[564,3537,664],{"class":624},[564,3539,2710],{"class":574},[564,3541,3543,3545,3547],{"class":566,"line":3542},290,[564,3544,1650],{"class":1187},[564,3546,664],{"class":624},[564,3548,2720],{"class":574},[564,3550,3552,3554,3556,3558],{"class":566,"line":3551},291,[564,3553,1637],{"class":624},[564,3555,1267],{"class":1187},[564,3557,664],{"class":624},[564,3559,2776],{"class":574},[564,3561,3563,3565,3567],{"class":566,"line":3562},292,[564,3564,1650],{"class":1187},[564,3566,664],{"class":624},[564,3568,2786],{"class":574},[564,3570,3572,3574,3576,3578],{"class":566,"line":3571},293,[564,3573,1637],{"class":624},[564,3575,1267],{"class":1187},[564,3577,664],{"class":624},[564,3579,3580],{"class":574}," RENDER_LARGE_OFFICE\n",[564,3582,3584,3586,3588,3590,3593],{"class":566,"line":3583},294,[564,3585,1650],{"class":1187},[564,3587,664],{"class":624},[564,3589,2692],{"class":624},[564,3591,3592],{"class":574},"on",[564,3594,2698],{"class":624},[564,3596,3598,3600],{"class":566,"line":3597},295,[564,3599,1819],{"class":1187},[564,3601,1213],{"class":624},[564,3603,3605,3607],{"class":566,"line":3604},296,[564,3606,1827],{"class":1187},[564,3608,1213],{"class":624},[564,3610,3612,3614,3616],{"class":566,"line":3611},297,[564,3613,1835],{"class":1187},[564,3615,664],{"class":624},[564,3617,3618],{"class":574}," 500m\n",[564,3620,3622,3624,3626],{"class":566,"line":3621},298,[564,3623,1846],{"class":1187},[564,3625,664],{"class":624},[564,3627,3628],{"class":574}," 1Gi\n",[564,3630,3632,3634],{"class":566,"line":3631},299,[564,3633,1857],{"class":1187},[564,3635,1213],{"class":624},[564,3637,3639,3641,3643],{"class":566,"line":3638},300,[564,3640,1846],{"class":1187},[564,3642,664],{"class":624},[564,3644,3645],{"class":574}," 3Gi\n",[564,3647,3649,3651],{"class":566,"line":3648},301,[564,3650,1875],{"class":1187},[564,3652,1213],{"class":624},[564,3654,3656,3658,3660,3662],{"class":566,"line":3655},302,[564,3657,1637],{"class":624},[564,3659,1267],{"class":1187},[564,3661,664],{"class":624},[564,3663,3089],{"class":574},[564,3665,3667,3669,3671],{"class":566,"line":3666},303,[564,3668,1894],{"class":1187},[564,3670,664],{"class":624},[564,3672,3099],{"class":574},[564,3674,3676],{"class":566,"line":3675},304,[564,3677,3105],{"class":674},[564,3679,3681,3683,3685,3687],{"class":566,"line":3680},305,[564,3682,1637],{"class":624},[564,3684,1267],{"class":1187},[564,3686,664],{"class":624},[564,3688,1939],{"class":574},[564,3690,3692,3694,3696],{"class":566,"line":3691},306,[564,3693,1894],{"class":1187},[564,3695,664],{"class":624},[564,3697,1949],{"class":574},[564,3699,3701,3703],{"class":566,"line":3700},307,[564,3702,1955],{"class":1187},[564,3704,1213],{"class":624},[564,3706,3708,3710,3712,3714],{"class":566,"line":3707},308,[564,3709,1433],{"class":624},[564,3711,1267],{"class":1187},[564,3713,664],{"class":624},[564,3715,3089],{"class":574},[564,3717,3719,3721],{"class":566,"line":3718},309,[564,3720,3149],{"class":1187},[564,3722,1213],{"class":624},[564,3724,3726,3728,3730],{"class":566,"line":3725},310,[564,3727,3157],{"class":1187},[564,3729,664],{"class":624},[564,3731,2142],{"class":574},[564,3733,3735,3737,3739,3741],{"class":566,"line":3734},311,[564,3736,1433],{"class":624},[564,3738,1267],{"class":1187},[564,3740,664],{"class":624},[564,3742,1939],{"class":574},[564,3744,3746,3748,3750],{"class":566,"line":3745},312,[564,3747,1974],{"class":1187},[564,3749,664],{"class":624},[564,3751,1979],{"class":624},[564,3753,3755],{"class":566,"line":3754},313,[564,3756,1169],{"class":570},[564,3758,3760],{"class":566,"line":3759},314,[564,3761,3762],{"class":674},"# The reader app: its pages, and everything under \u002Fapi forwarded to the cms.\n",[564,3764,3766,3768,3770],{"class":566,"line":3765},315,[564,3767,1188],{"class":1187},[564,3769,664],{"class":624},[564,3771,1193],{"class":574},[564,3773,3775,3777,3779],{"class":566,"line":3774},316,[564,3776,1199],{"class":1187},[564,3778,664],{"class":624},[564,3780,1204],{"class":574},[564,3782,3784,3786],{"class":566,"line":3783},317,[564,3785,1210],{"class":1187},[564,3787,1213],{"class":624},[564,3789,3791,3793,3795],{"class":566,"line":3790},318,[564,3792,1219],{"class":1187},[564,3794,664],{"class":624},[564,3796,3797],{"class":574}," client\n",[564,3799,3801,3803],{"class":566,"line":3800},319,[564,3802,1230],{"class":1187},[564,3804,1213],{"class":624},[564,3806,3808,3810],{"class":566,"line":3807},320,[564,3809,1238],{"class":1187},[564,3811,1213],{"class":624},[564,3813,3815,3817,3819],{"class":566,"line":3814},321,[564,3816,1246],{"class":1187},[564,3818,664],{"class":624},[564,3820,3797],{"class":574},[564,3822,3824,3826],{"class":566,"line":3823},322,[564,3825,1256],{"class":1187},[564,3827,1213],{"class":624},[564,3829,3831,3833,3835,3837],{"class":566,"line":3830},323,[564,3832,1264],{"class":624},[564,3834,1267],{"class":1187},[564,3836,664],{"class":624},[564,3838,2296],{"class":574},[564,3840,3842,3844,3846],{"class":566,"line":3841},324,[564,3843,1277],{"class":1187},[564,3845,664],{"class":624},[564,3847,2306],{"class":1282},[564,3849,3851,3853,3855],{"class":566,"line":3850},325,[564,3852,2312],{"class":1187},[564,3854,664],{"class":624},[564,3856,2296],{"class":574},[564,3858,3860],{"class":566,"line":3859},326,[564,3861,1169],{"class":570},[564,3863,3865,3867,3869],{"class":566,"line":3864},327,[564,3866,1188],{"class":1187},[564,3868,664],{"class":624},[564,3870,1298],{"class":574},[564,3872,3874,3876,3878],{"class":566,"line":3873},328,[564,3875,1199],{"class":1187},[564,3877,664],{"class":624},[564,3879,2340],{"class":574},[564,3881,3883,3885],{"class":566,"line":3882},329,[564,3884,1210],{"class":1187},[564,3886,1213],{"class":624},[564,3888,3890,3892,3894],{"class":566,"line":3889},330,[564,3891,1219],{"class":1187},[564,3893,664],{"class":624},[564,3895,3797],{"class":574},[564,3897,3899,3901],{"class":566,"line":3898},331,[564,3900,1230],{"class":1187},[564,3902,1213],{"class":624},[564,3904,3906,3908,3910],{"class":566,"line":3905},332,[564,3907,1347],{"class":1187},[564,3909,664],{"class":624},[564,3911,1352],{"class":1282},[564,3913,3915,3917],{"class":566,"line":3914},333,[564,3916,1238],{"class":1187},[564,3918,1213],{"class":624},[564,3920,3922,3924],{"class":566,"line":3921},334,[564,3923,1365],{"class":1187},[564,3925,1213],{"class":624},[564,3927,3929,3931,3933],{"class":566,"line":3928},335,[564,3930,1373],{"class":1187},[564,3932,664],{"class":624},[564,3934,3797],{"class":574},[564,3936,3938,3940],{"class":566,"line":3937},336,[564,3939,1383],{"class":1187},[564,3941,1213],{"class":624},[564,3943,3945,3947],{"class":566,"line":3944},337,[564,3946,1391],{"class":1187},[564,3948,1213],{"class":624},[564,3950,3952,3954],{"class":566,"line":3951},338,[564,3953,1399],{"class":1187},[564,3955,1213],{"class":624},[564,3957,3959,3961,3963],{"class":566,"line":3958},339,[564,3960,1407],{"class":1187},[564,3962,664],{"class":624},[564,3964,3797],{"class":574},[564,3966,3968,3970],{"class":566,"line":3967},340,[564,3969,1417],{"class":1187},[564,3971,1213],{"class":624},[564,3973,3975,3977],{"class":566,"line":3974},341,[564,3976,1425],{"class":1187},[564,3978,1213],{"class":624},[564,3980,3982,3984,3986,3988],{"class":566,"line":3981},342,[564,3983,1433],{"class":624},[564,3985,1267],{"class":1187},[564,3987,664],{"class":624},[564,3989,1440],{"class":574},[564,3991,3993,3995],{"class":566,"line":3992},343,[564,3994,1458],{"class":1187},[564,3996,1213],{"class":624},[564,3998,4000,4002,4004],{"class":566,"line":3999},344,[564,4001,1466],{"class":1187},[564,4003,664],{"class":624},[564,4005,1472],{"class":1471},[564,4007,4009,4011,4013],{"class":566,"line":4008},345,[564,4010,1478],{"class":1187},[564,4012,664],{"class":624},[564,4014,2495],{"class":1282},[564,4016,4018,4020,4022],{"class":566,"line":4017},346,[564,4019,1489],{"class":1187},[564,4021,664],{"class":624},[564,4023,2495],{"class":1282},[564,4025,4027,4029],{"class":566,"line":4026},347,[564,4028,1528],{"class":1187},[564,4030,1213],{"class":624},[564,4032,4034,4036,4038,4040],{"class":566,"line":4033},348,[564,4035,1433],{"class":624},[564,4037,1267],{"class":1187},[564,4039,664],{"class":624},[564,4041,3797],{"class":574},[564,4043,4045,4047,4049,4052],{"class":566,"line":4044},349,[564,4046,1547],{"class":1187},[564,4048,664],{"class":624},[564,4050,4051],{"class":574}," registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Fclient:latest",[564,4053,4054],{"class":674}," # {\"$imagepolicy\": \"flux-system:ddm-client\"}\n",[564,4056,4058,4060,4062],{"class":566,"line":4057},350,[564,4059,1564],{"class":1187},[564,4061,664],{"class":624},[564,4063,1569],{"class":574},[564,4065,4067,4069],{"class":566,"line":4066},351,[564,4068,1575],{"class":1187},[564,4070,1213],{"class":624},[564,4072,4074,4076,4078],{"class":566,"line":4073},352,[564,4075,1583],{"class":1187},[564,4077,664],{"class":624},[564,4079,1588],{"class":1471},[564,4081,4083,4085,4087],{"class":566,"line":4082},353,[564,4084,1594],{"class":1187},[564,4086,664],{"class":624},[564,4088,1472],{"class":1471},[564,4090,4092,4094],{"class":566,"line":4091},354,[564,4093,1604],{"class":1187},[564,4095,1213],{"class":624},[564,4097,4099,4101,4103,4105,4107],{"class":566,"line":4098},355,[564,4100,1612],{"class":1187},[564,4102,664],{"class":624},[564,4104,1617],{"class":624},[564,4106,1620],{"class":574},[564,4108,1623],{"class":624},[564,4110,4112,4114],{"class":566,"line":4111},356,[564,4113,2610],{"class":1187},[564,4115,1213],{"class":624},[564,4117,4119,4121,4123],{"class":566,"line":4118},357,[564,4120,1637],{"class":624},[564,4122,2620],{"class":1187},[564,4124,1213],{"class":624},[564,4126,4128,4130,4132],{"class":566,"line":4127},358,[564,4129,2628],{"class":1187},[564,4131,664],{"class":624},[564,4133,581],{"class":574},[564,4135,4137,4139],{"class":566,"line":4136},359,[564,4138,1629],{"class":1187},[564,4140,1213],{"class":624},[564,4142,4144,4146,4148,4150],{"class":566,"line":4143},360,[564,4145,1637],{"class":624},[564,4147,1267],{"class":1187},[564,4149,664],{"class":624},[564,4151,4152],{"class":574}," NUXT_API_ORIGIN\n",[564,4154,4156,4158,4160],{"class":566,"line":4155},361,[564,4157,1650],{"class":1187},[564,4159,664],{"class":624},[564,4161,4162],{"class":574}," http:\u002F\u002Fcms:3000\n",[564,4164,4166,4168,4170,4172],{"class":566,"line":4165},362,[564,4167,1637],{"class":624},[564,4169,1267],{"class":1187},[564,4171,664],{"class":624},[564,4173,4174],{"class":574}," NUXT_PUBLIC_MGMT_URL\n",[564,4176,4178,4180,4182],{"class":566,"line":4177},363,[564,4179,1650],{"class":1187},[564,4181,664],{"class":624},[564,4183,2742],{"class":574},[564,4185,4187],{"class":566,"line":4186},364,[564,4188,4189],{"class":674},"            # The reader app on this installation, for the mobile app's „Server\".\n",[564,4191,4193,4195,4197,4199],{"class":566,"line":4192},365,[564,4194,1637],{"class":624},[564,4196,1267],{"class":1187},[564,4198,664],{"class":624},[564,4200,4201],{"class":574}," NUXT_PUBLIC_SERVER_URL\n",[564,4203,4205,4207,4209],{"class":566,"line":4204},366,[564,4206,1650],{"class":1187},[564,4208,664],{"class":624},[564,4210,2764],{"class":574},[564,4212,4214,4216,4218,4220],{"class":566,"line":4213},367,[564,4215,1637],{"class":624},[564,4217,1267],{"class":1187},[564,4219,664],{"class":624},[564,4221,2826],{"class":574},[564,4223,4225,4227,4229],{"class":566,"line":4224},368,[564,4226,1650],{"class":1187},[564,4228,664],{"class":624},[564,4230,2836],{"class":574},[564,4232,4234,4236],{"class":566,"line":4233},369,[564,4235,1729],{"class":1187},[564,4237,1213],{"class":624},[564,4239,4241,4243,4245,4247],{"class":566,"line":4240},370,[564,4242,1637],{"class":624},[564,4244,1267],{"class":1187},[564,4246,664],{"class":624},[564,4248,2296],{"class":574},[564,4250,4252,4254,4256],{"class":566,"line":4251},371,[564,4253,1748],{"class":1187},[564,4255,664],{"class":624},[564,4257,2306],{"class":1282},[564,4259,4261],{"class":566,"line":4260},372,[564,4262,4263],{"class":674},"          # Through to the cms: what the reader app forwards answers, too.\n",[564,4265,4267,4269],{"class":566,"line":4266},373,[564,4268,1758],{"class":1187},[564,4270,1213],{"class":624},[564,4272,4274,4276],{"class":566,"line":4273},374,[564,4275,2883],{"class":1187},[564,4277,1213],{"class":624},[564,4279,4281,4283,4285],{"class":566,"line":4280},375,[564,4282,2891],{"class":1187},[564,4284,664],{"class":624},[564,4286,2896],{"class":574},[564,4288,4290,4292,4294],{"class":566,"line":4289},376,[564,4291,2902],{"class":1187},[564,4293,664],{"class":624},[564,4295,2296],{"class":574},[564,4297,4299,4301,4303],{"class":566,"line":4298},377,[564,4300,1808],{"class":1187},[564,4302,664],{"class":624},[564,4304,2969],{"class":1282},[564,4306,4308,4310],{"class":566,"line":4307},378,[564,4309,1819],{"class":1187},[564,4311,1213],{"class":624},[564,4313,4315,4317],{"class":566,"line":4314},379,[564,4316,1827],{"class":1187},[564,4318,1213],{"class":624},[564,4320,4322,4324,4326],{"class":566,"line":4321},380,[564,4323,1835],{"class":1187},[564,4325,664],{"class":624},[564,4327,4328],{"class":574}," 100m\n",[564,4330,4332,4334,4336],{"class":566,"line":4331},381,[564,4333,1846],{"class":1187},[564,4335,664],{"class":624},[564,4337,4338],{"class":574}," 128Mi\n",[564,4340,4342,4344],{"class":566,"line":4341},382,[564,4343,1857],{"class":1187},[564,4345,1213],{"class":624},[564,4347,4349,4351,4353],{"class":566,"line":4348},383,[564,4350,1846],{"class":1187},[564,4352,664],{"class":624},[564,4354,1851],{"class":574},[564,4356,4358,4360],{"class":566,"line":4357},384,[564,4359,1875],{"class":1187},[564,4361,1213],{"class":624},[564,4363,4365,4367,4369,4371],{"class":566,"line":4364},385,[564,4366,1637],{"class":624},[564,4368,1267],{"class":1187},[564,4370,664],{"class":624},[564,4372,1939],{"class":574},[564,4374,4376,4378,4380],{"class":566,"line":4375},386,[564,4377,1894],{"class":1187},[564,4379,664],{"class":624},[564,4381,1949],{"class":574},[564,4383,4385,4387],{"class":566,"line":4384},387,[564,4386,1955],{"class":1187},[564,4388,1213],{"class":624},[564,4390,4392,4394,4396,4398],{"class":566,"line":4391},388,[564,4393,1433],{"class":624},[564,4395,1267],{"class":1187},[564,4397,664],{"class":624},[564,4399,1939],{"class":574},[564,4401,4403,4405,4407],{"class":566,"line":4402},389,[564,4404,1974],{"class":1187},[564,4406,664],{"class":624},[564,4408,1979],{"class":624},[564,4410,4412],{"class":566,"line":4411},390,[564,4413,1169],{"class":570},[564,4415,4417],{"class":566,"line":4416},391,[564,4418,4419],{"class":674},"# Both hostnames — replace `cms.example.com` and `app.example.com` with yours —\n",[564,4421,4423],{"class":566,"line":4422},392,[564,4424,4425],{"class":674},"# with TLS from the Secret `ddm-tls`, or from cert-manager with its\n",[564,4427,4429],{"class":566,"line":4428},393,[564,4430,4431],{"class":674},"# annotation added here. Uploads are up to 1 GiB and may take a while:\n",[564,4433,4435],{"class":566,"line":4434},394,[564,4436,4437],{"class":674},"# ingress-nginx's limits raised; another controller needs its own.\n",[564,4439,4441,4443,4445],{"class":566,"line":4440},395,[564,4442,1188],{"class":1187},[564,4444,664],{"class":624},[564,4446,4447],{"class":574}," networking.k8s.io\u002Fv1\n",[564,4449,4451,4453,4455],{"class":566,"line":4450},396,[564,4452,1199],{"class":1187},[564,4454,664],{"class":624},[564,4456,4457],{"class":574}," Ingress\n",[564,4459,4461,4463],{"class":566,"line":4460},397,[564,4462,1210],{"class":1187},[564,4464,1213],{"class":624},[564,4466,4468,4470,4472],{"class":566,"line":4467},398,[564,4469,1219],{"class":1187},[564,4471,664],{"class":624},[564,4473,581],{"class":574},[564,4475,4477,4480],{"class":566,"line":4476},399,[564,4478,4479],{"class":1187},"  annotations",[564,4481,1213],{"class":624},[564,4483,4485,4488,4490],{"class":566,"line":4484},400,[564,4486,4487],{"class":1187},"    nginx.ingress.kubernetes.io\u002Fproxy-body-size",[564,4489,664],{"class":624},[564,4491,4492],{"class":574}," 1g\n",[564,4494,4496,4499,4501,4503,4506],{"class":566,"line":4495},401,[564,4497,4498],{"class":1187},"    nginx.ingress.kubernetes.io\u002Fproxy-read-timeout",[564,4500,664],{"class":624},[564,4502,2692],{"class":624},[564,4504,4505],{"class":574},"600",[564,4507,2698],{"class":624},[564,4509,4511,4514,4516,4518,4520],{"class":566,"line":4510},402,[564,4512,4513],{"class":1187},"    nginx.ingress.kubernetes.io\u002Fproxy-send-timeout",[564,4515,664],{"class":624},[564,4517,2692],{"class":624},[564,4519,4505],{"class":574},[564,4521,2698],{"class":624},[564,4523,4525,4528,4530,4532,4535],{"class":566,"line":4524},403,[564,4526,4527],{"class":1187},"    nginx.ingress.kubernetes.io\u002Fproxy-request-buffering",[564,4529,664],{"class":624},[564,4531,2692],{"class":624},[564,4533,4534],{"class":574},"off",[564,4536,2698],{"class":624},[564,4538,4540,4542],{"class":566,"line":4539},404,[564,4541,1230],{"class":1187},[564,4543,1213],{"class":624},[564,4545,4547,4550],{"class":566,"line":4546},405,[564,4548,4549],{"class":1187},"  tls",[564,4551,1213],{"class":624},[564,4553,4555,4557,4560,4562,4564,4566,4568,4571],{"class":566,"line":4554},406,[564,4556,1264],{"class":624},[564,4558,4559],{"class":1187}," hosts",[564,4561,664],{"class":624},[564,4563,1617],{"class":624},[564,4565,1022],{"class":574},[564,4567,1784],{"class":624},[564,4569,4570],{"class":574}," app.example.com",[564,4572,1623],{"class":624},[564,4574,4576,4579,4581],{"class":566,"line":4575},407,[564,4577,4578],{"class":1187},"      secretName",[564,4580,664],{"class":624},[564,4582,4583],{"class":574}," ddm-tls\n",[564,4585,4587,4590],{"class":566,"line":4586},408,[564,4588,4589],{"class":1187},"  rules",[564,4591,1213],{"class":624},[564,4593,4595,4597,4600,4602],{"class":566,"line":4594},409,[564,4596,1264],{"class":624},[564,4598,4599],{"class":1187}," host",[564,4601,664],{"class":624},[564,4603,4604],{"class":574}," cms.example.com\n",[564,4606,4608,4611],{"class":566,"line":4607},410,[564,4609,4610],{"class":1187},"      http",[564,4612,1213],{"class":624},[564,4614,4616,4619],{"class":566,"line":4615},411,[564,4617,4618],{"class":1187},"        paths",[564,4620,1213],{"class":624},[564,4622,4624,4627,4630,4632],{"class":566,"line":4623},412,[564,4625,4626],{"class":624},"          -",[564,4628,4629],{"class":1187}," path",[564,4631,664],{"class":624},[564,4633,4634],{"class":574}," \u002F\n",[564,4636,4638,4641,4643],{"class":566,"line":4637},413,[564,4639,4640],{"class":1187},"            pathType",[564,4642,664],{"class":624},[564,4644,4645],{"class":574}," Prefix\n",[564,4647,4649,4652],{"class":566,"line":4648},414,[564,4650,4651],{"class":1187},"            backend",[564,4653,1213],{"class":624},[564,4655,4657,4660],{"class":566,"line":4656},415,[564,4658,4659],{"class":1187},"              service",[564,4661,1213],{"class":624},[564,4663,4665,4667,4669],{"class":566,"line":4664},416,[564,4666,2628],{"class":1187},[564,4668,664],{"class":624},[564,4670,2254],{"class":574},[564,4672,4674,4677],{"class":566,"line":4673},417,[564,4675,4676],{"class":1187},"                port",[564,4678,1213],{"class":624},[564,4680,4682,4684,4686],{"class":566,"line":4681},418,[564,4683,1709],{"class":1187},[564,4685,664],{"class":624},[564,4687,2296],{"class":574},[564,4689,4691,4693,4695,4697],{"class":566,"line":4690},419,[564,4692,1264],{"class":624},[564,4694,4599],{"class":1187},[564,4696,664],{"class":624},[564,4698,4699],{"class":574}," app.example.com\n",[564,4701,4703,4705],{"class":566,"line":4702},420,[564,4704,4610],{"class":1187},[564,4706,1213],{"class":624},[564,4708,4710,4712],{"class":566,"line":4709},421,[564,4711,4618],{"class":1187},[564,4713,1213],{"class":624},[564,4715,4717,4719,4721,4723],{"class":566,"line":4716},422,[564,4718,4626],{"class":624},[564,4720,4629],{"class":1187},[564,4722,664],{"class":624},[564,4724,4634],{"class":574},[564,4726,4728,4730,4732],{"class":566,"line":4727},423,[564,4729,4640],{"class":1187},[564,4731,664],{"class":624},[564,4733,4645],{"class":574},[564,4735,4737,4739],{"class":566,"line":4736},424,[564,4738,4651],{"class":1187},[564,4740,1213],{"class":624},[564,4742,4744,4746],{"class":566,"line":4743},425,[564,4745,4659],{"class":1187},[564,4747,1213],{"class":624},[564,4749,4751,4753,4755],{"class":566,"line":4750},426,[564,4752,2628],{"class":1187},[564,4754,664],{"class":624},[564,4756,3797],{"class":574},[564,4758,4760,4762],{"class":566,"line":4759},427,[564,4761,4676],{"class":1187},[564,4763,1213],{"class":624},[564,4765,4767,4769,4771],{"class":566,"line":4766},428,[564,4768,1709],{"class":1187},[564,4770,664],{"class":624},[564,4772,2296],{"class":574},[451,4774,4776],{"id":4775},"_4-apply","4. Apply",[555,4778,4780],{"className":557,"code":4779,"language":559,"meta":560,"style":560},"kubectl -n ddm apply -f ddm.yaml\nkubectl -n ddm rollout status deployment\u002Fcms\n",[442,4781,4782,4799],{"__ignoreMap":560},[564,4783,4784,4786,4788,4790,4793,4796],{"class":566,"line":567},[564,4785,571],{"class":570},[564,4787,589],{"class":574},[564,4789,592],{"class":574},[564,4791,4792],{"class":574}," apply",[564,4794,4795],{"class":574}," -f",[564,4797,4798],{"class":574}," ddm.yaml\n",[564,4800,4801,4803,4805,4807,4810,4813],{"class":566,"line":584},[564,4802,571],{"class":570},[564,4804,589],{"class":574},[564,4806,592],{"class":574},[564,4808,4809],{"class":574}," rollout",[564,4811,4812],{"class":574}," status",[564,4814,4815],{"class":574}," deployment\u002Fcms\n",[433,4817,4818,4819,1014],{},"Then, as with Docker Compose, ",[661,4820,4822],{"href":4821},"\u002Fen\u002Fself-hosting\u002Fdocker-compose#6-create-the-first-account","create the first account",[451,4824,4826],{"id":4825},"changing-settings","Changing settings",[433,4828,4829,4830,4832,4833,4835],{},"After changing ",[442,4831,658],{}," or ",[442,4834,838],{},", write the ConfigMap and the Secret again and restart the apps:",[555,4837,4839],{"className":557,"code":4838,"language":559,"meta":560,"style":560},"kubectl -n ddm create configmap ddm --from-env-file=config.env --dry-run=client -o yaml | kubectl apply -f -\nkubectl -n ddm create secret generic ddm --from-env-file=secrets.env --dry-run=client -o yaml | kubectl apply -f -\nkubectl -n ddm rollout restart deployment\n",[442,4840,4841,4880,4915],{"__ignoreMap":560},[564,4842,4843,4845,4847,4849,4851,4853,4855,4858,4861,4864,4867,4870,4873,4875,4877],{"class":566,"line":567},[564,4844,571],{"class":570},[564,4846,589],{"class":574},[564,4848,592],{"class":574},[564,4850,575],{"class":574},[564,4852,949],{"class":574},[564,4854,592],{"class":574},[564,4856,4857],{"class":574}," --from-env-file=config.env",[564,4859,4860],{"class":574}," --dry-run=client",[564,4862,4863],{"class":574}," -o",[564,4865,4866],{"class":574}," yaml",[564,4868,4869],{"class":624}," |",[564,4871,4872],{"class":570}," kubectl",[564,4874,4792],{"class":574},[564,4876,4795],{"class":574},[564,4878,4879],{"class":574}," -\n",[564,4881,4882,4884,4886,4888,4890,4892,4894,4896,4899,4901,4903,4905,4907,4909,4911,4913],{"class":566,"line":584},[564,4883,571],{"class":570},[564,4885,589],{"class":574},[564,4887,592],{"class":574},[564,4889,575],{"class":574},[564,4891,597],{"class":574},[564,4893,969],{"class":574},[564,4895,592],{"class":574},[564,4897,4898],{"class":574}," --from-env-file=secrets.env",[564,4900,4860],{"class":574},[564,4902,4863],{"class":574},[564,4904,4866],{"class":574},[564,4906,4869],{"class":624},[564,4908,4872],{"class":570},[564,4910,4792],{"class":574},[564,4912,4795],{"class":574},[564,4914,4879],{"class":574},[564,4916,4917,4919,4921,4923,4925,4928],{"class":566,"line":610},[564,4918,571],{"class":570},[564,4920,589],{"class":574},[564,4922,592],{"class":574},[564,4924,4809],{"class":574},[564,4926,4927],{"class":574}," restart",[564,4929,4930],{"class":574}," deployment\n",[451,4932,4934],{"id":4933},"using-your-own-database","Using your own database",[433,4936,4937,4938,4941],{},"If you already run Postgres yourself, DDM needs Postgres 18 with the German dictionary for full-text search, which our ",[442,4939,4940],{},"postgres:18"," image brings along. Then:",[4943,4944,4945,4954,4971],"ol",{},[989,4946,4947,4948,4950,4951,1014],{},"Enter the address in ",[442,4949,838],{},": ",[442,4952,4953],{},"EXTERNAL_DATABASE_URL=postgres:\u002F\u002Fddm:\u003Cpassword>@db.company.com:5432\u002Fddm",[989,4955,4956,4957,4959,4960,998,4963,843,4965,4967,4968,1014],{},"In ",[442,4958,444],{},", replace the value of ",[442,4961,4962],{},"DATABASE_URL",[442,4964,492],{},[442,4966,510],{}," with ",[442,4969,4970],{},"$(EXTERNAL_DATABASE_URL)",[989,4972,4956,4973,4975,4976,1014],{},[442,4974,444],{},", delete the first two sections – the Service and the StatefulSet ",[442,4977,481],{},[451,4979,4981],{"id":4980},"without-readwritemany","Without ReadWriteMany",[433,4983,4984,4985,4987,4988,843,4991,4994,4995,4997,4998,5000,5001,664],{},"The CMS and the render worker share the volume ",[442,4986,530],{},". If your cluster cannot provide a ReadWriteMany volume, put the documents in an S3-compatible bucket – ",[442,4989,4990],{},"S3_ENDPOINT",[442,4992,4993],{},"S3_BUCKET"," in ",[442,4996,658],{},", the keys in ",[442,4999,838],{},". The backups then go to the same bucket. After that, only the CMS needs the volume. Change in ",[442,5002,444],{},[4943,5004,5005,5018],{},[989,5006,5007,5008,5010,5011,5014,5015,1784],{},"for the PersistentVolumeClaim ",[442,5009,530],{},", the ",[442,5012,5013],{},"accessModes"," to ",[442,5016,5017],{},"[ReadWriteOnce]",[989,5019,5020,5021,5010,5023,5026,5027,5030,5031,5034,5035,5038],{},"for the Deployment ",[442,5022,510],{},[442,5024,5025],{},"data"," entries under ",[442,5028,5029],{},"volumeMounts"," and under ",[442,5032,5033],{},"volumes"," – delete both; ",[442,5036,5037],{},"tmp"," stays.",[5040,5041,5042],"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":560,"searchDepth":584,"depth":584,"links":5044},[5045,5046,5047,5048,5049,5050,5051,5052],{"id":453,"depth":584,"text":454},{"id":552,"depth":584,"text":553},{"id":650,"depth":584,"text":651},{"id":977,"depth":584,"text":978},{"id":4775,"depth":584,"text":4776},{"id":4825,"depth":584,"text":4826},{"id":4933,"depth":584,"text":4934},{"id":4980,"depth":584,"text":4981},"DDM in a Kubernetes cluster – one file with everything, two with your settings, and a secret for the registry.","md",null,{},{"icon":394},{"title":391,"description":5053},"-h-6q2j3zCqH-KRZJ3XQCI3Wq8TuZoPc0aUu0xnswI0",[5061,5063],{"title":387,"path":388,"stem":389,"description":5062,"icon":106,"children":-1},"Set up DDM on one server with Docker Compose – from signing in to the registry to the first account.",{"title":396,"path":397,"stem":398,"description":5064,"icon":101,"children":-1},"The settings of an installation – what each one does and when you need it.",1793617723333]