From eaa668036f6c19dd0a08b4636f4181409d3dbf67 Mon Sep 17 00:00:00 2001 From: Yassir <53705290+YaRissi@users.noreply.github.com> Date: Mon, 5 Jan 2026 14:13:42 +0100 Subject: [PATCH] feat(service): upgrade docker registry template (#7034) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 🏔️ Peak <122374094+peaklabs-dev@users.noreply.github.com> --- app/Models/Service.php | 25 +++++++++++++ templates/compose/docker-registry.yaml | 47 ++++++++++++++++++------- templates/service-templates-latest.json | 4 +-- templates/service-templates.json | 4 +-- 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/app/Models/Service.php b/app/Models/Service.php index b4ee17b6a..f28b7b635 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -515,6 +515,31 @@ public function extraFields() } $fields->put('RabbitMQ', $data->toArray()); break; + case $image->is('registry'): + $data = collect([]); + $registry_user = $this->environment_variables()->where('key', 'SERVICE_USER_REGISTRY')->first(); + $registry_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_REGISTRY')->first(); + if ($registry_user) { + $data = $data->merge([ + 'Registry User' => [ + 'key' => data_get($registry_user, 'key'), + 'value' => data_get($registry_user, 'value'), + 'rules' => 'required', + ], + ]); + } + if ($registry_password) { + $data = $data->merge([ + 'Registry Password' => [ + 'key' => data_get($registry_password, 'key'), + 'value' => data_get($registry_password, 'value'), + 'rules' => 'required', + 'isPassword' => true, + ], + ]); + } + $fields->put('Docker Registry', $data->toArray()); + break; case $image->contains('tolgee'): $data = collect([]); $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_TOLGEE')->first(); diff --git a/templates/compose/docker-registry.yaml b/templates/compose/docker-registry.yaml index ac983f644..555e6669b 100644 --- a/templates/compose/docker-registry.yaml +++ b/templates/compose/docker-registry.yaml @@ -1,4 +1,4 @@ -# documentation: https://docs.docker.com/registry/ +# documentation: https://distribution.github.io/distribution/ # slogan: The Docker Registry lets you distribute Docker images. # category: devtools # tags: registry,images,docker @@ -7,20 +7,35 @@ services: registry: - image: registry:2 + image: registry:3 environment: - SERVICE_URL_REGISTRY_5000 + - USERNAME=${SERVICE_USER_REGISTRY} + - PASSWORD=${SERVICE_PASSWORD_REGISTRY} - REGISTRY_AUTH=htpasswd - - REGISTRY_AUTH_HTPASSWD_REALM=Registry + - REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm - REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry.password - - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data + command: ["/entrypoint.sh"] volumes: + - registry-data:/var/lib/registry - type: bind - source: ./auth/registry.password - target: /auth/registry.password - isDirectory: false - content: >- - testuser:$2y$05$/o2JvmI2bhExXIt6Oqxa7ekYB7v3scj1wFEf6tBslJvJOMoPQL.Gy + source: ./etc/entrypoint.sh + target: /entrypoint.sh + mode: "0755" + content: | + #!/usr/bin/env sh + set -e + + if [ -z "$USERNAME" ] || [ -z "$PASSWORD" ]; then + echo "Error: USERNAME and PASSWORD environment variables must be set" + exit 1 + fi + + apk add --no-cache apache2-utils + mkdir -p "$(dirname "$REGISTRY_AUTH_HTPASSWD_PATH")" + chmod 755 "$(dirname "$REGISTRY_AUTH_HTPASSWD_PATH")" + htpasswd -Bbc "$REGISTRY_AUTH_HTPASSWD_PATH" "$USERNAME" "$PASSWORD" + registry serve /etc/docker/registry/config.yml - type: bind source: ./config/config.yml target: /etc/docker/registry/config.yml @@ -45,7 +60,13 @@ services: enabled: true interval: 10s threshold: 3 - - type: bind - source: ./data - target: /data - isDirectory: true + healthcheck: + test: + - CMD + - wget + - "-q" + - "--spider" + - "http://localhost:5000/" + interval: 5s + timeout: 20s + retries: 10 diff --git a/templates/service-templates-latest.json b/templates/service-templates-latest.json index 1673bbf48..e48b61ac9 100644 --- a/templates/service-templates-latest.json +++ b/templates/service-templates-latest.json @@ -773,9 +773,9 @@ "minversion": "0.0.0" }, "docker-registry": { - "documentation": "https://docs.docker.com/registry/?utm_source=coolify.io", + "documentation": "https://distribution.github.io/distribution/?utm_source=coolify.io", "slogan": "The Docker Registry lets you distribute Docker images.", - "compose": "c2VydmljZXM6CiAgcmVnaXN0cnk6CiAgICBpbWFnZTogJ3JlZ2lzdHJ5OjInCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX1VSTF9SRUdJU1RSWV81MDAwCiAgICAgIC0gUkVHSVNUUllfQVVUSD1odHBhc3N3ZAogICAgICAtIFJFR0lTVFJZX0FVVEhfSFRQQVNTV0RfUkVBTE09UmVnaXN0cnkKICAgICAgLSBSRUdJU1RSWV9BVVRIX0hUUEFTU1dEX1BBVEg9L2F1dGgvcmVnaXN0cnkucGFzc3dvcmQKICAgICAgLSBSRUdJU1RSWV9TVE9SQUdFX0ZJTEVTWVNURU1fUk9PVERJUkVDVE9SWT0vZGF0YQogICAgdm9sdW1lczoKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vYXV0aC9yZWdpc3RyeS5wYXNzd29yZAogICAgICAgIHRhcmdldDogL2F1dGgvcmVnaXN0cnkucGFzc3dvcmQKICAgICAgICBpc0RpcmVjdG9yeTogZmFsc2UKICAgICAgICBjb250ZW50OiAndGVzdHVzZXI6JDJ5JDA1JC9vMkp2bUkyYmhFeFhJdDZPcXhhN2VrWUI3djNzY2oxd0ZFZjZ0QnNsSnZKT01vUFFMLkd5JwogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi9jb25maWcvY29uZmlnLnltbAogICAgICAgIHRhcmdldDogL2V0Yy9kb2NrZXIvcmVnaXN0cnkvY29uZmlnLnltbAogICAgICAgIGlzRGlyZWN0b3J5OiBmYWxzZQogICAgICAgIGNvbnRlbnQ6ICJ2ZXJzaW9uOiAwLjFcbmxvZzpcbiAgZmllbGRzOlxuICAgIHNlcnZpY2U6IHJlZ2lzdHJ5XG5zdG9yYWdlOlxuICBjYWNoZTpcbiAgICBibG9iZGVzY3JpcHRvcjogaW5tZW1vcnlcbiAgZmlsZXN5c3RlbTpcbiAgICByb290ZGlyZWN0b3J5OiAvdmFyL2xpYi9yZWdpc3RyeVxuaHR0cDpcbiAgYWRkcjogOjUwMDBcbiAgaGVhZGVyczpcbiAgICBYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBbbm9zbmlmZl1cbmhlYWx0aDpcbiAgc3RvcmFnZWRyaXZlcjpcbiAgICBlbmFibGVkOiB0cnVlXG4gICAgaW50ZXJ2YWw6IDEwc1xuICAgIHRocmVzaG9sZDogMyIKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vZGF0YQogICAgICAgIHRhcmdldDogL2RhdGEKICAgICAgICBpc0RpcmVjdG9yeTogdHJ1ZQo=", + "compose": "c2VydmljZXM6CiAgcmVnaXN0cnk6CiAgICBpbWFnZTogJ3JlZ2lzdHJ5OjMnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX1VSTF9SRUdJU1RSWV81MDAwCiAgICAgIC0gJ1VTRVJOQU1FPSR7U0VSVklDRV9VU0VSX1JFR0lTVFJZfScKICAgICAgLSAnUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1JFR0lTVFJZfScKICAgICAgLSBSRUdJU1RSWV9BVVRIPWh0cGFzc3dkCiAgICAgIC0gJ1JFR0lTVFJZX0FVVEhfSFRQQVNTV0RfUkVBTE09UmVnaXN0cnkgUmVhbG0nCiAgICAgIC0gUkVHSVNUUllfQVVUSF9IVFBBU1NXRF9QQVRIPS9hdXRoL3JlZ2lzdHJ5LnBhc3N3b3JkCiAgICBjb21tYW5kOgogICAgICAtIC9lbnRyeXBvaW50LnNoCiAgICB2b2x1bWVzOgogICAgICAtICdyZWdpc3RyeS1kYXRhOi92YXIvbGliL3JlZ2lzdHJ5JwogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi9ldGMvZW50cnlwb2ludC5zaAogICAgICAgIHRhcmdldDogL2VudHJ5cG9pbnQuc2gKICAgICAgICBtb2RlOiAnMDc1NScKICAgICAgICBjb250ZW50OiAiIyEvdXNyL2Jpbi9lbnYgc2hcbnNldCAtZSBcblxuaWYgWyAteiBcIiRVU0VSTkFNRVwiIF0gfHwgWyAteiBcIiRQQVNTV09SRFwiIF07IHRoZW5cbiAgICBlY2hvIFwiRXJyb3I6IFVTRVJOQU1FIGFuZCBQQVNTV09SRCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbXVzdCBiZSBzZXRcIlxuICAgIGV4aXQgMVxuZmlcblxuYXBrIGFkZCAtLW5vLWNhY2hlIGFwYWNoZTItdXRpbHNcbm1rZGlyIC1wIFwiJChkaXJuYW1lIFwiJFJFR0lTVFJZX0FVVEhfSFRQQVNTV0RfUEFUSFwiKVwiXG5jaG1vZCA3NTUgXCIkKGRpcm5hbWUgXCIkUkVHSVNUUllfQVVUSF9IVFBBU1NXRF9QQVRIXCIpXCJcbmh0cGFzc3dkIC1CYmMgXCIkUkVHSVNUUllfQVVUSF9IVFBBU1NXRF9QQVRIXCIgXCIkVVNFUk5BTUVcIiBcIiRQQVNTV09SRFwiXG5yZWdpc3RyeSBzZXJ2ZSAvZXRjL2RvY2tlci9yZWdpc3RyeS9jb25maWcueW1sXG4iCiAgICAgIC0KICAgICAgICB0eXBlOiBiaW5kCiAgICAgICAgc291cmNlOiAuL2NvbmZpZy9jb25maWcueW1sCiAgICAgICAgdGFyZ2V0OiAvZXRjL2RvY2tlci9yZWdpc3RyeS9jb25maWcueW1sCiAgICAgICAgaXNEaXJlY3Rvcnk6IGZhbHNlCiAgICAgICAgY29udGVudDogInZlcnNpb246IDAuMVxubG9nOlxuICBmaWVsZHM6XG4gICAgc2VydmljZTogcmVnaXN0cnlcbnN0b3JhZ2U6XG4gIGNhY2hlOlxuICAgIGJsb2JkZXNjcmlwdG9yOiBpbm1lbW9yeVxuICBmaWxlc3lzdGVtOlxuICAgIHJvb3RkaXJlY3Rvcnk6IC92YXIvbGliL3JlZ2lzdHJ5XG5odHRwOlxuICBhZGRyOiA6NTAwMFxuICBoZWFkZXJzOlxuICAgIFgtQ29udGVudC1UeXBlLU9wdGlvbnM6IFtub3NuaWZmXVxuaGVhbHRoOlxuICBzdG9yYWdlZHJpdmVyOlxuICAgIGVuYWJsZWQ6IHRydWVcbiAgICBpbnRlcnZhbDogMTBzXG4gICAgdGhyZXNob2xkOiAzIgogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHdnZXQKICAgICAgICAtICctcScKICAgICAgICAtICctLXNwaWRlcicKICAgICAgICAtICdodHRwOi8vbG9jYWxob3N0OjUwMDAvJwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==", "tags": [ "registry", "images", diff --git a/templates/service-templates.json b/templates/service-templates.json index 7669832b0..89b8044dd 100644 --- a/templates/service-templates.json +++ b/templates/service-templates.json @@ -773,9 +773,9 @@ "minversion": "0.0.0" }, "docker-registry": { - "documentation": "https://docs.docker.com/registry/?utm_source=coolify.io", + "documentation": "https://distribution.github.io/distribution/?utm_source=coolify.io", "slogan": "The Docker Registry lets you distribute Docker images.", - "compose": "c2VydmljZXM6CiAgcmVnaXN0cnk6CiAgICBpbWFnZTogJ3JlZ2lzdHJ5OjInCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fUkVHSVNUUllfNTAwMAogICAgICAtIFJFR0lTVFJZX0FVVEg9aHRwYXNzd2QKICAgICAgLSBSRUdJU1RSWV9BVVRIX0hUUEFTU1dEX1JFQUxNPVJlZ2lzdHJ5CiAgICAgIC0gUkVHSVNUUllfQVVUSF9IVFBBU1NXRF9QQVRIPS9hdXRoL3JlZ2lzdHJ5LnBhc3N3b3JkCiAgICAgIC0gUkVHSVNUUllfU1RPUkFHRV9GSUxFU1lTVEVNX1JPT1RESVJFQ1RPUlk9L2RhdGEKICAgIHZvbHVtZXM6CiAgICAgIC0KICAgICAgICB0eXBlOiBiaW5kCiAgICAgICAgc291cmNlOiAuL2F1dGgvcmVnaXN0cnkucGFzc3dvcmQKICAgICAgICB0YXJnZXQ6IC9hdXRoL3JlZ2lzdHJ5LnBhc3N3b3JkCiAgICAgICAgaXNEaXJlY3Rvcnk6IGZhbHNlCiAgICAgICAgY29udGVudDogJ3Rlc3R1c2VyOiQyeSQwNSQvbzJKdm1JMmJoRXhYSXQ2T3F4YTdla1lCN3Yzc2NqMXdGRWY2dEJzbEp2Sk9Nb1BRTC5HeScKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vY29uZmlnL2NvbmZpZy55bWwKICAgICAgICB0YXJnZXQ6IC9ldGMvZG9ja2VyL3JlZ2lzdHJ5L2NvbmZpZy55bWwKICAgICAgICBpc0RpcmVjdG9yeTogZmFsc2UKICAgICAgICBjb250ZW50OiAidmVyc2lvbjogMC4xXG5sb2c6XG4gIGZpZWxkczpcbiAgICBzZXJ2aWNlOiByZWdpc3RyeVxuc3RvcmFnZTpcbiAgY2FjaGU6XG4gICAgYmxvYmRlc2NyaXB0b3I6IGlubWVtb3J5XG4gIGZpbGVzeXN0ZW06XG4gICAgcm9vdGRpcmVjdG9yeTogL3Zhci9saWIvcmVnaXN0cnlcbmh0dHA6XG4gIGFkZHI6IDo1MDAwXG4gIGhlYWRlcnM6XG4gICAgWC1Db250ZW50LVR5cGUtT3B0aW9uczogW25vc25pZmZdXG5oZWFsdGg6XG4gIHN0b3JhZ2Vkcml2ZXI6XG4gICAgZW5hYmxlZDogdHJ1ZVxuICAgIGludGVydmFsOiAxMHNcbiAgICB0aHJlc2hvbGQ6IDMiCiAgICAgIC0KICAgICAgICB0eXBlOiBiaW5kCiAgICAgICAgc291cmNlOiAuL2RhdGEKICAgICAgICB0YXJnZXQ6IC9kYXRhCiAgICAgICAgaXNEaXJlY3Rvcnk6IHRydWUK", + "compose": "c2VydmljZXM6CiAgcmVnaXN0cnk6CiAgICBpbWFnZTogJ3JlZ2lzdHJ5OjMnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fUkVHSVNUUllfNTAwMAogICAgICAtICdVU0VSTkFNRT0ke1NFUlZJQ0VfVVNFUl9SRUdJU1RSWX0nCiAgICAgIC0gJ1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9SRUdJU1RSWX0nCiAgICAgIC0gUkVHSVNUUllfQVVUSD1odHBhc3N3ZAogICAgICAtICdSRUdJU1RSWV9BVVRIX0hUUEFTU1dEX1JFQUxNPVJlZ2lzdHJ5IFJlYWxtJwogICAgICAtIFJFR0lTVFJZX0FVVEhfSFRQQVNTV0RfUEFUSD0vYXV0aC9yZWdpc3RyeS5wYXNzd29yZAogICAgY29tbWFuZDoKICAgICAgLSAvZW50cnlwb2ludC5zaAogICAgdm9sdW1lczoKICAgICAgLSAncmVnaXN0cnktZGF0YTovdmFyL2xpYi9yZWdpc3RyeScKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vZXRjL2VudHJ5cG9pbnQuc2gKICAgICAgICB0YXJnZXQ6IC9lbnRyeXBvaW50LnNoCiAgICAgICAgbW9kZTogJzA3NTUnCiAgICAgICAgY29udGVudDogIiMhL3Vzci9iaW4vZW52IHNoXG5zZXQgLWUgXG5cbmlmIFsgLXogXCIkVVNFUk5BTUVcIiBdIHx8IFsgLXogXCIkUEFTU1dPUkRcIiBdOyB0aGVuXG4gICAgZWNobyBcIkVycm9yOiBVU0VSTkFNRSBhbmQgUEFTU1dPUkQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3QgYmUgc2V0XCJcbiAgICBleGl0IDFcbmZpXG5cbmFwayBhZGQgLS1uby1jYWNoZSBhcGFjaGUyLXV0aWxzXG5ta2RpciAtcCBcIiQoZGlybmFtZSBcIiRSRUdJU1RSWV9BVVRIX0hUUEFTU1dEX1BBVEhcIilcIlxuY2htb2QgNzU1IFwiJChkaXJuYW1lIFwiJFJFR0lTVFJZX0FVVEhfSFRQQVNTV0RfUEFUSFwiKVwiXG5odHBhc3N3ZCAtQmJjIFwiJFJFR0lTVFJZX0FVVEhfSFRQQVNTV0RfUEFUSFwiIFwiJFVTRVJOQU1FXCIgXCIkUEFTU1dPUkRcIlxucmVnaXN0cnkgc2VydmUgL2V0Yy9kb2NrZXIvcmVnaXN0cnkvY29uZmlnLnltbFxuIgogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi9jb25maWcvY29uZmlnLnltbAogICAgICAgIHRhcmdldDogL2V0Yy9kb2NrZXIvcmVnaXN0cnkvY29uZmlnLnltbAogICAgICAgIGlzRGlyZWN0b3J5OiBmYWxzZQogICAgICAgIGNvbnRlbnQ6ICJ2ZXJzaW9uOiAwLjFcbmxvZzpcbiAgZmllbGRzOlxuICAgIHNlcnZpY2U6IHJlZ2lzdHJ5XG5zdG9yYWdlOlxuICBjYWNoZTpcbiAgICBibG9iZGVzY3JpcHRvcjogaW5tZW1vcnlcbiAgZmlsZXN5c3RlbTpcbiAgICByb290ZGlyZWN0b3J5OiAvdmFyL2xpYi9yZWdpc3RyeVxuaHR0cDpcbiAgYWRkcjogOjUwMDBcbiAgaGVhZGVyczpcbiAgICBYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBbbm9zbmlmZl1cbmhlYWx0aDpcbiAgc3RvcmFnZWRyaXZlcjpcbiAgICBlbmFibGVkOiB0cnVlXG4gICAgaW50ZXJ2YWw6IDEwc1xuICAgIHRocmVzaG9sZDogMyIKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSB3Z2V0CiAgICAgICAgLSAnLXEnCiAgICAgICAgLSAnLS1zcGlkZXInCiAgICAgICAgLSAnaHR0cDovL2xvY2FsaG9zdDo1MDAwLycKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAo=", "tags": [ "registry", "images",