diff --git a/.github/ISSUE_TEMPLATE/01_BUG_REPORT.yml b/.github/ISSUE_TEMPLATE/01_BUG_REPORT.yml index 42df4785e..f0c77577e 100644 --- a/.github/ISSUE_TEMPLATE/01_BUG_REPORT.yml +++ b/.github/ISSUE_TEMPLATE/01_BUG_REPORT.yml @@ -9,9 +9,6 @@ body: > [!IMPORTANT] > **Please ensure you are using the latest version of Coolify before submitting an issue, as the bug may have already been fixed in a recent update.** (Of course, if you're experiencing an issue on the latest version that wasn't present in a previous version, please let us know.) - # 💎 Bounty Program (with [algora.io](https://console.algora.io/org/coollabsio/bounties/new)) - - If you would like to prioritize the issue resolution, consider adding a bounty to this issue through our [Bounty Program](https://console.algora.io/org/coollabsio/bounties/new). - - type: textarea attributes: label: Error Message and Logs diff --git a/.github/ISSUE_TEMPLATE/02_ENHANCEMENT_BOUNTY.yml b/.github/ISSUE_TEMPLATE/02_ENHANCEMENT_BOUNTY.yml deleted file mode 100644 index ef26125e0..000000000 --- a/.github/ISSUE_TEMPLATE/02_ENHANCEMENT_BOUNTY.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: 💎 Enhancement Bounty -description: "Propose a new feature, service, or improvement with an attached bounty." -title: "[Enhancement]: " -labels: ["✨ Enhancement", "🔍 Triage"] -body: - - type: markdown - attributes: - value: | - > [!IMPORTANT] - > **This issue template is exclusively for proposing new features, services, or improvements with an attached bounty.** Enhancements without a bounty can be discussed in the appropriate category of [Github Discussions](https://github.com/coollabsio/coolify/discussions). - - # 💎 Add a Bounty (with [algora.io](https://console.algora.io/org/coollabsio/bounties/new)) - - [Click here to add the required bounty](https://console.algora.io/org/coollabsio/bounties/new) - - - type: dropdown - attributes: - label: Request Type - description: Select the type of request you are making. - options: - - New Feature - - New Service - - Improvement - validations: - required: true - - - type: textarea - attributes: - label: Description - description: Provide a detailed description of the feature, improvement, or service you are proposing. - validations: - required: true diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7fd2c358e..e1286eb22 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -22,7 +22,7 @@ ## Category ## Preview - + ## AI Assistance diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9aec08420..85fceb28f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -212,7 +212,7 @@ #### Review Process - Duplicate or superseded work - Security or quality concerns -#### Code Quality, Testing, and Bounty Submissions +#### Code Quality and Testing All contributions must adhere to the highest standards of code quality and testing: - **Testing Required**: Every PR must include steps to test your changes. Untested code will not be reviewed or merged. @@ -220,15 +220,6 @@ #### Code Quality, Testing, and Bounty Submissions - **Code Standards**: Follow the existing code style, conventions, and patterns in the codebase. - **No AI-Generated Code**: Do not submit code generated by AI tools without fully understanding and verifying it. AI-generated submissions that are untested or incorrect will be rejected immediately. -**For PRs that claim bounties:** - -- **Eligibility**: Bounty PRs must strictly follow all guidelines above. Untested, poorly described, or non-compliant PRs will not qualify for bounty rewards. -- **Original Work**: Bounties are for genuine contributions. Submitting AI-generated or copied code solely for bounty claims will result in disqualification and potential removal from contributing. -- **Quality Standards**: Bounty submissions are held to even higher standards. Ensure comprehensive testing, clear documentation, and alignment with project goals. When maintainers review the changes, they should work as expected (the things mentioned in the PR description plus what the bounty issuer needs). -- **Claim Process**: Only successfully merged PRs that pass all reviews (core maintainers + bounty issuer) and meet bounty criteria will be awarded. Follow the issue's bounty guidelines precisely. -- **Prioritization**: Contributor PRs are prioritized over first-time or new contributors. -- **Developer Experience**: We highly advise beginners to avoid participating in bug bounties for our codebase. Most of the time, they don't know what they are changing, how it affects other parts of the system, or if their changes are even correct. -- **Review Comments**: When maintainers ask questions, you should be able to respond properly without generic or AI-generated fluff. ## Development Notes diff --git a/README.md b/README.md index a5aa69343..9a5feff4e 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # Coolify An open-source & self-hostable Heroku / Netlify / Vercel alternative. ![Latest Release Version](https://img.shields.io/badge/dynamic/json?labelColor=grey&color=6366f1&label=Latest%20released%20version&url=https%3A%2F%2Fcdn.coollabs.io%2Fcoolify%2Fversions.json&query=coolify.v4.version&style=for-the-badge -) [![Bounty Issues](https://img.shields.io/static/v1?labelColor=grey&color=6366f1&label=Algora&message=%F0%9F%92%8E+Bounty+issues&style=for-the-badge)](https://console.algora.io/org/coollabsio/bounties/new) +) ## About the Project @@ -65,7 +65,6 @@ ### Huge Sponsors ### Big Sponsors * [23M](https://23m.com?ref=coolify.io) - Your experts for high-availability hosting solutions! -* [Algora](https://algora.io?ref=coolify.io) - Open source contribution platform * [American Cloud](https://americancloud.com?ref=coolify.io) - US-based cloud infrastructure services * [Arcjet](https://arcjet.com?ref=coolify.io) - Advanced web security and performance solutions * [BC Direct](https://bc.direct?ref=coolify.io) - Your trusted technology consulting partner diff --git a/app/Support/ValidationPatterns.php b/app/Support/ValidationPatterns.php index 6f38e5444..15d0f19e0 100644 --- a/app/Support/ValidationPatterns.php +++ b/app/Support/ValidationPatterns.php @@ -40,10 +40,11 @@ class ValidationPatterns * Blocks dangerous shell metacharacters: ; | ` $ ( ) > < newlines and carriage returns * Allows & for command chaining (&&) which is common in multi-step build commands * Allows double quotes for build args with spaces (e.g. --build-arg KEY="value") - * Blocks backslashes and single quotes to prevent escape-sequence attacks + * Blocks backslashes to prevent escape-sequence attacks + * Allows single and double quotes for quoted arguments (e.g. --entrypoint "sh -c 'npm start'") * Uses [ \t] instead of \s to explicitly exclude \n and \r (which act as command separators) */ - public const SHELL_SAFE_COMMAND_PATTERN = '/^[a-zA-Z0-9 \t._\-\/=:@,+\[\]{}#%^~&"]+$/'; + public const SHELL_SAFE_COMMAND_PATTERN = '/^[a-zA-Z0-9 \t._\-\/=:@,+\[\]{}#%^~&"\']+$/'; /** * Pattern for Docker volume names diff --git a/config/constants.php b/config/constants.php index 828493208..d0ae9be65 100644 --- a/config/constants.php +++ b/config/constants.php @@ -2,9 +2,9 @@ return [ 'coolify' => [ - 'version' => '4.0.0-beta.471', - 'helper_version' => '1.0.12', - 'realtime_version' => '1.0.11', + 'version' => '4.0.0-beta.472', + 'helper_version' => '1.0.13', + 'realtime_version' => '1.0.12', 'self_hosted' => env('SELF_HOSTED', true), 'autoupdate' => env('AUTOUPDATE'), 'base_config_path' => env('BASE_CONFIG_PATH', '/data/coolify'), diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 0bd4ae2dd..e6d2bce54 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -60,7 +60,7 @@ services: retries: 10 timeout: 2s soketi: - image: '${REGISTRY_URL:-ghcr.io}/coollabsio/coolify-realtime:1.0.11' + image: '${REGISTRY_URL:-ghcr.io}/coollabsio/coolify-realtime:1.0.12' ports: - "${SOKETI_PORT:-6001}:6001" - "6002:6002" diff --git a/docker-compose.windows.yml b/docker-compose.windows.yml index ca233356a..00734fb0e 100644 --- a/docker-compose.windows.yml +++ b/docker-compose.windows.yml @@ -96,7 +96,7 @@ services: retries: 10 timeout: 2s soketi: - image: 'ghcr.io/coollabsio/coolify-realtime:1.0.10' + image: 'ghcr.io/coollabsio/coolify-realtime:1.0.12' pull_policy: always container_name: coolify-realtime restart: always diff --git a/docker/coolify-helper/Dockerfile b/docker/coolify-helper/Dockerfile index 14879eb96..9c984a5ee 100644 --- a/docker/coolify-helper/Dockerfile +++ b/docker/coolify-helper/Dockerfile @@ -28,7 +28,8 @@ ARG NIXPACKS_VERSION USER root WORKDIR /artifacts -RUN apk add --no-cache bash curl git git-lfs openssh-client tar tini +RUN apk upgrade --no-cache && \ + apk add --no-cache bash curl git git-lfs openssh-client tar tini RUN mkdir -p ~/.docker/cli-plugins RUN if [[ ${TARGETPLATFORM} == 'linux/amd64' ]]; then \ curl -sSL https://github.com/docker/buildx/releases/download/v${DOCKER_BUILDX_VERSION}/buildx-v${DOCKER_BUILDX_VERSION}.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx && \ diff --git a/docker/coolify-realtime/Dockerfile b/docker/coolify-realtime/Dockerfile index 99157268b..325a30dcc 100644 --- a/docker/coolify-realtime/Dockerfile +++ b/docker/coolify-realtime/Dockerfile @@ -10,7 +10,8 @@ ARG TARGETPLATFORM ARG CLOUDFLARED_VERSION WORKDIR /terminal -RUN apk add --no-cache openssh-client make g++ python3 curl +RUN apk upgrade --no-cache && \ + apk add --no-cache openssh-client make g++ python3 curl COPY docker/coolify-realtime/package.json ./ RUN npm i RUN npm rebuild node-pty --update-binary diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile index 98b4d2006..77013e1b9 100644 --- a/docker/development/Dockerfile +++ b/docker/development/Dockerfile @@ -33,7 +33,8 @@ RUN docker-php-serversideup-set-id www-data $USER_ID:$GROUP_ID && \ docker-php-serversideup-set-file-permissions --owner $USER_ID:$GROUP_ID --service nginx # Install PostgreSQL repository and keys -RUN apk add --no-cache gnupg && \ +RUN apk upgrade --no-cache && \ + apk add --no-cache gnupg && \ mkdir -p /usr/share/keyrings && \ curl -fSsL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor > /usr/share/keyrings/postgresql.gpg diff --git a/other/nightly/docker-compose.prod.yml b/other/nightly/docker-compose.prod.yml index 0bd4ae2dd..e6d2bce54 100644 --- a/other/nightly/docker-compose.prod.yml +++ b/other/nightly/docker-compose.prod.yml @@ -60,7 +60,7 @@ services: retries: 10 timeout: 2s soketi: - image: '${REGISTRY_URL:-ghcr.io}/coollabsio/coolify-realtime:1.0.11' + image: '${REGISTRY_URL:-ghcr.io}/coollabsio/coolify-realtime:1.0.12' ports: - "${SOKETI_PORT:-6001}:6001" - "6002:6002" diff --git a/other/nightly/docker-compose.windows.yml b/other/nightly/docker-compose.windows.yml index ca233356a..00734fb0e 100644 --- a/other/nightly/docker-compose.windows.yml +++ b/other/nightly/docker-compose.windows.yml @@ -96,7 +96,7 @@ services: retries: 10 timeout: 2s soketi: - image: 'ghcr.io/coollabsio/coolify-realtime:1.0.10' + image: 'ghcr.io/coollabsio/coolify-realtime:1.0.12' pull_policy: always container_name: coolify-realtime restart: always diff --git a/other/nightly/versions.json b/other/nightly/versions.json index af11ef4d3..26d755967 100644 --- a/other/nightly/versions.json +++ b/other/nightly/versions.json @@ -1,16 +1,16 @@ { "coolify": { "v4": { - "version": "4.0.0-beta.471" + "version": "4.0.0-beta.472" }, "nightly": { "version": "4.0.0" }, "helper": { - "version": "1.0.12" + "version": "1.0.13" }, "realtime": { - "version": "1.0.11" + "version": "1.0.12" }, "sentinel": { "version": "0.0.21" diff --git a/package-lock.json b/package-lock.json index 6959704a1..0af80f950 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "pusher-js": "8.4.0", "tailwind-scrollbar": "4.0.2", "tailwindcss": "4.1.18", - "vite": "7.3.0", + "vite": "7.3.2", "vue": "3.5.26" } }, @@ -2709,9 +2709,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", - "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 81cd8c9a4..661b13e4c 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "pusher-js": "8.4.0", "tailwind-scrollbar": "4.0.2", "tailwindcss": "4.1.18", - "vite": "7.3.0", + "vite": "7.3.2", "vue": "3.5.26" }, "dependencies": { diff --git a/public/svgs/grimmory.svg b/public/svgs/grimmory.svg new file mode 100644 index 000000000..cd8230fa2 --- /dev/null +++ b/public/svgs/grimmory.svg @@ -0,0 +1,4 @@ + + + + diff --git a/templates/compose/actualbudget.yaml b/templates/compose/actualbudget.yaml index a943ee424..00a043b05 100644 --- a/templates/compose/actualbudget.yaml +++ b/templates/compose/actualbudget.yaml @@ -1,6 +1,6 @@ # documentation: https://actualbudget.org/docs/install/docker # slogan: A local-first personal finance app. -# category: productivity +# category: finance # tags: budgeting,actual,finance,budget,money,expenses,income # logo: svgs/actualbudget.png # port: 5006 diff --git a/templates/compose/alexandrie.yaml b/templates/compose/alexandrie.yaml index 9d7d59227..32bb98b2f 100644 --- a/templates/compose/alexandrie.yaml +++ b/templates/compose/alexandrie.yaml @@ -7,7 +7,7 @@ services: frontend: - image: ghcr.io/smaug6739/alexandrie-frontend:v8.4.1 + image: ghcr.io/smaug6739/alexandrie-frontend:v8.7.2 environment: - SERVICE_URL_FRONTEND_8200 - PORT=8200 @@ -21,7 +21,7 @@ services: - backend backend: - image: ghcr.io/smaug6739/alexandrie-backend:v8.4.1 + image: ghcr.io/smaug6739/alexandrie-backend:v8.7.2 environment: - SERVICE_URL_BACKEND_8201 - BACKEND_PORT=8201 @@ -74,7 +74,7 @@ services: retries: 5 rustfs: - image: rustfs/rustfs:1.0.0-alpha.81 + image: rustfs/rustfs:1.0.0-alpha.90 environment: - SERVICE_URL_RUSTFS_9000 - RUSTFS_ACCESS_KEY=${SERVICE_USER_RUSTFS} diff --git a/templates/compose/argilla.yaml b/templates/compose/argilla.yaml index caa567eb3..643d8d70d 100644 --- a/templates/compose/argilla.yaml +++ b/templates/compose/argilla.yaml @@ -4,7 +4,6 @@ # tags: workflow, orchestration, data-pipeline, python, argilla, ai, elasticsearch, datasets, data, machine-learning, data-science, nlp # logo: svgs/argilla.png # port: 6900 -# category: productivity services: argilla: diff --git a/templates/compose/autobase.yaml b/templates/compose/autobase.yaml index bef8fdc05..ad8b5384a 100644 --- a/templates/compose/autobase.yaml +++ b/templates/compose/autobase.yaml @@ -1,5 +1,6 @@ # documentation: https://autobase.tech/docs/ # slogan: Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (self-hosted DBaaS). +# category: database # tags: database, postgres, automation, self-hosted, dbaas # logo: svgs/autobase.svg # port: 80 diff --git a/templates/compose/budge.yaml b/templates/compose/budge.yaml index 4a1b14b19..3d98408fc 100644 --- a/templates/compose/budge.yaml +++ b/templates/compose/budge.yaml @@ -1,6 +1,6 @@ # documentation: https://github.com/linuxserver/budge # slogan: A budgeting personal finance app. -# category: productivity +# category: finance # tags: personal finance, budgeting, expense tracking # logo: svgs/budge.png diff --git a/templates/compose/calibre-web-automated-book-downloader.yaml b/templates/compose/calibre-web-automated-book-downloader.yaml index 37f8a2752..423e07da9 100644 --- a/templates/compose/calibre-web-automated-book-downloader.yaml +++ b/templates/compose/calibre-web-automated-book-downloader.yaml @@ -1,5 +1,6 @@ # documentation: https://github.com/calibrain/calibre-web-automated-book-downloader # slogan: An intuitive web interface for searching and requesting book downloads, designed to work seamlessly with Calibre-Web-Automated. +# category: media # tags: calibre,calibre-web,ebook,library,epub,ereader,kindle,book,reader,download,downloader # logo: svgs/calibre-web-automated-with-downloader.png # port: 8083 diff --git a/templates/compose/cap.yaml b/templates/compose/cap.yaml index ab8197c02..2ceff75c1 100644 --- a/templates/compose/cap.yaml +++ b/templates/compose/cap.yaml @@ -1,5 +1,6 @@ # documentation: https://cap.so # slogan: Cap is the open source alternative to Loom. Lightweight, powerful, and cross-platform. Record and share in seconds. +# category: media # tags: cap,loom,open,source,low,code # logo: svgs/cap.svg # port: 5679 @@ -72,4 +73,4 @@ services: timeout: 10s retries: 5 volumes: - - 'cap_db:/var/lib/mysql' \ No newline at end of file + - 'cap_db:/var/lib/mysql' diff --git a/templates/compose/chaskiq.yaml b/templates/compose/chaskiq.yaml index 1f1cddaca..96eab133c 100644 --- a/templates/compose/chaskiq.yaml +++ b/templates/compose/chaskiq.yaml @@ -1,6 +1,6 @@ # documentation: https://chaskiq.io # slogan: Chaskiq is an messaging platform for marketing, support & sales -# category: cms +# category: helpdesk # tags: chaskiq,messaging,chat,marketing,support,sales,open,source,rails,redis,postgresql,sidekiq # logo: svgs/chaskiq.png # port: 3000 diff --git a/templates/compose/chatwoot.yaml b/templates/compose/chatwoot.yaml index 1759048f7..407e82bb3 100644 --- a/templates/compose/chatwoot.yaml +++ b/templates/compose/chatwoot.yaml @@ -1,6 +1,6 @@ # documentation: https://www.chatwoot.com/docs/self-hosted/ # slogan: Delightful customer relationships at scale. -# category: cms +# category: helpdesk # tags: chatwoot,chat,api,open,source,rails,redis,postgresql,sidekiq # logo: svgs/chatwoot.svg # port: 3000 diff --git a/templates/compose/chibisafe.yaml b/templates/compose/chibisafe.yaml index 62ced7a80..60bb8a7d7 100644 --- a/templates/compose/chibisafe.yaml +++ b/templates/compose/chibisafe.yaml @@ -1,5 +1,6 @@ # documentation: https://chibisafe.app/docs/intro # slogan: A beautiful and performant vault to save all your files in the cloud. +# category: storage # tags: storage,file-sharing,upload,sharing # logo: svgs/chibisafe.svg # port: 80 diff --git a/templates/compose/convex.yaml b/templates/compose/convex.yaml index 49f2449df..e80cc4254 100644 --- a/templates/compose/convex.yaml +++ b/templates/compose/convex.yaml @@ -7,7 +7,7 @@ services: backend: - image: ghcr.io/get-convex/convex-backend:00bd92723422f3bff968230c94ccdeb8c1719832 + image: ghcr.io/get-convex/convex-backend:a9a760ca10399ed42e1b4bb87c78539a235488c7 volumes: - data:/convex/data environment: @@ -47,7 +47,7 @@ services: start_period: 10s dashboard: - image: ghcr.io/get-convex/convex-dashboard:33cef775a8a6228cbacee4a09ac2c4073d62ed13 + image: ghcr.io/get-convex/convex-dashboard:a9a760ca10399ed42e1b4bb87c78539a235488c7 environment: - SERVICE_URL_DASHBOARD_6791 # URL of the Convex API as accessed by the dashboard (browser). @@ -56,6 +56,6 @@ services: backend: condition: service_healthy healthcheck: - test: wget -qO- http://127.0.0.1:6791/ + test: curl -f http://127.0.0.1:6791/ interval: 5s start_period: 5s diff --git a/templates/compose/directus-with-postgresql.yaml b/templates/compose/directus-with-postgresql.yaml index c35e411fd..763944456 100644 --- a/templates/compose/directus-with-postgresql.yaml +++ b/templates/compose/directus-with-postgresql.yaml @@ -27,6 +27,11 @@ services: - REDIS_HOST=redis - REDIS_PORT=6379 - WEBSOCKETS_ENABLED=true + - CORS_ENABLED=${CORS_ENABLED:-true} + - CORS_ORIGIN=${CORS_ORIGIN} + - CORS_METHODS=${CORS_METHODS:-GET,POST,PATCH,DELETE,OPTIONS} + - CORS_ALLOWED_HEADERS=${CORS_ALLOWED_HEADERS:-Content-Type,Authorization} + - CORS_CREDENTIALS=${CORS_CREDENTIALS:-true} healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:8055/admin/login"] interval: 5s diff --git a/templates/compose/directus.yaml b/templates/compose/directus.yaml index 36589c72a..1648f7e3d 100644 --- a/templates/compose/directus.yaml +++ b/templates/compose/directus.yaml @@ -22,6 +22,11 @@ services: - DB_CLIENT=sqlite3 - DB_FILENAME=/directus/database/data.db - WEBSOCKETS_ENABLED=true + - CORS_ENABLED=${CORS_ENABLED:-true} + - CORS_ORIGIN=${CORS_ORIGIN} + - CORS_METHODS=${CORS_METHODS:-GET,POST,PATCH,DELETE,OPTIONS} + - CORS_ALLOWED_HEADERS=${CORS_ALLOWED_HEADERS:-Content-Type,Authorization} + - CORS_CREDENTIALS=${CORS_CREDENTIALS:-true} healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:8055/admin/login"] diff --git a/templates/compose/dolibarr.yaml b/templates/compose/dolibarr.yaml index 0ec07ca32..4cdfc05fe 100644 --- a/templates/compose/dolibarr.yaml +++ b/templates/compose/dolibarr.yaml @@ -1,6 +1,6 @@ # documentation: https://www.dolibarr.org/documentation-home.php # slogan: Dolibarr is a modern software package to manage your organization's activity (contacts, quotes, invoices, orders, stocks, agenda, hr, expense reports, accountancy, ecm, manufacturing, ...). -# category: cms +# category: productivity # tags: crm,ERP # logo: svgs/dolibarr.png # port: 80 diff --git a/templates/compose/drizzle-gateway.yaml b/templates/compose/drizzle-gateway.yaml index 59f1c3447..b80f6b51a 100644 --- a/templates/compose/drizzle-gateway.yaml +++ b/templates/compose/drizzle-gateway.yaml @@ -1,6 +1,6 @@ # documentation: https://gateway.drizzle.team/ # slogan: Free self-hosted Drizzle Studio on steroids -# category: backend +# category: devtools # tags: drizzle,gateway,self-hosted,open-source,low-code # logo: svgs/drizzle.jpeg # port: 4983 diff --git a/templates/compose/elasticsearch-with-kibana.yaml b/templates/compose/elasticsearch-with-kibana.yaml index 2893f9875..7c83389e8 100644 --- a/templates/compose/elasticsearch-with-kibana.yaml +++ b/templates/compose/elasticsearch-with-kibana.yaml @@ -1,5 +1,6 @@ # documentation: https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-kibana-with-docker # slogan: Elastic + Kibana is a Free and Open Source Search, Monitoring, and Visualization Stack +# category: monitoring # tags: elastic,kibana,elasticsearch,search,visualization,logging,monitoring,observability,analytics,stack,devops # logo: svgs/elasticsearch.svg # port: 5601 diff --git a/templates/compose/espocrm.yaml b/templates/compose/espocrm.yaml index 6fec260c4..677b1fa64 100644 --- a/templates/compose/espocrm.yaml +++ b/templates/compose/espocrm.yaml @@ -1,6 +1,6 @@ # documentation: https://docs.espocrm.com # slogan: EspoCRM is a free and open-source CRM platform. -# category: cms +# category: productivity # tags: crm, self-hosted, open-source, workflow, automation, project management # logo: svgs/espocrm.svg # port: 80 diff --git a/templates/compose/firefly.yaml b/templates/compose/firefly.yaml index 284a7c696..057a41f08 100644 --- a/templates/compose/firefly.yaml +++ b/templates/compose/firefly.yaml @@ -1,6 +1,6 @@ # documentation: https://firefly-iii.org # slogan: A personal finances manager that can help you save money. -# category: productivity +# category: finance # tags: finance, money, personal, manager # logo: svgs/firefly.svg # port: 8080 diff --git a/templates/compose/formbricks.yaml b/templates/compose/formbricks.yaml index 17d462486..7a24ec210 100644 --- a/templates/compose/formbricks.yaml +++ b/templates/compose/formbricks.yaml @@ -1,6 +1,6 @@ # documentation: https://formbricks.com/docs/self-hosting/setup/docker # slogan: Open Source Survey Platform -# category: analytics +# category: productivity # tags: form, builder, forms, survey # logo: svgs/formbricks.png # port: 3000 diff --git a/templates/compose/foundryvtt.yaml b/templates/compose/foundryvtt.yaml index 3584722fa..d6ab28bae 100644 --- a/templates/compose/foundryvtt.yaml +++ b/templates/compose/foundryvtt.yaml @@ -1,6 +1,6 @@ # documentation: https://foundryvtt.com/kb/ # slogan: Foundry Virtual Tabletop is a self-hosted & modern roleplaying platform -# category: media +# category: games # tags: foundryvtt,foundry,vtt,ttrpg,roleplaying # logo: svgs/foundryvtt.png # port: 30000 diff --git a/templates/compose/freescout.yaml b/templates/compose/freescout.yaml index 46c99d0df..247220f96 100644 --- a/templates/compose/freescout.yaml +++ b/templates/compose/freescout.yaml @@ -1,6 +1,6 @@ # documentation: https://github.com/freescout-help-desk/freescout/wiki/ # slogan: FreeScout is the super lightweight and powerful free open source help desk and shared inbox written in PHP (Laravel framework). -# category: cms +# category: helpdesk # tags: helpdesk, support, ticketing, customer-support # logo: svgs/freescout.png # port: 80 diff --git a/templates/compose/freshrss-with-mariadb.yaml b/templates/compose/freshrss-with-mariadb.yaml index 3b150dfac..dc0e18916 100644 --- a/templates/compose/freshrss-with-mariadb.yaml +++ b/templates/compose/freshrss-with-mariadb.yaml @@ -1,6 +1,6 @@ # documentation: https://freshrss.org/index.html # slogan: A free, self-hostable feed aggregator. -# category: cms +# category: RSS # tags: rss, feed # logo: svgs/freshrss.png # port: 80 diff --git a/templates/compose/freshrss-with-mysql.yaml b/templates/compose/freshrss-with-mysql.yaml index 13cb1be39..f475de569 100644 --- a/templates/compose/freshrss-with-mysql.yaml +++ b/templates/compose/freshrss-with-mysql.yaml @@ -1,6 +1,6 @@ # documentation: https://freshrss.org/index.html # slogan: A free, self-hostable feed aggregator. -# category: cms +# category: RSS # tags: rss, feed # logo: svgs/freshrss.png # port: 80 diff --git a/templates/compose/freshrss-with-postgresql.yaml b/templates/compose/freshrss-with-postgresql.yaml index 9915f99f5..381aabc8b 100644 --- a/templates/compose/freshrss-with-postgresql.yaml +++ b/templates/compose/freshrss-with-postgresql.yaml @@ -1,6 +1,6 @@ # documentation: https://freshrss.org/index.html # slogan: A free, self-hostable feed aggregator. -# category: cms +# category: RSS # tags: rss, feed # logo: svgs/freshrss.png # port: 80 diff --git a/templates/compose/freshrss.yaml b/templates/compose/freshrss.yaml index 16813c0dd..b5c2e92c6 100644 --- a/templates/compose/freshrss.yaml +++ b/templates/compose/freshrss.yaml @@ -1,6 +1,6 @@ # documentation: https://freshrss.org/index.html # slogan: A free, self-hostable feed aggregator. -# category: cms +# category: RSS # tags: rss, feed # logo: svgs/freshrss.png # port: 80 diff --git a/templates/compose/glance.yaml b/templates/compose/glance.yaml index 3055a4ee0..90e985aad 100644 --- a/templates/compose/glance.yaml +++ b/templates/compose/glance.yaml @@ -1,6 +1,6 @@ # documentation: https://github.com/glanceapp/glance # slogan: A self-hosted dashboard that puts all your feeds in one place. -# category: monitoring +# category: productivity # tags: dashboard, server, applications, interface, rrss # logo: svgs/glance.png # port: 8080 diff --git a/templates/compose/gotify.yaml b/templates/compose/gotify.yaml index 10e8264f5..e653616fb 100644 --- a/templates/compose/gotify.yaml +++ b/templates/compose/gotify.yaml @@ -1,6 +1,6 @@ # documentation: https://gotify.net/docs/install # slogan: Gotify is an open-source self-hosted notification server. -# category: productivity +# category: messaging # tags: productivity,notification,collaboration # logo: svgs/gotify.png # port: 80 @@ -26,4 +26,4 @@ services: interval: 5s timeout: 20s retries: 10 - \ No newline at end of file + diff --git a/templates/compose/gowa.yaml b/templates/compose/gowa.yaml index 32c3412e9..52c1c8a91 100644 --- a/templates/compose/gowa.yaml +++ b/templates/compose/gowa.yaml @@ -1,6 +1,6 @@ # documentation: https://github.com/aldinokemal/go-whatsapp-web-multidevice # slogan: Golang WhatsApp - Built with Go for efficient memory use -# category: cms +# category: messaging # tags: whatsapp,golang,multidevice,api,go-whatsapp # logo: svgs/gowa.svg # port: 3000 diff --git a/templates/compose/grimmory.yaml b/templates/compose/grimmory.yaml new file mode 100644 index 000000000..c04d1086d --- /dev/null +++ b/templates/compose/grimmory.yaml @@ -0,0 +1,49 @@ +# documentation: https://github.com/grimmory-tools/grimmory +# slogan: Grimmory is a self-hosted application for managing your entire book collection in one place. Organize, read, annotate, sync across devices, and share without relying on third-party services. +# tags: books,ebooks,library,reader +# logo: svgs/grimmory.svg +# port: 80 + +services: + grimmory: + image: 'grimmory/grimmory:nightly-20260403-3a371f7' # Released on April 3 2026 + environment: + - SERVICE_URL_GRIMMORY_80 + - 'USER_ID=${GRIMMORY_USER_ID:-0}' + - 'GROUP_ID=${GRIMMORY_GROUP_ID:-0}' + - 'TZ=${TZ:-UTC}' + - 'DATABASE_URL=jdbc:mariadb://mariadb:3306/${MARIADB_DATABASE:-grimmory-db}' + - 'DATABASE_USERNAME=${SERVICE_USER_MARIADB}' + - 'DATABASE_PASSWORD=${SERVICE_PASSWORD_MARIADB}' + - BOOKLORE_PORT=80 + volumes: + - 'grimmory-data:/app/data' + - 'grimmory-books:/books' + - 'grimmory-bookdrop:/bookdrop' + healthcheck: + test: 'wget --no-verbose --tries=1 --spider http://127.0.0.1/health || exit 1' + interval: 10s + timeout: 5s + retries: 10 + depends_on: + mariadb: + condition: service_healthy + + mariadb: + image: 'mariadb:12' + environment: + - 'MARIADB_USER=${SERVICE_USER_MARIADB}' + - 'MARIADB_PASSWORD=${SERVICE_PASSWORD_MARIADB}' + - 'MARIADB_ROOT_PASSWORD=${SERVICE_PASSWORD_MARIADBROOT}' + - 'MARIADB_DATABASE=${MARIADB_DATABASE:-grimmory-db}' + volumes: + - 'mariadb-data:/var/lib/mysql' + healthcheck: + test: + - CMD + - healthcheck.sh + - '--connect' + - '--innodb_initialized' + interval: 10s + timeout: 5s + retries: 10 \ No newline at end of file diff --git a/templates/compose/hatchet.yaml b/templates/compose/hatchet.yaml index 92e307734..597d9dc97 100644 --- a/templates/compose/hatchet.yaml +++ b/templates/compose/hatchet.yaml @@ -1,5 +1,6 @@ # documentation: https://docs.hatchet.run/self-hosting/docker-compose # slogan: Hatchet allows you to run background tasks at scale with a high-throughput, low-latency computing service built on an open-source, fault-tolerant queue. +# category: automation # tags: ai-agents,background-tasks,data-pipelines,scheduling # logo: svgs/hatchet.svg # port: 80 diff --git a/templates/compose/homebox.yaml b/templates/compose/homebox.yaml index 7180fd459..8537247e4 100644 --- a/templates/compose/homebox.yaml +++ b/templates/compose/homebox.yaml @@ -1,6 +1,6 @@ # documentation: https://github.com/sysadminsmedia/homebox # slogan: Homebox is the inventory and organization system built for the Home User. -# category: storage +# category: productivity # tags: inventory, home, organize # logo: svgs/homebox.svg # port: 7745 diff --git a/templates/compose/invoice-ninja.yaml b/templates/compose/invoice-ninja.yaml index d24ef348d..c4581cc9f 100644 --- a/templates/compose/invoice-ninja.yaml +++ b/templates/compose/invoice-ninja.yaml @@ -1,6 +1,6 @@ # documentation: https://invoiceninja.github.io/selfhost.html # slogan: The leading open-source invoicing platform -# category: productivity +# category: finance # tags: invoicing, billing, accounting, finance, self-hosted # logo: svgs/invoiceninja.png # port: 9000 diff --git a/templates/compose/librechat.yaml b/templates/compose/librechat.yaml index 575411443..66ac35aca 100644 --- a/templates/compose/librechat.yaml +++ b/templates/compose/librechat.yaml @@ -7,7 +7,7 @@ services: librechat: - image: ghcr.io/danny-avila/librechat-dev-api:latest + image: ghcr.io/danny-avila/librechat-dev-api:6ecd1b510faaa593ad954fb6276c18e5f12a8e53 # Released on April 2 environment: - SERVICE_URL_LIBRECHAT_3080 - DOMAIN_CLIENT=${SERVICE_URL_LIBRECHAT} @@ -64,7 +64,7 @@ services: "--no-verbose", "--tries=1", "--spider", - "http://127.0.0.1:3080/api/health", + "http://127.0.0.1:3080/health", ] interval: 5s timeout: 10s @@ -92,7 +92,7 @@ services: retries: 3 meilisearch: - image: getmeili/meilisearch:v1.12.3 + image: getmeili/meilisearch:v1.35.1 environment: - MEILI_MASTER_KEY=${SERVICE_PASSWORD_MEILI} - MEILI_NO_ANALYTICS=${MEILI_NO_ANALYTICS:-false} @@ -107,7 +107,7 @@ services: retries: 15 vectordb: - image: ankane/pgvector:latest + image: ankane/pgvector:v0.5.1 # pgvector by ankane is archived and not maintained, in future we have to swap this image to something else that is well maintained environment: - POSTGRES_DB=rag - POSTGRES_USER=${SERVICE_USER_POSTGRES} @@ -129,7 +129,7 @@ services: start_period: 10s rag-api: - image: ghcr.io/danny-avila/librechat-rag-api-dev-lite:latest + image: ghcr.io/danny-avila/librechat-rag-api-dev-lite:v0.7.3 environment: - POSTGRES_DB=rag - POSTGRES_USER=${SERVICE_USER_POSTGRES} diff --git a/templates/compose/mattermost.yaml b/templates/compose/mattermost.yaml index 94aca3ac1..26faa2098 100644 --- a/templates/compose/mattermost.yaml +++ b/templates/compose/mattermost.yaml @@ -1,6 +1,6 @@ # documentation: https://docs.mattermost.com # slogan: Mattermost is an open source, self-hosted Slack-alternative. -# category: mattermost +# category: messaging # tags: mattermost,slack,alternative # logo: svgs/mattermost.svg # port: 8065 diff --git a/templates/compose/minecraft.yaml b/templates/compose/minecraft.yaml index 507bbb8bb..46ae437bb 100644 --- a/templates/compose/minecraft.yaml +++ b/templates/compose/minecraft.yaml @@ -1,6 +1,6 @@ # documentation: https://github.com/itzg/docker-minecraft-server # slogan: Minecraft Server that will automatically download selected version at startup. -# category: media +# category: games # tags: minecraft # logo: svgs/minecraft.svg # port: 25565 diff --git a/templates/compose/miniflux.yaml b/templates/compose/miniflux.yaml index 6c6634cd8..20a79aef0 100644 --- a/templates/compose/miniflux.yaml +++ b/templates/compose/miniflux.yaml @@ -1,6 +1,6 @@ # documentation: https://miniflux.app/docs/index.html # slogan: Miniflux is a minimalist and opinionated feed reader. -# category: cms +# category: RSS # tags: miniflux,rss,feed,self,hosted # logo: svgs/miniflux.svg # port: 8080 diff --git a/templates/compose/n8n-with-postgres-and-worker.yaml b/templates/compose/n8n-with-postgres-and-worker.yaml index b7d381399..286038551 100644 --- a/templates/compose/n8n-with-postgres-and-worker.yaml +++ b/templates/compose/n8n-with-postgres-and-worker.yaml @@ -48,7 +48,7 @@ services: redis: condition: service_healthy healthcheck: - test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/"] + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/healthz"] interval: 5s timeout: 20s retries: 10 @@ -133,7 +133,7 @@ services: healthcheck: test: - CMD-SHELL - - 'wget -qO- http://127.0.0.1:5680/' + - 'wget -qO- http://127.0.0.1:5680/healthz' interval: 5s timeout: 20s retries: 10 diff --git a/templates/compose/n8n-with-postgresql.yaml b/templates/compose/n8n-with-postgresql.yaml index d7096add2..4d1f9e970 100644 --- a/templates/compose/n8n-with-postgresql.yaml +++ b/templates/compose/n8n-with-postgresql.yaml @@ -41,7 +41,7 @@ services: postgresql: condition: service_healthy healthcheck: - test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/"] + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/healthz"] interval: 5s timeout: 20s retries: 10 @@ -58,7 +58,7 @@ services: healthcheck: test: - CMD-SHELL - - 'wget -qO- http://127.0.0.1:5680/' + - 'wget -qO- http://127.0.0.1:5680/healthz' interval: 5s timeout: 20s retries: 10 diff --git a/templates/compose/n8n.yaml b/templates/compose/n8n.yaml index ff5ee90b2..46a1a9fc5 100644 --- a/templates/compose/n8n.yaml +++ b/templates/compose/n8n.yaml @@ -32,7 +32,7 @@ services: volumes: - n8n-data:/home/node/.n8n healthcheck: - test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/"] + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:5678/healthz"] interval: 5s timeout: 20s retries: 10 @@ -49,7 +49,7 @@ services: healthcheck: test: - CMD-SHELL - - 'wget -qO- http://127.0.0.1:5680/' + - 'wget -qO- http://127.0.0.1:5680/healthz' interval: 5s timeout: 20s retries: 10 diff --git a/templates/compose/netbird-client.yaml b/templates/compose/netbird-client.yaml index 4bc5e32e0..85b54da8b 100644 --- a/templates/compose/netbird-client.yaml +++ b/templates/compose/netbird-client.yaml @@ -13,7 +13,7 @@ services: - 'NB_ENABLE_ROSENPASS=${NB_ENABLE_ROSENPASS:-false}' - 'NB_ENABLE_EXPERIMENTAL_LAZY_CONN=${NB_ENABLE_EXPERIMENTAL_LAZY_CONN:-false}' volumes: - - 'netbird-client:/etc/netbird' + - 'netbird-client:/var/lib/netbird' cap_add: - NET_ADMIN - SYS_ADMIN diff --git a/templates/compose/newt-pangolin.yaml b/templates/compose/newt-pangolin.yaml index 7e2db3253..40a1ee31d 100644 --- a/templates/compose/newt-pangolin.yaml +++ b/templates/compose/newt-pangolin.yaml @@ -1,5 +1,6 @@ # documentation: https://docs.digpangolin.com/manage/sites/install-site # slogan: Pangolin tunnels your services to the internet so you can access anything from anywhere. +# category: proxy # tags: wireguard, reverse-proxy, zero-trust-network-access, open source # logo: svgs/pangolin-logo.png diff --git a/templates/compose/nextcloud-with-mariadb.yaml b/templates/compose/nextcloud-with-mariadb.yaml index 42ee52274..033423caf 100644 --- a/templates/compose/nextcloud-with-mariadb.yaml +++ b/templates/compose/nextcloud-with-mariadb.yaml @@ -28,8 +28,8 @@ services: redis: condition: service_healthy healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] - interval: 2s + test: ["CMD", "curl", "-f", "http://127.0.0.1:80/status.php"] + interval: 30s timeout: 10s retries: 15 diff --git a/templates/compose/nextcloud-with-mysql.yaml b/templates/compose/nextcloud-with-mysql.yaml index e6512deed..17d803c5d 100644 --- a/templates/compose/nextcloud-with-mysql.yaml +++ b/templates/compose/nextcloud-with-mysql.yaml @@ -28,8 +28,8 @@ services: redis: condition: service_healthy healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] - interval: 2s + test: ["CMD", "curl", "-f", "http://127.0.0.1:80/status.php"] + interval: 30s timeout: 10s retries: 15 diff --git a/templates/compose/nextcloud-with-postgres.yaml b/templates/compose/nextcloud-with-postgres.yaml index b3eaaa853..0f717cd85 100644 --- a/templates/compose/nextcloud-with-postgres.yaml +++ b/templates/compose/nextcloud-with-postgres.yaml @@ -28,8 +28,8 @@ services: redis: condition: service_healthy healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] - interval: 2s + test: ["CMD", "curl", "-f", "http://127.0.0.1:80/status.php"] + interval: 30s timeout: 10s retries: 15 diff --git a/templates/compose/nextcloud.yaml b/templates/compose/nextcloud.yaml index dfdf5dba3..a5b783641 100644 --- a/templates/compose/nextcloud.yaml +++ b/templates/compose/nextcloud.yaml @@ -17,7 +17,7 @@ services: - nextcloud-config:/config - nextcloud-data:/data healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1:80"] - interval: 2s + test: ["CMD", "curl", "-f", "http://127.0.0.1:80/status.php"] + interval: 30s timeout: 10s retries: 15 diff --git a/templates/compose/nocodb.yaml b/templates/compose/nocodb.yaml index ab68cddb4..902a201a9 100644 --- a/templates/compose/nocodb.yaml +++ b/templates/compose/nocodb.yaml @@ -1,6 +1,6 @@ # documentation: https://nocodb.com/ # slogan: NocoDB is an open source Airtable alternative. Turns any MySQL, PostgreSQL, SQL Server, SQLite & MariaDB into a smart-spreadsheet. -# category: automation +# category: productivity # tags: nocodb,airtable,mysql,postgresql,sqlserver,sqlite,mariadb # logo: svgs/nocodb.svg # port: 8080 diff --git a/templates/compose/odoo.yaml b/templates/compose/odoo.yaml index e71b415c5..ce5dd50c7 100644 --- a/templates/compose/odoo.yaml +++ b/templates/compose/odoo.yaml @@ -1,6 +1,6 @@ # documentation: https://www.odoo.com/ # slogan: Odoo is a suite of open-source business apps that cover all your company needs. -# category: cms +# category: productivity # tags: business, apps, CRM, eCommerce, accounting, inventory, point of sale, project management, open-source # logo: svgs/odoo.svg # port: 8069 diff --git a/templates/compose/open-archiver.yaml b/templates/compose/open-archiver.yaml index e491eaac1..f6a7ba9b0 100644 --- a/templates/compose/open-archiver.yaml +++ b/templates/compose/open-archiver.yaml @@ -1,5 +1,6 @@ # documentation: https://docs.openarchiver.com/ # slogan: A self-hosted, open-source email archiving solution with full-text search capability. +# category: email # tags: email archiving,email,compliance,search # logo: svgs/openarchiver.svg # port: 3000 diff --git a/templates/compose/openpanel.yaml b/templates/compose/openpanel.yaml index 0d37886a8..6dd2382e3 100644 --- a/templates/compose/openpanel.yaml +++ b/templates/compose/openpanel.yaml @@ -1,6 +1,6 @@ # documentation: https://openpanel.dev/docs # slogan: Open source alternative to Mixpanel and Plausible for product analytics -# category: devtools +# category: analytics # tags: analytics, insights, privacy, mixpanel, plausible, google, alternative # logo: svgs/openpanel.svg # port: 3000 diff --git a/templates/compose/opnform.yaml b/templates/compose/opnform.yaml index 8b4bbe3f5..86502b800 100644 --- a/templates/compose/opnform.yaml +++ b/templates/compose/opnform.yaml @@ -1,5 +1,6 @@ # documentation: https://docs.opnform.com/introduction # slogan: OpnForm is an open-source form builder that lets you create beautiful forms and share them anywhere. It's super fast, you don't need to know how to code +# category: productivity # tags: opnform, form, survey, cloud, open-source, self-hosted, docker, no-code, embeddable # logo: svg/opnform.svg # port: 80 diff --git a/templates/compose/orangehrm.yaml b/templates/compose/orangehrm.yaml index e34c6709c..c93495a1f 100644 --- a/templates/compose/orangehrm.yaml +++ b/templates/compose/orangehrm.yaml @@ -1,6 +1,6 @@ # documentation: https://starterhelp.orangehrm.com/hc/en-us # slogan: OrangeHRM open source HR management software. -# category: cms +# category: productivity # tags: HR, HRIS, HRMS, human resource management, OrangeHRM, HR management # logo: svgs/orangehrm.svg # port: 80 diff --git a/templates/compose/osticket.yaml b/templates/compose/osticket.yaml index 53eec22e2..7d502989a 100644 --- a/templates/compose/osticket.yaml +++ b/templates/compose/osticket.yaml @@ -1,6 +1,6 @@ # documentation: https://docs.osticket.com/en/latest/ # slogan: osTicket is a widely-used open source support ticket system. -# category: cms +# category: helpdesk # tags: helpdesk, ticketing, support, open-source # logo: svgs/osticket.png # port: 80 diff --git a/templates/compose/palworld.yaml b/templates/compose/palworld.yaml index 4875d16f8..28704ccfe 100644 --- a/templates/compose/palworld.yaml +++ b/templates/compose/palworld.yaml @@ -1,3 +1,4 @@ +# category: games services: palworld: image: thijsvanloef/palworld-server-docker:v1.4.6 diff --git a/templates/compose/paymenter.yaml b/templates/compose/paymenter.yaml index 6ce4ae3b9..d86c101a4 100644 --- a/templates/compose/paymenter.yaml +++ b/templates/compose/paymenter.yaml @@ -1,6 +1,6 @@ # documentation: https://paymenter.org/docs/guides/docker # slogan: Open-Source Billing, Built for Hosting -# category: cms +# category: finance # tags: automation, billing, open source # logo: svgs/paymenter.svg # port: 80 diff --git a/templates/compose/plunk.yaml b/templates/compose/plunk.yaml index 6858f2967..11c72bf39 100644 --- a/templates/compose/plunk.yaml +++ b/templates/compose/plunk.yaml @@ -1,6 +1,6 @@ # documentation: https://docs.useplunk.com/getting-started/introduction # slogan: Plunk, The Open-Source Email Platform for AWS -# category: automation +# category: email # tags: plunk,email,automation,aws # logo: svgs/plunk.svg # port: 3000 diff --git a/templates/compose/proxyscotch.yaml b/templates/compose/proxyscotch.yaml index 70342135c..d03268348 100644 --- a/templates/compose/proxyscotch.yaml +++ b/templates/compose/proxyscotch.yaml @@ -1,5 +1,6 @@ # documentation: https://github.com/hoppscotch/proxyscotch # slogan: A simple proxy server created for https://hoppscotch.io - CORS proxy +# category: proxy # tags: proxy,hoppscotch,cors # logo: svgs/hoppscotch.png # port: 9159 diff --git a/templates/compose/pydio-cells.yml b/templates/compose/pydio-cells.yml index 77a24a533..622ffeeab 100644 --- a/templates/compose/pydio-cells.yml +++ b/templates/compose/pydio-cells.yml @@ -1,5 +1,6 @@ # documentation: https://docs.pydio.com/ # slogan: High-performance large file sharing, native no-code automation, and a collaboration-centric architecture that simplifies access control without compromising security or compliance. +# category: storage # tags: storage # logo: svgs/cells.svg # port: 8080 diff --git a/templates/compose/redmine.yaml b/templates/compose/redmine.yaml index cdbf1f8ae..ca97a52a2 100644 --- a/templates/compose/redmine.yaml +++ b/templates/compose/redmine.yaml @@ -1,5 +1,6 @@ # documentation: https://www.redmine.org/ # slogan: Redmine is a flexible project management web application. +# category: productivity # tags: redmine,project management # logo: svgs/redmine.svg # port: 3000 diff --git a/templates/compose/rivet-engine.yaml b/templates/compose/rivet-engine.yaml index 608cdaac3..e77561cca 100644 --- a/templates/compose/rivet-engine.yaml +++ b/templates/compose/rivet-engine.yaml @@ -7,14 +7,13 @@ services: rivet-engine: - image: rivetkit/engine:25.8.0 + image: rivetdev/engine:2.2.0 environment: - SERVICE_URL_RIVET_6420 - - 'RIVET__AUTH__ADMIN_TOKEN=${SERVICE_PASSWORD_RIVET}' - - RIVET__POSTGRES__URL=postgresql://$SERVICE_USER_POSTGRESQL:$SERVICE_PASSWORD_POSTGRESQL@postgresql:5432/${POSTGRESQL_DATABASE-rivet} - depends_on: - postgresql: - condition: service_healthy + - RIVET__FILE_SYSTEM__PATH=/data + - 'RIVET__AUTH__ADMIN_TOKEN=${SERVICE_BASE64_TOKEN}' + volumes: + - 'rivet-data:/data' healthcheck: test: - CMD @@ -24,19 +23,4 @@ services: interval: 2s timeout: 10s retries: 10 - start_period: 30s - - postgresql: - image: postgres:17-alpine - volumes: - - rivet-postgresql-data:/var/lib/postgresql/data - environment: - - POSTGRES_USER=${SERVICE_USER_POSTGRESQL} - - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRESQL} - - POSTGRES_DB=${POSTGRESQL_DATABASE-rivet} - healthcheck: - test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] - interval: 5s - timeout: 20s - retries: 10 - + start_period: 30s \ No newline at end of file diff --git a/templates/compose/sftpgo.yaml b/templates/compose/sftpgo.yaml index a80b56e80..c95245adb 100644 --- a/templates/compose/sftpgo.yaml +++ b/templates/compose/sftpgo.yaml @@ -1,5 +1,6 @@ # documentation: https://docs.sftpgo.com/2.7/ # slogan: SFTPGo is an event-driven SFTP, FTP/S, HTTP/S and WebDAV server. +# category: storage # tags: sftpgo,sftp,ftp,file,webdav # logo: svgs/sftpgo.png # port: 8080 diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index c7e044947..45380e88a 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -1,5 +1,6 @@ # documentation: https://signoz.io/docs/introduction/ # slogan: An observability platform native to OpenTelemetry with logs, traces and metrics. +# category: monitoring # tags: telemetry, server, applications, interface, logs, monitoring, traces, metrics # logo: svgs/signoz.svg # port: 8080 diff --git a/templates/compose/silverbullet.yaml b/templates/compose/silverbullet.yaml index 3cab77f96..0fd4a022b 100644 --- a/templates/compose/silverbullet.yaml +++ b/templates/compose/silverbullet.yaml @@ -1,5 +1,6 @@ # documentation: https://v2.silverbullet.md/Install/Configuration # slogan: SilverBullet is a tool to develop, organize, and structure your personal knowledge and to make it universally accessible across all your devices. +# category: productivity # tags: note-taking,markdown,pkm # logo: svgs/silverbullet.png # port: 3000 diff --git a/templates/compose/soketi-app-manager.yaml b/templates/compose/soketi-app-manager.yaml index 730bce6c6..b43181758 100644 --- a/templates/compose/soketi-app-manager.yaml +++ b/templates/compose/soketi-app-manager.yaml @@ -1,5 +1,6 @@ # documentation: https://github.com/rahulhaque/soketi-app-manager-filament # slogan: Manage soketi websocket server and apps with ease. +# category: devtools # tags: soketi,websockets,app-manager,dashboard # logo: svgs/soketi-app-manager.svg # port: 8080 @@ -29,4 +30,4 @@ services: - METRICS_HOST=$METRICS_HOST healthcheck: test: ["CMD", "php-fpm-healthcheck"] - start_period: 10s \ No newline at end of file + start_period: 10s diff --git a/templates/compose/supabase.yaml b/templates/compose/supabase.yaml index fad059a08..b79eec604 100644 --- a/templates/compose/supabase.yaml +++ b/templates/compose/supabase.yaml @@ -8,33 +8,77 @@ services: supabase-kong: - image: kong:2.8.1 - # https://unix.stackexchange.com/a/294837 - entrypoint: bash -c 'eval "echo \"$$(cat ~/temp.yml)\"" > ~/kong.yml && /docker-entrypoint.sh kong docker-start' + image: kong/kong:3.9.1 + entrypoint: /home/kong/kong-entrypoint.sh depends_on: supabase-analytics: condition: service_healthy + healthcheck: + test: ["CMD", "kong", "health"] + interval: 5s + timeout: 5s + retries: 5 environment: - SERVICE_URL_SUPABASEKONG_8000 - KONG_PORT_MAPS=443:8000 - JWT_SECRET=${SERVICE_PASSWORD_JWT} - KONG_DATABASE=off - - KONG_DECLARATIVE_CONFIG=/home/kong/kong.yml + - KONG_DECLARATIVE_CONFIG=/usr/local/kong/kong.yml # https://github.com/supabase/cli/issues/14 - KONG_DNS_ORDER=LAST,A,CNAME - - KONG_PLUGINS=request-transformer,cors,key-auth,acl,basic-auth + - KONG_DNS_NOT_FOUND_TTL=1 + - KONG_PLUGINS=request-transformer,cors,key-auth,acl,basic-auth,request-termination,ip-restriction,post-function - KONG_NGINX_PROXY_PROXY_BUFFER_SIZE=160k - KONG_NGINX_PROXY_PROXY_BUFFERS=64 160k + - 'KONG_PROXY_ACCESS_LOG=/dev/stdout combined' - SUPABASE_ANON_KEY=${SERVICE_SUPABASEANON_KEY} - SUPABASE_SERVICE_KEY=${SERVICE_SUPABASESERVICE_KEY} + - SUPABASE_PUBLISHABLE_KEY=${SUPABASE_PUBLISHABLE_KEY:-} + - SUPABASE_SECRET_KEY=${SUPABASE_SECRET_KEY:-} + - ANON_KEY_ASYMMETRIC=${ANON_KEY_ASYMMETRIC:-} + - SERVICE_ROLE_KEY_ASYMMETRIC=${SERVICE_ROLE_KEY_ASYMMETRIC:-} - DASHBOARD_USERNAME=${SERVICE_USER_ADMIN} - DASHBOARD_PASSWORD=${SERVICE_PASSWORD_ADMIN} - 'KONG_STORAGE_CONNECT_TIMEOUT=${KONG_STORAGE_CONNECT_TIMEOUT:-60}' - 'KONG_STORAGE_WRITE_TIMEOUT=${KONG_STORAGE_WRITE_TIMEOUT:-3600}' - 'KONG_STORAGE_READ_TIMEOUT=${KONG_STORAGE_READ_TIMEOUT:-3600}' - 'KONG_STORAGE_REQUEST_BUFFERING=${KONG_STORAGE_REQUEST_BUFFERING:-false}' - - 'KONG_STORAGE_RESPONSE_BUFFERING=${KONG_STORAGE_RESPONSE_BUFFERING:-false}' + - 'KONG_STORAGE_RESPONSE_BUFFERING=${KONG_STORAGE_RESPONSE_BUFFERING:-false}' volumes: + - type: bind + source: ./volumes/api/kong-entrypoint.sh + target: /home/kong/kong-entrypoint.sh + content: | + #!/bin/bash + # Custom entrypoint for Kong that builds Lua expressions for request-transformer + # and performs environment variable substitution in the declarative config. + + if [ -n "$SUPABASE_SECRET_KEY" ] && [ -n "$SUPABASE_PUBLISHABLE_KEY" ]; then + export LUA_AUTH_EXPR="\$((headers.authorization ~= nil and headers.authorization:sub(1, 10) ~= 'Bearer sb_' and headers.authorization) or (headers.apikey == '$SUPABASE_SECRET_KEY' and 'Bearer $SERVICE_ROLE_KEY_ASYMMETRIC') or (headers.apikey == '$SUPABASE_PUBLISHABLE_KEY' and 'Bearer $ANON_KEY_ASYMMETRIC') or headers.apikey)" + export LUA_RT_WS_EXPR="\$((query_params.apikey == '$SUPABASE_SECRET_KEY' and '$SERVICE_ROLE_KEY_ASYMMETRIC') or (query_params.apikey == '$SUPABASE_PUBLISHABLE_KEY' and '$ANON_KEY_ASYMMETRIC') or query_params.apikey)" + else + export LUA_AUTH_EXPR="\$((headers.authorization ~= nil and headers.authorization:sub(1, 10) ~= 'Bearer sb_' and headers.authorization) or headers.apikey)" + export LUA_RT_WS_EXPR="\$(query_params.apikey)" + fi + + awk '{ + result = "" + rest = $0 + while (match(rest, /\$[A-Za-z_][A-Za-z_0-9]*/)) { + varname = substr(rest, RSTART + 1, RLENGTH - 1) + if (varname in ENVIRON) { + result = result substr(rest, 1, RSTART - 1) ENVIRON[varname] + } else { + result = result substr(rest, 1, RSTART + RLENGTH - 1) + } + rest = substr(rest, RSTART + RLENGTH) + } + print result rest + }' /home/kong/temp.yml > "$KONG_DECLARATIVE_CONFIG" + + sed -i '/^[[:space:]]*- key:[[:space:]]*$/d' "$KONG_DECLARATIVE_CONFIG" + + exec /entrypoint.sh kong docker-start # https://github.com/supabase/supabase/issues/12661 - type: bind source: ./volumes/api/kong.yml @@ -51,9 +95,11 @@ services: - username: anon keyauth_credentials: - key: $SUPABASE_ANON_KEY + - key: $SUPABASE_PUBLISHABLE_KEY - username: service_role keyauth_credentials: - key: $SUPABASE_SERVICE_KEY + - key: $SUPABASE_SECRET_KEY ### ### Access Control List @@ -69,8 +115,8 @@ services: ### basicauth_credentials: - consumer: DASHBOARD - username: $DASHBOARD_USERNAME - password: $DASHBOARD_PASSWORD + username: '$DASHBOARD_USERNAME' + password: '$DASHBOARD_PASSWORD' ### @@ -106,6 +152,36 @@ services: - /auth/v1/authorize plugins: - name: cors + - name: auth-v1-open-jwks + _comment: 'Auth: /auth/v1/.well-known/jwks.json -> http://supabase-auth:9999/.well-known/jwks.json' + url: http://supabase-auth:9999/.well-known/jwks.json + routes: + - name: auth-v1-open-jwks + strip_path: true + paths: + - /auth/v1/.well-known/jwks.json + plugins: + - name: cors + + - name: auth-v1-open-sso-acs + url: "http://supabase-auth:9999/sso/saml/acs" + routes: + - name: auth-v1-open-sso-acs + strip_path: true + paths: + - /sso/saml/acs + plugins: + - name: cors + + - name: auth-v1-open-sso-metadata + url: "http://supabase-auth:9999/sso/saml/metadata" + routes: + - name: auth-v1-open-sso-metadata + strip_path: true + paths: + - /sso/saml/metadata + plugins: + - name: cors ## Secure Auth routes - name: auth-v1 @@ -121,6 +197,14 @@ services: - name: key-auth config: hide_credentials: false + - name: request-transformer + config: + add: + headers: + - "Authorization: $LUA_AUTH_EXPR" + replace: + headers: + - "Authorization: $LUA_AUTH_EXPR" - name: acl config: hide_groups_header: true @@ -141,7 +225,15 @@ services: - name: cors - name: key-auth config: - hide_credentials: true + hide_credentials: false + - name: request-transformer + config: + add: + headers: + - "Authorization: $LUA_AUTH_EXPR" + replace: + headers: + - "Authorization: $LUA_AUTH_EXPR" - name: acl config: hide_groups_header: true @@ -162,12 +254,17 @@ services: - name: cors - name: key-auth config: - hide_credentials: true + hide_credentials: false - name: request-transformer config: add: headers: - - Content-Profile:graphql_public + - "Content-Profile: graphql_public" + - "Authorization: $LUA_AUTH_EXPR" + replace: + headers: + - "Content-Profile: graphql_public" + - "Authorization: $LUA_AUTH_EXPR" - name: acl config: hide_groups_header: true @@ -190,6 +287,14 @@ services: - name: key-auth config: hide_credentials: false + - name: request-transformer + config: + add: + querystring: + - "apikey: $LUA_RT_WS_EXPR" + replace: + querystring: + - "apikey: $LUA_RT_WS_EXPR" - name: acl config: hide_groups_header: true @@ -197,7 +302,7 @@ services: - admin - anon - name: realtime-v1-rest - _comment: 'Realtime: /realtime/v1/* -> ws://realtime:4000/socket/*' + _comment: 'Realtime: /realtime/v1/api/* -> http://realtime:4000/api/*' url: http://realtime-dev:4000/api protocol: http routes: @@ -210,6 +315,14 @@ services: - name: key-auth config: hide_credentials: false + - name: request-transformer + config: + add: + headers: + - "Authorization: $LUA_AUTH_EXPR" + replace: + headers: + - "Authorization: $LUA_AUTH_EXPR" - name: acl config: hide_groups_header: true @@ -217,7 +330,8 @@ services: - admin - anon - ## Storage routes: the storage server manages its own auth + ## Storage API endpoint + ## No key-auth - S3 protocol requests don't carry an apikey header. - name: storage-v1 _comment: 'Storage: /storage/v1/* -> http://supabase-storage:5000/*' connect_timeout: $KONG_STORAGE_CONNECT_TIMEOUT @@ -233,11 +347,20 @@ services: response_buffering: $KONG_STORAGE_RESPONSE_BUFFERING plugins: - name: cors + - name: post-function + config: + access: + - | + local auth = kong.request.get_header("authorization") + if auth == nil or auth == "" or auth:find("^%s*$") then + kong.service.request.clear_header("authorization") + end ## Edge Functions routes - name: functions-v1 _comment: 'Edge Functions: /functions/v1/* -> http://supabase-edge-functions:9000/*' url: http://supabase-edge-functions:9000/ + read_timeout: 150000 routes: - name: functions-v1-all strip_path: true @@ -246,15 +369,28 @@ services: plugins: - name: cors - ## Analytics routes - - name: analytics-v1 - _comment: 'Analytics: /analytics/v1/* -> http://logflare:4000/*' - url: http://supabase-analytics:4000/ + ## OAuth 2.0 Authorization Server Metadata (RFC 8414) + - name: well-known-oauth + _comment: 'Auth: /.well-known/oauth-authorization-server -> http://supabase-auth:9999/.well-known/oauth-authorization-server' + url: http://supabase-auth:9999/.well-known/oauth-authorization-server routes: - - name: analytics-v1-all + - name: well-known-oauth strip_path: true paths: - - /analytics/v1/ + - /.well-known/oauth-authorization-server + plugins: + - name: cors + + ## Analytics routes + ## Not used - Studio and Vector talk directly to analytics via Docker networking. + # - name: analytics-v1 + # _comment: 'Analytics: /analytics/v1/* -> http://logflare:4000/*' + # url: http://supabase-analytics:4000/ + # routes: + # - name: analytics-v1-all + # strip_path: true + # paths: + # - /analytics/v1/ ## Secure Database routes - name: meta @@ -275,6 +411,48 @@ services: allow: - admin + ## Block access to /api/mcp + - name: mcp-blocker + _comment: 'Block direct access to /api/mcp' + url: http://supabase-studio:3000/api/mcp + routes: + - name: mcp-blocker-route + strip_path: true + paths: + - /api/mcp + plugins: + - name: request-termination + config: + status_code: 403 + message: "Access is forbidden." + + ## MCP endpoint - local access + - name: mcp + _comment: 'MCP: /mcp -> http://supabase-studio:3000/api/mcp (local access)' + url: http://supabase-studio:3000/api/mcp + routes: + - name: mcp + strip_path: true + paths: + - /mcp + plugins: + # Block access to /mcp by default + - name: request-termination + config: + status_code: 403 + message: "Access is forbidden." + # Enable local access (danger zone!) + # 1. Comment out the 'request-termination' section above + # 2. Uncomment the entire section below, including 'deny' + # 3. Add your local IPs to the 'allow' list + #- name: cors + #- name: ip-restriction + # config: + # allow: + # - 127.0.0.1 + # - ::1 + # deny: [] + ## Protected Dashboard - catch all remaining routes - name: dashboard _comment: 'Studio: /* -> http://studio:3000/*' @@ -290,7 +468,7 @@ services: config: hide_credentials: true supabase-studio: - image: supabase/studio:2026.01.07-sha-037e5f9 + image: supabase/studio:2026.03.16-sha-5528817 healthcheck: test: [ @@ -310,7 +488,11 @@ services: - STUDIO_PG_META_URL=http://supabase-meta:8080 - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES} - POSTGRES_HOST=${POSTGRES_HOST:-supabase-db} - - CURRENT_CLI_VERSION=2.67.1 + - POSTGRES_PORT=${POSTGRES_PORT:-5432} + - POSTGRES_DB=${POSTGRES_DB:-postgres} + - 'PGRST_DB_SCHEMAS=${PGRST_DB_SCHEMAS:-public,storage,graphql_public}' + - PGRST_DB_MAX_ROWS=${PGRST_DB_MAX_ROWS:-1000} + - PGRST_DB_EXTRA_SEARCH_PATH=${PGRST_DB_EXTRA_SEARCH_PATH:-public} - DEFAULT_ORGANIZATION_NAME=${STUDIO_DEFAULT_ORGANIZATION:-Default Organization} - DEFAULT_PROJECT_NAME=${STUDIO_DEFAULT_PROJECT:-Default Project} @@ -320,10 +502,12 @@ services: - SUPABASE_ANON_KEY=${SERVICE_SUPABASEANON_KEY} - SUPABASE_SERVICE_KEY=${SERVICE_SUPABASESERVICE_KEY} - AUTH_JWT_SECRET=${SERVICE_PASSWORD_JWT} + - PG_META_CRYPTO_KEY=${SERVICE_PASSWORD_PGMETACRYPTO} - LOGFLARE_API_KEY=${SERVICE_PASSWORD_LOGFLARE} + - LOGFLARE_PUBLIC_ACCESS_TOKEN=${SERVICE_PASSWORD_LOGFLARE} + - LOGFLARE_PRIVATE_ACCESS_TOKEN=${SERVICE_PASSWORD_LOGFLAREPRIVATE} - LOGFLARE_URL=http://supabase-analytics:4000 - - 'SUPABASE_PUBLIC_API=${SERVICE_URL_SUPABASEKONG}' # Next.js client-side environment variables (required for browser access) - 'NEXT_PUBLIC_SUPABASE_URL=${SERVICE_URL_SUPABASEKONG}' - NEXT_PUBLIC_SUPABASE_ANON_KEY=${SERVICE_SUPABASEANON_KEY} @@ -333,8 +517,13 @@ services: # Uncomment to use Big Query backend for analytics # NEXT_ANALYTICS_BACKEND_PROVIDER=bigquery - 'OPENAI_API_KEY=${OPENAI_API_KEY}' + - SNIPPETS_MANAGEMENT_FOLDER=/app/snippets + - EDGE_FUNCTIONS_MANAGEMENT_FOLDER=/app/edge-functions + volumes: + - ./volumes/snippets:/app/snippets + - ./volumes/functions:/app/edge-functions supabase-db: - image: supabase/postgres:15.8.1.048 + image: supabase/postgres:15.8.1.085 healthcheck: test: pg_isready -U postgres -h 127.0.0.1 interval: 5s @@ -365,7 +554,7 @@ services: source: ./volumes/db/realtime.sql target: /docker-entrypoint-initdb.d/migrations/99-realtime.sql content: | - \set pguser `echo "supabase_admin"` + \set pguser `echo "$POSTGRES_USER"` create schema if not exists _realtime; alter schema _realtime owner to :pguser; @@ -380,7 +569,7 @@ services: source: ./volumes/db/pooler.sql target: /docker-entrypoint-initdb.d/migrations/99-pooler.sql content: | - \set pguser `echo "supabase_admin"` + \set pguser `echo "$POSTGRES_USER"` \c _supabase create schema if not exists _supavisor; alter schema _supavisor owner to :pguser; @@ -624,7 +813,7 @@ services: source: ./volumes/db/logs.sql target: /docker-entrypoint-initdb.d/migrations/99-logs.sql content: | - \set pguser `echo "supabase_admin"` + \set pguser `echo "$POSTGRES_USER"` \c _supabase create schema if not exists _analytics; alter schema _analytics owner to :pguser; @@ -633,7 +822,7 @@ services: - supabase-db-config:/etc/postgresql-custom supabase-analytics: - image: supabase/logflare:1.4.0 + image: supabase/logflare:1.31.2 healthcheck: test: ["CMD", "curl", "http://127.0.0.1:4000/health"] timeout: 5s @@ -655,11 +844,10 @@ services: - DB_PORT=${POSTGRES_PORT:-5432} - DB_PASSWORD=${SERVICE_PASSWORD_POSTGRES} - DB_SCHEMA=_analytics - - LOGFLARE_API_KEY=${SERVICE_PASSWORD_LOGFLARE} + - LOGFLARE_PUBLIC_ACCESS_TOKEN=${SERVICE_PASSWORD_LOGFLARE} + - LOGFLARE_PRIVATE_ACCESS_TOKEN=${SERVICE_PASSWORD_LOGFLAREPRIVATE} - LOGFLARE_SINGLE_TENANT=true - - LOGFLARE_SINGLE_TENANT_MODE=true - LOGFLARE_SUPABASE_MODE=true - - LOGFLARE_MIN_CLUSTER_SIZE=1 # Comment variables to use Big Query backend for analytics - POSTGRES_BACKEND_URL=postgresql://supabase_admin:${SERVICE_PASSWORD_POSTGRES}@${POSTGRES_HOSTNAME:-supabase-db}:${POSTGRES_PORT:-5432}/_supabase @@ -670,7 +858,7 @@ services: # GOOGLE_PROJECT_ID=${GOOGLE_PROJECT_ID} # GOOGLE_PROJECT_NUMBER=${GOOGLE_PROJECT_NUMBER} supabase-vector: - image: timberio/vector:0.28.1-alpine + image: timberio/vector:0.53.0-alpine healthcheck: test: [ @@ -722,13 +910,13 @@ services: inputs: - project_logs route: - kong: 'starts_with(string!(.appname), "supabase-kong")' - auth: 'starts_with(string!(.appname), "supabase-auth")' - rest: 'starts_with(string!(.appname), "supabase-rest")' - realtime: 'starts_with(string!(.appname), "realtime-dev")' - storage: 'starts_with(string!(.appname), "supabase-storage")' - functions: 'starts_with(string!(.appname), "supabase-functions")' - db: 'starts_with(string!(.appname), "supabase-db")' + kong: 'contains(string!(.appname), "supabase-kong")' + auth: 'contains(string!(.appname), "supabase-auth")' + rest: 'contains(string!(.appname), "supabase-rest")' + realtime: 'contains(string!(.appname), "supabase-realtime")' + storage: 'contains(string!(.appname), "supabase-storage")' + functions: 'contains(string!(.appname), "supabase-edge-functions")' + db: 'contains(string!(.appname), "supabase-db")' # Ignores non nginx errors since they are related with kong booting up kong_logs: type: remap @@ -741,10 +929,13 @@ services: .metadata.request.headers.referer = req.referer .metadata.request.headers.user_agent = req.agent .metadata.request.headers.cf_connecting_ip = req.client - .metadata.request.method = req.method - .metadata.request.path = req.path - .metadata.request.protocol = req.protocol .metadata.response.status_code = req.status + url, split_err = split(req.request, " ") + if split_err == null { + .metadata.request.method = url[0] + .metadata.request.path = url[1] + .metadata.request.protocol = url[2] + } } if err != null { abort @@ -793,14 +984,20 @@ services: parsed, err = parse_regex(.event_message, r'^(?P