From 64b6f86a36638af56de0f582e80cd1f93ccd2ce6 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Thu, 30 Nov 2023 12:21:21 +0100 Subject: [PATCH 01/12] Update PostgreSQL image version to 16-alpine for services --- templates/compose/directus-with-postgresql.yaml | 2 +- templates/compose/gitea-with-postgresql.yaml | 2 +- templates/compose/grafana-with-postgresql.yaml | 2 +- templates/compose/mattermost.yaml | 2 +- templates/compose/n8n-with-postgresql.yaml | 2 +- templates/compose/sonarqube.yaml | 2 +- templates/compose/trigger.yaml | 2 +- templates/compose/umami.yaml | 2 +- templates/service-templates.json | 12 ++++++------ 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/templates/compose/directus-with-postgresql.yaml b/templates/compose/directus-with-postgresql.yaml index 3c843c4de..21fc83f3c 100644 --- a/templates/compose/directus-with-postgresql.yaml +++ b/templates/compose/directus-with-postgresql.yaml @@ -24,7 +24,7 @@ services: - REDIS_PORT=6379 - WEBSOCKETS_ENABLED=true postgresql: - image: postgres:15-alpine + image: postgres:16-alpine volumes: - directus-postgresql-data:/var/lib/postgresql/data environment: diff --git a/templates/compose/gitea-with-postgresql.yaml b/templates/compose/gitea-with-postgresql.yaml index f213a3bac..d7e5f2a42 100644 --- a/templates/compose/gitea-with-postgresql.yaml +++ b/templates/compose/gitea-with-postgresql.yaml @@ -30,7 +30,7 @@ services: retries: 15 postgresql: - image: postgres:15-alpine + image: postgres:16-alpine volumes: - gitea-postgresql-data:/var/lib/postgresql/data environment: diff --git a/templates/compose/grafana-with-postgresql.yaml b/templates/compose/grafana-with-postgresql.yaml index eb5798e66..5e01be07c 100644 --- a/templates/compose/grafana-with-postgresql.yaml +++ b/templates/compose/grafana-with-postgresql.yaml @@ -25,7 +25,7 @@ services: depends_on: - postgresql postgresql: - image: postgres:15-alpine + image: postgres:16-alpine volumes: - postgresql-data:/var/lib/postgresql/data environment: diff --git a/templates/compose/mattermost.yaml b/templates/compose/mattermost.yaml index 899490d58..2afe9a537 100644 --- a/templates/compose/mattermost.yaml +++ b/templates/compose/mattermost.yaml @@ -18,7 +18,7 @@ services: depends_on: - postgres postgres: - image: postgres:15-alpine + image: postgres:16-alpine volumes: - postgresql-data:/var/lib/postgresql/data environment: diff --git a/templates/compose/n8n-with-postgresql.yaml b/templates/compose/n8n-with-postgresql.yaml index ef9208b02..4de32d60a 100644 --- a/templates/compose/n8n-with-postgresql.yaml +++ b/templates/compose/n8n-with-postgresql.yaml @@ -24,7 +24,7 @@ services: depends_on: - postgresql postgresql: - image: postgres:15-alpine + image: postgres:16-alpine volumes: - postgresql-data:/var/lib/postgresql/data environment: diff --git a/templates/compose/sonarqube.yaml b/templates/compose/sonarqube.yaml index 3f3f5d8e5..a0df26411 100644 --- a/templates/compose/sonarqube.yaml +++ b/templates/compose/sonarqube.yaml @@ -21,7 +21,7 @@ services: postgresql: condition: service_healthy postgresql: - image: postgres:15-alpine + image: postgres:16-alpine volumes: - postgresql-data:/var/lib/postgresql/data environment: diff --git a/templates/compose/trigger.yaml b/templates/compose/trigger.yaml index 7f2bd8167..dbe95df76 100644 --- a/templates/compose/trigger.yaml +++ b/templates/compose/trigger.yaml @@ -31,7 +31,7 @@ services: healthcheck: test: ["NONE"] postgresql: - image: postgres:15-alpine + image: postgres:16-alpine volumes: - postgresql-data:/var/lib/postgresql/data environment: diff --git a/templates/compose/umami.yaml b/templates/compose/umami.yaml index cc9dc4c03..563ec72fd 100644 --- a/templates/compose/umami.yaml +++ b/templates/compose/umami.yaml @@ -14,7 +14,7 @@ services: postgresql: condition: service_healthy postgresql: - image: postgres:15-alpine + image: postgres:16-alpine volumes: - postgresql-data:/var/lib/postgresql/data environment: diff --git a/templates/service-templates.json b/templates/service-templates.json index aed78172c..f65dd2894 100644 --- a/templates/service-templates.json +++ b/templates/service-templates.json @@ -68,7 +68,7 @@ "directus-with-postgresql": { "documentation": "https:\/\/docs.directus.io\/self-hosted\/quickstart.html", "slogan": "Directus is an open-source tool that wraps custom SQL databases with a dynamic API, and provides an intuitive admin app for managing its content.", - "compose": "c2VydmljZXM6CiAgZGlyZWN0dXM6CiAgICBpbWFnZTogJ2RpcmVjdHVzL2RpcmVjdHVzOjEwLjcnCiAgICB2b2x1bWVzOgogICAgICAtICdkaXJlY3R1cy11cGxvYWRzOi9kaXJlY3R1cy91cGxvYWRzJwogICAgICAtICdkaXJlY3R1cy1leHRlbnNpb25zOi9kaXJlY3R1cy9leHRlbnNpb25zJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX0RJUkVDVFVTCiAgICAgIC0gS0VZPSRTRVJWSUNFX0JBU0U2NF82NF9LRVkKICAgICAgLSBTRUNSRVQ9JFNFUlZJQ0VfQkFTRTY0XzY0X1NFQ1JFVAogICAgICAtICdBRE1JTl9FTUFJTD0ke0FETUlOX0VNQUlMOi1hZG1pbkBleGFtcGxlLmNvbX0nCiAgICAgIC0gQURNSU5fUEFTU1dPUkQ9JFNFUlZJQ0VfUEFTU1dPUkRfQURNSU4KICAgICAgLSBEQl9DTElFTlQ9cG9zdGdyZXMKICAgICAgLSBEQl9IT1NUPXBvc3RncmVzcWwKICAgICAgLSBEQl9QT1JUPTU0MzIKICAgICAgLSAnREJfREFUQUJBU0U9JHtQT1NUR1JFU1FMX0RBVEFCQVNFOi1kaXJlY3R1c30nCiAgICAgIC0gREJfVVNFUj0kU0VSVklDRV9VU0VSX1BPU1RHUkVTUUwKICAgICAgLSBEQl9QQVNTV09SRD0kU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU1FMCiAgICAgIC0gUkVESVNfSE9TVD1yZWRpcwogICAgICAtIFJFRElTX1BPUlQ9NjM3OQogICAgICAtIFdFQlNPQ0tFVFNfRU5BQkxFRD10cnVlCiAgcG9zdGdyZXNxbDoKICAgIGltYWdlOiAncG9zdGdyZXM6MTUtYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAnZGlyZWN0dXMtcG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19VU0VSPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTUUx9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNRTH0nCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNRTF9EQVRBQkFTRTotZGlyZWN0dXN9JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogIHJlZGlzOgogICAgaW1hZ2U6ICdyZWRpczo3LWFscGluZScKICAgIGNvbW1hbmQ6ICdyZWRpcy1zZXJ2ZXIgLS1hcHBlbmRvbmx5IHllcycKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2RpcmVjdHVzLXJlZGlzLWRhdGE6L2RhdGEnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gcmVkaXMtY2xpCiAgICAgICAgLSBwaW5nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK", + "compose": "c2VydmljZXM6CiAgZGlyZWN0dXM6CiAgICBpbWFnZTogJ2RpcmVjdHVzL2RpcmVjdHVzOjEwLjcnCiAgICB2b2x1bWVzOgogICAgICAtICdkaXJlY3R1cy11cGxvYWRzOi9kaXJlY3R1cy91cGxvYWRzJwogICAgICAtICdkaXJlY3R1cy1leHRlbnNpb25zOi9kaXJlY3R1cy9leHRlbnNpb25zJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX0RJUkVDVFVTCiAgICAgIC0gS0VZPSRTRVJWSUNFX0JBU0U2NF82NF9LRVkKICAgICAgLSBTRUNSRVQ9JFNFUlZJQ0VfQkFTRTY0XzY0X1NFQ1JFVAogICAgICAtICdBRE1JTl9FTUFJTD0ke0FETUlOX0VNQUlMOi1hZG1pbkBleGFtcGxlLmNvbX0nCiAgICAgIC0gQURNSU5fUEFTU1dPUkQ9JFNFUlZJQ0VfUEFTU1dPUkRfQURNSU4KICAgICAgLSBEQl9DTElFTlQ9cG9zdGdyZXMKICAgICAgLSBEQl9IT1NUPXBvc3RncmVzcWwKICAgICAgLSBEQl9QT1JUPTU0MzIKICAgICAgLSAnREJfREFUQUJBU0U9JHtQT1NUR1JFU1FMX0RBVEFCQVNFOi1kaXJlY3R1c30nCiAgICAgIC0gREJfVVNFUj0kU0VSVklDRV9VU0VSX1BPU1RHUkVTUUwKICAgICAgLSBEQl9QQVNTV09SRD0kU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU1FMCiAgICAgIC0gUkVESVNfSE9TVD1yZWRpcwogICAgICAtIFJFRElTX1BPUlQ9NjM3OQogICAgICAtIFdFQlNPQ0tFVFNfRU5BQkxFRD10cnVlCiAgcG9zdGdyZXNxbDoKICAgIGltYWdlOiAncG9zdGdyZXM6MTYtYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAnZGlyZWN0dXMtcG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19VU0VSPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTUUx9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNRTH0nCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNRTF9EQVRBQkFTRTotZGlyZWN0dXN9JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogIHJlZGlzOgogICAgaW1hZ2U6ICdyZWRpczo3LWFscGluZScKICAgIGNvbW1hbmQ6ICdyZWRpcy1zZXJ2ZXIgLS1hcHBlbmRvbmx5IHllcycKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2RpcmVjdHVzLXJlZGlzLWRhdGE6L2RhdGEnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gcmVkaXMtY2xpCiAgICAgICAgLSBwaW5nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK", "tags": [ "directus", "cms", @@ -208,7 +208,7 @@ "gitea-with-postgresql": { "documentation": "https:\/\/docs.gitea.com", "slogan": "Gitea (with PostgreSQL)vis a self-hosted, lightweight Git service, offering version control, collaboration, and code hosting.", - "compose": "c2VydmljZXM6CiAgZ2l0ZWE6CiAgICBpbWFnZTogJ2dpdGVhL2dpdGVhOmxhdGVzdCcKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9HSVRFQV8zMDAwCiAgICAgIC0gVVNFUl9VSUQ9MTAwMAogICAgICAtIFVTRVJfR0lEPTEwMDAKICAgICAgLSBHSVRFQV9fZGF0YWJhc2VfX0RCX1RZUEU9cG9zdGdyZXMKICAgICAgLSBHSVRFQV9fZGF0YWJhc2VfX0hPU1Q9cG9zdGdyZXNxbAogICAgICAtICdHSVRFQV9fZGF0YWJhc2VfX05BTUU9JHtQT1NUR1JFU1FMX0RBVEFCQVNFLWdpdGVhfScKICAgICAgLSBHSVRFQV9fZGF0YWJhc2VfX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFU1FMCiAgICAgIC0gR0lURUFfX2RhdGFiYXNlX19QQVNTV0Q9JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNRTAogICAgdm9sdW1lczoKICAgICAgLSAnZ2l0ZWEtZGF0YTovdmFyL2xpYi9naXRlYScKICAgICAgLSAnZ2l0ZWEtdGltZXpvbmU6L2V0Yy90aW1lem9uZTpybycKICAgICAgLSAnZ2l0ZWEtbG9jYWx0aW1lOi9ldGMvbG9jYWx0aW1lOnJvJwogICAgcG9ydHM6CiAgICAgIC0gJzIyMjIyOjIyJwogICAgZGVwZW5kc19vbjoKICAgICAgcG9zdGdyZXNxbDoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICctZicKICAgICAgICAtICdodHRwOi8vbG9jYWxob3N0OjMwMDAnCiAgICAgIGludGVydmFsOiAycwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMTUKICBwb3N0Z3Jlc3FsOgogICAgaW1hZ2U6ICdwb3N0Z3JlczoxNS1hbHBpbmUnCiAgICB2b2x1bWVzOgogICAgICAtICdnaXRlYS1wb3N0Z3Jlc3FsLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVNRTH0nCiAgICAgIC0gJ1BPU1RHUkVTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU1FMfScKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU1FMX0RBVEFCQVNFfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAkJHtQT1NUR1JFU19VU0VSfSAtZCAkJHtQT1NUR1JFU19EQn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK", + "compose": "c2VydmljZXM6CiAgZ2l0ZWE6CiAgICBpbWFnZTogJ2dpdGVhL2dpdGVhOmxhdGVzdCcKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9HSVRFQV8zMDAwCiAgICAgIC0gVVNFUl9VSUQ9MTAwMAogICAgICAtIFVTRVJfR0lEPTEwMDAKICAgICAgLSBHSVRFQV9fZGF0YWJhc2VfX0RCX1RZUEU9cG9zdGdyZXMKICAgICAgLSBHSVRFQV9fZGF0YWJhc2VfX0hPU1Q9cG9zdGdyZXNxbAogICAgICAtICdHSVRFQV9fZGF0YWJhc2VfX05BTUU9JHtQT1NUR1JFU1FMX0RBVEFCQVNFLWdpdGVhfScKICAgICAgLSBHSVRFQV9fZGF0YWJhc2VfX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFU1FMCiAgICAgIC0gR0lURUFfX2RhdGFiYXNlX19QQVNTV0Q9JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNRTAogICAgdm9sdW1lczoKICAgICAgLSAnZ2l0ZWEtZGF0YTovdmFyL2xpYi9naXRlYScKICAgICAgLSAnZ2l0ZWEtdGltZXpvbmU6L2V0Yy90aW1lem9uZTpybycKICAgICAgLSAnZ2l0ZWEtbG9jYWx0aW1lOi9ldGMvbG9jYWx0aW1lOnJvJwogICAgcG9ydHM6CiAgICAgIC0gJzIyMjIyOjIyJwogICAgZGVwZW5kc19vbjoKICAgICAgcG9zdGdyZXNxbDoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICctZicKICAgICAgICAtICdodHRwOi8vbG9jYWxob3N0OjMwMDAnCiAgICAgIGludGVydmFsOiAycwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMTUKICBwb3N0Z3Jlc3FsOgogICAgaW1hZ2U6ICdwb3N0Z3JlczoxNi1hbHBpbmUnCiAgICB2b2x1bWVzOgogICAgICAtICdnaXRlYS1wb3N0Z3Jlc3FsLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVNRTH0nCiAgICAgIC0gJ1BPU1RHUkVTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU1FMfScKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU1FMX0RBVEFCQVNFfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAkJHtQT1NUR1JFU19VU0VSfSAtZCAkJHtQT1NUR1JFU19EQn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK", "tags": [ "version control", "collaboration", @@ -233,7 +233,7 @@ "grafana-with-postgresql": { "documentation": "https:\/\/grafana.com\/docs\/grafana\/latest\/installation\/docker\/", "slogan": "Grafana is the open source analytics & monitoring solution for every database.", - "compose": "c2VydmljZXM6CiAgZ3JhZmFuYToKICAgIGltYWdlOiBncmFmYW5hL2dyYWZhbmEtb3NzCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fR1JBRkFOQQogICAgICAtICdHRl9TRVJWRVJfUk9PVF9VUkw9JHtTRVJWSUNFX0ZRRE5fR1JBRkFOQX0nCiAgICAgIC0gJ0dGX1NFUlZFUl9ET01BSU49JHtTRVJWSUNFX0ZRRE5fR1JBRkFOQX0nCiAgICAgIC0gJ0dGX1NFQ1VSSVRZX0FETUlOX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9HUkFGQU5BfScKICAgICAgLSBHRl9EQVRBQkFTRV9UWVBFPXBvc3RncmVzCiAgICAgIC0gR0ZfREFUQUJBU0VfSE9TVD1wb3N0Z3Jlc3FsCiAgICAgIC0gR0ZfREFUQUJBU0VfVVNFUj0kU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIC0gR0ZfREFUQUJBU0VfUEFTU1dPUkQ9JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVMKICAgICAgLSAnR0ZfREFUQUJBU0VfTkFNRT0ke1BPU1RHUkVTX0RCOi1ncmFmYW5hfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2dyYWZhbmEtZGF0YTovdmFyL2xpYi9ncmFmYW5hJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICctZicKICAgICAgICAtICdodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpL2hlYWx0aCcKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogICAgZGVwZW5kc19vbjoKICAgICAgLSBwb3N0Z3Jlc3FsCiAgcG9zdGdyZXNxbDoKICAgIGltYWdlOiAncG9zdGdyZXM6MTUtYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAncG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LWdyYWZhbmF9JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAo=", + "compose": "c2VydmljZXM6CiAgZ3JhZmFuYToKICAgIGltYWdlOiBncmFmYW5hL2dyYWZhbmEtb3NzCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fR1JBRkFOQQogICAgICAtICdHRl9TRVJWRVJfUk9PVF9VUkw9JHtTRVJWSUNFX0ZRRE5fR1JBRkFOQX0nCiAgICAgIC0gJ0dGX1NFUlZFUl9ET01BSU49JHtTRVJWSUNFX0ZRRE5fR1JBRkFOQX0nCiAgICAgIC0gJ0dGX1NFQ1VSSVRZX0FETUlOX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9HUkFGQU5BfScKICAgICAgLSBHRl9EQVRBQkFTRV9UWVBFPXBvc3RncmVzCiAgICAgIC0gR0ZfREFUQUJBU0VfSE9TVD1wb3N0Z3Jlc3FsCiAgICAgIC0gR0ZfREFUQUJBU0VfVVNFUj0kU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIC0gR0ZfREFUQUJBU0VfUEFTU1dPUkQ9JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVMKICAgICAgLSAnR0ZfREFUQUJBU0VfTkFNRT0ke1BPU1RHUkVTX0RCOi1ncmFmYW5hfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2dyYWZhbmEtZGF0YTovdmFyL2xpYi9ncmFmYW5hJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICctZicKICAgICAgICAtICdodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpL2hlYWx0aCcKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogICAgZGVwZW5kc19vbjoKICAgICAgLSBwb3N0Z3Jlc3FsCiAgcG9zdGdyZXNxbDoKICAgIGltYWdlOiAncG9zdGdyZXM6MTYtYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAncG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LWdyYWZhbmF9JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAo=", "tags": [ "grafana", "analytics", @@ -346,7 +346,7 @@ "n8n-with-postgresql": { "documentation": "https:\/\/docs.n8n.io\/hosting\/", "slogan": "n8n is an extendable workflow automation tool which enables you to connect anything to everything via its open, fair-code model.", - "compose": "c2VydmljZXM6CiAgbjhuOgogICAgaW1hZ2U6IGRvY2tlci5uOG4uaW8vbjhuaW8vbjhuCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fTjhOCiAgICAgIC0gJ044Tl9FRElUT1JfQkFTRV9VUkw9JHtTRVJWSUNFX0ZRRE5fTjhOfScKICAgICAgLSAnV0VCSE9PS19VUkw9JHtTRVJWSUNFX0ZRRE5fTjhOfScKICAgICAgLSAnTjhOX0hPU1Q9JHtTRVJWSUNFX1VSTF9OOE59JwogICAgICAtICdHRU5FUklDX1RJTUVaT05FPSJFdXJvcGUvQmVybGluIicKICAgICAgLSAnVFo9IkV1cm9wZS9CZXJsaW4iJwogICAgICAtIERCX1RZUEU9cG9zdGdyZXNkYgogICAgICAtICdEQl9QT1NUR1JFU0RCX0RBVEFCQVNFPSR7UE9TVEdSRVNfREI6LW44bn0nCiAgICAgIC0gREJfUE9TVEdSRVNEQl9IT1NUPXBvc3RncmVzcWwKICAgICAgLSBEQl9QT1NUR1JFU0RCX1BPUlQ9NTQzMgogICAgICAtIERCX1BPU1RHUkVTREJfVVNFUj0kU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIC0gREJfUE9TVEdSRVNEQl9TQ0hFTUE9cHVibGljCiAgICAgIC0gREJfUE9TVEdSRVNEQl9QQVNTV09SRD0kU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFUwogICAgdm9sdW1lczoKICAgICAgLSAnbjhuLWRhdGE6L2hvbWUvbm9kZS8ubjhuJwogICAgZGVwZW5kc19vbjoKICAgICAgLSBwb3N0Z3Jlc3FsCiAgcG9zdGdyZXNxbDoKICAgIGltYWdlOiAncG9zdGdyZXM6MTUtYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAncG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LW44bn0nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9JwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==", + "compose": "c2VydmljZXM6CiAgbjhuOgogICAgaW1hZ2U6IGRvY2tlci5uOG4uaW8vbjhuaW8vbjhuCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fTjhOCiAgICAgIC0gJ044Tl9FRElUT1JfQkFTRV9VUkw9JHtTRVJWSUNFX0ZRRE5fTjhOfScKICAgICAgLSAnV0VCSE9PS19VUkw9JHtTRVJWSUNFX0ZRRE5fTjhOfScKICAgICAgLSAnTjhOX0hPU1Q9JHtTRVJWSUNFX1VSTF9OOE59JwogICAgICAtICdHRU5FUklDX1RJTUVaT05FPSJFdXJvcGUvQmVybGluIicKICAgICAgLSAnVFo9IkV1cm9wZS9CZXJsaW4iJwogICAgICAtIERCX1RZUEU9cG9zdGdyZXNkYgogICAgICAtICdEQl9QT1NUR1JFU0RCX0RBVEFCQVNFPSR7UE9TVEdSRVNfREI6LW44bn0nCiAgICAgIC0gREJfUE9TVEdSRVNEQl9IT1NUPXBvc3RncmVzcWwKICAgICAgLSBEQl9QT1NUR1JFU0RCX1BPUlQ9NTQzMgogICAgICAtIERCX1BPU1RHUkVTREJfVVNFUj0kU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIC0gREJfUE9TVEdSRVNEQl9TQ0hFTUE9cHVibGljCiAgICAgIC0gREJfUE9TVEdSRVNEQl9QQVNTV09SRD0kU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFUwogICAgdm9sdW1lczoKICAgICAgLSAnbjhuLWRhdGE6L2hvbWUvbm9kZS8ubjhuJwogICAgZGVwZW5kc19vbjoKICAgICAgLSBwb3N0Z3Jlc3FsCiAgcG9zdGdyZXNxbDoKICAgIGltYWdlOiAncG9zdGdyZXM6MTYtYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAncG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LW44bn0nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9JwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==", "tags": [ "n8n", "workflow", @@ -473,7 +473,7 @@ "trigger": { "documentation": "https:\/\/trigger.dev\/docs\/documentation\/guides\/self-hosting", "slogan": "The open source Background Jobs framework for TypeScript", - "compose": "c2VydmljZXM6CiAgdHJpZ2dlcjoKICAgIGltYWdlOiAnZ2hjci5pby90cmlnZ2VyZG90ZGV2L3RyaWdnZXIuZGV2OmxhdGVzdCcKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9UUklHR0VSCiAgICAgIC0gTE9HSU5fT1JJR0lOPSRTRVJWSUNFX0ZRRE5fVFJJR0dFUgogICAgICAtIEFQUF9PUklHSU49JFNFUlZJQ0VfRlFETl9UUklHR0VSCiAgICAgIC0gTUFHSUNfTElOS19TRUNSRVQ9JFNFUlZJQ0VfUEFTU1dPUkRfNjRfTUFHSUMKICAgICAgLSBFTkNSWVBUSU9OX0tFWT0kU0VSVklDRV9QQVNTV09SRF82NF9FTkNSWVBUSU9OCiAgICAgIC0gU0VTU0lPTl9TRUNSRVQ9JFNFUlZJQ0VfUEFTU1dPUkRfNjRfU0VTU0lPTgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LXRyaWdnZXJ9JwogICAgICAtIFBPU1RHUkVTX0hPU1Q9cG9zdGdyZXMKICAgICAgLSAnREFUQUJBU0VfVVJMPXBvc3RncmVzOi8vJFNFUlZJQ0VfVVNFUl9QT1NUR1JFUzokU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU0Bwb3N0Z3Jlc3FsOjU0MzIvJFBPU1RHUkVTX0RCJwogICAgICAtICdESVJFQ1RfVVJMPXBvc3RncmVzOi8vJFNFUlZJQ0VfVVNFUl9QT1NUR1JFUzokU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU0Bwb3N0Z3Jlc3FsOjU0MzIvJFBPU1RHUkVTX0RCJwogICAgICAtIFJVTlRJTUVfUExBVEZPUk09ZG9ja2VyLWNvbXBvc2UKICAgICAgLSBOT0RFX0VOVj1wcm9kdWN0aW9uCiAgICAgIC0gJ0FVVEhfR0lUSFVCX0NMSUVOVF9JRD0ke0FVVEhfR0lUSFVCX0NMSUVOVF9JRH0nCiAgICAgIC0gJ0FVVEhfR0lUSFVCX0NMSUVOVF9TRUNSRVQ9JHtBVVRIX0dJVEhVQl9DTElFTlRfU0VDUkVUfScKICAgICAgLSAnUkVTRU5EX0FQSV9LRVk9JHtSRVNFTkRfQVBJX0tFWX0nCiAgICAgIC0gJ0ZST01fRU1BSUw9JHtGUk9NX0VNQUlMfScKICAgICAgLSAnUkVQTFlfVE9fRU1BSUw9JHtSRVBMWV9UT19FTUFJTH0nCiAgICBkZXBlbmRzX29uOgogICAgICBwb3N0Z3Jlc3FsOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIE5PTkUKICBwb3N0Z3Jlc3FsOgogICAgaW1hZ2U6ICdwb3N0Z3JlczoxNS1hbHBpbmUnCiAgICB2b2x1bWVzOgogICAgICAtICdwb3N0Z3Jlc3FsLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gUE9TVEdSRVNfVVNFUj0kU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIC0gUE9TVEdSRVNfUEFTU1dPUkQ9JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVMKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotdHJpZ2dlcn0nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9JwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==", + "compose": "c2VydmljZXM6CiAgdHJpZ2dlcjoKICAgIGltYWdlOiAnZ2hjci5pby90cmlnZ2VyZG90ZGV2L3RyaWdnZXIuZGV2OmxhdGVzdCcKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9UUklHR0VSCiAgICAgIC0gTE9HSU5fT1JJR0lOPSRTRVJWSUNFX0ZRRE5fVFJJR0dFUgogICAgICAtIEFQUF9PUklHSU49JFNFUlZJQ0VfRlFETl9UUklHR0VSCiAgICAgIC0gTUFHSUNfTElOS19TRUNSRVQ9JFNFUlZJQ0VfUEFTU1dPUkRfNjRfTUFHSUMKICAgICAgLSBFTkNSWVBUSU9OX0tFWT0kU0VSVklDRV9QQVNTV09SRF82NF9FTkNSWVBUSU9OCiAgICAgIC0gU0VTU0lPTl9TRUNSRVQ9JFNFUlZJQ0VfUEFTU1dPUkRfNjRfU0VTU0lPTgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LXRyaWdnZXJ9JwogICAgICAtIFBPU1RHUkVTX0hPU1Q9cG9zdGdyZXMKICAgICAgLSAnREFUQUJBU0VfVVJMPXBvc3RncmVzOi8vJFNFUlZJQ0VfVVNFUl9QT1NUR1JFUzokU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU0Bwb3N0Z3Jlc3FsOjU0MzIvJFBPU1RHUkVTX0RCJwogICAgICAtICdESVJFQ1RfVVJMPXBvc3RncmVzOi8vJFNFUlZJQ0VfVVNFUl9QT1NUR1JFUzokU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU0Bwb3N0Z3Jlc3FsOjU0MzIvJFBPU1RHUkVTX0RCJwogICAgICAtIFJVTlRJTUVfUExBVEZPUk09ZG9ja2VyLWNvbXBvc2UKICAgICAgLSBOT0RFX0VOVj1wcm9kdWN0aW9uCiAgICAgIC0gJ0FVVEhfR0lUSFVCX0NMSUVOVF9JRD0ke0FVVEhfR0lUSFVCX0NMSUVOVF9JRH0nCiAgICAgIC0gJ0FVVEhfR0lUSFVCX0NMSUVOVF9TRUNSRVQ9JHtBVVRIX0dJVEhVQl9DTElFTlRfU0VDUkVUfScKICAgICAgLSAnUkVTRU5EX0FQSV9LRVk9JHtSRVNFTkRfQVBJX0tFWX0nCiAgICAgIC0gJ0ZST01fRU1BSUw9JHtGUk9NX0VNQUlMfScKICAgICAgLSAnUkVQTFlfVE9fRU1BSUw9JHtSRVBMWV9UT19FTUFJTH0nCiAgICBkZXBlbmRzX29uOgogICAgICBwb3N0Z3Jlc3FsOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIE5PTkUKICBwb3N0Z3Jlc3FsOgogICAgaW1hZ2U6ICdwb3N0Z3JlczoxNi1hbHBpbmUnCiAgICB2b2x1bWVzOgogICAgICAtICdwb3N0Z3Jlc3FsLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gUE9TVEdSRVNfVVNFUj0kU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIC0gUE9TVEdSRVNfUEFTU1dPUkQ9JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVMKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotdHJpZ2dlcn0nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9JwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==", "tags": [ "trigger.dev", "background jobs", @@ -487,7 +487,7 @@ "umami": { "documentation": "https:\/\/umami.is\/docs\/getting-started", "slogan": "Umami is a lightweight, self-hosted web analytics platform designed to provide website owners with insights into visitor behavior without compromising user privacy.", - "compose": "c2VydmljZXM6CiAgdW1hbWk6CiAgICBpbWFnZTogJ2doY3IuaW8vdW1hbWktc29mdHdhcmUvdW1hbWk6cG9zdGdyZXNxbC1sYXRlc3QnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fVU1BTUkKICAgICAgLSAnREFUQUJBU0VfVVJMPXBvc3RncmVzOi8vJFNFUlZJQ0VfVVNFUl9QT1NUR1JFUzokU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU0Bwb3N0Z3Jlc3FsOjU0MzIvJFBPU1RHUkVTX0RCJwogICAgICAtIERBVEFCQVNFX1RZUEU9cG9zdGdyZXMKICAgICAgLSBBUFBfU0VDUkVUPSRTRVJWSUNFX1BBU1NXT1JEXzY0X1VNQU1JCiAgICBkZXBlbmRzX29uOgogICAgICBwb3N0Z3Jlc3FsOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgcG9zdGdyZXNxbDoKICAgIGltYWdlOiAncG9zdGdyZXM6MTUtYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAncG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LXVtYW1pfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAkJHtQT1NUR1JFU19VU0VSfSAtZCAkJHtQT1NUR1JFU19EQn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK", + "compose": "c2VydmljZXM6CiAgdW1hbWk6CiAgICBpbWFnZTogJ2doY3IuaW8vdW1hbWktc29mdHdhcmUvdW1hbWk6cG9zdGdyZXNxbC1sYXRlc3QnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fVU1BTUkKICAgICAgLSAnREFUQUJBU0VfVVJMPXBvc3RncmVzOi8vJFNFUlZJQ0VfVVNFUl9QT1NUR1JFUzokU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU0Bwb3N0Z3Jlc3FsOjU0MzIvJFBPU1RHUkVTX0RCJwogICAgICAtIERBVEFCQVNFX1RZUEU9cG9zdGdyZXMKICAgICAgLSBBUFBfU0VDUkVUPSRTRVJWSUNFX1BBU1NXT1JEXzY0X1VNQU1JCiAgICBkZXBlbmRzX29uOgogICAgICBwb3N0Z3Jlc3FsOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgcG9zdGdyZXNxbDoKICAgIGltYWdlOiAncG9zdGdyZXM6MTYtYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAncG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LXVtYW1pfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAkJHtQT1NUR1JFU19VU0VSfSAtZCAkJHtQT1NUR1JFU19EQn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK", "tags": [ "analytics", "insights", From c3882b75c1dacddbf557ed8ab8366faa6c096714 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Thu, 30 Nov 2023 12:21:42 +0100 Subject: [PATCH 02/12] Update release version to 4.0.0-beta.151 --- config/sentry.php | 2 +- config/version.php | 2 +- versions.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/sentry.php b/config/sentry.php index 7c5ac9de1..4592b8dfe 100644 --- a/config/sentry.php +++ b/config/sentry.php @@ -7,7 +7,7 @@ return [ // The release version of your application // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) - 'release' => '4.0.0-beta.150', + 'release' => '4.0.0-beta.151', // When left empty or `null` the Laravel environment will be used 'environment' => config('app.env'), diff --git a/config/version.php b/config/version.php index 82ee909b7..70e9fdca3 100644 --- a/config/version.php +++ b/config/version.php @@ -1,3 +1,3 @@ Date: Thu, 30 Nov 2023 12:21:53 +0100 Subject: [PATCH 03/12] fix: server view for link() --- app/Models/Application.php | 13 ++++---- app/Models/Service.php | 13 ++++---- app/Models/StandaloneMariadb.php | 13 ++++---- app/Models/StandaloneMongodb.php | 13 ++++---- app/Models/StandaloneMysql.php | 13 ++++---- app/Models/StandalonePostgresql.php | 13 ++++---- app/Models/StandaloneRedis.php | 13 ++++---- .../views/livewire/server/delete.blade.php | 30 ++++++++++++++----- 8 files changed, 78 insertions(+), 43 deletions(-) diff --git a/app/Models/Application.php b/app/Models/Application.php index e2d93c7a1..0a9c8fac8 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -50,11 +50,14 @@ class Application extends BaseModel } public function link() { - return route('project.application.configuration', [ - 'project_uuid' => $this->environment->project->uuid, - 'environment_name' => $this->environment->name, - 'application_uuid' => $this->uuid - ]); + if (data_get($this, 'environment.project.uuid')) { + return route('project.application.configuration', [ + 'project_uuid' => data_get($this, 'environment.project.uuid'), + 'environment_name' => data_get($this, 'environment.name'), + 'application_uuid' => data_get($this, 'uuid') + ]); + } + return null; } public function settings() { diff --git a/app/Models/Service.php b/app/Models/Service.php index 3a02ed560..b5842bb88 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -363,11 +363,14 @@ class Service extends BaseModel } public function link() { - return route('project.service.configuration', [ - 'project_uuid' => $this->environment->project->uuid, - 'environment_name' => $this->environment->name, - 'service_uuid' => $this->uuid - ]); + if (data_get($this, 'environment.project.uuid')) { + return route('project.service.configuration', [ + 'project_uuid' => data_get($this, 'environment.project.uuid'), + 'environment_name' => data_get($this, 'environment.name'), + 'service_uuid' => data_get($this, 'uuid') + ]); + } + return null; } public function documentation() { diff --git a/app/Models/StandaloneMariadb.php b/app/Models/StandaloneMariadb.php index ca7221d7c..8893632d3 100644 --- a/app/Models/StandaloneMariadb.php +++ b/app/Models/StandaloneMariadb.php @@ -43,11 +43,14 @@ class StandaloneMariadb extends BaseModel } public function link() { - return route('project.database.configuration', [ - 'project_uuid' => $this->environment->project->uuid, - 'environment_name' => $this->environment->name, - 'database_uuid' => $this->uuid - ]); + if (data_get($this, 'environment.project.uuid')) { + return route('project.database.configuration', [ + 'project_uuid' => data_get($this, 'environment.project.uuid'), + 'environment_name' => data_get($this, 'environment.name'), + 'database_uuid' => data_get($this, 'uuid') + ]); + } + return null; } public function isLogDrainEnabled() { diff --git a/app/Models/StandaloneMongodb.php b/app/Models/StandaloneMongodb.php index 598719acf..c041c9407 100644 --- a/app/Models/StandaloneMongodb.php +++ b/app/Models/StandaloneMongodb.php @@ -50,11 +50,14 @@ class StandaloneMongodb extends BaseModel } public function link() { - return route('project.database.configuration', [ - 'project_uuid' => $this->environment->project->uuid, - 'environment_name' => $this->environment->name, - 'database_uuid' => $this->uuid - ]); + if (data_get($this, 'environment.project.uuid')) { + return route('project.database.configuration', [ + 'project_uuid' => data_get($this, 'environment.project.uuid'), + 'environment_name' => data_get($this, 'environment.name'), + 'database_uuid' => data_get($this, 'uuid') + ]); + } + return null; } public function mongoInitdbRootPassword(): Attribute { diff --git a/app/Models/StandaloneMysql.php b/app/Models/StandaloneMysql.php index 4cbee006e..a4691b9b2 100644 --- a/app/Models/StandaloneMysql.php +++ b/app/Models/StandaloneMysql.php @@ -43,11 +43,14 @@ class StandaloneMysql extends BaseModel } public function link() { - return route('project.database.configuration', [ - 'project_uuid' => $this->environment->project->uuid, - 'environment_name' => $this->environment->name, - 'database_uuid' => $this->uuid - ]); + if (data_get($this, 'environment.project.uuid')) { + return route('project.database.configuration', [ + 'project_uuid' => data_get($this, 'environment.project.uuid'), + 'environment_name' => data_get($this, 'environment.name'), + 'database_uuid' => data_get($this, 'uuid') + ]); + } + return null; } public function type(): string { diff --git a/app/Models/StandalonePostgresql.php b/app/Models/StandalonePostgresql.php index 0056f9b51..e0db00d76 100644 --- a/app/Models/StandalonePostgresql.php +++ b/app/Models/StandalonePostgresql.php @@ -43,11 +43,14 @@ class StandalonePostgresql extends BaseModel } public function link() { - return route('project.database.configuration', [ - 'project_uuid' => $this->environment->project->uuid, - 'environment_name' => $this->environment->name, - 'database_uuid' => $this->uuid - ]); + if (data_get($this, 'environment.project.uuid')) { + return route('project.database.configuration', [ + 'project_uuid' => data_get($this, 'environment.project.uuid'), + 'environment_name' => data_get($this, 'environment.name'), + 'database_uuid' => data_get($this, 'uuid') + ]); + } + return null; } public function isLogDrainEnabled() { diff --git a/app/Models/StandaloneRedis.php b/app/Models/StandaloneRedis.php index b2038d8af..95add8315 100644 --- a/app/Models/StandaloneRedis.php +++ b/app/Models/StandaloneRedis.php @@ -38,11 +38,14 @@ class StandaloneRedis extends BaseModel } public function link() { - return route('project.database.configuration', [ - 'project_uuid' => $this->environment->project->uuid, - 'environment_name' => $this->environment->name, - 'database_uuid' => $this->uuid - ]); + if (data_get($this, 'environment.project.uuid')) { + return route('project.database.configuration', [ + 'project_uuid' => data_get($this, 'environment.project.uuid'), + 'environment_name' => data_get($this, 'environment.name'), + 'database_uuid' => data_get($this, 'uuid') + ]); + } + return null; } public function isLogDrainEnabled() { diff --git a/resources/views/livewire/server/delete.blade.php b/resources/views/livewire/server/delete.blade.php index b1855ea15..e85fe37e5 100644 --- a/resources/views/livewire/server/delete.blade.php +++ b/resources/views/livewire/server/delete.blade.php @@ -25,10 +25,17 @@ @if ($loop->first)

Defined resources

@endif - -
{{ str($resource->type())->headline() }}
-
{{ $resource->name }}
-
+ @if ($resource->link()) + +
{{ str($resource->type())->headline() }}
+
{{ $resource->name }}
+
+ @else +
+
{{ str($resource->type())->headline() }}
+
{{ $resource->name }}
+
+ @endif @empty @endforelse @@ -38,10 +45,17 @@ @if ($loop->first)

Defined resources

@endif - -
{{ str($resource->type())->headline() }}
-
{{ $resource->name }}
-
+ @if ($resource->link()) + +
{{ str($resource->type())->headline() }}
+
{{ $resource->name }}
+
+ @else +
+
{{ str($resource->type())->headline() }}
+
{{ $resource->name }}
+
+ @endif @empty @endforelse From b52680a2d8e1ec56e71c0ea5186021b1a61af722 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Thu, 30 Nov 2023 12:55:31 +0100 Subject: [PATCH 04/12] Fix dispatch_sync issue in ContainerStatusJob --- app/Http/Livewire/Project/Service/Index.php | 2 +- app/Jobs/ContainerStatusJob.php | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/Http/Livewire/Project/Service/Index.php b/app/Http/Livewire/Project/Service/Index.php index 79d933369..af88fac87 100644 --- a/app/Http/Livewire/Project/Service/Index.php +++ b/app/Http/Livewire/Project/Service/Index.php @@ -28,7 +28,7 @@ class Index extends Component } public function checkStatus() { - dispatch_sync(new ContainerStatusJob($this->service->server)); + dispatch(new ContainerStatusJob($this->service->server)); $this->refreshStacks(); } public function refreshStacks() diff --git a/app/Jobs/ContainerStatusJob.php b/app/Jobs/ContainerStatusJob.php index 1f20bb264..baabc966c 100644 --- a/app/Jobs/ContainerStatusJob.php +++ b/app/Jobs/ContainerStatusJob.php @@ -21,10 +21,6 @@ class ContainerStatusJob implements ShouldQueue, ShouldBeEncrypted { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - public function __construct(public Server $server) - { - $this->handle(); - } public function middleware(): array { return [(new WithoutOverlapping($this->server->id))->dontRelease()]; @@ -35,6 +31,11 @@ class ContainerStatusJob implements ShouldQueue, ShouldBeEncrypted return $this->server->id; } + public function __construct(public Server $server) + { + } + + public function handle() { // ray("checking container statuses for {$this->server->id}"); From a28a28cd2376370b787be8a22663b91a09c4b7f6 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Thu, 30 Nov 2023 13:17:43 +0100 Subject: [PATCH 05/12] Add docker-compose.prod.standalone.yml configuration file --- docker-compose.prod.standalone.yml | 40 ++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 docker-compose.prod.standalone.yml diff --git a/docker-compose.prod.standalone.yml b/docker-compose.prod.standalone.yml new file mode 100644 index 000000000..9c40e58e1 --- /dev/null +++ b/docker-compose.prod.standalone.yml @@ -0,0 +1,40 @@ +version: '3.8' +services: + postgres: + volumes: + - coolify-db:/var/lib/postgresql/data + ports: + - 127.0.0.1:5432:5432 + environment: + POSTGRES_USER: "${DB_USERNAME:-coolify}" + POSTGRES_PASSWORD: "${DB_PASSWORD}" + POSTGRES_DB: "${DB_DATABASE:-coolify}" + healthcheck: + test: + [ + "CMD-SHELL", + "pg_isready -U ${DB_USERNAME:-coolify}", + "-d", + "${DB_DATABASE:-coolify}" + ] + interval: 2s + retries: 5 + timeout: 2s + redis: + command: redis-server --save 20 1 --loglevel warning --requirepass ${REDIS_PASSWORD} + environment: + REDIS_PASSWORD: "${REDIS_PASSWORD}" + ports: + - 127.0.0.1:6379:6379 + volumes: + - coolify-redis:/data + healthcheck: + test: redis-cli ping + interval: 2s + retries: 5 + timeout: 2s +volumes: + coolify-db: + name: coolify-db + coolify-redis: + name: coolify-redis From 0135ba7e89da27ff9d7f78fe61616380ac4bf771 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Thu, 30 Nov 2023 13:38:52 +0100 Subject: [PATCH 06/12] Delete docker-compose.prod.standalone.yml --- docker-compose.prod.standalone.yml | 40 ------------------------------ 1 file changed, 40 deletions(-) delete mode 100644 docker-compose.prod.standalone.yml diff --git a/docker-compose.prod.standalone.yml b/docker-compose.prod.standalone.yml deleted file mode 100644 index 9c40e58e1..000000000 --- a/docker-compose.prod.standalone.yml +++ /dev/null @@ -1,40 +0,0 @@ -version: '3.8' -services: - postgres: - volumes: - - coolify-db:/var/lib/postgresql/data - ports: - - 127.0.0.1:5432:5432 - environment: - POSTGRES_USER: "${DB_USERNAME:-coolify}" - POSTGRES_PASSWORD: "${DB_PASSWORD}" - POSTGRES_DB: "${DB_DATABASE:-coolify}" - healthcheck: - test: - [ - "CMD-SHELL", - "pg_isready -U ${DB_USERNAME:-coolify}", - "-d", - "${DB_DATABASE:-coolify}" - ] - interval: 2s - retries: 5 - timeout: 2s - redis: - command: redis-server --save 20 1 --loglevel warning --requirepass ${REDIS_PASSWORD} - environment: - REDIS_PASSWORD: "${REDIS_PASSWORD}" - ports: - - 127.0.0.1:6379:6379 - volumes: - - coolify-redis:/data - healthcheck: - test: redis-cli ping - interval: 2s - retries: 5 - timeout: 2s -volumes: - coolify-db: - name: coolify-db - coolify-redis: - name: coolify-redis From 3b67d0a8de20b71d7274f7057d28b1b29bf4e834 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 1 Dec 2023 10:34:30 +0100 Subject: [PATCH 07/12] feat: save timestamp configuration for logs --- app/Http/Livewire/Project/Shared/GetLogs.php | 36 +++++++++++ app/Http/Livewire/Project/Shared/Logs.php | 6 ++ ...3_12_01_091723_save_logs_view_settings.php | 64 +++++++++++++++++++ .../livewire/project/shared/logs.blade.php | 6 +- 4 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 database/migrations/2023_12_01_091723_save_logs_view_settings.php diff --git a/app/Http/Livewire/Project/Shared/GetLogs.php b/app/Http/Livewire/Project/Shared/GetLogs.php index 4244bed12..933938f56 100644 --- a/app/Http/Livewire/Project/Shared/GetLogs.php +++ b/app/Http/Livewire/Project/Shared/GetLogs.php @@ -2,7 +2,16 @@ namespace App\Http\Livewire\Project\Shared; +use App\Models\Application; use App\Models\Server; +use App\Models\Service; +use App\Models\ServiceApplication; +use App\Models\ServiceDatabase; +use App\Models\StandaloneMariadb; +use App\Models\StandaloneMongodb; +use App\Models\StandaloneMysql; +use App\Models\StandalonePostgresql; +use App\Models\StandaloneRedis; use Illuminate\Support\Facades\Process; use Livewire\Component; @@ -10,17 +19,44 @@ class GetLogs extends Component { public string $outputs = ''; public string $errors = ''; + public Application|Service|StandalonePostgresql|StandaloneRedis|StandaloneMongodb|StandaloneMysql|StandaloneMariadb $resource; + public ServiceApplication|ServiceDatabase|null $servicesubtype = null; public Server $server; public ?string $container = null; public ?bool $streamLogs = false; public ?bool $showTimeStamps = true; public int $numberOfLines = 100; + + public function mount() + { + if ($this->resource->getMorphClass() === 'App\Models\Application') { + $this->showTimeStamps = $this->resource->settings->is_include_timestamps; + } else { + if ($this->servicesubtype) { + $this->showTimeStamps = $this->servicesubtype->is_include_timestamps; + } else { + $this->showTimeStamps = $this->resource->is_include_timestamps; + } + } + } public function doSomethingWithThisChunkOfOutput($output) { $this->outputs .= removeAnsiColors($output); } public function instantSave() { + if ($this->resource->getMorphClass() === 'App\Models\Application') { + $this->resource->settings->is_include_timestamps = $this->showTimeStamps; + $this->resource->settings->save(); + } else { + if ($this->servicesubtype) { + $this->servicesubtype->is_include_timestamps = $this->showTimeStamps; + $this->servicesubtype->save(); + } else { + $this->resource->is_include_timestamps = $this->showTimeStamps; + $this->resource->save(); + } + } } public function getLogs($refresh = false) { diff --git a/app/Http/Livewire/Project/Shared/Logs.php b/app/Http/Livewire/Project/Shared/Logs.php index 982f729b4..18b632ab4 100644 --- a/app/Http/Livewire/Project/Shared/Logs.php +++ b/app/Http/Livewire/Project/Shared/Logs.php @@ -22,6 +22,7 @@ class Logs extends Component public $parameters; public $query; public $status; + public $serviceSubType; public function mount() { @@ -64,6 +65,11 @@ class Logs extends Component } else if (data_get($this->parameters, 'service_uuid')) { $this->type = 'service'; $this->resource = Service::where('uuid', $this->parameters['service_uuid'])->firstOrFail(); + $service_name = data_get($this->parameters, 'service_name'); + $this->serviceSubType = $this->resource->applications()->where('name', $service_name)->first(); + if (!$this->serviceSubType) { + $this->serviceSubType = $this->resource->databases()->where('name', $service_name)->first(); + } $this->status = $this->resource->status; $this->server = $this->resource->server; $this->container = data_get($this->parameters, 'service_name') . '-' . $this->resource->uuid; diff --git a/database/migrations/2023_12_01_091723_save_logs_view_settings.php b/database/migrations/2023_12_01_091723_save_logs_view_settings.php new file mode 100644 index 000000000..a43564454 --- /dev/null +++ b/database/migrations/2023_12_01_091723_save_logs_view_settings.php @@ -0,0 +1,64 @@ +boolean('is_include_timestamps')->default(false); + }); + Schema::table('service_applications', function (Blueprint $table) { + $table->boolean('is_include_timestamps')->default(false); + }); + Schema::table('service_databases', function (Blueprint $table) { + $table->boolean('is_include_timestamps')->default(false); + }); + Schema::table('standalone_mysqls', function (Blueprint $table) { + $table->boolean('is_include_timestamps')->default(false); + }); + Schema::table('standalone_postgresqls', function (Blueprint $table) { + $table->boolean('is_include_timestamps')->default(false); + }); + Schema::table('standalone_redis', function (Blueprint $table) { + $table->boolean('is_include_timestamps')->default(false); + }); + Schema::table('standalone_mongodbs', function (Blueprint $table) { + $table->boolean('is_include_timestamps')->default(false); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('application_settings', function (Blueprint $table) { + $table->dropColumn('is_include_timestamps'); + }); + Schema::table('service_applications', function (Blueprint $table) { + $table->dropColumn('is_include_timestamps'); + }); + Schema::table('service_databases', function (Blueprint $table) { + $table->dropColumn('is_include_timestamps'); + }); + Schema::table('standalone_mysqls', function (Blueprint $table) { + $table->dropColumn('is_include_timestamps'); + }); + Schema::table('standalone_postgresqls', function (Blueprint $table) { + $table->dropColumn('is_include_timestamps'); + }); + Schema::table('standalone_redis', function (Blueprint $table) { + $table->dropColumn('is_include_timestamps'); + }); + Schema::table('standalone_mongodbs', function (Blueprint $table) { + $table->dropColumn('is_include_timestamps'); + }); + } +}; diff --git a/resources/views/livewire/project/shared/logs.blade.php b/resources/views/livewire/project/shared/logs.blade.php index db5320a17..2b21f18a9 100644 --- a/resources/views/livewire/project/shared/logs.blade.php +++ b/resources/views/livewire/project/shared/logs.blade.php @@ -7,7 +7,7 @@ @if ($loop->first)

Logs

@endif - + @empty
No containers are not running.
@endforelse @@ -16,7 +16,7 @@

Logs

- +
@elseif ($type === 'service') @@ -28,7 +28,7 @@
- +
@endif From cc72f416e8eaafb994b01d1afc78588828855af3 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 1 Dec 2023 11:13:58 +0100 Subject: [PATCH 08/12] feat: custom log drain endpoints --- app/Actions/Server/InstallLogDrain.php | 24 +++++++++++--- app/Http/Livewire/Server/LogDrains.php | 24 ++++++++++++++ app/Models/Server.php | 2 +- ...dd_custom_fluentd_config_for_logdrains.php | 32 +++++++++++++++++++ .../livewire/server/log-drains.blade.php | 19 +++++++++++ 5 files changed, 96 insertions(+), 5 deletions(-) create mode 100644 database/migrations/2023_12_01_095356_add_custom_fluentd_config_for_logdrains.php diff --git a/app/Actions/Server/InstallLogDrain.php b/app/Actions/Server/InstallLogDrain.php index 11487d633..e43642e7a 100644 --- a/app/Actions/Server/InstallLogDrain.php +++ b/app/Actions/Server/InstallLogDrain.php @@ -16,6 +16,8 @@ class InstallLogDrain $type = 'highlight'; } else if ($server->settings->is_logdrain_axiom_enabled) { $type = 'axiom'; + } else if ($server->settings->is_logdrain_custom_enabled) { + $type = 'custom'; } else { $type = 'none'; } @@ -114,15 +116,23 @@ class InstallLogDrain json_date_format iso8601 tls On "); + } else if ($type === 'custom') { + if (!$server->settings->is_logdrain_custom_enabled) { + throw new \Exception('Custom log drain is not enabled.'); + } + $config = base64_encode($server->settings->logdrain_custom_config); + $parsers = base64_encode($server->settings->logdrain_custom_config_parser); } else { throw new \Exception('Unknown log drain type.'); } - $parsers = base64_encode(" + if ($type !== 'custom') { + $parsers = base64_encode(" [PARSER] - Name empty_line_skipper - Format regex - Regex /^(?!\s*$).+/ +Name empty_line_skipper +Format regex +Regex /^(?!\s*$).+/ "); + } $compose = base64_encode(" services: coolify-log-drain: @@ -179,6 +189,12 @@ Files: "echo AXIOM_DATASET_NAME={$server->settings->logdrain_axiom_dataset_name} >> $config_path/.env", "echo AXIOM_API_KEY={$server->settings->logdrain_axiom_api_key} >> $config_path/.env", ]; + } else if ($type === 'custom') { + $add_envs_command = [ + "touch $config_path/.env" + ]; + } else { + throw new \Exception('Unknown log drain type.'); } $restart_command = [ "echo 'Stopping old Fluent Bit'", diff --git a/app/Http/Livewire/Server/LogDrains.php b/app/Http/Livewire/Server/LogDrains.php index 056beb584..5afe540ca 100644 --- a/app/Http/Livewire/Server/LogDrains.php +++ b/app/Http/Livewire/Server/LogDrains.php @@ -19,6 +19,9 @@ class LogDrains extends Component 'server.settings.is_logdrain_axiom_enabled' => 'required|boolean', 'server.settings.logdrain_axiom_dataset_name' => 'required|string', 'server.settings.logdrain_axiom_api_key' => 'required|string', + 'server.settings.is_logdrain_custom_enabled' => 'required|boolean', + 'server.settings.logdrain_custom_config' => 'required|string', + 'server.settings.logdrain_custom_config_parser' => 'nullable', ]; protected $validationAttributes = [ 'server.settings.is_logdrain_newrelic_enabled' => 'New Relic log drain', @@ -29,6 +32,9 @@ class LogDrains extends Component 'server.settings.is_logdrain_axiom_enabled' => 'Axiom log drain', 'server.settings.logdrain_axiom_dataset_name' => 'Axiom dataset name', 'server.settings.logdrain_axiom_api_key' => 'Axiom API key', + 'server.settings.is_logdrain_custom_enabled' => 'Custom log drain', + 'server.settings.logdrain_custom_config' => 'Custom log drain configuration', + 'server.settings.logdrain_custom_config_parser' => 'Custom log drain configuration parser', ]; public function mount() @@ -84,6 +90,7 @@ class LogDrains extends Component $this->server->settings->update([ 'is_logdrain_highlight_enabled' => false, 'is_logdrain_axiom_enabled' => false, + 'is_logdrain_custom_enabled' => false, ]); } else if ($type === 'highlight') { $this->validate([ @@ -93,6 +100,7 @@ class LogDrains extends Component $this->server->settings->update([ 'is_logdrain_newrelic_enabled' => false, 'is_logdrain_axiom_enabled' => false, + 'is_logdrain_custom_enabled' => false, ]); } else if ($type === 'axiom') { $this->validate([ @@ -103,6 +111,18 @@ class LogDrains extends Component $this->server->settings->update([ 'is_logdrain_newrelic_enabled' => false, 'is_logdrain_highlight_enabled' => false, + 'is_logdrain_custom_enabled' => false, + ]); + } else if ($type === 'custom') { + $this->validate([ + 'server.settings.is_logdrain_custom_enabled' => 'required|boolean', + 'server.settings.logdrain_custom_config' => 'required|string', + 'server.settings.logdrain_custom_config_parser' => 'nullable', + ]); + $this->server->settings->update([ + 'is_logdrain_newrelic_enabled' => false, + 'is_logdrain_highlight_enabled' => false, + 'is_logdrain_axiom_enabled' => false, ]); } $this->server->settings->save(); @@ -121,6 +141,10 @@ class LogDrains extends Component $this->server->settings->update([ 'is_logdrain_axiom_enabled' => false, ]); + } else if ($type === 'custom') { + $this->server->settings->update([ + 'is_logdrain_custom_enabled' => false, + ]); } handleError($e, $this); return false; diff --git a/app/Models/Server.php b/app/Models/Server.php index 408106107..f65ecfb10 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -349,7 +349,7 @@ class Server extends BaseModel } public function isLogDrainEnabled() { - return $this->settings->is_logdrain_newrelic_enabled || $this->settings->is_logdrain_highlight_enabled || $this->settings->is_logdrain_axiom_enabled; + return $this->settings->is_logdrain_newrelic_enabled || $this->settings->is_logdrain_highlight_enabled || $this->settings->is_logdrain_axiom_enabled || $this->settings->is_logdrain_custom_enabled; } public function validateOS(): bool | Stringable { diff --git a/database/migrations/2023_12_01_095356_add_custom_fluentd_config_for_logdrains.php b/database/migrations/2023_12_01_095356_add_custom_fluentd_config_for_logdrains.php new file mode 100644 index 000000000..ff100b484 --- /dev/null +++ b/database/migrations/2023_12_01_095356_add_custom_fluentd_config_for_logdrains.php @@ -0,0 +1,32 @@ +boolean('is_logdrain_custom_enabled')->default(false); + $table->text('logdrain_custom_config')->nullable(); + $table->text('logdrain_custom_config_parser')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('server_settings', function (Blueprint $table) { + $table->dropColumn('is_logdrain_custom_enabled'); + $table->dropColumn('logdrain_custom_config'); + $table->dropColumn('logdrain_custom_config_parser'); + }); + } +}; diff --git a/resources/views/livewire/server/log-drains.blade.php b/resources/views/livewire/server/log-drains.blade.php index 465702053..c452b171b 100644 --- a/resources/views/livewire/server/log-drains.blade.php +++ b/resources/views/livewire/server/log-drains.blade.php @@ -62,6 +62,25 @@ --}} +

Custom FluentBit configuration

+
+ +
+
+
+ + +
+
+ + Save + +
+
+ From dc03179bd18e9c04aa45891e8b11b9b70df49965 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 1 Dec 2023 11:37:00 +0100 Subject: [PATCH 09/12] feat: auto-restart tcp proxies for databases --- app/Jobs/ContainerStatusJob.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/Jobs/ContainerStatusJob.php b/app/Jobs/ContainerStatusJob.php index baabc966c..96fde2a40 100644 --- a/app/Jobs/ContainerStatusJob.php +++ b/app/Jobs/ContainerStatusJob.php @@ -2,6 +2,7 @@ namespace App\Jobs; +use App\Actions\Database\StartDatabaseProxy; use App\Actions\Proxy\CheckProxy; use App\Actions\Proxy\StartProxy; use App\Models\ApplicationPreview; @@ -84,7 +85,6 @@ class ContainerStatusJob implements ShouldQueue, ShouldBeEncrypted $databases = $this->server->databases(); $services = $this->server->services()->get(); $previews = $this->server->previews(); - $foundApplications = []; $foundApplicationPreviews = []; $foundDatabases = []; @@ -135,11 +135,25 @@ class ContainerStatusJob implements ShouldQueue, ShouldBeEncrypted if ($uuid) { $database = $databases->where('uuid', $uuid)->first(); if ($database) { + $isPublic = data_get($database, 'is_public'); $foundDatabases[] = $database->id; $statusFromDb = $database->status; if ($statusFromDb !== $containerStatus) { $database->update(['status' => $containerStatus]); } + if ($isPublic) { + $foundTcpProxy = $containers->filter(function ($value, $key) use ($uuid) { + if ($this->server->isSwarm()) { + return data_get($value, 'Spec.Name') === "coolify-proxy_$uuid"; + } else { + return data_get($value, 'Name') === "/$uuid-proxy"; + } + })->first(); + if (!$foundTcpProxy) { + StartDatabaseProxy::run($database); + $this->server->team?->notify(new ContainerRestarted("TCP Proxy for {$database->name}", $this->server)); + } + } } else { // Notify user that this container should not be there. } From 2352e4a71d26679d362cb63f72234e2e8100c156 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 1 Dec 2023 12:13:55 +0100 Subject: [PATCH 10/12] Fix directory creation inApplicationDeploymentJob.php --- app/Jobs/ApplicationDeploymentJob.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index 47913a4d9..2b4796862 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -701,7 +701,15 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted [ "command" => executeInDocker($this->deployment_uuid, "mkdir -p {$this->basedir}") ], + ); + if ($this->restart_only || !$this->force_rebuild) { + $this->execute_remote_command( + [ + "command" => executeInDocker($this->deployment_uuid, "mkdir -p {$this->workdir}") + ], + ); + } } private function deploy_to_additional_destinations() { @@ -1285,7 +1293,6 @@ COPY ./nginx.conf /etc/nginx/conf.d/default.conf"); $dockerfile->splice(1, 0, "ARG {$env->key}={$env->value}"); } } - ray($dockerfile->implode("\n")); $dockerfile_base64 = base64_encode($dockerfile->implode("\n")); $this->execute_remote_command([ executeInDocker($this->deployment_uuid, "echo '{$dockerfile_base64}' | base64 -d > {$this->workdir}{$this->dockerfile_location}"), From 335788c2d640dc0bf1136c7f3c9aecd10cdfd715 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 1 Dec 2023 12:14:23 +0100 Subject: [PATCH 11/12] fix: default value do not overwrite existing env value --- bootstrap/helpers/shared.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index 3681a6c0c..65aad2abc 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -913,13 +913,17 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal continue; } if ($value?->startsWith('$')) { - $value = Str::of(replaceVariables($value)); - $key = $value; $foundEnv = EnvironmentVariable::where([ 'key' => $key, 'service_id' => $resource->id, ])->first(); + $value = Str::of(replaceVariables($value)); + $key = $value; if ($value->startsWith('SERVICE_')) { + $foundEnv = EnvironmentVariable::where([ + 'key' => $key, + 'service_id' => $resource->id, + ])->first(); ['command' => $command, 'forService' => $forService, 'generatedValue' => $generatedValue, 'port' => $port] = parseEnvVariable($value); if ($command->value() === 'FQDN' || $command->value() === 'URL') { if (Str::lower($forService) === $serviceName) { From 12d9b6538b22f525eb9d8587828ac24cfb27055a Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 1 Dec 2023 12:34:23 +0100 Subject: [PATCH 12/12] Fix environment variable parsing in Docker Compose file --- bootstrap/helpers/shared.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index 65aad2abc..d52aa4d8e 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -1275,13 +1275,18 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal continue; } if ($value?->startsWith('$')) { - $value = Str::of(replaceVariables($value)); - $key = $value; $foundEnv = EnvironmentVariable::where([ 'key' => $key, - 'application_id' => $resource->id, + 'service_id' => $resource->id, ])->first(); + $value = Str::of(replaceVariables($value)); + $key = $value; + if ($value->startsWith('SERVICE_')) { + $foundEnv = EnvironmentVariable::where([ + 'key' => $key, + 'application_id' => $resource->id, + ])->first(); ['command' => $command, 'forService' => $forService, 'generatedValue' => $generatedValue, 'port' => $port] = parseEnvVariable($value); if ($command->value() === 'FQDN' || $command->value() === 'URL') { if (Str::lower($forService) === $serviceName) {