Fix native Nextcloud bootstrap quoting and initial configuration seeding

This commit is contained in:
Jonatan Castro
2026-11-04 00:04:57 +01:00
parent f4e7f7d525
commit eef425666a
4 changed files with 50 additions and 7 deletions
+3 -3
View File
@@ -48,7 +48,7 @@
"revision": "bde257b20aa3ea653bf6900d22356c15cede5cc8",
"image_repository_url": "https://github.com/linuxserver/docker-nextcloud/pkgs/container/nextcloud",
"readme_pushed_at": "",
"compose_sha256": "f68fd416080b89759c26e3d1c805c431ab3158048ed83fbdd6aabb4f166c78d0",
"compose_sha256": "84937d6f7b501808b46dda6a68c3e517ac589a38d0afc2728c050535738a3fcf",
"generated_at": "2026-11-03T22:32:36+00:00"
},
"container_contract": {
@@ -167,7 +167,7 @@
],
"restart": "unless-stopped",
"stop_grace_period": null,
"original_compose": "name: nextcloud\nservices:\n db:\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_ROOT_PASSWORD: ${GENERATED_DB_ROOT_PASSWORD}\n MYSQL_USER: nextcloud\n TZ: ${TZ}\n image: mariadb:10.11\n restart: unless-stopped\n volumes:\n - read_only: false\n source: database\n target: /var/lib/mysql\n mem_limit: 1g\n healthcheck:\n test:\n - CMD\n - healthcheck.sh\n - --connect\n - --innodb_initialized\n interval: 10s\n timeout: 5s\n retries: 30\n nextcloud:\n depends_on:\n db:\n condition: service_healthy\n redis:\n condition: service_healthy\n entrypoint:\n - /bin/sh\n - -ec\n - \"umask 077\\nphp -r '$dir = '\\\"'\\\"'/config/www/nextcloud/config'\\\"'\\\"';\\nif (!is_dir($dir)\\\n \\ && !mkdir($dir, 0770, true)) { throw new RuntimeException('\\\"'\\\"'Cannot create\\\n \\ the Nextcloud config directory'\\\"'\\\"'); }\\nif (!is_file($dir . '\\\"'\\\"'/config.php'\\\"\\\n '\\\"') && !is_file($dir . '\\\"'\\\"'/autoconfig.php'\\\"'\\\"')) {\\n foreach (['\\\"\\\n '\\\"'MYSQL_HOST'\\\"'\\\"', '\\\"'\\\"'MYSQL_DATABASE'\\\"'\\\"', '\\\"'\\\"'MYSQL_USER'\\\"'\\\"\\\n ', '\\\"'\\\"'MYSQL_PASSWORD'\\\"'\\\"'] as $name) {\\n if (getenv($name) ===\\\n \\ false || getenv($name) === '\\\"'\\\"''\\\"'\\\"') { throw new RuntimeException('\\\"\\\n '\\\"'Missing Nextcloud database setting: '\\\"'\\\"' . $name); }\\n }\\n $settings\\\n \\ = ['\\\"'\\\"'dbtype'\\\"'\\\"' => '\\\"'\\\"'mysql'\\\"'\\\"', '\\\"'\\\"'dbhost'\\\"'\\\"' => getenv('\\\"\\\n '\\\"'MYSQL_HOST'\\\"'\\\"'), '\\\"'\\\"'dbname'\\\"'\\\"' => getenv('\\\"'\\\"'MYSQL_DATABASE'\\\"\\\n '\\\"'), '\\\"'\\\"'dbuser'\\\"'\\\"' => getenv('\\\"'\\\"'MYSQL_USER'\\\"'\\\"'), '\\\"'\\\"'dbpass'\\\"\\\n '\\\"' => getenv('\\\"'\\\"'MYSQL_PASSWORD'\\\"'\\\"'), '\\\"'\\\"'directory'\\\"'\\\"' => '\\\"\\\n '\\\"'/data'\\\"'\\\"'];\\n $path = $dir . '\\\"'\\\"'/autoconfig.php'\\\"'\\\"';\\n if\\\n \\ (file_put_contents($path, \\\"<?php\\\\n\\\\$AUTOCONFIG = \\\" . var_export($settings,\\\n \\ true) . \\\";\\\\n\\\", LOCK_EX) === false) { throw new RuntimeException('\\\"'\\\"\\\n 'Cannot write the Nextcloud database configuration'\\\"'\\\"'); }\\n chmod($path,\\\n \\ 0600);\\n}\\n$path = $dir . '\\\"'\\\"'/proxmenux-redis.config.php'\\\"'\\\"';\\nif (!is_file($path))\\\n \\ {\\n $settings = ['\\\"'\\\"'filelocking.enabled'\\\"'\\\"' => true, '\\\"'\\\"'memcache.local'\\\"\\\n '\\\"' => '\\\"'\\\"'\\\\OC\\\\Memcache\\\\APCu'\\\"'\\\"', '\\\"'\\\"'memcache.locking'\\\"'\\\"' =>\\\n \\ '\\\"'\\\"'\\\\OC\\\\Memcache\\\\Redis'\\\"'\\\"', '\\\"'\\\"'redis'\\\"'\\\"' => ['\\\"'\\\"'host'\\\"\\\n '\\\"' => '\\\"'\\\"'redis'\\\"'\\\"', '\\\"'\\\"'port'\\\"'\\\"' => 6379, '\\\"'\\\"'timeout'\\\"'\\\"\\\n ' => 0.0]];\\n if (file_put_contents($path, \\\"<?php\\\\n\\\\$CONFIG = \\\" . var_export($settings,\\\n \\ true) . \\\";\\\\n\\\", LOCK_EX) === false) { throw new RuntimeException('\\\"'\\\"\\\n 'Cannot write the Nextcloud Redis configuration'\\\"'\\\"'); }\\n chmod($path,\\\n \\ 0600);\\n}'\\nexec /init\"\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_HOST: db\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_USER: nextcloud\n PGID: ${PGID}\n PUID: ${PUID}\n TZ: ${TZ}\n image: lscr.io/linuxserver/nextcloud:latest\n ports:\n - 443:443\n restart: unless-stopped\n volumes:\n - read_only: false\n source: config\n target: /config\n - read_only: false\n source: data\n target: /data\n mem_limit: 2g\n redis:\n image: redis:7-alpine\n restart: unless-stopped\n volumes:\n - read_only: false\n source: redis\n target: /data\n mem_limit: 512m\n healthcheck:\n test:\n - CMD\n - redis-cli\n - ping\n interval: 10s\n timeout: 5s\n retries: 30\nvolumes:\n config: {}\n data: {}\n database: {}\n redis: {}\n"
"original_compose": "name: nextcloud\nservices:\n db:\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_ROOT_PASSWORD: ${GENERATED_DB_ROOT_PASSWORD}\n MYSQL_USER: nextcloud\n TZ: ${TZ}\n image: mariadb:10.11\n restart: unless-stopped\n volumes:\n - read_only: false\n source: database\n target: /var/lib/mysql\n mem_limit: 1g\n healthcheck:\n test:\n - CMD\n - healthcheck.sh\n - --connect\n - --innodb_initialized\n interval: 10s\n timeout: 5s\n retries: 30\n nextcloud:\n depends_on:\n db:\n condition: service_healthy\n redis:\n condition: service_healthy\n entrypoint:\n - /bin/sh\n - -ec\n - umask 077; printf %s PD9waHAKLy8gUHJlcGFyZSBhIGZyZXNoIExpbnV4U2VydmVyIE5leHRjbG91ZCB3aXRob3V0IHJlcGxhY2luZyBwZXJzaXN0ZW50IHVzZXIgc2V0dGluZ3MuCiRkaXIgPSAnL2NvbmZpZy93d3cvbmV4dGNsb3VkL2NvbmZpZyc7CmlmICghaXNfZGlyKCRkaXIpICYmICFta2RpcigkZGlyLCAwNzcwLCB0cnVlKSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignQ2Fubm90IGNyZWF0ZSB0aGUgTmV4dGNsb3VkIGNvbmZpZyBkaXJlY3RvcnknKTsgfQppZiAoIWlzX2ZpbGUoJGRpciAuICcvY29uZmlnLnBocCcpICYmICFpc19maWxlKCRkaXIgLiAnL2F1dG9jb25maWcucGhwJykpIHsKICAgIGZvcmVhY2ggKFsnTVlTUUxfSE9TVCcsICdNWVNRTF9EQVRBQkFTRScsICdNWVNRTF9VU0VSJywgJ01ZU1FMX1BBU1NXT1JEJ10gYXMgJG5hbWUpIHsKICAgICAgICBpZiAoZ2V0ZW52KCRuYW1lKSA9PT0gZmFsc2UgfHwgZ2V0ZW52KCRuYW1lKSA9PT0gJycpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01pc3NpbmcgTmV4dGNsb3VkIGRhdGFiYXNlIHNldHRpbmc6ICcgLiAkbmFtZSk7IH0KICAgIH0KICAgIC8vIEtlZXAgdGhlIGRlZmF1bHRzIHRoYXQgTGludXhTZXJ2ZXIgY29waWVzIG9ubHkgaW50byBhbiBlbXB0eSBjb25maWcgZGlyZWN0b3J5LgogICAgJGRlZmF1bHRzID0gJy9hcHAvd3d3L3NyYy9jb25maWcnOwogICAgaWYgKGlzX2RpcigkZGVmYXVsdHMpKSB7CiAgICAgICAgZm9yZWFjaCAobmV3IERpcmVjdG9yeUl0ZXJhdG9yKCRkZWZhdWx0cykgYXMgJGZpbGUpIHsKICAgICAgICAgICAgaWYgKCRmaWxlLT5pc0RvdCgpIHx8ICEkZmlsZS0+aXNGaWxlKCkpIHsgY29udGludWU7IH0KICAgICAgICAgICAgJHRhcmdldCA9ICRkaXIgLiAnLycgLiAkZmlsZS0+Z2V0RmlsZW5hbWUoKTsKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkdGFyZ2V0KSAmJiAhY29weSgkZmlsZS0+Z2V0UGF0aG5hbWUoKSwgJHRhcmdldCkpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCBzZWVkIHRoZSBOZXh0Y2xvdWQgY29uZmlndXJhdGlvbicpOyB9CiAgICAgICAgfQogICAgfQogICAgJHNldHRpbmdzID0gWydkYnR5cGUnID0+ICdteXNxbCcsICdkYmhvc3QnID0+IGdldGVudignTVlTUUxfSE9TVCcpLCAnZGJuYW1lJyA9PiBnZXRlbnYoJ01ZU1FMX0RBVEFCQVNFJyksICdkYnVzZXInID0+IGdldGVudignTVlTUUxfVVNFUicpLCAnZGJwYXNzJyA9PiBnZXRlbnYoJ01ZU1FMX1BBU1NXT1JEJyksICdkaXJlY3RvcnknID0+ICcvZGF0YSddOwogICAgJHBhdGggPSAkZGlyIC4gJy9hdXRvY29uZmlnLnBocCc7CiAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJHBhdGgsICI8P3BocFxuXCRBVVRPQ09ORklHID0gIiAuIHZhcl9leHBvcnQoJHNldHRpbmdzLCB0cnVlKSAuICI7XG4iLCBMT0NLX0VYKSA9PT0gZmFsc2UpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCB3cml0ZSB0aGUgTmV4dGNsb3VkIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24nKTsgfQogICAgY2htb2QoJHBhdGgsIDA2MDApOwp9CiRwYXRoID0gJGRpciAuICcvcHJveG1lbnV4LXJlZGlzLmNvbmZpZy5waHAnOwppZiAoIWlzX2ZpbGUoJHBhdGgpKSB7CiAgICAkc2V0dGluZ3MgPSBbJ2ZpbGVsb2NraW5nLmVuYWJsZWQnID0+IHRydWUsICdtZW1jYWNoZS5sb2NhbCcgPT4gJ1xPQ1xNZW1jYWNoZVxBUEN1JywgJ21lbWNhY2hlLmxvY2tpbmcnID0+ICdcT0NcTWVtY2FjaGVcUmVkaXMnLCAncmVkaXMnID0+IFsnaG9zdCcgPT4gJ3JlZGlzJywgJ3BvcnQnID0+IDYzNzksICd0aW1lb3V0JyA9PiAwLjBdXTsKICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgIjw/cGhwXG5cJENPTkZJRyA9ICIgLiB2YXJfZXhwb3J0KCRzZXR0aW5ncywgdHJ1ZSkgLiAiO1xuIiwgTE9DS19FWCkgPT09IGZhbHNlKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdDYW5ub3Qgd3JpdGUgdGhlIE5leHRjbG91ZCBSZWRpcyBjb25maWd1cmF0aW9uJyk7IH0KICAgIGNobW9kKCRwYXRoLCAwNjAwKTsKfQo=\n | base64 -d | php; exec /init\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_HOST: db\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_USER: nextcloud\n PGID: ${PGID}\n PUID: ${PUID}\n TZ: ${TZ}\n image: lscr.io/linuxserver/nextcloud:latest\n ports:\n - 443:443\n restart: unless-stopped\n volumes:\n - read_only: false\n source: config\n target: /config\n - read_only: false\n source: data\n target: /data\n mem_limit: 2g\n redis:\n image: redis:7-alpine\n restart: unless-stopped\n volumes:\n - read_only: false\n source: redis\n target: /data\n mem_limit: 512m\n healthcheck:\n test:\n - CMD\n - redis-cli\n - ping\n interval: 10s\n timeout: 5s\n retries: 30\nvolumes:\n config: {}\n data: {}\n database: {}\n redis: {}\n"
},
"compose_stack": {
"project_name": "nextcloud",
@@ -272,7 +272,7 @@
"entrypoint": [
"/bin/sh",
"-ec",
"umask 077\nphp -r '$dir = '\"'\"'/config/www/nextcloud/config'\"'\"';\nif (!is_dir($dir) && !mkdir($dir, 0770, true)) { throw new RuntimeException('\"'\"'Cannot create the Nextcloud config directory'\"'\"'); }\nif (!is_file($dir . '\"'\"'/config.php'\"'\"') && !is_file($dir . '\"'\"'/autoconfig.php'\"'\"')) {\n foreach (['\"'\"'MYSQL_HOST'\"'\"', '\"'\"'MYSQL_DATABASE'\"'\"', '\"'\"'MYSQL_USER'\"'\"', '\"'\"'MYSQL_PASSWORD'\"'\"'] as $name) {\n if (getenv($name) === false || getenv($name) === '\"'\"''\"'\"') { throw new RuntimeException('\"'\"'Missing Nextcloud database setting: '\"'\"' . $name); }\n }\n $settings = ['\"'\"'dbtype'\"'\"' => '\"'\"'mysql'\"'\"', '\"'\"'dbhost'\"'\"' => getenv('\"'\"'MYSQL_HOST'\"'\"'), '\"'\"'dbname'\"'\"' => getenv('\"'\"'MYSQL_DATABASE'\"'\"'), '\"'\"'dbuser'\"'\"' => getenv('\"'\"'MYSQL_USER'\"'\"'), '\"'\"'dbpass'\"'\"' => getenv('\"'\"'MYSQL_PASSWORD'\"'\"'), '\"'\"'directory'\"'\"' => '\"'\"'/data'\"'\"'];\n $path = $dir . '\"'\"'/autoconfig.php'\"'\"';\n if (file_put_contents($path, \"<?php\\n\\$AUTOCONFIG = \" . var_export($settings, true) . \";\\n\", LOCK_EX) === false) { throw new RuntimeException('\"'\"'Cannot write the Nextcloud database configuration'\"'\"'); }\n chmod($path, 0600);\n}\n$path = $dir . '\"'\"'/proxmenux-redis.config.php'\"'\"';\nif (!is_file($path)) {\n $settings = ['\"'\"'filelocking.enabled'\"'\"' => true, '\"'\"'memcache.local'\"'\"' => '\"'\"'\\OC\\Memcache\\APCu'\"'\"', '\"'\"'memcache.locking'\"'\"' => '\"'\"'\\OC\\Memcache\\Redis'\"'\"', '\"'\"'redis'\"'\"' => ['\"'\"'host'\"'\"' => '\"'\"'redis'\"'\"', '\"'\"'port'\"'\"' => 6379, '\"'\"'timeout'\"'\"' => 0.0]];\n if (file_put_contents($path, \"<?php\\n\\$CONFIG = \" . var_export($settings, true) . \";\\n\", LOCK_EX) === false) { throw new RuntimeException('\"'\"'Cannot write the Nextcloud Redis configuration'\"'\"'); }\n chmod($path, 0600);\n}'\nexec /init"
"umask 077; printf %s PD9waHAKLy8gUHJlcGFyZSBhIGZyZXNoIExpbnV4U2VydmVyIE5leHRjbG91ZCB3aXRob3V0IHJlcGxhY2luZyBwZXJzaXN0ZW50IHVzZXIgc2V0dGluZ3MuCiRkaXIgPSAnL2NvbmZpZy93d3cvbmV4dGNsb3VkL2NvbmZpZyc7CmlmICghaXNfZGlyKCRkaXIpICYmICFta2RpcigkZGlyLCAwNzcwLCB0cnVlKSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignQ2Fubm90IGNyZWF0ZSB0aGUgTmV4dGNsb3VkIGNvbmZpZyBkaXJlY3RvcnknKTsgfQppZiAoIWlzX2ZpbGUoJGRpciAuICcvY29uZmlnLnBocCcpICYmICFpc19maWxlKCRkaXIgLiAnL2F1dG9jb25maWcucGhwJykpIHsKICAgIGZvcmVhY2ggKFsnTVlTUUxfSE9TVCcsICdNWVNRTF9EQVRBQkFTRScsICdNWVNRTF9VU0VSJywgJ01ZU1FMX1BBU1NXT1JEJ10gYXMgJG5hbWUpIHsKICAgICAgICBpZiAoZ2V0ZW52KCRuYW1lKSA9PT0gZmFsc2UgfHwgZ2V0ZW52KCRuYW1lKSA9PT0gJycpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01pc3NpbmcgTmV4dGNsb3VkIGRhdGFiYXNlIHNldHRpbmc6ICcgLiAkbmFtZSk7IH0KICAgIH0KICAgIC8vIEtlZXAgdGhlIGRlZmF1bHRzIHRoYXQgTGludXhTZXJ2ZXIgY29waWVzIG9ubHkgaW50byBhbiBlbXB0eSBjb25maWcgZGlyZWN0b3J5LgogICAgJGRlZmF1bHRzID0gJy9hcHAvd3d3L3NyYy9jb25maWcnOwogICAgaWYgKGlzX2RpcigkZGVmYXVsdHMpKSB7CiAgICAgICAgZm9yZWFjaCAobmV3IERpcmVjdG9yeUl0ZXJhdG9yKCRkZWZhdWx0cykgYXMgJGZpbGUpIHsKICAgICAgICAgICAgaWYgKCRmaWxlLT5pc0RvdCgpIHx8ICEkZmlsZS0+aXNGaWxlKCkpIHsgY29udGludWU7IH0KICAgICAgICAgICAgJHRhcmdldCA9ICRkaXIgLiAnLycgLiAkZmlsZS0+Z2V0RmlsZW5hbWUoKTsKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkdGFyZ2V0KSAmJiAhY29weSgkZmlsZS0+Z2V0UGF0aG5hbWUoKSwgJHRhcmdldCkpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCBzZWVkIHRoZSBOZXh0Y2xvdWQgY29uZmlndXJhdGlvbicpOyB9CiAgICAgICAgfQogICAgfQogICAgJHNldHRpbmdzID0gWydkYnR5cGUnID0+ICdteXNxbCcsICdkYmhvc3QnID0+IGdldGVudignTVlTUUxfSE9TVCcpLCAnZGJuYW1lJyA9PiBnZXRlbnYoJ01ZU1FMX0RBVEFCQVNFJyksICdkYnVzZXInID0+IGdldGVudignTVlTUUxfVVNFUicpLCAnZGJwYXNzJyA9PiBnZXRlbnYoJ01ZU1FMX1BBU1NXT1JEJyksICdkaXJlY3RvcnknID0+ICcvZGF0YSddOwogICAgJHBhdGggPSAkZGlyIC4gJy9hdXRvY29uZmlnLnBocCc7CiAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJHBhdGgsICI8P3BocFxuXCRBVVRPQ09ORklHID0gIiAuIHZhcl9leHBvcnQoJHNldHRpbmdzLCB0cnVlKSAuICI7XG4iLCBMT0NLX0VYKSA9PT0gZmFsc2UpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCB3cml0ZSB0aGUgTmV4dGNsb3VkIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24nKTsgfQogICAgY2htb2QoJHBhdGgsIDA2MDApOwp9CiRwYXRoID0gJGRpciAuICcvcHJveG1lbnV4LXJlZGlzLmNvbmZpZy5waHAnOwppZiAoIWlzX2ZpbGUoJHBhdGgpKSB7CiAgICAkc2V0dGluZ3MgPSBbJ2ZpbGVsb2NraW5nLmVuYWJsZWQnID0+IHRydWUsICdtZW1jYWNoZS5sb2NhbCcgPT4gJ1xPQ1xNZW1jYWNoZVxBUEN1JywgJ21lbWNhY2hlLmxvY2tpbmcnID0+ICdcT0NcTWVtY2FjaGVcUmVkaXMnLCAncmVkaXMnID0+IFsnaG9zdCcgPT4gJ3JlZGlzJywgJ3BvcnQnID0+IDYzNzksICd0aW1lb3V0JyA9PiAwLjBdXTsKICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgIjw/cGhwXG5cJENPTkZJRyA9ICIgLiB2YXJfZXhwb3J0KCRzZXR0aW5ncywgdHJ1ZSkgLiAiO1xuIiwgTE9DS19FWCkgPT09IGZhbHNlKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdDYW5ub3Qgd3JpdGUgdGhlIE5leHRjbG91ZCBSZWRpcyBjb25maWd1cmF0aW9uJyk7IH0KICAgIGNobW9kKCRwYXRoLCAwNjAwKTsKfQo= | base64 -d | php; exec /init"
],
"environment": {
"PUID": "${PUID}",
+3 -3
View File
@@ -48,7 +48,7 @@
"revision": "bde257b20aa3ea653bf6900d22356c15cede5cc8",
"image_repository_url": "https://github.com/linuxserver/docker-nextcloud/pkgs/container/nextcloud",
"readme_pushed_at": "",
"compose_sha256": "f68fd416080b89759c26e3d1c805c431ab3158048ed83fbdd6aabb4f166c78d0",
"compose_sha256": "84937d6f7b501808b46dda6a68c3e517ac589a38d0afc2728c050535738a3fcf",
"generated_at": "2026-11-03T22:32:36+00:00"
},
"container_contract": {
@@ -167,7 +167,7 @@
],
"restart": "unless-stopped",
"stop_grace_period": null,
"original_compose": "name: nextcloud\nservices:\n db:\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_ROOT_PASSWORD: ${GENERATED_DB_ROOT_PASSWORD}\n MYSQL_USER: nextcloud\n TZ: ${TZ}\n image: mariadb:10.11\n restart: unless-stopped\n volumes:\n - read_only: false\n source: database\n target: /var/lib/mysql\n mem_limit: 1g\n healthcheck:\n test:\n - CMD\n - healthcheck.sh\n - --connect\n - --innodb_initialized\n interval: 10s\n timeout: 5s\n retries: 30\n nextcloud:\n depends_on:\n db:\n condition: service_healthy\n redis:\n condition: service_healthy\n entrypoint:\n - /bin/sh\n - -ec\n - \"umask 077\\nphp -r '$dir = '\\\"'\\\"'/config/www/nextcloud/config'\\\"'\\\"';\\nif (!is_dir($dir)\\\n \\ && !mkdir($dir, 0770, true)) { throw new RuntimeException('\\\"'\\\"'Cannot create\\\n \\ the Nextcloud config directory'\\\"'\\\"'); }\\nif (!is_file($dir . '\\\"'\\\"'/config.php'\\\"\\\n '\\\"') && !is_file($dir . '\\\"'\\\"'/autoconfig.php'\\\"'\\\"')) {\\n foreach (['\\\"\\\n '\\\"'MYSQL_HOST'\\\"'\\\"', '\\\"'\\\"'MYSQL_DATABASE'\\\"'\\\"', '\\\"'\\\"'MYSQL_USER'\\\"'\\\"\\\n ', '\\\"'\\\"'MYSQL_PASSWORD'\\\"'\\\"'] as $name) {\\n if (getenv($name) ===\\\n \\ false || getenv($name) === '\\\"'\\\"''\\\"'\\\"') { throw new RuntimeException('\\\"\\\n '\\\"'Missing Nextcloud database setting: '\\\"'\\\"' . $name); }\\n }\\n $settings\\\n \\ = ['\\\"'\\\"'dbtype'\\\"'\\\"' => '\\\"'\\\"'mysql'\\\"'\\\"', '\\\"'\\\"'dbhost'\\\"'\\\"' => getenv('\\\"\\\n '\\\"'MYSQL_HOST'\\\"'\\\"'), '\\\"'\\\"'dbname'\\\"'\\\"' => getenv('\\\"'\\\"'MYSQL_DATABASE'\\\"\\\n '\\\"'), '\\\"'\\\"'dbuser'\\\"'\\\"' => getenv('\\\"'\\\"'MYSQL_USER'\\\"'\\\"'), '\\\"'\\\"'dbpass'\\\"\\\n '\\\"' => getenv('\\\"'\\\"'MYSQL_PASSWORD'\\\"'\\\"'), '\\\"'\\\"'directory'\\\"'\\\"' => '\\\"\\\n '\\\"'/data'\\\"'\\\"'];\\n $path = $dir . '\\\"'\\\"'/autoconfig.php'\\\"'\\\"';\\n if\\\n \\ (file_put_contents($path, \\\"<?php\\\\n\\\\$AUTOCONFIG = \\\" . var_export($settings,\\\n \\ true) . \\\";\\\\n\\\", LOCK_EX) === false) { throw new RuntimeException('\\\"'\\\"\\\n 'Cannot write the Nextcloud database configuration'\\\"'\\\"'); }\\n chmod($path,\\\n \\ 0600);\\n}\\n$path = $dir . '\\\"'\\\"'/proxmenux-redis.config.php'\\\"'\\\"';\\nif (!is_file($path))\\\n \\ {\\n $settings = ['\\\"'\\\"'filelocking.enabled'\\\"'\\\"' => true, '\\\"'\\\"'memcache.local'\\\"\\\n '\\\"' => '\\\"'\\\"'\\\\OC\\\\Memcache\\\\APCu'\\\"'\\\"', '\\\"'\\\"'memcache.locking'\\\"'\\\"' =>\\\n \\ '\\\"'\\\"'\\\\OC\\\\Memcache\\\\Redis'\\\"'\\\"', '\\\"'\\\"'redis'\\\"'\\\"' => ['\\\"'\\\"'host'\\\"\\\n '\\\"' => '\\\"'\\\"'redis'\\\"'\\\"', '\\\"'\\\"'port'\\\"'\\\"' => 6379, '\\\"'\\\"'timeout'\\\"'\\\"\\\n ' => 0.0]];\\n if (file_put_contents($path, \\\"<?php\\\\n\\\\$CONFIG = \\\" . var_export($settings,\\\n \\ true) . \\\";\\\\n\\\", LOCK_EX) === false) { throw new RuntimeException('\\\"'\\\"\\\n 'Cannot write the Nextcloud Redis configuration'\\\"'\\\"'); }\\n chmod($path,\\\n \\ 0600);\\n}'\\nexec /init\"\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_HOST: db\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_USER: nextcloud\n PGID: ${PGID}\n PUID: ${PUID}\n TZ: ${TZ}\n image: lscr.io/linuxserver/nextcloud:latest\n ports:\n - 443:443\n restart: unless-stopped\n volumes:\n - read_only: false\n source: config\n target: /config\n - read_only: false\n source: data\n target: /data\n mem_limit: 2g\n redis:\n image: redis:7-alpine\n restart: unless-stopped\n volumes:\n - read_only: false\n source: redis\n target: /data\n mem_limit: 512m\n healthcheck:\n test:\n - CMD\n - redis-cli\n - ping\n interval: 10s\n timeout: 5s\n retries: 30\nvolumes:\n config: {}\n data: {}\n database: {}\n redis: {}\n"
"original_compose": "name: nextcloud\nservices:\n db:\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_ROOT_PASSWORD: ${GENERATED_DB_ROOT_PASSWORD}\n MYSQL_USER: nextcloud\n TZ: ${TZ}\n image: mariadb:10.11\n restart: unless-stopped\n volumes:\n - read_only: false\n source: database\n target: /var/lib/mysql\n mem_limit: 1g\n healthcheck:\n test:\n - CMD\n - healthcheck.sh\n - --connect\n - --innodb_initialized\n interval: 10s\n timeout: 5s\n retries: 30\n nextcloud:\n depends_on:\n db:\n condition: service_healthy\n redis:\n condition: service_healthy\n entrypoint:\n - /bin/sh\n - -ec\n - umask 077; printf %s PD9waHAKLy8gUHJlcGFyZSBhIGZyZXNoIExpbnV4U2VydmVyIE5leHRjbG91ZCB3aXRob3V0IHJlcGxhY2luZyBwZXJzaXN0ZW50IHVzZXIgc2V0dGluZ3MuCiRkaXIgPSAnL2NvbmZpZy93d3cvbmV4dGNsb3VkL2NvbmZpZyc7CmlmICghaXNfZGlyKCRkaXIpICYmICFta2RpcigkZGlyLCAwNzcwLCB0cnVlKSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignQ2Fubm90IGNyZWF0ZSB0aGUgTmV4dGNsb3VkIGNvbmZpZyBkaXJlY3RvcnknKTsgfQppZiAoIWlzX2ZpbGUoJGRpciAuICcvY29uZmlnLnBocCcpICYmICFpc19maWxlKCRkaXIgLiAnL2F1dG9jb25maWcucGhwJykpIHsKICAgIGZvcmVhY2ggKFsnTVlTUUxfSE9TVCcsICdNWVNRTF9EQVRBQkFTRScsICdNWVNRTF9VU0VSJywgJ01ZU1FMX1BBU1NXT1JEJ10gYXMgJG5hbWUpIHsKICAgICAgICBpZiAoZ2V0ZW52KCRuYW1lKSA9PT0gZmFsc2UgfHwgZ2V0ZW52KCRuYW1lKSA9PT0gJycpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01pc3NpbmcgTmV4dGNsb3VkIGRhdGFiYXNlIHNldHRpbmc6ICcgLiAkbmFtZSk7IH0KICAgIH0KICAgIC8vIEtlZXAgdGhlIGRlZmF1bHRzIHRoYXQgTGludXhTZXJ2ZXIgY29waWVzIG9ubHkgaW50byBhbiBlbXB0eSBjb25maWcgZGlyZWN0b3J5LgogICAgJGRlZmF1bHRzID0gJy9hcHAvd3d3L3NyYy9jb25maWcnOwogICAgaWYgKGlzX2RpcigkZGVmYXVsdHMpKSB7CiAgICAgICAgZm9yZWFjaCAobmV3IERpcmVjdG9yeUl0ZXJhdG9yKCRkZWZhdWx0cykgYXMgJGZpbGUpIHsKICAgICAgICAgICAgaWYgKCRmaWxlLT5pc0RvdCgpIHx8ICEkZmlsZS0+aXNGaWxlKCkpIHsgY29udGludWU7IH0KICAgICAgICAgICAgJHRhcmdldCA9ICRkaXIgLiAnLycgLiAkZmlsZS0+Z2V0RmlsZW5hbWUoKTsKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkdGFyZ2V0KSAmJiAhY29weSgkZmlsZS0+Z2V0UGF0aG5hbWUoKSwgJHRhcmdldCkpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCBzZWVkIHRoZSBOZXh0Y2xvdWQgY29uZmlndXJhdGlvbicpOyB9CiAgICAgICAgfQogICAgfQogICAgJHNldHRpbmdzID0gWydkYnR5cGUnID0+ICdteXNxbCcsICdkYmhvc3QnID0+IGdldGVudignTVlTUUxfSE9TVCcpLCAnZGJuYW1lJyA9PiBnZXRlbnYoJ01ZU1FMX0RBVEFCQVNFJyksICdkYnVzZXInID0+IGdldGVudignTVlTUUxfVVNFUicpLCAnZGJwYXNzJyA9PiBnZXRlbnYoJ01ZU1FMX1BBU1NXT1JEJyksICdkaXJlY3RvcnknID0+ICcvZGF0YSddOwogICAgJHBhdGggPSAkZGlyIC4gJy9hdXRvY29uZmlnLnBocCc7CiAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJHBhdGgsICI8P3BocFxuXCRBVVRPQ09ORklHID0gIiAuIHZhcl9leHBvcnQoJHNldHRpbmdzLCB0cnVlKSAuICI7XG4iLCBMT0NLX0VYKSA9PT0gZmFsc2UpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCB3cml0ZSB0aGUgTmV4dGNsb3VkIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24nKTsgfQogICAgY2htb2QoJHBhdGgsIDA2MDApOwp9CiRwYXRoID0gJGRpciAuICcvcHJveG1lbnV4LXJlZGlzLmNvbmZpZy5waHAnOwppZiAoIWlzX2ZpbGUoJHBhdGgpKSB7CiAgICAkc2V0dGluZ3MgPSBbJ2ZpbGVsb2NraW5nLmVuYWJsZWQnID0+IHRydWUsICdtZW1jYWNoZS5sb2NhbCcgPT4gJ1xPQ1xNZW1jYWNoZVxBUEN1JywgJ21lbWNhY2hlLmxvY2tpbmcnID0+ICdcT0NcTWVtY2FjaGVcUmVkaXMnLCAncmVkaXMnID0+IFsnaG9zdCcgPT4gJ3JlZGlzJywgJ3BvcnQnID0+IDYzNzksICd0aW1lb3V0JyA9PiAwLjBdXTsKICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgIjw/cGhwXG5cJENPTkZJRyA9ICIgLiB2YXJfZXhwb3J0KCRzZXR0aW5ncywgdHJ1ZSkgLiAiO1xuIiwgTE9DS19FWCkgPT09IGZhbHNlKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdDYW5ub3Qgd3JpdGUgdGhlIE5leHRjbG91ZCBSZWRpcyBjb25maWd1cmF0aW9uJyk7IH0KICAgIGNobW9kKCRwYXRoLCAwNjAwKTsKfQo=\n | base64 -d | php; exec /init\n environment:\n MYSQL_DATABASE: nextcloud\n MYSQL_HOST: db\n MYSQL_PASSWORD: ${GENERATED_DB_PASSWORD}\n MYSQL_USER: nextcloud\n PGID: ${PGID}\n PUID: ${PUID}\n TZ: ${TZ}\n image: lscr.io/linuxserver/nextcloud:latest\n ports:\n - 443:443\n restart: unless-stopped\n volumes:\n - read_only: false\n source: config\n target: /config\n - read_only: false\n source: data\n target: /data\n mem_limit: 2g\n redis:\n image: redis:7-alpine\n restart: unless-stopped\n volumes:\n - read_only: false\n source: redis\n target: /data\n mem_limit: 512m\n healthcheck:\n test:\n - CMD\n - redis-cli\n - ping\n interval: 10s\n timeout: 5s\n retries: 30\nvolumes:\n config: {}\n data: {}\n database: {}\n redis: {}\n"
},
"compose_stack": {
"project_name": "nextcloud",
@@ -272,7 +272,7 @@
"entrypoint": [
"/bin/sh",
"-ec",
"umask 077\nphp -r '$dir = '\"'\"'/config/www/nextcloud/config'\"'\"';\nif (!is_dir($dir) && !mkdir($dir, 0770, true)) { throw new RuntimeException('\"'\"'Cannot create the Nextcloud config directory'\"'\"'); }\nif (!is_file($dir . '\"'\"'/config.php'\"'\"') && !is_file($dir . '\"'\"'/autoconfig.php'\"'\"')) {\n foreach (['\"'\"'MYSQL_HOST'\"'\"', '\"'\"'MYSQL_DATABASE'\"'\"', '\"'\"'MYSQL_USER'\"'\"', '\"'\"'MYSQL_PASSWORD'\"'\"'] as $name) {\n if (getenv($name) === false || getenv($name) === '\"'\"''\"'\"') { throw new RuntimeException('\"'\"'Missing Nextcloud database setting: '\"'\"' . $name); }\n }\n $settings = ['\"'\"'dbtype'\"'\"' => '\"'\"'mysql'\"'\"', '\"'\"'dbhost'\"'\"' => getenv('\"'\"'MYSQL_HOST'\"'\"'), '\"'\"'dbname'\"'\"' => getenv('\"'\"'MYSQL_DATABASE'\"'\"'), '\"'\"'dbuser'\"'\"' => getenv('\"'\"'MYSQL_USER'\"'\"'), '\"'\"'dbpass'\"'\"' => getenv('\"'\"'MYSQL_PASSWORD'\"'\"'), '\"'\"'directory'\"'\"' => '\"'\"'/data'\"'\"'];\n $path = $dir . '\"'\"'/autoconfig.php'\"'\"';\n if (file_put_contents($path, \"<?php\\n\\$AUTOCONFIG = \" . var_export($settings, true) . \";\\n\", LOCK_EX) === false) { throw new RuntimeException('\"'\"'Cannot write the Nextcloud database configuration'\"'\"'); }\n chmod($path, 0600);\n}\n$path = $dir . '\"'\"'/proxmenux-redis.config.php'\"'\"';\nif (!is_file($path)) {\n $settings = ['\"'\"'filelocking.enabled'\"'\"' => true, '\"'\"'memcache.local'\"'\"' => '\"'\"'\\OC\\Memcache\\APCu'\"'\"', '\"'\"'memcache.locking'\"'\"' => '\"'\"'\\OC\\Memcache\\Redis'\"'\"', '\"'\"'redis'\"'\"' => ['\"'\"'host'\"'\"' => '\"'\"'redis'\"'\"', '\"'\"'port'\"'\"' => 6379, '\"'\"'timeout'\"'\"' => 0.0]];\n if (file_put_contents($path, \"<?php\\n\\$CONFIG = \" . var_export($settings, true) . \";\\n\", LOCK_EX) === false) { throw new RuntimeException('\"'\"'Cannot write the Nextcloud Redis configuration'\"'\"'); }\n chmod($path, 0600);\n}'\nexec /init"
"umask 077; printf %s PD9waHAKLy8gUHJlcGFyZSBhIGZyZXNoIExpbnV4U2VydmVyIE5leHRjbG91ZCB3aXRob3V0IHJlcGxhY2luZyBwZXJzaXN0ZW50IHVzZXIgc2V0dGluZ3MuCiRkaXIgPSAnL2NvbmZpZy93d3cvbmV4dGNsb3VkL2NvbmZpZyc7CmlmICghaXNfZGlyKCRkaXIpICYmICFta2RpcigkZGlyLCAwNzcwLCB0cnVlKSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignQ2Fubm90IGNyZWF0ZSB0aGUgTmV4dGNsb3VkIGNvbmZpZyBkaXJlY3RvcnknKTsgfQppZiAoIWlzX2ZpbGUoJGRpciAuICcvY29uZmlnLnBocCcpICYmICFpc19maWxlKCRkaXIgLiAnL2F1dG9jb25maWcucGhwJykpIHsKICAgIGZvcmVhY2ggKFsnTVlTUUxfSE9TVCcsICdNWVNRTF9EQVRBQkFTRScsICdNWVNRTF9VU0VSJywgJ01ZU1FMX1BBU1NXT1JEJ10gYXMgJG5hbWUpIHsKICAgICAgICBpZiAoZ2V0ZW52KCRuYW1lKSA9PT0gZmFsc2UgfHwgZ2V0ZW52KCRuYW1lKSA9PT0gJycpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01pc3NpbmcgTmV4dGNsb3VkIGRhdGFiYXNlIHNldHRpbmc6ICcgLiAkbmFtZSk7IH0KICAgIH0KICAgIC8vIEtlZXAgdGhlIGRlZmF1bHRzIHRoYXQgTGludXhTZXJ2ZXIgY29waWVzIG9ubHkgaW50byBhbiBlbXB0eSBjb25maWcgZGlyZWN0b3J5LgogICAgJGRlZmF1bHRzID0gJy9hcHAvd3d3L3NyYy9jb25maWcnOwogICAgaWYgKGlzX2RpcigkZGVmYXVsdHMpKSB7CiAgICAgICAgZm9yZWFjaCAobmV3IERpcmVjdG9yeUl0ZXJhdG9yKCRkZWZhdWx0cykgYXMgJGZpbGUpIHsKICAgICAgICAgICAgaWYgKCRmaWxlLT5pc0RvdCgpIHx8ICEkZmlsZS0+aXNGaWxlKCkpIHsgY29udGludWU7IH0KICAgICAgICAgICAgJHRhcmdldCA9ICRkaXIgLiAnLycgLiAkZmlsZS0+Z2V0RmlsZW5hbWUoKTsKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkdGFyZ2V0KSAmJiAhY29weSgkZmlsZS0+Z2V0UGF0aG5hbWUoKSwgJHRhcmdldCkpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCBzZWVkIHRoZSBOZXh0Y2xvdWQgY29uZmlndXJhdGlvbicpOyB9CiAgICAgICAgfQogICAgfQogICAgJHNldHRpbmdzID0gWydkYnR5cGUnID0+ICdteXNxbCcsICdkYmhvc3QnID0+IGdldGVudignTVlTUUxfSE9TVCcpLCAnZGJuYW1lJyA9PiBnZXRlbnYoJ01ZU1FMX0RBVEFCQVNFJyksICdkYnVzZXInID0+IGdldGVudignTVlTUUxfVVNFUicpLCAnZGJwYXNzJyA9PiBnZXRlbnYoJ01ZU1FMX1BBU1NXT1JEJyksICdkaXJlY3RvcnknID0+ICcvZGF0YSddOwogICAgJHBhdGggPSAkZGlyIC4gJy9hdXRvY29uZmlnLnBocCc7CiAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJHBhdGgsICI8P3BocFxuXCRBVVRPQ09ORklHID0gIiAuIHZhcl9leHBvcnQoJHNldHRpbmdzLCB0cnVlKSAuICI7XG4iLCBMT0NLX0VYKSA9PT0gZmFsc2UpIHsgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0Nhbm5vdCB3cml0ZSB0aGUgTmV4dGNsb3VkIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24nKTsgfQogICAgY2htb2QoJHBhdGgsIDA2MDApOwp9CiRwYXRoID0gJGRpciAuICcvcHJveG1lbnV4LXJlZGlzLmNvbmZpZy5waHAnOwppZiAoIWlzX2ZpbGUoJHBhdGgpKSB7CiAgICAkc2V0dGluZ3MgPSBbJ2ZpbGVsb2NraW5nLmVuYWJsZWQnID0+IHRydWUsICdtZW1jYWNoZS5sb2NhbCcgPT4gJ1xPQ1xNZW1jYWNoZVxBUEN1JywgJ21lbWNhY2hlLmxvY2tpbmcnID0+ICdcT0NcTWVtY2FjaGVcUmVkaXMnLCAncmVkaXMnID0+IFsnaG9zdCcgPT4gJ3JlZGlzJywgJ3BvcnQnID0+IDYzNzksICd0aW1lb3V0JyA9PiAwLjBdXTsKICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgIjw/cGhwXG5cJENPTkZJRyA9ICIgLiB2YXJfZXhwb3J0KCRzZXR0aW5ncywgdHJ1ZSkgLiAiO1xuIiwgTE9DS19FWCkgPT09IGZhbHNlKSB7IHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdDYW5ub3Qgd3JpdGUgdGhlIE5leHRjbG91ZCBSZWRpcyBjb25maWd1cmF0aW9uJyk7IH0KICAgIGNobW9kKCRwYXRoLCAwNjAwKTsKfQo= | base64 -d | php; exec /init"
],
"environment": {
"PUID": "${PUID}",
@@ -0,0 +1,28 @@
<?php
// Prepare a fresh LinuxServer Nextcloud without replacing persistent user settings.
$dir = '/config/www/nextcloud/config';
if (!is_dir($dir) && !mkdir($dir, 0770, true)) { throw new RuntimeException('Cannot create the Nextcloud config directory'); }
if (!is_file($dir . '/config.php') && !is_file($dir . '/autoconfig.php')) {
foreach (['MYSQL_HOST', 'MYSQL_DATABASE', 'MYSQL_USER', 'MYSQL_PASSWORD'] as $name) {
if (getenv($name) === false || getenv($name) === '') { throw new RuntimeException('Missing Nextcloud database setting: ' . $name); }
}
// Keep the defaults that LinuxServer copies only into an empty config directory.
$defaults = '/app/www/src/config';
if (is_dir($defaults)) {
foreach (new DirectoryIterator($defaults) as $file) {
if ($file->isDot() || !$file->isFile()) { continue; }
$target = $dir . '/' . $file->getFilename();
if (!file_exists($target) && !copy($file->getPathname(), $target)) { throw new RuntimeException('Cannot seed the Nextcloud configuration'); }
}
}
$settings = ['dbtype' => 'mysql', 'dbhost' => getenv('MYSQL_HOST'), 'dbname' => getenv('MYSQL_DATABASE'), 'dbuser' => getenv('MYSQL_USER'), 'dbpass' => getenv('MYSQL_PASSWORD'), 'directory' => '/data'];
$path = $dir . '/autoconfig.php';
if (file_put_contents($path, "<?php\n\$AUTOCONFIG = " . var_export($settings, true) . ";\n", LOCK_EX) === false) { throw new RuntimeException('Cannot write the Nextcloud database configuration'); }
chmod($path, 0600);
}
$path = $dir . '/proxmenux-redis.config.php';
if (!is_file($path)) {
$settings = ['filelocking.enabled' => true, 'memcache.local' => '\OC\Memcache\APCu', 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => ['host' => 'redis', 'port' => 6379, 'timeout' => 0.0]];
if (file_put_contents($path, "<?php\n\$CONFIG = " . var_export($settings, true) . ";\n", LOCK_EX) === false) { throw new RuntimeException('Cannot write the Nextcloud Redis configuration'); }
chmod($path, 0600);
}
+16 -1
View File
@@ -1,5 +1,7 @@
"""The LinuxServer/MariaDB variant keeps its complete private stack and safe bootstrap."""
import json
import base64
import re
import os
from pathlib import Path
import shutil
@@ -76,6 +78,8 @@ class NextcloudMariaDBTests(unittest.TestCase):
{'nextcloud': 2048, 'db': 1024, 'redis': 512})
runtime = services['nextcloud']['template']['proxmox']['installer_profile']['runtime']
self.assertIn('exec /init', runtime['compose_entrypoint'][2])
self.assertNotIn('\n', runtime['compose_entrypoint'][2])
self.assertNotIn('\r', runtime['compose_entrypoint'][2])
def test_nas_mount_is_separate_from_configuration_database_and_cache(self):
plan = self.plan(DEFAULT_MODE, {'Where to store nextcloud: /data': 'host-bind',
@@ -95,10 +99,19 @@ class NextcloudMariaDBTests(unittest.TestCase):
entry = next(s for s in self.template['compose_stack']['services'] if s['name'] == 'nextcloud')['compose']['entrypoint']
with tempfile.TemporaryDirectory() as temp:
folder = Path(temp) / 'config'
script = entry[2].replace('/config/www/nextcloud/config', str(folder)).replace('exec /init', 'exit 0')
image_config = Path(temp) / 'image-config'
image_config.mkdir()
defaults = {'CAN_INSTALL': '', '.htaccess': 'deny all', 'config.sample.php': '<?php // sample'}
for name, content in defaults.items(): (image_config / name).write_text(content)
payload = re.search(r'printf %s ([A-Za-z0-9+/=]+) \| base64 -d \| php', entry[2]).group(1)
source = base64.b64decode(payload).decode()
self.assertEqual(source, (ROOT / 'examples/nextcloud-mariadb-bootstrap.php').read_text())
test_source = source.replace('/config/www/nextcloud/config', str(folder)).replace('/app/www/src/config', str(image_config))
script = entry[2].replace(payload, base64.b64encode(test_source.encode()).decode()).replace('exec /init', 'exit 0')
password = "test-'quote\\backslash$not-a-real-secret\nline"
env = dict(os.environ, MYSQL_HOST='db', MYSQL_DATABASE='nextcloud', MYSQL_USER='nextcloud', MYSQL_PASSWORD=password)
subprocess.run(['/bin/sh', '-ec', script], env=env, check=True, capture_output=True)
for name, content in defaults.items(): self.assertEqual((folder / name).read_text(), content)
autoconfig = folder / 'autoconfig.php'
redis = folder / 'proxmenux-redis.config.php'
for path in (autoconfig, redis):
@@ -118,9 +131,11 @@ class NextcloudMariaDBTests(unittest.TestCase):
subprocess.run(['/bin/sh', '-ec', script], env=dict(env, MYSQL_PASSWORD='changed'), check=True, capture_output=True)
for path, content in saved.items(): self.assertEqual(path.read_bytes(), content)
autoconfig.unlink()
(folder / 'CAN_INSTALL').unlink()
(folder / 'config.php').write_text('<?php $CONFIG = ["installed" => true];')
subprocess.run(['/bin/sh', '-ec', script], env=env, check=True, capture_output=True)
self.assertFalse(autoconfig.exists())
self.assertFalse((folder / 'CAN_INSTALL').exists())
if __name__ == '__main__':
unittest.main()