[{"data":1,"prerenderedAt":2353},["ShallowReactive",2],{"navigation_docs_en":3,"-en-self-hosting-updates":427,"-en-self-hosting-updates-surround":2348},[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":405,"body":429,"description":2341,"extension":2342,"links":2343,"meta":2344,"navigation":2345,"path":406,"seo":2346,"stem":407,"__hash__":2347},"docs_en\u002Fen\u002F09.self-hosting\u002F06.updates.md",{"type":430,"value":431,"toc":2329},"minimark",[432,452,457,460,521,527,531,542,580,597,600,604,617,659,673,677,685,689,717,790,794,797,853,860,863,867,881,1086,1093,1096,1121,1124,1171,1304,2295,2301,2305,2325],[433,434,435,436,440,441,443,444,446,447,451],"p",{},"When there is a new version, administrators see the hint ",[437,438,439],"strong",{},"Update"," next to ",[437,442,400],{}," under ",[437,445,98],{},", and get an e-mail with what it brings. What each version brought is in the ",[448,449,450],"a",{"href":376},"changelog",".",[453,454,456],"h2",{"id":455},"which-version-runs","Which version runs",[433,458,459],{},"The images come under several names:",[461,462,463,476],"table",{},[464,465,466],"thead",{},[467,468,469,473],"tr",{},[470,471,472],"th",{},"Tag",[470,474,475],{},"Meaning",[477,478,479,491,501,511],"tbody",{},[467,480,481,488],{},[482,483,484],"td",{},[485,486,487],"code",{},"0.26.1",[482,489,490],{},"Exactly this version.",[467,492,493,498],{},[482,494,495],{},[485,496,497],{},"0.26",[482,499,500],{},"The latest bug fix of 0.26 – without new features.",[467,502,503,508],{},[482,504,505],{},[485,506,507],{},"stable",[482,509,510],{},"The version we have released for installations. It follows the releases with some delay.",[467,512,513,518],{},[482,514,515],{},[485,516,517],{},"latest",[482,519,520],{},"The newest release, as soon as it is out.",[433,522,523,524,526],{},"For an installation that updates itself, ",[485,525,507],{}," is right (with Watchtower or Keel) or a version range (with Flux); for one you update by hand, a fixed version.",[453,528,530],{"id":529},"by-hand","By hand",[433,532,533,534,537,538,541],{},"With Docker Compose, set ",[485,535,536],{},"DDM_VERSION"," in ",[485,539,540],{},".env"," and restart:",[543,544,549],"pre",{"className":545,"code":546,"language":547,"meta":548,"style":548},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","docker compose pull\ndocker compose up -d\n","bash","",[485,550,551,567],{"__ignoreMap":548},[552,553,556,560,564],"span",{"class":554,"line":555},"line",1,[552,557,559],{"class":558},"sBMFI","docker",[552,561,563],{"class":562},"sfazB"," compose",[552,565,566],{"class":562}," pull\n",[552,568,570,572,574,577],{"class":554,"line":569},2,[552,571,559],{"class":558},[552,573,563],{"class":562},[552,575,576],{"class":562}," up",[552,578,579],{"class":562}," -d\n",[433,581,582,583,586,587,590,591,593,594,596],{},"With Kubernetes, change the version in ",[485,584,585],{},"ddm.yaml"," and apply the file again (",[485,588,589],{},"kubectl -n ddm apply -f ddm.yaml","). If ",[485,592,585],{}," on the ",[448,595,391],{"href":392}," page has changed since your version, take that over too.",[433,598,599],{},"The CMS backs up the database and applies the migrations before it accepts requests. With Docker Compose, the render worker and the reader app only start after that.",[453,601,603],{"id":602},"new-installation-files","New installation files",[433,605,606,609,610,612,613,616],{},[485,607,608],{},"compose.yaml"," and ",[485,611,585],{}," carry their version (",[485,614,615],{},"DDM_DEPLOY_VERSION","). Usually a new DDM version runs with the files you have. For the two cases where it does not:",[618,619,620,634],"ul",{},[621,622,623,626,627,629,630,633],"li",{},[437,624,625],{},"Fixes (0.26.1 → 0.26.2) never need new files."," If your installation follows ",[485,628,497],{},", or ",[485,631,632],{},"0.26.x"," with Flux, its files always fit.",[621,635,636,639,640,643,644,646,647,649,650,629,652,609,655,658],{},[437,637,638],{},"A new version (0.26 → 0.27) may need new files."," Then ",[437,641,642],{},"Settings › Licence"," and the mail about the new version say: \"needs new installation files\". In that case, take over ",[485,645,608],{}," or ",[485,648,585],{}," from this guide before updating – keep your settings in ",[485,651,540],{},[485,653,654],{},"config.env",[485,656,657],{},"secrets.env"," – and then update.",[433,660,661,662,664,665,440,668,443,670,672],{},"If an installation runs with files older than its version needs – because it updated itself with ",[485,663,507],{},", say – its administrators see ",[437,666,667],{},"Check",[437,669,400],{},[437,671,98],{},", and there what to do; the CMS writes it into its log too.",[453,674,676],{"id":675},"supported-versions","Supported versions",[433,678,679,680,440,682,684],{},"We support the versions from one we name to your installation with every licence renewal. If it runs an older one, its administrators see ",[437,681,667],{},[437,683,400],{}," and get one mail. The installation keeps running – but fixes, security fixes too, come only for newer versions.",[453,686,688],{"id":687},"automatically-with-docker-compose","Automatically with Docker Compose",[433,690,691,692,537,695,697,698,704,705,708,709,712,713,716],{},"Set ",[485,693,694],{},"DDM_VERSION=stable",[485,696,540],{},". ",[448,699,703],{"href":700,"rel":701},"https:\u002F\u002Fcontainrrr.dev\u002Fwatchtower\u002F",[702],"nofollow","Watchtower"," with ",[485,706,707],{},"--label-enable"," then updates the services with the label ",[485,710,711],{},"com.centurylinklabs.watchtower.enable"," – the CMS, the render worker and the reader app, ",[437,714,715],{},"not Postgres"," – as soon as we release a version:",[543,718,720],{"className":545,"code":719,"language":547,"meta":548,"style":548},"docker run -d --name watchtower --restart unless-stopped \\\n  -v \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock \\\n  -v ~\u002F.docker\u002Fconfig.json:\u002Fconfig.json:ro \\\n  containrrr\u002Fwatchtower --label-enable --schedule \"0 0 3 * * *\"\n",[485,721,722,748,758,768],{"__ignoreMap":548},[552,723,724,726,729,732,735,738,741,744],{"class":554,"line":555},[552,725,559],{"class":558},[552,727,728],{"class":562}," run",[552,730,731],{"class":562}," -d",[552,733,734],{"class":562}," --name",[552,736,737],{"class":562}," watchtower",[552,739,740],{"class":562}," --restart",[552,742,743],{"class":562}," unless-stopped",[552,745,747],{"class":746},"sTEyZ"," \\\n",[552,749,750,753,756],{"class":554,"line":569},[552,751,752],{"class":562},"  -v",[552,754,755],{"class":562}," \u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock",[552,757,747],{"class":746},[552,759,761,763,766],{"class":554,"line":760},3,[552,762,752],{"class":562},[552,764,765],{"class":562}," ~\u002F.docker\u002Fconfig.json:\u002Fconfig.json:ro",[552,767,747],{"class":746},[552,769,771,774,777,780,784,787],{"class":554,"line":770},4,[552,772,773],{"class":562},"  containrrr\u002Fwatchtower",[552,775,776],{"class":562}," --label-enable",[552,778,779],{"class":562}," --schedule",[552,781,783],{"class":782},"sMK4o"," \"",[552,785,786],{"class":562},"0 0 3 * * *",[552,788,789],{"class":782},"\"\n",[453,791,793],{"id":792},"automatically-with-kubernetes","Automatically with Kubernetes",[433,795,796],{},"Two tools fit. They work differently:",[461,798,799,811],{},[464,800,801],{},[467,802,803,805,808],{},[470,804],{},[470,806,807],{},"Keel",[470,809,810],{},"Flux",[477,812,813,829,842],{},[467,814,815,818,824],{},[482,816,817],{},"Follows",[482,819,820,821,823],{},"the ",[485,822,507],{}," tag – every version we release",[482,825,826,827],{},"a version range, for example every ",[485,828,632],{},[467,830,831,834,837],{},[482,832,833],{},"Changes",[482,835,836],{},"the deployments in the cluster directly",[482,838,839,841],{},[485,840,585],{}," in your Git repository; Flux then applies it",[467,843,844,847,850],{},[482,845,846],{},"Fits when",[482,848,849],{},"you look after the cluster by hand",[482,851,852],{},"you already run the cluster with Flux from Git",[433,854,855,856,859],{},"Neither updates Postgres: its ",[485,857,858],{},"18"," tag only changes with a new major version, which needs the data converted.",[433,861,862],{},"During an update the CMS restarts and applies the migrations; DDM is then unavailable for a minute or two.",[864,865,807],"h3",{"id":866},"keel",[433,868,869,873,874,876,877,880],{},[448,870,807],{"href":871,"rel":872},"https:\u002F\u002Fkeel.sh",[702]," checks at regular intervals whether there is a new image under the ",[485,875,507],{}," tag, and restarts the app with it. It uses the deployments' registry secret ",[485,878,879],{},"ddm-registry"," for that.",[882,883,884,943,997],"ol",{},[621,885,886,889],{},[437,887,888],{},"Install Keel:",[543,890,892],{"className":545,"code":891,"language":547,"meta":548,"style":548},"helm repo add keel https:\u002F\u002Fcharts.keel.sh\nhelm repo update\nhelm upgrade --install keel keel\u002Fkeel --namespace keel --create-namespace\n",[485,893,894,911,920],{"__ignoreMap":548},[552,895,896,899,902,905,908],{"class":554,"line":555},[552,897,898],{"class":558},"helm",[552,900,901],{"class":562}," repo",[552,903,904],{"class":562}," add",[552,906,907],{"class":562}," keel",[552,909,910],{"class":562}," https:\u002F\u002Fcharts.keel.sh\n",[552,912,913,915,917],{"class":554,"line":569},[552,914,898],{"class":558},[552,916,901],{"class":562},[552,918,919],{"class":562}," update\n",[552,921,922,924,927,930,932,935,938,940],{"class":554,"line":760},[552,923,898],{"class":558},[552,925,926],{"class":562}," upgrade",[552,928,929],{"class":562}," --install",[552,931,907],{"class":562},[552,933,934],{"class":562}," keel\u002Fkeel",[552,936,937],{"class":562}," --namespace",[552,939,907],{"class":562},[552,941,942],{"class":562}," --create-namespace\n",[621,944,945,537,951,953,954,957,958,609,961,964,965,967,968,971,972],{},[437,946,947,948,950],{},"Use ",[485,949,507],{},":",[485,952,585],{},", give ",[485,955,956],{},"cms",", ",[485,959,960],{},"render-worker",[485,962,963],{},"client"," the tag ",[485,966,507],{}," instead of a version – ",[485,969,970],{},"…\u002Fcms:stable"," and so on – and apply:",[543,973,975],{"className":545,"code":974,"language":547,"meta":548,"style":548},"kubectl -n ddm apply -f ddm.yaml\n",[485,976,977],{"__ignoreMap":548},[552,978,979,982,985,988,991,994],{"class":554,"line":555},[552,980,981],{"class":558},"kubectl",[552,983,984],{"class":562}," -n",[552,986,987],{"class":562}," ddm",[552,989,990],{"class":562}," apply",[552,992,993],{"class":562}," -f",[552,995,996],{"class":562}," ddm.yaml\n",[621,998,999,1002,1073,1076,704,1079,1082,1083,1085],{},[437,1000,1001],{},"Hand the three apps to Keel:",[543,1003,1005],{"className":545,"code":1004,"language":547,"meta":548,"style":548},"kubectl -n ddm annotate deployment cms render-worker client --overwrite \\\n  keel.sh\u002Fpolicy=force \\\n  keel.sh\u002Fmatch-tag=true \\\n  keel.sh\u002Ftrigger=poll \\\n  keel.sh\u002FpollSchedule=\"@every 6h\"\n",[485,1006,1007,1035,1042,1052,1059],{"__ignoreMap":548},[552,1008,1009,1011,1013,1015,1018,1021,1024,1027,1030,1033],{"class":554,"line":555},[552,1010,981],{"class":558},[552,1012,984],{"class":562},[552,1014,987],{"class":562},[552,1016,1017],{"class":562}," annotate",[552,1019,1020],{"class":562}," deployment",[552,1022,1023],{"class":562}," cms",[552,1025,1026],{"class":562}," render-worker",[552,1028,1029],{"class":562}," client",[552,1031,1032],{"class":562}," --overwrite",[552,1034,747],{"class":746},[552,1036,1037,1040],{"class":554,"line":569},[552,1038,1039],{"class":562},"  keel.sh\u002Fpolicy=force",[552,1041,747],{"class":746},[552,1043,1044,1047,1050],{"class":554,"line":760},[552,1045,1046],{"class":562},"  keel.sh\u002Fmatch-tag=",[552,1048,1049],{"class":782},"true",[552,1051,747],{"class":746},[552,1053,1054,1057],{"class":554,"line":770},[552,1055,1056],{"class":562},"  keel.sh\u002Ftrigger=poll",[552,1058,747],{"class":746},[552,1060,1062,1065,1068,1071],{"class":554,"line":1061},5,[552,1063,1064],{"class":562},"  keel.sh\u002FpollSchedule=",[552,1066,1067],{"class":782},"\"",[552,1069,1070],{"class":562},"@every 6h",[552,1072,789],{"class":782},[1074,1075],"br",{},[485,1077,1078],{},"force",[485,1080,1081],{},"match-tag"," means: the same tag, a new image – exactly what happens under ",[485,1084,507],{}," when we release a version. Keel looks every six hours.",[433,1087,1088,1089,1092],{},"From then on the installation updates itself. ",[485,1090,1091],{},"kubectl -n keel logs deploy\u002Fkeel"," shows whether Keel found anything.",[864,1094,810],{"id":1095},"flux",[433,1097,1098,1103,1104,1106,1107,1109,1110,1113,1114,1116,1117,1120],{},[448,1099,1102],{"href":1100,"rel":1101},"https:\u002F\u002Ffluxcd.io\u002Fflux\u002Fguides\u002Fimage-update\u002F",[702],"Flux's image automation"," reads the versions in our registry, writes the newest matching one into ",[485,1105,585],{}," in your Git repository and applies it from there. It follows a version range, not the ",[485,1108,507],{}," tag – most safely the ",[437,1111,1112],{},"fixes of your version"," (",[485,1115,632],{},"); you then move to the next version (",[485,1118,1119],{},"0.27",") by hand.",[433,1122,1123],{},"It needs a cluster that Flux runs from a Git repository, with the two image controllers – for a new cluster:",[543,1125,1127],{"className":545,"code":1126,"language":547,"meta":548,"style":548},"flux bootstrap gitlab --owner=\u003Cgroup> --repository=\u003Crepository> --path=clusters\u002Fproduction \\\n  --components-extra=image-reflector-controller,image-automation-controller\n",[485,1128,1129,1166],{"__ignoreMap":548},[552,1130,1131,1133,1136,1139,1142,1145,1148,1151,1154,1156,1159,1161,1164],{"class":554,"line":555},[552,1132,1095],{"class":558},[552,1134,1135],{"class":562}," bootstrap",[552,1137,1138],{"class":562}," gitlab",[552,1140,1141],{"class":562}," --owner=",[552,1143,1144],{"class":782},"\u003C",[552,1146,1147],{"class":562},"group",[552,1149,1150],{"class":782},">",[552,1152,1153],{"class":562}," --repository=",[552,1155,1144],{"class":782},[552,1157,1158],{"class":562},"repository",[552,1160,1150],{"class":782},[552,1162,1163],{"class":562}," --path=clusters\u002Fproduction",[552,1165,747],{"class":746},[552,1167,1168],{"class":554,"line":569},[552,1169,1170],{"class":562},"  --components-extra=image-reflector-controller,image-automation-controller\n",[882,1172,1173,1194,1267,1285],{},[621,1174,1175,1181,1182,1185,1186,1189,1190,1193],{},[437,1176,1177,1178,1180],{},"Put ",[485,1179,585],{}," in the repository",", for example under ",[485,1183,1184],{},"clusters\u002Fproduction\u002Fddm\u002F",", with an exact version (",[485,1187,1188],{},"…\u002Fcms:0.26.1","). The markers telling Flux where to write a new version – ",[485,1191,1192],{},"# {\"$imagepolicy\": …}"," behind the three image lines – are already in it.",[621,1195,1196,1199,1200,1203,1204],{},[437,1197,1198],{},"Let Flux read the registry"," – with the same deploy token, as a secret in the ",[485,1201,1202],{},"flux-system"," namespace:",[543,1205,1207],{"className":545,"code":1206,"language":547,"meta":548,"style":548},"kubectl -n flux-system create secret docker-registry ddm-registry \\\n  --docker-server=registry.gitlab.com \\\n  --docker-username=\u003Ctoken name> --docker-password=\u003Ctoken>\n",[485,1208,1209,1232,1239],{"__ignoreMap":548},[552,1210,1211,1213,1215,1218,1221,1224,1227,1230],{"class":554,"line":555},[552,1212,981],{"class":558},[552,1214,984],{"class":562},[552,1216,1217],{"class":562}," flux-system",[552,1219,1220],{"class":562}," create",[552,1222,1223],{"class":562}," secret",[552,1225,1226],{"class":562}," docker-registry",[552,1228,1229],{"class":562}," ddm-registry",[552,1231,747],{"class":746},[552,1233,1234,1237],{"class":554,"line":569},[552,1235,1236],{"class":562},"  --docker-server=registry.gitlab.com",[552,1238,747],{"class":746},[552,1240,1241,1244,1246,1249,1252,1255,1257,1260,1262,1264],{"class":554,"line":760},[552,1242,1243],{"class":562},"  --docker-username=",[552,1245,1144],{"class":782},[552,1247,1248],{"class":562},"token",[552,1250,1251],{"class":562}," nam",[552,1253,1254],{"class":746},"e",[552,1256,1150],{"class":782},[552,1258,1259],{"class":562}," --docker-password=",[552,1261,1144],{"class":782},[552,1263,1248],{"class":562},[552,1265,1266],{"class":782},">\n",[621,1268,1269,1272,1273,1276,1277,1280,1281,1284],{},[437,1270,1271],{},"What Flux watches and where it writes:"," ",[485,1274,1275],{},"ddm-updates.yaml",", below, in the same folder. Set ",[485,1278,1279],{},"range"," (three times), ",[485,1282,1283],{},"path"," and the commits' e-mail address in it.",[621,1286,1287,1290,1291,1293,1294,1296,1297,1300,1301,1303],{},[437,1288,1289],{},"Commit and push."," Flux checks every hour; every new ",[485,1292,632],{}," lands as a commit in your repository and in the cluster. For the next version, set ",[485,1295,1279],{}," to ",[485,1298,1299],{},"0.27.x"," (three times) and the three versions in ",[485,1302,585],{}," by hand.",[543,1305,1309],{"className":1306,"code":1307,"filename":1275,"language":1308,"meta":548,"style":548},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Updates by Flux's image automation, for an installation Flux runs from a\n# Git repository (user guide, „Updates\"): beside `ddm.yaml`, in the folder\n# Flux applies. It reads our registry every hour and writes the newest\n# version in `range` into `ddm.yaml` — behind the `$imagepolicy` comments —\n# commits and pushes it.\n#\n# Set before committing:\n#   - `range`, three times: your version's fixes, e.g. `0.26.x`;\n#   - `path`: the folder `ddm.yaml` is in, from the repository's root;\n#   - the commit's `email`, and `branch` if yours is not `main`.\n# It reads the registry with the Secret `ddm-registry` in `flux-system` —\n# the deploy token, as in the `ddm` namespace.\n# cms: where its versions are, and which one applies.\napiVersion: image.toolkit.fluxcd.io\u002Fv1beta2\nkind: ImageRepository\nmetadata: { name: ddm-cms, namespace: flux-system }\nspec:\n  image: registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Fcms\n  interval: 1h\n  secretRef: { name: ddm-registry }\n---\napiVersion: image.toolkit.fluxcd.io\u002Fv1beta2\nkind: ImagePolicy\nmetadata: { name: ddm-cms, namespace: flux-system }\nspec:\n  imageRepositoryRef: { name: ddm-cms }\n  filterTags: { pattern: '^\\d+\\.\\d+\\.\\d+$' }\n  policy: { semver: { range: '0.26.x' } }\n---\n# render-worker: where its versions are, and which one applies.\napiVersion: image.toolkit.fluxcd.io\u002Fv1beta2\nkind: ImageRepository\nmetadata: { name: ddm-render-worker, namespace: flux-system }\nspec:\n  image: registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Frender-worker\n  interval: 1h\n  secretRef: { name: ddm-registry }\n---\napiVersion: image.toolkit.fluxcd.io\u002Fv1beta2\nkind: ImagePolicy\nmetadata: { name: ddm-render-worker, namespace: flux-system }\nspec:\n  imageRepositoryRef: { name: ddm-render-worker }\n  filterTags: { pattern: '^\\d+\\.\\d+\\.\\d+$' }\n  policy: { semver: { range: '0.26.x' } }\n---\n# client: where its versions are, and which one applies.\napiVersion: image.toolkit.fluxcd.io\u002Fv1beta2\nkind: ImageRepository\nmetadata: { name: ddm-client, namespace: flux-system }\nspec:\n  image: registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Fclient\n  interval: 1h\n  secretRef: { name: ddm-registry }\n---\napiVersion: image.toolkit.fluxcd.io\u002Fv1beta2\nkind: ImagePolicy\nmetadata: { name: ddm-client, namespace: flux-system }\nspec:\n  imageRepositoryRef: { name: ddm-client }\n  filterTags: { pattern: '^\\d+\\.\\d+\\.\\d+$' }\n  policy: { semver: { range: '0.26.x' } }\n---\n# Writes the new versions into ddm.yaml and pushes them.\napiVersion: image.toolkit.fluxcd.io\u002Fv1beta2\nkind: ImageUpdateAutomation\nmetadata: { name: ddm, namespace: flux-system }\nspec:\n  interval: 1h\n  sourceRef: { kind: GitRepository, name: flux-system }\n  git:\n    checkout: { ref: { branch: main } }\n    commit:\n      author: { name: Flux, email: flux@example.com }\n      messageTemplate: Update DDM\n    push: { branch: main }\n  update: { path: .\u002Fclusters\u002Fproduction\u002Fddm, strategy: Setters }\n","yaml",[485,1310,1311,1317,1322,1327,1332,1337,1343,1349,1355,1361,1367,1373,1379,1385,1397,1408,1440,1449,1460,1471,1489,1495,1504,1514,1539,1546,1564,1590,1623,1628,1634,1643,1652,1678,1685,1695,1704,1721,1726,1735,1744,1769,1776,1793,1814,1843,1848,1854,1863,1872,1898,1905,1915,1924,1941,1946,1955,1964,1989,1996,2013,2034,2063,2068,2074,2083,2093,2118,2125,2134,2162,2170,2199,2207,2236,2247,2265],{"__ignoreMap":548},[552,1312,1313],{"class":554,"line":555},[552,1314,1316],{"class":1315},"sHwdD","# Updates by Flux's image automation, for an installation Flux runs from a\n",[552,1318,1319],{"class":554,"line":569},[552,1320,1321],{"class":1315},"# Git repository (user guide, „Updates\"): beside `ddm.yaml`, in the folder\n",[552,1323,1324],{"class":554,"line":760},[552,1325,1326],{"class":1315},"# Flux applies. It reads our registry every hour and writes the newest\n",[552,1328,1329],{"class":554,"line":770},[552,1330,1331],{"class":1315},"# version in `range` into `ddm.yaml` — behind the `$imagepolicy` comments —\n",[552,1333,1334],{"class":554,"line":1061},[552,1335,1336],{"class":1315},"# commits and pushes it.\n",[552,1338,1340],{"class":554,"line":1339},6,[552,1341,1342],{"class":1315},"#\n",[552,1344,1346],{"class":554,"line":1345},7,[552,1347,1348],{"class":1315},"# Set before committing:\n",[552,1350,1352],{"class":554,"line":1351},8,[552,1353,1354],{"class":1315},"#   - `range`, three times: your version's fixes, e.g. `0.26.x`;\n",[552,1356,1358],{"class":554,"line":1357},9,[552,1359,1360],{"class":1315},"#   - `path`: the folder `ddm.yaml` is in, from the repository's root;\n",[552,1362,1364],{"class":554,"line":1363},10,[552,1365,1366],{"class":1315},"#   - the commit's `email`, and `branch` if yours is not `main`.\n",[552,1368,1370],{"class":554,"line":1369},11,[552,1371,1372],{"class":1315},"# It reads the registry with the Secret `ddm-registry` in `flux-system` —\n",[552,1374,1376],{"class":554,"line":1375},12,[552,1377,1378],{"class":1315},"# the deploy token, as in the `ddm` namespace.\n",[552,1380,1382],{"class":554,"line":1381},13,[552,1383,1384],{"class":1315},"# cms: where its versions are, and which one applies.\n",[552,1386,1388,1392,1394],{"class":554,"line":1387},14,[552,1389,1391],{"class":1390},"swJcz","apiVersion",[552,1393,950],{"class":782},[552,1395,1396],{"class":562}," image.toolkit.fluxcd.io\u002Fv1beta2\n",[552,1398,1400,1403,1405],{"class":554,"line":1399},15,[552,1401,1402],{"class":1390},"kind",[552,1404,950],{"class":782},[552,1406,1407],{"class":562}," ImageRepository\n",[552,1409,1411,1414,1416,1419,1422,1424,1427,1430,1433,1435,1437],{"class":554,"line":1410},16,[552,1412,1413],{"class":1390},"metadata",[552,1415,950],{"class":782},[552,1417,1418],{"class":782}," {",[552,1420,1421],{"class":1390}," name",[552,1423,950],{"class":782},[552,1425,1426],{"class":562}," ddm-cms",[552,1428,1429],{"class":782},",",[552,1431,1432],{"class":1390}," namespace",[552,1434,950],{"class":782},[552,1436,1217],{"class":562},[552,1438,1439],{"class":782}," }\n",[552,1441,1443,1446],{"class":554,"line":1442},17,[552,1444,1445],{"class":1390},"spec",[552,1447,1448],{"class":782},":\n",[552,1450,1452,1455,1457],{"class":554,"line":1451},18,[552,1453,1454],{"class":1390},"  image",[552,1456,950],{"class":782},[552,1458,1459],{"class":562}," registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Fcms\n",[552,1461,1463,1466,1468],{"class":554,"line":1462},19,[552,1464,1465],{"class":1390},"  interval",[552,1467,950],{"class":782},[552,1469,1470],{"class":562}," 1h\n",[552,1472,1474,1477,1479,1481,1483,1485,1487],{"class":554,"line":1473},20,[552,1475,1476],{"class":1390},"  secretRef",[552,1478,950],{"class":782},[552,1480,1418],{"class":782},[552,1482,1421],{"class":1390},[552,1484,950],{"class":782},[552,1486,1229],{"class":562},[552,1488,1439],{"class":782},[552,1490,1492],{"class":554,"line":1491},21,[552,1493,1494],{"class":558},"---\n",[552,1496,1498,1500,1502],{"class":554,"line":1497},22,[552,1499,1391],{"class":1390},[552,1501,950],{"class":782},[552,1503,1396],{"class":562},[552,1505,1507,1509,1511],{"class":554,"line":1506},23,[552,1508,1402],{"class":1390},[552,1510,950],{"class":782},[552,1512,1513],{"class":562}," ImagePolicy\n",[552,1515,1517,1519,1521,1523,1525,1527,1529,1531,1533,1535,1537],{"class":554,"line":1516},24,[552,1518,1413],{"class":1390},[552,1520,950],{"class":782},[552,1522,1418],{"class":782},[552,1524,1421],{"class":1390},[552,1526,950],{"class":782},[552,1528,1426],{"class":562},[552,1530,1429],{"class":782},[552,1532,1432],{"class":1390},[552,1534,950],{"class":782},[552,1536,1217],{"class":562},[552,1538,1439],{"class":782},[552,1540,1542,1544],{"class":554,"line":1541},25,[552,1543,1445],{"class":1390},[552,1545,1448],{"class":782},[552,1547,1549,1552,1554,1556,1558,1560,1562],{"class":554,"line":1548},26,[552,1550,1551],{"class":1390},"  imageRepositoryRef",[552,1553,950],{"class":782},[552,1555,1418],{"class":782},[552,1557,1421],{"class":1390},[552,1559,950],{"class":782},[552,1561,1426],{"class":562},[552,1563,1439],{"class":782},[552,1565,1567,1570,1572,1574,1577,1579,1582,1585,1588],{"class":554,"line":1566},27,[552,1568,1569],{"class":1390},"  filterTags",[552,1571,950],{"class":782},[552,1573,1418],{"class":782},[552,1575,1576],{"class":1390}," pattern",[552,1578,950],{"class":782},[552,1580,1581],{"class":782}," '",[552,1583,1584],{"class":562},"^\\d+\\.\\d+\\.\\d+$",[552,1586,1587],{"class":782},"'",[552,1589,1439],{"class":782},[552,1591,1593,1596,1598,1600,1603,1605,1607,1610,1612,1614,1616,1618,1621],{"class":554,"line":1592},28,[552,1594,1595],{"class":1390},"  policy",[552,1597,950],{"class":782},[552,1599,1418],{"class":782},[552,1601,1602],{"class":1390}," semver",[552,1604,950],{"class":782},[552,1606,1418],{"class":782},[552,1608,1609],{"class":1390}," range",[552,1611,950],{"class":782},[552,1613,1581],{"class":782},[552,1615,632],{"class":562},[552,1617,1587],{"class":782},[552,1619,1620],{"class":782}," }",[552,1622,1439],{"class":782},[552,1624,1626],{"class":554,"line":1625},29,[552,1627,1494],{"class":558},[552,1629,1631],{"class":554,"line":1630},30,[552,1632,1633],{"class":1315},"# render-worker: where its versions are, and which one applies.\n",[552,1635,1637,1639,1641],{"class":554,"line":1636},31,[552,1638,1391],{"class":1390},[552,1640,950],{"class":782},[552,1642,1396],{"class":562},[552,1644,1646,1648,1650],{"class":554,"line":1645},32,[552,1647,1402],{"class":1390},[552,1649,950],{"class":782},[552,1651,1407],{"class":562},[552,1653,1655,1657,1659,1661,1663,1665,1668,1670,1672,1674,1676],{"class":554,"line":1654},33,[552,1656,1413],{"class":1390},[552,1658,950],{"class":782},[552,1660,1418],{"class":782},[552,1662,1421],{"class":1390},[552,1664,950],{"class":782},[552,1666,1667],{"class":562}," ddm-render-worker",[552,1669,1429],{"class":782},[552,1671,1432],{"class":1390},[552,1673,950],{"class":782},[552,1675,1217],{"class":562},[552,1677,1439],{"class":782},[552,1679,1681,1683],{"class":554,"line":1680},34,[552,1682,1445],{"class":1390},[552,1684,1448],{"class":782},[552,1686,1688,1690,1692],{"class":554,"line":1687},35,[552,1689,1454],{"class":1390},[552,1691,950],{"class":782},[552,1693,1694],{"class":562}," registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Frender-worker\n",[552,1696,1698,1700,1702],{"class":554,"line":1697},36,[552,1699,1465],{"class":1390},[552,1701,950],{"class":782},[552,1703,1470],{"class":562},[552,1705,1707,1709,1711,1713,1715,1717,1719],{"class":554,"line":1706},37,[552,1708,1476],{"class":1390},[552,1710,950],{"class":782},[552,1712,1418],{"class":782},[552,1714,1421],{"class":1390},[552,1716,950],{"class":782},[552,1718,1229],{"class":562},[552,1720,1439],{"class":782},[552,1722,1724],{"class":554,"line":1723},38,[552,1725,1494],{"class":558},[552,1727,1729,1731,1733],{"class":554,"line":1728},39,[552,1730,1391],{"class":1390},[552,1732,950],{"class":782},[552,1734,1396],{"class":562},[552,1736,1738,1740,1742],{"class":554,"line":1737},40,[552,1739,1402],{"class":1390},[552,1741,950],{"class":782},[552,1743,1513],{"class":562},[552,1745,1747,1749,1751,1753,1755,1757,1759,1761,1763,1765,1767],{"class":554,"line":1746},41,[552,1748,1413],{"class":1390},[552,1750,950],{"class":782},[552,1752,1418],{"class":782},[552,1754,1421],{"class":1390},[552,1756,950],{"class":782},[552,1758,1667],{"class":562},[552,1760,1429],{"class":782},[552,1762,1432],{"class":1390},[552,1764,950],{"class":782},[552,1766,1217],{"class":562},[552,1768,1439],{"class":782},[552,1770,1772,1774],{"class":554,"line":1771},42,[552,1773,1445],{"class":1390},[552,1775,1448],{"class":782},[552,1777,1779,1781,1783,1785,1787,1789,1791],{"class":554,"line":1778},43,[552,1780,1551],{"class":1390},[552,1782,950],{"class":782},[552,1784,1418],{"class":782},[552,1786,1421],{"class":1390},[552,1788,950],{"class":782},[552,1790,1667],{"class":562},[552,1792,1439],{"class":782},[552,1794,1796,1798,1800,1802,1804,1806,1808,1810,1812],{"class":554,"line":1795},44,[552,1797,1569],{"class":1390},[552,1799,950],{"class":782},[552,1801,1418],{"class":782},[552,1803,1576],{"class":1390},[552,1805,950],{"class":782},[552,1807,1581],{"class":782},[552,1809,1584],{"class":562},[552,1811,1587],{"class":782},[552,1813,1439],{"class":782},[552,1815,1817,1819,1821,1823,1825,1827,1829,1831,1833,1835,1837,1839,1841],{"class":554,"line":1816},45,[552,1818,1595],{"class":1390},[552,1820,950],{"class":782},[552,1822,1418],{"class":782},[552,1824,1602],{"class":1390},[552,1826,950],{"class":782},[552,1828,1418],{"class":782},[552,1830,1609],{"class":1390},[552,1832,950],{"class":782},[552,1834,1581],{"class":782},[552,1836,632],{"class":562},[552,1838,1587],{"class":782},[552,1840,1620],{"class":782},[552,1842,1439],{"class":782},[552,1844,1846],{"class":554,"line":1845},46,[552,1847,1494],{"class":558},[552,1849,1851],{"class":554,"line":1850},47,[552,1852,1853],{"class":1315},"# client: where its versions are, and which one applies.\n",[552,1855,1857,1859,1861],{"class":554,"line":1856},48,[552,1858,1391],{"class":1390},[552,1860,950],{"class":782},[552,1862,1396],{"class":562},[552,1864,1866,1868,1870],{"class":554,"line":1865},49,[552,1867,1402],{"class":1390},[552,1869,950],{"class":782},[552,1871,1407],{"class":562},[552,1873,1875,1877,1879,1881,1883,1885,1888,1890,1892,1894,1896],{"class":554,"line":1874},50,[552,1876,1413],{"class":1390},[552,1878,950],{"class":782},[552,1880,1418],{"class":782},[552,1882,1421],{"class":1390},[552,1884,950],{"class":782},[552,1886,1887],{"class":562}," ddm-client",[552,1889,1429],{"class":782},[552,1891,1432],{"class":1390},[552,1893,950],{"class":782},[552,1895,1217],{"class":562},[552,1897,1439],{"class":782},[552,1899,1901,1903],{"class":554,"line":1900},51,[552,1902,1445],{"class":1390},[552,1904,1448],{"class":782},[552,1906,1908,1910,1912],{"class":554,"line":1907},52,[552,1909,1454],{"class":1390},[552,1911,950],{"class":782},[552,1913,1914],{"class":562}," registry.gitlab.com\u002Fiq-me\u002Fnew-ddm-images\u002Fclient\n",[552,1916,1918,1920,1922],{"class":554,"line":1917},53,[552,1919,1465],{"class":1390},[552,1921,950],{"class":782},[552,1923,1470],{"class":562},[552,1925,1927,1929,1931,1933,1935,1937,1939],{"class":554,"line":1926},54,[552,1928,1476],{"class":1390},[552,1930,950],{"class":782},[552,1932,1418],{"class":782},[552,1934,1421],{"class":1390},[552,1936,950],{"class":782},[552,1938,1229],{"class":562},[552,1940,1439],{"class":782},[552,1942,1944],{"class":554,"line":1943},55,[552,1945,1494],{"class":558},[552,1947,1949,1951,1953],{"class":554,"line":1948},56,[552,1950,1391],{"class":1390},[552,1952,950],{"class":782},[552,1954,1396],{"class":562},[552,1956,1958,1960,1962],{"class":554,"line":1957},57,[552,1959,1402],{"class":1390},[552,1961,950],{"class":782},[552,1963,1513],{"class":562},[552,1965,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987],{"class":554,"line":1966},58,[552,1968,1413],{"class":1390},[552,1970,950],{"class":782},[552,1972,1418],{"class":782},[552,1974,1421],{"class":1390},[552,1976,950],{"class":782},[552,1978,1887],{"class":562},[552,1980,1429],{"class":782},[552,1982,1432],{"class":1390},[552,1984,950],{"class":782},[552,1986,1217],{"class":562},[552,1988,1439],{"class":782},[552,1990,1992,1994],{"class":554,"line":1991},59,[552,1993,1445],{"class":1390},[552,1995,1448],{"class":782},[552,1997,1999,2001,2003,2005,2007,2009,2011],{"class":554,"line":1998},60,[552,2000,1551],{"class":1390},[552,2002,950],{"class":782},[552,2004,1418],{"class":782},[552,2006,1421],{"class":1390},[552,2008,950],{"class":782},[552,2010,1887],{"class":562},[552,2012,1439],{"class":782},[552,2014,2016,2018,2020,2022,2024,2026,2028,2030,2032],{"class":554,"line":2015},61,[552,2017,1569],{"class":1390},[552,2019,950],{"class":782},[552,2021,1418],{"class":782},[552,2023,1576],{"class":1390},[552,2025,950],{"class":782},[552,2027,1581],{"class":782},[552,2029,1584],{"class":562},[552,2031,1587],{"class":782},[552,2033,1439],{"class":782},[552,2035,2037,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057,2059,2061],{"class":554,"line":2036},62,[552,2038,1595],{"class":1390},[552,2040,950],{"class":782},[552,2042,1418],{"class":782},[552,2044,1602],{"class":1390},[552,2046,950],{"class":782},[552,2048,1418],{"class":782},[552,2050,1609],{"class":1390},[552,2052,950],{"class":782},[552,2054,1581],{"class":782},[552,2056,632],{"class":562},[552,2058,1587],{"class":782},[552,2060,1620],{"class":782},[552,2062,1439],{"class":782},[552,2064,2066],{"class":554,"line":2065},63,[552,2067,1494],{"class":558},[552,2069,2071],{"class":554,"line":2070},64,[552,2072,2073],{"class":1315},"# Writes the new versions into ddm.yaml and pushes them.\n",[552,2075,2077,2079,2081],{"class":554,"line":2076},65,[552,2078,1391],{"class":1390},[552,2080,950],{"class":782},[552,2082,1396],{"class":562},[552,2084,2086,2088,2090],{"class":554,"line":2085},66,[552,2087,1402],{"class":1390},[552,2089,950],{"class":782},[552,2091,2092],{"class":562}," ImageUpdateAutomation\n",[552,2094,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114,2116],{"class":554,"line":2095},67,[552,2097,1413],{"class":1390},[552,2099,950],{"class":782},[552,2101,1418],{"class":782},[552,2103,1421],{"class":1390},[552,2105,950],{"class":782},[552,2107,987],{"class":562},[552,2109,1429],{"class":782},[552,2111,1432],{"class":1390},[552,2113,950],{"class":782},[552,2115,1217],{"class":562},[552,2117,1439],{"class":782},[552,2119,2121,2123],{"class":554,"line":2120},68,[552,2122,1445],{"class":1390},[552,2124,1448],{"class":782},[552,2126,2128,2130,2132],{"class":554,"line":2127},69,[552,2129,1465],{"class":1390},[552,2131,950],{"class":782},[552,2133,1470],{"class":562},[552,2135,2137,2140,2142,2144,2147,2149,2152,2154,2156,2158,2160],{"class":554,"line":2136},70,[552,2138,2139],{"class":1390},"  sourceRef",[552,2141,950],{"class":782},[552,2143,1418],{"class":782},[552,2145,2146],{"class":1390}," kind",[552,2148,950],{"class":782},[552,2150,2151],{"class":562}," GitRepository",[552,2153,1429],{"class":782},[552,2155,1421],{"class":1390},[552,2157,950],{"class":782},[552,2159,1217],{"class":562},[552,2161,1439],{"class":782},[552,2163,2165,2168],{"class":554,"line":2164},71,[552,2166,2167],{"class":1390},"  git",[552,2169,1448],{"class":782},[552,2171,2173,2176,2178,2180,2183,2185,2187,2190,2192,2195,2197],{"class":554,"line":2172},72,[552,2174,2175],{"class":1390},"    checkout",[552,2177,950],{"class":782},[552,2179,1418],{"class":782},[552,2181,2182],{"class":1390}," ref",[552,2184,950],{"class":782},[552,2186,1418],{"class":782},[552,2188,2189],{"class":1390}," branch",[552,2191,950],{"class":782},[552,2193,2194],{"class":562}," main",[552,2196,1620],{"class":782},[552,2198,1439],{"class":782},[552,2200,2202,2205],{"class":554,"line":2201},73,[552,2203,2204],{"class":1390},"    commit",[552,2206,1448],{"class":782},[552,2208,2210,2213,2215,2217,2219,2221,2224,2226,2229,2231,2234],{"class":554,"line":2209},74,[552,2211,2212],{"class":1390},"      author",[552,2214,950],{"class":782},[552,2216,1418],{"class":782},[552,2218,1421],{"class":1390},[552,2220,950],{"class":782},[552,2222,2223],{"class":562}," Flux",[552,2225,1429],{"class":782},[552,2227,2228],{"class":1390}," email",[552,2230,950],{"class":782},[552,2232,2233],{"class":562}," flux@example.com",[552,2235,1439],{"class":782},[552,2237,2239,2242,2244],{"class":554,"line":2238},75,[552,2240,2241],{"class":1390},"      messageTemplate",[552,2243,950],{"class":782},[552,2245,2246],{"class":562}," Update DDM\n",[552,2248,2250,2253,2255,2257,2259,2261,2263],{"class":554,"line":2249},76,[552,2251,2252],{"class":1390},"    push",[552,2254,950],{"class":782},[552,2256,1418],{"class":782},[552,2258,2189],{"class":1390},[552,2260,950],{"class":782},[552,2262,2194],{"class":562},[552,2264,1439],{"class":782},[552,2266,2268,2271,2273,2275,2278,2280,2283,2285,2288,2290,2293],{"class":554,"line":2267},77,[552,2269,2270],{"class":1390},"  update",[552,2272,950],{"class":782},[552,2274,1418],{"class":782},[552,2276,2277],{"class":1390}," path",[552,2279,950],{"class":782},[552,2281,2282],{"class":562}," .\u002Fclusters\u002Fproduction\u002Fddm",[552,2284,1429],{"class":782},[552,2286,2287],{"class":1390}," strategy",[552,2289,950],{"class":782},[552,2291,2292],{"class":562}," Setters",[552,2294,1439],{"class":782},[433,2296,2297,2300],{},[485,2298,2299],{},"flux get images all"," shows whether Flux found anything.",[453,2302,2304],{"id":2303},"what-you-should-not-do","What you should not do",[618,2306,2307,2317],{},[621,2308,2309,2312,2313,2316],{},[437,2310,2311],{},"Don't go back a version."," A new version changes the database; an older one no longer understands it afterwards. If something doesn't work after an update, ",[448,2314,2315],{"href":415},"restore the backup"," from before the update and write to us.",[621,2318,2319,2322,2323,451],{},[437,2320,2321],{},"Don't update Postgres automatically."," A new major version (18 → 19) needs the data to be converted – see ",[448,2324,409],{"href":410},[2326,2327,2328],"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 .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 .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 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}",{"title":548,"searchDepth":569,"depth":569,"links":2330},[2331,2332,2333,2334,2335,2336,2340],{"id":455,"depth":569,"text":456},{"id":529,"depth":569,"text":530},{"id":602,"depth":569,"text":603},{"id":675,"depth":569,"text":676},{"id":687,"depth":569,"text":688},{"id":792,"depth":569,"text":793,"children":2337},[2338,2339],{"id":866,"depth":760,"text":807},{"id":1095,"depth":760,"text":810},{"id":2303,"depth":569,"text":2304},"Bring an installation to a new version – by hand or automatically.","md",null,{},{"icon":211},{"title":405,"description":2341},"AsKZ6S66mGKf_ao8C83E8_zQmh5ul9-yA8eNPECIA-M",[2349,2351],{"title":400,"path":401,"stem":402,"description":2350,"icon":403,"children":-1},"How an installation's licence is renewed, what it allows and what happens when it runs out.",{"title":409,"path":410,"stem":411,"description":2352,"icon":412,"children":-1},"Which Postgres version DDM needs, how its fixes arrive, and how to move to a new major version.",1793617723579]