Compare commits

..
Author SHA1 Message Date
Mauricio SiuandGitHub 9de737b21b Update docker-compose.yml 2025-12-20 00:15:30 -06:00
copilot-swe-agent[bot]andSiumauricio 85b07df702 Remove package-lock.json (project uses pnpm)
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-20 04:59:03 +00:00
copilot-swe-agent[bot]andSiumauricio 77779f87a3 Add ONEUPTIME_SECRET environment variable to all services
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-20 04:58:47 +00:00
Mauricio SiuandGitHub cc1a169fdd Update docker-compose.yml 2025-12-19 22:46:57 -06:00
Mauricio SiuandGitHub 4f1ae3752e Update docker-compose.yml 2025-12-19 22:43:31 -06:00
copilot-swe-agent[bot]andSiumauricio f96da34bf5 Remove package-lock.json (project uses pnpm)
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-20 04:42:46 +00:00
copilot-swe-agent[bot]andSiumauricio 1e1cbf30d1 Add PROBE_KEY and PROBE_NAME environment variables to probe service
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-20 04:42:21 +00:00
Mauricio SiuandGitHub ab3c139ee7 Update blueprints/oneuptime/docker-compose.yml 2025-12-19 22:35:01 -06:00
Mauricio SiuandGitHub 3fd61bd12c Update blueprints/oneuptime/docker-compose.yml 2025-12-19 22:34:54 -06:00
Mauricio SiuandGitHub 05ce6581f5 Update blueprints/oneuptime/docker-compose.yml 2025-12-19 22:34:45 -06:00
Mauricio SiuandGitHub 50997d94d1 Update blueprints/oneuptime/docker-compose.yml 2025-12-19 22:34:39 -06:00
Mauricio SiuandGitHub 6de2978e97 Update blueprints/oneuptime/docker-compose.yml 2025-12-19 22:34:31 -06:00
Mauricio SiuandGitHub adbdbcdd4f Update blueprints/oneuptime/docker-compose.yml 2025-12-19 22:34:13 -06:00
Mauricio SiuandGitHub ff481a7f0d Update docker-compose.yml 2025-12-19 22:32:42 -06:00
copilot-swe-agent[bot]andSiumauricio 20576fc810 Add OneUptime observability platform template
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-20 04:29:07 +00:00
copilot-swe-agent[bot]andSiumauricio fb86d2c496 Add ONEUPTIME_URL env var to probe service
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-20 04:27:21 +00:00
Mauricio SiuandGitHub e273dcad95 Update template.toml 2025-12-19 18:31:35 -06:00
copilot-swe-agent[bot]andSiumauricio ab902e17b9 Fix OneUptime: use microservices architecture, fix health checks, remove version field
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-20 00:21:32 +00:00
Mauricio SiuandGitHub 3d995322db Update docker-compose.yml 2025-12-19 18:00:49 -06:00
copilot-swe-agent[bot]andSiumauricio f088a3214b Improve security: use environment variables for health check authentication
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-19 22:17:20 +00:00
copilot-swe-agent[bot]andSiumauricio 79042376f1 Fix ClickHouse health check authentication and remove package-lock.json
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-19 22:16:20 +00:00
copilot-swe-agent[bot]andSiumauricio a63d67bcae Fix Redis health check to authenticate with password
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-19 22:15:09 +00:00
copilot-swe-agent[bot]andSiumauricio a43cf890f3 Verify OneUptime template passes all validations
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-19 22:13:39 +00:00
copilot-swe-agent[bot]andSiumauricio dc59349116 Add OneUptime monitoring template
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-19 22:11:26 +00:00
copilot-swe-agent[bot] 2b62d182a8 Initial plan 2025-12-19 22:07:25 +00:00
CopilotGitHubcopilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>SiumauricioCopilot
be3c7f2d1d [WIP] Fix mounted prometheus.yml file not working (#605)
* Initial plan

* Fix Prometheus mounted prometheus.yml file by adding volume mount

Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>

* Update blueprints/prometheus/template.toml

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-19 16:06:36 -06:00
CopilotGitHubcopilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>Siumauricio
f5552b557c Add Reactive Resume template (#603)
* Initial plan

* Add Reactive Resume template with docker-compose, template.toml, and meta.json entry

Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>

* Fix MinIO storage path alignment between template.toml and docker-compose.yml

Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>

* Update docker-compose.yml

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Siumauricio <47042324+Siumauricio@users.noreply.github.com>
2025-12-19 16:03:32 -06:00
Huy PhamandGitHub e4ffe271e0 fix: update zitadel default instance features (#544) 2025-12-19 15:57:48 -06:00
Mauricio Siu dd8ef5b3c8 refactor: enhance Docker Compose validation workflow
Updated the GitHub Actions workflow for validating Docker Compose files by streamlining the detection of changed blueprints and improving the validation process. Removed redundant steps and consolidated the validation of docker-compose.yml and template.toml files into a more efficient structure. Added clearer output messages for validation results and ensured that best practices are checked for each blueprint. This refactor aims to improve maintainability and clarity in the CI/CD process.
2025-12-19 15:54:36 -06:00
Mauricio Siu 4757c59da3 docs: update copilot instructions to emphasize version pinning in docker-compose.yml
Clarified the importance of pinning image versions in docker-compose.yml and explicitly stated to avoid using the `latest` tag to prevent potential issues with template functionality when upstream images change.
2025-12-19 15:45:08 -06:00
Khiet Tam NguyenandGitHub 0438165d43 feat(blueprint): mage ai template (#601)
* feat(blueprint): template for mage-ai

* fix: add healthcheck for mage-ai
2025-12-18 22:39:16 -06:00
JemgandGitHub 7528f73265 refactor: update docker-compose.yml to include version and restart policy (#599) 2025-12-17 23:45:28 -06:00
Carl-Gerhard LindesvärdandGitHub 37dc848e71 fix: openpanel and migrate to v2 (#594) 2025-12-16 21:14:42 -06:00
76049e3628 Add trailbase template (#590)
* Add trailbase

* Add comment on mounting local directory

* Update meta.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-16 11:32:11 -06:00
726a8c6bc9 Updating copilot instructions.md and AGENTS.md (#452)
* docs: add copilot instructions for project development

Added comprehensive documentation file (.github/copilot-instructions.md) that provides detailed guidance on the Dokploy Open Source Templates project structure, development workflow, and conventions. The document covers the project overview, key files and directories, development workflow for adding/updating templates, local development setup, CI/CD processes, and established conventions and patterns. This documentation will help onboard new contributors and ensure consistent development practices across the project.

* docs(copilot-instructions): enhance project overview and development guide

Updated copilot instructions to reflect expanded app capabilities (200+ apps, TypeScript integration, Fuse.js search) and detailed processes for templates, local dev, and CI/CD for improved clarity and accuracy.

* refactor: remove frontend development instructions from AGENTS.md and update contributing guidelines

- Removed frontend development commands from AGENTS.md to streamline the document.
- Updated CONTRIBUTING.md by removing the recommendation to set `restart: unless-stopped` for services.

---------

Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
2025-12-15 00:19:57 -06:00
JemgandGitHub 54eccbe32b add: restart policy to MinIO service (#576)
restart: unless-stopped is a Docker restart policy that automatically restarts a container if it stops due to an error or Docker daemon restart
2025-12-14 23:30:03 -06:00
b23e3320f0 fix: update WireGuard Easy template for proper functionality (#573)
* fix: update WireGuard Easy template for proper functionality

- Changed to named volume (etc_wireguard) instead of host path mount
- Added explicit port mappings (51820:51820/udp, 51821:51821/tcp) required for WireGuard
- Updated environment variables to use correct WG_HOST and PASSWORD format
- Added all required WireGuard environment variables:
  - WG_PORT, PORT, WG_MTU, WG_DEFAULT_DNS, WG_ALLOWED_IPS
  - WG_POST_UP/WG_POST_DOWN for iptables rules
- Added NET_RAW capability for proper network operations
- Simplified template.toml to use WIREGUARD_HOST and WIREGUARD_PASSWORD
- Removed explicit networks config to enable Dokploy's isolated deployment
- Template now works with Dokploy's automatic network isolation

This configuration has been tested and confirmed working with isolated deployment enabled.

* Update template.toml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-14 23:28:39 -06:00
be933bdc54 feat: add Mumble voice chat server template (#572)
* feat: add Mumble voice chat server template

- Add Mumble VoIP server blueprint with docker-compose.yml
- Configure environment variables for superuser password, welcome text, and max users
- Add template.toml with auto-generated secure password
- Follow Dokploy best practices (no container_name, proper port format)
- Add Mumble metadata to meta.json with proper tags
- Support for TCP and UDP on port 64738

* Update template.toml

* fix: correct JSON formatting in meta.json for Mumble template entry

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
2025-12-14 23:27:26 -06:00
32da868c01 feat: improve RustDesk template configuration (#571)
* feat: improve RustDesk template configuration

- Add comprehensive environment variables for RustDesk server
- Add RELAY_HOST, API_SERVER, ID_SERVER, and ENCRYPTION_KEY variables
- Follow Dokploy best practices (no container_name, proper port format)
- Use restart: unless-stopped policy
- Add encryption key generation with password helper

* fix: use explicit port mapping for RustDesk services

RustDesk requires explicit port bindings (host:container format) to function properly. The service uses specific ports for:
- 21115-21116 (TCP/UDP): hbbs service for ID and NAT traversal
- 21117-21119 (TCP): hbbr relay service

Without explicit port mapping, RustDesk clients cannot establish connections to the server.

This is an exception to Dokploy's general port guidelines due to RustDesk's specific networking requirements.

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-14 23:23:05 -06:00
efea22e1f0 Add dokploy-prom-monitoring-extension template with comprehensive tests and documentation (#548)
* Add dokploy-prom-monitoring-extension template with comprehensive tests and documentation

* Fix METRICS_CONFIG environment variable: use single-line JSON format

* Fix template.toml: use correct [config.env] syntax for environment variables

* Fix docker-compose.yml: add env_file reference to load environment variables

* Delete blueprints/dokploy-prom-monitoring-extension/README.md

* Delete test-dokploy-prom-monitoring-extension.sh

---------

Co-authored-by: Sanjeevi Subramani <ssanjeevi.ss@gmail.com>
Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-14 23:09:54 -06:00
ScanandGitHub 40aa695a73 feat: add Bluesky PDS template (#542)
* feat: Bluesky PDS template

* chore: add bluesky pds svg

* chore: metadata for bluesky pds

* yaml > yml

* pnpm lock

* fix: correct rotation key config

* fix volumes

* fix: volumes in the pds compose

* define volumes in compose

* fix: 32 bit rotation key

* create pds.env correctly

* some extra fixes

* more extra fixes

* a blank line

* update pnpm lock
2025-12-14 23:08:22 -06:00
Khiet Tam NguyenandGitHub 4367e2a42a feat(blueprint): peerdb template (#579)
* feat(blueprint): initial attempt at peerdb template

* fix: entrypoint and healthcheck

* fix: entrypoint

* fix: temporarily remove network

* fix: temporal port

* chore: remove 36987 for minio

* fix: remove peerdb 9900 port exposure

* fix: port for console

* fix: minio env fix

* fix: expose peerdb and minio to dokploy network

* fix(peerdb): add defaults

* fix: remove extra hosts

* fix: remove network entries

* fix: use consistent environment variables
2025-12-14 22:52:06 -06:00
87ab908a32 feat(blueprint): update trmnl-byos-laravel template (#533)
* feat(blueprint): update trmnl-byos-laravel template

* Update docker-compose.yml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-14 01:18:49 -06:00
a9740da9cb Feat : Add MuleSoft ESB Runtime Template (#498)
* added the mulesoft esb template

* updated the compose and the meta.json

* feat(mulesoft-esb): update image and add dynamic env configuration  - Updated image to hari1367709/mule-esb:latest - Added dynamic HTTP_PORT for runtime port configuration - Added MULE_VERSION environment variable for Mule ESB version selection

* updated the meta.json to use the version as latest

* added a comment line to the template file

* updated the mule runtime image

* fix(mulesoft-esb): update ports configuration to follow guidelines

* updated the port to use the env(HTTP_PORT)

* Update docker-compose.yml

* Update docker-compose.yml

* Update blueprints/mulesoft-esb/docker-compose.yml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-14 01:16:39 -06:00
Mauricio Siu b4efed26a0 chore: add section for screenshots or videos in pull request template
- Introduced a new section in the pull request template to encourage contributors to include screenshots or videos, enhancing the clarity and context of their submissions.
2025-12-14 01:15:46 -06:00
Mauricio Siu 0e84b284d8 fix: update pull request template link for clarity
- Changed the link in the pull request template from 'general suggestions' to 'general requirements' to better reflect the content and ensure users follow the correct guidelines when creating templates.
2025-12-14 01:15:25 -06:00
4c36b7d6ca chore: upgrade Infisical from v0.90.1 to v0.135.0 (#529)
* chore: upgrade Infisical from v0.90.1 to v0.135.0

* Update docker-compose.yml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-14 00:54:16 -06:00
Mauricio Siu 7c540d158a refactor: remove dokploy-network configurations from multiple docker-compose files
- Removed the external dokploy-network configuration from various services' docker-compose.yml files to streamline network management.
- This change simplifies the setup and ensures consistency across blueprints.
2025-12-14 00:52:59 -06:00
a00b179ddf feat: Add anytype template (#527)
* add anytype template

* sort

* Update name field for Anytype in meta.json

* Update meta.json

* Update docker-compose.yml

* Update blueprints/anytype/docker-compose.yml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-14 00:42:48 -06:00
ChrisandGitHub 6e1aece2e7 fix(rustdesk): use explicit ports, use port 21118 on hbbs instead of hbbr (#526)
* fix: use explicit ports, use port 21118 on hbbs instead of hbbr

* fix: whitespace character in rustdesk
2025-12-14 00:40:29 -06:00
eb41d83963 Feat : Add Quant-Ux template -#173 (#525)
* Feat : Add Quant-Ux template -#173

* Remove extra newline in docker-compose.yml

* Update blueprints/quant-ux/docker-compose.yml

* Update blueprints/quant-ux/docker-compose.yml

* Update blueprints/quant-ux/docker-compose.yml

* Update blueprints/quant-ux/docker-compose.yml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-14 00:40:02 -06:00
Harikrishnan DhanasekaranandGitHub 385906aa4c feat: Add MediaCMS template (#524) 2025-12-14 00:37:18 -06:00
640abda5d8 Feat : Add MCSManager template support (#521) (#522)
* feat: Add MCSManager template support (#521)

* Update docker-compose.yml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-14 00:31:12 -06:00
Mauricio SiuandGitHub 9e4da9c806 Update section title from 'Suggestions' to 'Requirements' 2025-12-14 00:21:47 -06:00
f3c1060443 feat: add ChirpStack LoRaWAN Network Server template (#486)
* feat: add ChirpStack LoRaWAN Network Server template

  Add complete ChirpStack v4 template with:
  - Main ChirpStack server with web UI
  - UDP and Basics Station gateway bridges
  - REST API interface
  - PostgreSQL database with PostGIS extensions
  - Redis cache
  - Mosquitto MQTT broker

Default configuration for EU868 region with secure random credentials. Supports all LoRaWAN frequency bands globally.

* fix(chirpstack): use original configurations from chirpstack-docker repo

Update template.toml to use exact configuration files from the
chirpstack-docker repository instead of simplified versions:

- Use original chirpstack.toml with all 15 enabled regions
- Use original gateway bridge configuration with documentation links
- Use complete Basics Station EU868 config with frequency plans
- Keep original Mosquitto and PostgreSQL initialization scripts

Template size increased from 131 to 219 lines (4.7KB) to include
comprehensive default configurations that match the official setup.

* feat: add all 38 region configuration files

* fix(chirpstack): add volume mounts to expose config files to containers

* fix(chirpstack): remove read-only flag

* fix(chirpstack): correct file paths for configuration mounts in docker-compose and template files

* fix: update volume paths to be on correct directory level

* fix: configure template for dokploy-network with proper DNS resolution

- Add dokploy-network configuration to docker-compose.yml
- Replace environment variable placeholders with actual service hostnames
- Change PostgreSQL DSN from $POSTGRESQL_HOST to postgres
- Change Redis server from $REDIS_HOST to redis
- Replace $MQTT_BROKER_HOST with mosquitto in all 39 region configurations

These changes ensure Docker DNS resolution works correctly by:
- Using dokploy-network (overlay) instead of bridge network
- Using service names directly in TOML config files (TOML doesn't expand env vars)
- Enabling proper service discovery between containers

This resolves DNS resolution failures that caused ChirpStack to fail connecting
to PostgreSQL and MQTT services during deployment.

* fix: add missing network configurations for all services in docker-compose

* feat: add internal services to config.domains for proper network configuration

* Update docker-compose.yml

* fix: enhance domain validation in template validator

- Updated the TemplateValidator to ensure that if the 'host' field is provided, it must be a valid string.
- Added comments to clarify that 'host' is optional for internal services.

* refactor: remove redundant host validation in template validator

- Removed the validation for the 'host' field in the TemplateValidator, as it is optional for internal services and does not require a type check if not provided.

* refactor: remove internal service domain configurations from template

- Eliminated the domain configurations for internal services (Postgres, Redis, Mosquitto) from the template.toml file, streamlining the configuration for better clarity and maintainability.

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
2025-12-14 00:13:13 -06:00
c0ff3ca788 Feat: Add parseable (#460)
* Add parseable

* Update docker-compose.yml

* Update docker-compose.yml

* Update blueprints/parseable/template.toml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
Co-authored-by: Mauricio Siu <siumauricio@icloud.com>
2025-12-14 00:01:17 -06:00
Mauricio Siu dcc456d18b refactor: enhance Docker Compose validation workflow to improve error handling
- Replaced the pipe with an array to handle directory names, ensuring that errors within the loop propagate correctly to the parent shell.
- Updated the loop structure for better reliability in processing the directories.
2025-12-14 00:00:54 -06:00
Mauricio Siu b7f7c9ffb8 fix: improve Docker Compose validation workflow to handle subshell issues
- Converted the handling of COMPOSE_FILES from a pipe to an array to ensure error propagation in the parent shell.
- Updated the loop to iterate over the array for better reliability in the validation process.
2025-12-13 23:51:28 -06:00
30ecc96168 chore: update Tolgee to latest version and fix SMTP config typo (#432)
* chore: update Tolgee to latest version and fix SMTP config typo

* Update docker-compose.yml

* Update docker-compose.yml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-13 23:48:57 -06:00
Mauricio Siu c59fbf0f36 chore: remove package-lock.json file from the app directory 2025-12-13 23:41:40 -06:00
0aad2a0231 feat: Add Kokoro TTS FastAPI template (#353) (#403)
* feat: Add Kokoro TTS FastAPI template (#353)  - Add CPU-optimized docker-compose.yml with source build - Add GPU-optimized docker-compose-gpu.yml for NVIDIA support - Add comprehensive template.toml with OpenAI-compatible API docs - Add kokoro-tts.svg logo and meta.json entry - Support streaming audio, timestamps, and multi-language TTS - Resolves #353

* updated the meta.json for the build errors

* removed the docker-compose-gpu.yml file

* Update docker-compose.yml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-13 23:40:48 -06:00
aa48af7856 Add Passbolt template blueprint to Dokploy templates (#376)
* feat(templates): add Passbolt blueprint for Dokploy
- Add docker-compose.yml defining services for Passbolt and MariaDB
- Create template.toml with configurable domain, email, and database credentials
- Add meta.json with metadata, tags, and link to logo

* fix(meta): sort meta.json entries

* fix: passbolt template had several issues that broke deployment

- env variables were using old array format, changed to new table format
- mariadb healthcheck was broken (wrong command for mariadb 11)
- missing volume mounts for gpg keys, jwt tokens, and database
- setup instructions weren't visible to users, moved to docker-compose
- email config had circular references causing warnings
- tested admin user creation and confirmed working

everything works now, fully tested

* Update blueprints/passbolt/template.toml

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2025-12-13 23:37:00 -06:00
Mauricio Siu abd316fd6e feat: add validation scripts and configuration for Docker Compose and template files
- Introduced a GitHub Actions workflow to validate Docker Compose files and template.toml on pull requests.
- Added helper functions for generating random values and processing variables in templates.
- Implemented validation scripts for checking the structure, syntax, and best practices of Docker Compose and template files.
- Created necessary TypeScript types and configuration files for the build scripts.
2025-12-13 14:38:37 -06:00
Mauricio Siu f78cc8d51f fix: update pull request template to clarify issue closing keywords 2025-12-13 01:45:43 -06:00
Mauricio Siu 7834542c9c feat: add pull request template for improved contribution guidelines 2025-12-13 01:45:06 -06:00
BlinkStrikeandGitHub 5905579eab add rustfs template (#568) 2025-12-07 03:46:38 -06:00
Thiago MadPinandGitHub f569d1379c fix: correct DEFAULT_DOMAIN environment variable reference in docker-compose.yml (#562) 2025-12-03 10:19:27 -06:00
florianheysenandGitHub 3205b672c4 Add Openinary Template (#567)
* feat: add Openinary template

* feat: update Openinary configuration to support ALLOWED_ORIGIN and refactor domain variable
2025-12-03 10:01:30 -06:00
ScanandGitHub 0fd2456a2a Change Enshrouded Server Image #557
changed image to mornedhels/enshrouded-server
2025-11-29 17:30:26 -09:00
Crackvignoule b4ebb8d9c5 changed image from sknnr/enshrouded-dedicated-server to mornedhels/enshrouded-server for autoupdate and easier config 2025-11-29 10:32:45 +01:00
ScanandGitHub daae16de16 Merge pull request #550 from Rabithua/rote
feat: add Rote template
2025-11-28 03:33:25 -09:00
Rabithua 88bff5f2a0 fix: change VITE_API_BASE to http:// for traefik.me compatibility 2025-11-28 19:15:08 +08:00
ScanandGitHub bba48c0a57 feat: add LibreChat template 2025-11-28 00:46:40 -09:00
xSiumauricioandGitHub 7efe2226ff Update template.toml (#555)
* Update template.toml

* Update template.toml

* Update template.toml
2025-11-28 02:07:05 -06:00
Mauricio Siu 8ec4ad1d9c Refactor GitHub workflow: uncomment build preview steps for improved deployment process and clarity. 2025-11-28 02:03:42 -06:00
Mauricio Siu 3ec51b85bf Remove unnecessary blank line in deploy-preview.yml for improved readability. 2025-11-28 02:03:23 -06:00
Mauricio Siu a91730e582 Refactor GitHub workflow: comment out build preview steps for clarity and future modifications. 2025-11-28 01:56:31 -06:00
Mauricio Siu b56d2b6d8c Enhance GitHub workflows: add production deployment configuration and target 'canary' branch for pull requests. 2025-11-28 01:46:41 -06:00
Mauricio Siu c697f54b53 Update pnpm-lock.yaml to upgrade various dependencies, including '@codemirror/autocomplete', '@radix-ui/react-dialog', and React packages to their latest versions. This includes updates to '@types/react' and '@types/react-dom' for improved compatibility and performance. 2025-11-28 01:45:08 -06:00
Mauricio Siu e66cad204d Update GitHub workflows to target 'canary' branch for meta validation 2025-11-28 01:25:36 -06:00
Harikrishnan DhanasekaranandGitHub 3fcc9f2b93 Feat : Add Fonoster template -#45 (#509)
* feat: Add Fonoster template - open source Twilio alternative

* fixed the build issue

* fixed the service log issue
2025-11-28 01:09:47 -06:00
Rabithua d58cc15c54 fix: process meta.json to fix formatting and sorting 2025-11-25 20:06:49 +08:00
Rabithua ac07aa2ed8 feat: add Rote template
- Add Rote deployment template with frontend, backend, and PostgreSQL services
- Configure domain routing for frontend (port 80) and backend (port 3000)
- Set up automatic password generation and environment variables
- Use latest image tag by default
- Add logo and metadata to meta.json
2025-11-25 20:03:46 +08:00
Sunil Shrestha 46dc5b9be3 docs(librechat): add authentication reference link to docker-compose.yml 2025-11-10 10:38:02 +05:45
Sunil Shrestha 2e1fb3b3a9 fix(librechat): remove predefined persistent volume mounts from template.toml 2025-11-10 10:25:31 +05:45
Sunil Shrestha 1d70294310 fix(librechat): add version under [config] and remove stray [config.mounts] header 2025-11-10 09:19:06 +05:45
Mauricio SiuandGitHub 60796a9084 Update blueprints/librechat/template.toml 2025-11-08 00:24:36 -06:00
Mauricio SiuandGitHub 3e8b431031 Update blueprints/librechat/template.toml 2025-11-08 00:21:23 -06:00
Sunil Shrestha 47daea92f8 fix(librechat): rename api service to librechat in docker-compose.yml 2025-11-02 00:40:02 +05:45
Sunil Shrestha 758cf1d873 fix: rename templates to template.toml 2025-11-02 00:19:15 +05:45
Sunil Shrestha 1e21b7e785 feat(librechat): add LibreChat blueprint with compose, toml, metadata, links and tags 2025-11-02 00:15:12 +05:45
130 changed files with 17094 additions and 5327 deletions
+3 -12
View File
@@ -8,7 +8,6 @@ Key components:
- **Blueprints**: Self-contained templates with `docker-compose.yml` (service definitions) and `template.toml` (Dokploy-specific configuration for domains, env vars, mounts).
- **meta.json**: Centralized index of all templates, aggregated from blueprint metadata. Entries include `id`, `name`, `version`, `description`, `logo`, `links`, and `tags`.
- **app/**: Vite-based React frontend for local preview/development (runs at http://localhost:5173). Copies blueprints and meta.json to dist during build.
- **Scripts**: Node.js tools in root and `build-scripts/` for maintaining `meta.json` (deduplication, sorting, validation).
Data flow: New templates added to `blueprints/` → Metadata updated in `meta.json` → Processing scripts ensure consistency → App builds include static blueprints/meta for preview.
@@ -22,7 +21,6 @@ The "why": Enables rapid, standardized deployment of 200+ OSS apps on Dokploy wi
- `docker-compose.yml`: Standard Docker Compose v3.8. Avoid `ports`, `container_name`, `networks`—Dokploy handles isolation via internal networks.
- `template.toml`: Defines variables (e.g., `${domain}`), domains (service:port → host), env vars, and mounts. Use helpers like `${password:32}`, `${uuid}`, `${jwt:secret_var}`.
- `logo.svg/png`: Service icon, referenced in `meta.json`.
- `app/vite.config.ts`: Configures build to copy `blueprints/*` and `meta.json` to dist root for static serving.
- `dedupe-and-sort-meta.js`: Standalone script—reads `meta.json`, removes duplicate `id`s (keeps first), sorts by `id` (case-insensitive), creates timestamped backup.
- `build-scripts/process-meta.js`: Advanced processor with CLI options (`--verbose`, `--no-backup`, `--input`/`--output`), JSON schema validation (required: `id`, `name`, `version`, `description`, `links.github`, `logo`, `tags` array).
@@ -39,14 +37,7 @@ Exemplary blueprint: `blueprints/ghost/`—`docker-compose.yml` exposes port 236
- Run `node dedupe-and-sort-meta.js --backup` to validate/sort.
- Commit; PR triggers Dokploy preview (base64 import for testing).
2. **Local Development**:
- App: `cd app && pnpm install && pnpm dev` (Vite dev server).
- Meta processing: `npm run process-meta` or `make process-meta` (uses Makefile targets: `validate`, `check`, `build`).
- Build app: `cd app && pnpm build`—copies blueprints/meta to `dist/` for static hosting.
- Test template: Use PR preview URL or local Dokploy instance; import base64 from template card.
3. **CI/CD**:
2. **CI/CD**:
- `.github/workflows/validate-meta.yml` (if present): Runs validation on push/PR—fails on duplicates, invalid JSON, missing fields.
- Integrate processing: Add `npm run process-meta` to build steps; use `--no-backup` in CI.
@@ -64,10 +55,10 @@ No tests in repo—focus on manual validation via scripts and Dokploy deploys. D
- JWT helper: `${jwt:secret_var:payload_var}` for auth tokens; payload as JSON string with `exp: ${timestamps:YYYY-MM-DDTHH:mm:ssZ}`.
- **Meta.json**: Entries as JSON objects; tags array of lowercase strings (e.g., ["monitoring", "database"]); links object with `github`, `website`, `docs`.
- **No Networks**: Rely on Dokploy's isolated deployments—avoid explicit `networks:`.
- **Versions**: Pin images to specific versions in `docker-compose.yml` (e.g., `ghost:5.82.0-alpine`); match in `meta.json.version`.
- **Versions**: Pin images to specific versions in `docker-compose.yml` (e.g., `ghost:5.82.0-alpine`); match in `meta.json.version`. **NEVER use `latest` tag**—it can break templates when upstream images change unexpectedly.
- **Logos**: SVG preferred; size ~128x128; file name in `meta.json.logo` (e.g., "ghost.svg").
Cross-component: No runtime communication—templates independent. App consumes static blueprints/meta for UI rendering (e.g., search, cards via React components in `app/src/`).
Cross-component: Templates are independent and ship as static blueprints/meta.
## Integration Points
@@ -6,12 +6,13 @@ New PR of [Template Name]
Before submitting this PR, please make sure that:
- [ ] I have read the suggestions in the README.md file https://github.com/Dokploy/templates?tab=readme-ov-file#general-suggestions-when-creating-a-template
- [ ] I have read the suggestions in the README.md file https://github.com/Dokploy/templates?tab=readme-ov-file#general-requirements-when-creating-a-template
- [ ] I have tested the template in my instance, so the maintainers don't spend time trying to figure out what's wrong.
- [ ] I have added tests that demonstrate that my correction works or that my new feature works.
## Issues related (if applicable)
Close automatically the related issues using the keywords: `closes #ISSUE_NUMBER`, `fixes #ISSUE_NUMBER`, `resolves #ISSUE_NUMBER`
Close automatically the related issues using the keywords: `closes #ISSUE_NUMBER`
Example: `closes #123`
## Screenshots or Videos
+3 -1
View File
@@ -5,7 +5,9 @@ on:
workflows: [Build Preview Deployment]
types:
- completed
pull_request:
branches:
- canary
permissions:
actions: read
deployments: write
@@ -0,0 +1,121 @@
name: Validate Docker Compose Files
on:
pull_request:
branches:
- canary
paths:
- 'blueprints/**/docker-compose.yml'
- 'blueprints/**/template.toml'
workflow_dispatch:
jobs:
validate-docker-compose:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Docker Compose
run: docker compose version
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20.16.0
- name: Set up pnpm
uses: pnpm/action-setup@v4
with:
version: 8
- name: Install dependencies
run: cd build-scripts && pnpm install
- name: Detect changed blueprints
id: changed
run: |
BASE_SHA=$(git merge-base HEAD origin/${{ github.base_ref }})
# Obtener todos los blueprints que tienen cambios (en docker-compose.yml o template.toml)
CHANGED_BLUEPRINTS=$(git diff --name-only --diff-filter=ACMRT $BASE_SHA HEAD | \
grep -E 'blueprints/[^/]+/(docker-compose\.yml|template\.toml)$' | \
sed 's|blueprints/\([^/]*\)/.*|\1|' | \
sort -u)
echo "Changed blueprints:"
echo "$CHANGED_BLUEPRINTS" | while read blueprint; do
[ -n "$blueprint" ] && echo " - $blueprint"
done
# Guardar lista de blueprints (una por línea)
echo "blueprints<<EOF" >> $GITHUB_OUTPUT
echo "$CHANGED_BLUEPRINTS" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Validate blueprints
run: |
BLUEPRINTS="${{ steps.changed.outputs.blueprints }}"
if [ -z "$BLUEPRINTS" ] || [ "$BLUEPRINTS" = "" ]; then
echo "ℹ️ No blueprints changed, skipping validation"
exit 0
fi
ERROR=0
# Convertir a array para evitar problemas con subshells
mapfile -t BLUEPRINT_ARRAY <<< "$BLUEPRINTS"
# Iterar sobre cada blueprint
for blueprint in "${BLUEPRINT_ARRAY[@]}"; do
[ -z "$blueprint" ] && continue
BLUEPRINT_PATH="blueprints/$blueprint"
COMPOSE_FILE="$BLUEPRINT_PATH/docker-compose.yml"
TOML_FILE="$BLUEPRINT_PATH/template.toml"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📦 Validating: $blueprint"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
# 1. Validar best practices de docker-compose.yml
if [ ! -f "$COMPOSE_FILE" ]; then
echo "⚠️ WARNING: docker-compose.yml not found"
ERROR=1
continue
fi
echo "🔍 Validating docker-compose.yml best practices..."
if ! (cd build-scripts && pnpm exec tsx validate-docker-compose.ts --file "../$COMPOSE_FILE" --verbose); then
ERROR=1
continue
fi
# 3. Validar template.toml
if [ -f "$TOML_FILE" ]; then
echo "🔍 Validating template.toml..."
if ! (cd build-scripts && pnpm exec tsx validate-template.ts --dir "../$BLUEPRINT_PATH" --verbose); then
ERROR=1
continue
fi
else
echo "⚠️ WARNING: template.toml not found"
ERROR=1
continue
fi
echo "✅ All validations passed for $blueprint"
done
if [ $ERROR -eq 1 ]; then
echo ""
echo "❌ Validation failed for one or more blueprints"
exit 1
else
echo ""
echo "✅ All blueprints validated successfully"
fi
+2 -2
View File
@@ -2,10 +2,10 @@ name: Validate and Process Meta.json
on:
push:
branches: [main, master, develop]
branches: [canary]
paths: ["meta.json"]
pull_request:
branches: [main, master]
branches: [canary]
paths: ["meta.json"]
workflow_dispatch:
+2 -2
View File
@@ -3,10 +3,10 @@ name: Validate Blueprints Structure and Meta
on:
pull_request:
branches:
- main
- canary
push:
branches:
- main
- canary
jobs:
validate:
+1
View File
@@ -0,0 +1 @@
node_modules
+212
View File
@@ -0,0 +1,212 @@
# AGENTS.md: AI Collaboration Guide
This document provides essential context for AI models interacting with this project. Adhering to these guidelines will ensure consistency and maintain code quality.
## 1. Project Overview & Purpose
- **Primary Goal:** This is the official repository for Dokploy Open Source Templates, maintaining Docker Compose templates for deploying 200+ open-source applications via Dokploy (a self-hosted PaaS alternative to Heroku). The project enables rapid, standardized deployment of OSS applications without manual configuration.
- **Business Domain:** Self-hosted Platform as a Service (PaaS), DevOps tooling, containerized application deployment, and open-source software distribution.
## 2. Core Technologies & Stack
- **Languages:** JavaScript (Node.js), TypeScript (React frontend), YAML (Docker Compose), TOML (template configuration), JSON (metadata), Shell (build scripts).
- **Frameworks & Runtimes:** Node.js runtime, Vite 5.x (for React 19.x frontend), Docker Compose v3.8+, React Router 7.x.
- **Databases:** No direct database usage in core project (templates may include various databases like PostgreSQL, MySQL, Redis, etc.).
- **Key Libraries/Dependencies:**
- **Core:** `nodemon` for development, custom Node.js scripts for meta processing.
- **Frontend:** `fuse.js` (fuzzy search), `zustand` (state management), `@iarna/toml` (TOML parsing), `shadcn/ui` components, `@radix-ui` primitives, `@codemirror` (code editor), `react-router-dom`, `tailwindcss`.
- **Build:** `vite-plugin-static-copy` for copying blueprints to dist.
- **Platforms:** Linux (primary), Docker containers, Dokploy PaaS, Web browsers (for frontend preview), Cloudflare Pages (for PR previews).
- **Package Manager:** npm for root project, pnpm for frontend (`app/` directory).
## 3. Architectural Patterns
- **Overall Architecture:** Template collection and management system with decentralized blueprint architecture. Each blueprint is a self-contained Docker Compose application with Dokploy-specific configuration.
- **Directory Structure Philosophy:**
- `/blueprints`: Contains all deployable application templates, each as a subdirectory with `docker-compose.yml`, `template.toml`, and logo files. Each blueprint is independent with no shared state.
- `/app`: Vite + React + TypeScript frontend for local preview and development.
- `/src/components`: React components (UI components in `/ui` subdirectory using shadcn/ui).
- `/src/hooks`: Custom React hooks (e.g., `useFuseSearch.ts` for fuzzy search).
- `/src/store`: Zustand state management store.
- `/src/lib`: Utility functions and helpers.
- `/build-scripts`: Advanced meta.json processing tools with CLI options and JSON schema validation.
- `/.github/workflows`: CI/CD workflows for validation, preview builds, and deployments.
- Root level: Core processing scripts (`dedupe-and-sort-meta.js`), metadata index (`meta.json`), build configuration (`Makefile`, `package.json`).
- **Module Organization:** Node.js scripts for metadata processing, React components for frontend UI, Docker Compose files for service definitions, TOML files for Dokploy configuration. Frontend uses component-based architecture with hooks for business logic and Zustand for global state.
## 4. Coding Conventions & Style Guide
- **Formatting:** JavaScript follows standard conventions with 2-space indentation. TypeScript in frontend uses ESLint configuration. YAML uses 2-space indentation. TOML files use standard formatting.
- **Naming Conventions:**
- Variables, functions: camelCase (`myVariable`, `myFunction`)
- React components: PascalCase (`TemplateGrid`, `SearchBar`)
- Constants: SCREAMING_SNAKE_CASE (`MAX_BUFFER_SIZE`)
- Template IDs: lowercase, kebab-case (`activepieces`, `ghost`) - **MUST** be unique across repository
- Files: snake_case for scripts (`dedupe-and-sort-meta.js`), PascalCase for React components (`TemplateGrid.tsx`), kebab-case for directories (`build-scripts`)
- Docker services: **MUST** match blueprint folder name exactly (e.g., `ghost` service in `blueprints/ghost/`)
- **API Design:**
- **Backend:** Procedural scripting approach with CLI interfaces. Template system uses declarative configuration over imperative code.
- **Frontend:** Component-based React architecture with hooks for logic separation. Zustand for centralized state management. Custom hooks encapsulate complex logic (e.g., `useFuseSearch` for search functionality).
- **Common Patterns & Idioms:**
- **Metaprogramming:** Minimal use of advanced JavaScript features in scripts, focusing on simple, maintainable code.
- **Memory Management:** Relies on Node.js garbage collection and React's automatic memory management.
- **Polymorphism:** Uses JavaScript prototype-based objects and functional programming patterns. React components use composition over inheritance.
- **Type Safety:**
- Backend scripts: JavaScript with JSDoc comments for documentation.
- Frontend: TypeScript with strict type checking enabled.
- **Concurrency:**
- Backend: Synchronous processing model for meta.json operations.
- Frontend: React's concurrent rendering, `useDeferredValue` for debouncing, `useEffect` for async operations.
- **State Management:** Zustand store pattern with selectors for optimal re-renders. URL params synced with search state via React Router.
- **Error Handling:**
- Backend: Node.js error-first callback pattern and try-catch blocks. Scripts validate JSON structure and fail fast on errors.
- Frontend: Error boundaries for React components, try-catch for async operations, user-friendly error messages via toast notifications.
## 5. Key Files & Entrypoints
- **Main Entrypoints:**
- **Backend:** `dedupe-and-sort-meta.js` - Primary script for processing meta.json file.
- **Frontend:** `app/src/main.tsx` - React application entry point.
- **Configuration:**
- `package.json` - Root Node.js project configuration and npm scripts.
- `app/package.json` - Frontend dependencies and pnpm scripts.
- `meta.json` - Centralized template registry (200+ entries).
- `Makefile` - Build automation with targets for processing, validation, and cleanup.
- `app/vite.config.ts` - Vite build configuration with static copy plugin.
- `app/tsconfig.json` - TypeScript compiler configuration.
- **CI/CD Pipeline:**
- `.github/workflows/validate-meta.yml` - Validates meta.json structure, duplicates, and sort order.
- `.github/workflows/build-preview.yml` - Builds preview deployments for PRs.
- `.github/workflows/deploy-preview.yml` - Deploys previews to Cloudflare Pages.
## 6. Development & Testing Workflow
- **Local Development Environment:**
- **Install dependencies**
```bash
# Root project
npm install
# Frontend (uses pnpm)
cd app && pnpm install
```
- **Process meta.json** (CRITICAL: Run after ANY meta.json edits)
```bash
npm run process-meta
# or
make process-meta
# or
node dedupe-and-sort-meta.js
```
- **Validate without modifying**
```bash
npm run validate-meta
# or
make validate
```
- **Quick check for duplicates/sort status**
```bash
make check
```
- **Clean backup files**
```bash
make clean
```
- **Task Configuration:**
- **NPM Scripts:** Run `npm run` to list available scripts. Key scripts:
- `process-meta`: Remove duplicates and sort meta.json
- `process-meta-verbose`: Process with detailed output
- `validate-meta`: Validate structure without changes
- **Makefile Targets:** Run `make help` to list targets. Key targets:
- `process-meta`: Process meta.json
- `validate`: Validate without modifying
- `check`: Quick duplicate/sort check
- `build`: Full build process
- `clean`: Remove backup files
- **Testing:** No formal unit testing framework. Validation occurs through:
- Script-based validation of meta.json structure and schema
- Manual testing via Dokploy preview deployments (import base64 from PR preview)
- JSON schema validation in `build-scripts/process-meta.js`
- TypeScript compilation errors caught during build
- ESLint for code quality in frontend
- **CI/CD Process:**
- **On meta.json changes:** Validates structure, checks for duplicates, verifies sort order, compares processed vs original.
- **On PR creation:** Builds preview deployment, generates base64 import for testing in Dokploy.
- **Preview testing:** Use PR description link → Search template → Copy base64 → Import in Dokploy instance.
## 7. Specific Instructions for AI Collaboration
- **Contribution Guidelines:**
- Follow existing Dokploy template structure strictly. Each blueprint must be independent with no shared state.
- **CRITICAL:** Always run `node dedupe-and-sort-meta.js` or `npm run process-meta` after ANY meta.json edits.
- Test templates in Dokploy preview before submitting PRs (use base64 import from PR preview).
- Add logo file (SVG preferred, ~128x128px) to blueprint folder.
- Ensure template `id` in meta.json exactly matches blueprint folder name (lowercase kebab-case).
- **Docker Compose Conventions (CRITICAL):**
- **Version:** MUST be `3.8`
- **NEVER include:** `ports` (use `expose` only), `container_name`, `networks` (Dokploy handles isolation)
- **ALWAYS include:** `restart: unless-stopped` or `restart: always`, persistent volumes
- **Service naming:** MUST match blueprint folder name exactly
- **Example:**
```yaml
version: "3.8"
services:
ghost:
image: ghost:6-alpine
restart: always
volumes:
- ghost:/var/lib/ghost/content
volumes:
ghost:
```
- **template.toml Conventions:**
- **Variables:** Define in `[variables]` section, use helpers for secrets
- **Domains:** `[[config.domains]]` with `serviceName`, `port`, `host` (path optional)
- **Env:** Array of strings: `env = ["KEY=VALUE", "DB_PASSWORD=${db_pass}"]`
- **Available helpers:** `${domain}`, `${password:length}`, `${base64:length}`, `${hash:length}`, `${uuid}`, `${randomPort}`, `${email}`, `${username}`, `${timestamp}`, `${timestamps:datetime}`, `${timestampms:datetime}`, `${jwt:secret_var:payload_var}`
- **JWT helper example:** `${jwt:mysecret:mypayload}` with payload containing `exp: ${timestamps:2030-01-01T00:00:00Z}`
- **meta.json Requirements:**
- **Required fields:** `id`, `name`, `version`, `description`, `links` (with `github`), `logo`, `tags` (array)
- **Tags:** Lowercase strings (e.g., `["monitoring", "database"]`)
- **Version:** MUST match Docker image version in docker-compose.yml
- **Logo:** Filename only (e.g., `"ghost.jpeg"`), file must exist in blueprint folder
- **Frontend Development:**
- Use TypeScript with strict type checking
- Follow React hooks patterns, avoid class components
- Use Zustand selectors for state access to optimize re-renders
- Fuse.js searches across `name`, `description`, `tags`, `id` fields
- Use shadcn/ui components for consistency
- Sync URL params with search state via React Router
- **Security:**
- Be mindful of security when handling template configurations
- NEVER hardcode secrets in templates - use Dokploy's variable system with helpers
- Pin Docker images to specific versions to avoid supply chain attacks
- Validate user input in frontend before processing
- **Dependencies:**
- When adding new templates, ensure Docker images are pinned to specific versions
- Update meta.json with exact version matching Docker Compose image version
- For frontend dependencies: Use `pnpm add <package>` in `app/` directory
- For root dependencies: Use `npm install <package>` in root directory
- **Commit Messages:** Follow conventional commit patterns (e.g., `feat:`, `fix:`, `docs:`, `chore:`).
- **Common Pitfalls to Avoid:**
1. Forgetting to process meta.json after editing (CI will fail)
2. Template ID mismatch between meta.json and folder name
3. Including `ports`, `container_name`, or `networks` in docker-compose.yml
4. Using object syntax for env vars in template.toml (must be array of strings)
5. Logo file missing or filename mismatch in meta.json
6. Version mismatch between meta.json and docker-compose.yml image tag
-1
View File
@@ -148,7 +148,6 @@ Use these in `${}` for dynamic values:
- Omit explicit ports; let Dokploy handle exposure.
- Use persistent volumes for data (e.g., databases).
- Set `restart: unless-stopped` for services.
- **Template.toml**:
+2 -2
View File
@@ -170,7 +170,7 @@ We have a few helpers that are very common when creating a template, these are:
## General Suggestions when creating a template
## General Requirements when creating a template
- Don't use this way in your docker compose file:
@@ -225,4 +225,4 @@ services:
6. Now you can click on the Deploy Button and wait for the deployment to finish, and try to access to the service, if everything is correct you should access to the service and see the template working.
use the command `node dedupe-and-sort-meta.js` to deduplicate and sort the meta.json file.
use the command `node dedupe-and-sort-meta.js` to deduplicate and sort the meta.json file.
-4248
View File
File diff suppressed because it is too large Load Diff
+958 -792
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -10,6 +10,7 @@ serviceName = "ackee"
port = 3000
host = "${domain}"
[config.env]
ACKEE_USERNAME = "${ACKEE_USERNAME}"
ACKEE_PASSWORD = "${ACKEE_PASSWORD}"
+19
View File
@@ -0,0 +1,19 @@
# Example: Any-Sync-Bundle with embedded MongoDB and Redis (all-in-one image)
#
# Usage:
# docker compose -f compose.aio.yml up -d
#
# The bundle image already contains MongoDB and Redis. Only the bundle service is required
services:
any-sync-bundle:
image: ghcr.io/grishy/any-sync-bundle:latest
restart: unless-stopped
ports:
- "33010:33010"
- "33020:33020/udp"
volumes:
- ./data:/data
environment:
# Advertise addresses clients should use. Replace with your server hostname/IP.
ANY_SYNC_BUNDLE_INIT_EXTERNAL_ADDRS: "192.168.100.9"
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

+4
View File
@@ -0,0 +1,4 @@
[config]
domains = []
mounts = []
env = []
+3
View File
@@ -0,0 +1,3 @@
<svg width="600" height="530" xmlns="http://www.w3.org/2000/svg">
<path d="M135.72 44.03C202.216 93.951 273.74 195.17 300 249.49c26.262-54.316 97.782-155.54 164.28-205.46C512.26 8.009 590-19.862 590 68.825c0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.38-3.69-10.832-3.708-7.896-.017-2.936-1.193.516-3.707 7.896-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.45-163.25-81.433C20.15 217.613 9.997 86.535 9.997 68.825c0-88.687 77.742-60.816 125.72-24.795z" fill="#1185fe"/>
</svg>

After

Width:  |  Height:  |  Size: 665 B

+48
View File
@@ -0,0 +1,48 @@
services:
pds:
image: 'ghcr.io/bluesky-social/pds:0.4.182'
volumes:
- pds-data:/pds
environment:
- SERVICE_URL_PDS_3000
- PDS_HOSTNAME
- PDS_JWT_SECRET
- PDS_ADMIN_PASSWORD
- 'PDS_ADMIN_EMAIL=${PDS_ADMIN_EMAIL}'
- PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX
- 'PDS_DATA_DIRECTORY=${PDS_DATA_DIRECTORY:-/pds}'
- 'PDS_BLOBSTORE_DISK_LOCATION=${PDS_DATA_DIRECTORY:-/pds}/blocks'
- 'PDS_BLOB_UPLOAD_LIMIT=${PDS_BLOB_UPLOAD_LIMIT:-104857600}'
- 'PDS_DID_PLC_URL=${PDS_DID_PLC_URL:-https://plc.directory}'
- 'PDS_EMAIL_FROM_ADDRESS=${PDS_EMAIL_FROM_ADDRESS}'
- 'PDS_EMAIL_SMTP_URL=${PDS_EMAIL_SMTP_URL}'
- 'PDS_BSKY_APP_VIEW_URL=${PDS_BSKY_APP_VIEW_URL:-https://api.bsky.app}'
- 'PDS_BSKY_APP_VIEW_DID=${PDS_BSKY_APP_VIEW_DID:-did:web:api.bsky.app}'
- 'PDS_REPORT_SERVICE_URL=${PDS_REPORT_SERVICE_URL:-https://mod.bsky.app/xrpc/com.atproto.moderation.createReport}'
- 'PDS_REPORT_SERVICE_DID=${PDS_REPORT_SERVICE_DID:-did:plc:ar7c4by46qjdydhdevvrndac}'
- 'PDS_CRAWLERS=${PDS_CRAWLERS:-https://bsky.network}'
- 'LOG_ENABLED=${LOG_ENABLED:-true}'
command: |
sh -c '
set -euo pipefail
echo "Installing required packages and pdsadmin..."
apk add --no-cache openssl curl bash jq coreutils gnupg util-linux-misc >/dev/null
curl -o /usr/local/bin/pdsadmin.sh https://raw.githubusercontent.com/bluesky-social/pds/main/pdsadmin.sh
chmod 700 /usr/local/bin/pdsadmin.sh
ln -sf /usr/local/bin/pdsadmin.sh /usr/local/bin/pdsadmin
echo "Creating an empty pds.env file so pdsadmin works..."
touch /pds/pds.env
echo "Launching PDS, enjoy!..."
exec node --enable-source-maps index.js
'
healthcheck:
test:
- CMD
- wget
- '--spider'
- 'http://127.0.0.1:3000/xrpc/_health'
interval: 5s
timeout: 10s
retries: 10
volumes:
pds-data:
+36
View File
@@ -0,0 +1,36 @@
[variables]
main_domain = "${domain}"
admin_password = "${password:32}"
jwt_secret = "${jwt:32}"
rotation_key = "${jwt:32}"
data_directory = "/pds"
blob_upload_limit = "104857600"
log_enabled = "true"
[config]
mounts = []
env = [
"PDS_ADMIN_PASSWORD=${admin_password}",
"PDS_HOSTNAME=${main_domain}",
"PDS_JWT_SECRET=${jwt_secret}",
"PDS_PLC_ROTATION_KEY_K256_PRIVATE_KEY_HEX=${rotation_key}",
"PDS_ADMIN_EMAIL=",
"PDS_EMAIL_FROM_ADDRESS=",
"PDS_EMAIL_SMTP_URL=",
"PDS_DATA_DIRECTORY=${data_directory}",
"PDS_BLOBSTORE_DISK_LOCATION=${data_directory}/blocks",
"PDS_BLOB_UPLOAD_LIMIT=${blob_upload_limit}",
"PDS_DID_PLC_URL=https://plc.directory",
"PDS_BSKY_APP_VIEW_URL=https://api.bsky.app",
"PDS_BSKY_APP_VIEW_DID=did:web:api.bsky.app",
"PDS_REPORT_SERVICE_URL=https://mod.bsky.app/xrpc/com.atproto.moderation.createReport",
"PDS_REPORT_SERVICE_DID=did:plc:ar7c4by46qjdydhdevvrndac",
"PDS_CRAWLERS=https://bsky.network",
"LOG_ENABLED=${log_enabled}"
]
[[config.domains]]
serviceName = "pds"
port = 3000
host = "${main_domain}"
path = "/"
-3
View File
@@ -182,9 +182,6 @@ services:
labels:
- com.centurylinklabs.watchtower.enable=false
networks:
dokploy-network:
external: true
volumes:
minio_data:
-6
View File
@@ -4,8 +4,6 @@ x-base-config: &base-config
image: chatwoot/chatwoot:v4.0.3
volumes:
- chatwoot-storage:/app/storage
networks:
- dokploy-network
environment:
- FRONTEND_URL=${FRONTEND_URL}
- SECRET_KEY_BASE=${SECRET_KEY_BASE}
@@ -63,10 +61,6 @@ services:
volumes:
- chatwoot-redis-data:/data
networks:
dokploy-network:
external: true
volumes:
chatwoot-storage:
chatwoot-postgres-data:
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

+81
View File
@@ -0,0 +1,81 @@
services:
chirpstack:
image: chirpstack/chirpstack:4
command: -c /etc/chirpstack
restart: unless-stopped
volumes:
- ../files/chirpstack:/etc/chirpstack
ports:
- 8080
environment:
- MQTT_BROKER_HOST=mosquitto
- REDIS_HOST=redis
- POSTGRESQL_HOST=postgres
depends_on:
- postgres
- mosquitto
- redis
chirpstack-gateway-bridge:
image: chirpstack/chirpstack-gateway-bridge:4
restart: unless-stopped
volumes:
- ../files/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridge
ports:
- 1700/udp
environment:
- INTEGRATION__MQTT__EVENT_TOPIC_TEMPLATE=eu868/gateway/{{ .GatewayID }}/event/{{ .EventType }}
- INTEGRATION__MQTT__STATE_TOPIC_TEMPLATE=eu868/gateway/{{ .GatewayID }}/state/{{ .StateType }}
- INTEGRATION__MQTT__COMMAND_TOPIC_TEMPLATE=eu868/gateway/{{ .GatewayID }}/command/#
depends_on:
- mosquitto
chirpstack-gateway-bridge-basicstation:
image: chirpstack/chirpstack-gateway-bridge:4
command: -c /etc/chirpstack-gateway-bridge/chirpstack-gateway-bridge-basicstation-eu868.toml
restart: unless-stopped
volumes:
- ../files/chirpstack-gateway-bridge:/etc/chirpstack-gateway-bridge
ports:
- 3001
depends_on:
- mosquitto
chirpstack-rest-api:
image: chirpstack/chirpstack-rest-api:4
restart: unless-stopped
command: --server chirpstack:8080 --bind 0.0.0.0:8090 --insecure
ports:
- 8090
depends_on:
- chirpstack
postgres:
image: postgres:14-alpine
restart: unless-stopped
volumes:
- postgresqldata:/var/lib/postgresql/data
- ../files/postgresql/initdb:/docker-entrypoint-initdb.d
environment:
- POSTGRES_USER=chirpstack
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=chirpstack
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --save 300 1 --save 60 100 --appendonly no
volumes:
- redisdata:/data
mosquitto:
image: eclipse-mosquitto:2
restart: unless-stopped
volumes:
- ../files/mosquitto/config/:/mosquitto/config/
ports:
- 1883
volumes:
postgresqldata:
redisdata:
File diff suppressed because it is too large Load Diff
-6
View File
@@ -7,8 +7,6 @@ services:
restart: unless-stopped
volumes:
- db:/var/lib/matrix-conduit/
networks:
- dokploy-network
environment:
CONDUIT_SERVER_NAME: ${MATRIX_SUBDOMAIN}
CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/
@@ -25,7 +23,3 @@ services:
CONDUIT_CONFIG: '' # Ignore this
volumes:
db:
networks:
dokploy-network:
external: true
@@ -45,10 +45,6 @@ services:
PUBLISH_COMMANDS: "true"
SUPER: ${SUPER_USERS}
networks:
dokploy-network:
external: true
volumes:
tickets-mysql-data:
tickets-app-data:
-4
View File
@@ -34,10 +34,6 @@ services:
volumes:
- redis_docmost_data:/data
networks:
dokploy-network:
external: true
volumes:
docmost:
db_docmost_data:
@@ -0,0 +1,11 @@
services:
dokploy-monitoring:
image: dokploy/monitoring:canary
restart: unless-stopped
env_file:
- .env
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- monitoring-data:/app/data
volumes:
monitoring-data: {}
@@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128">
<!-- Background circle -->
<circle cx="50" cy="50" r="48" fill="#E6522C" stroke="#CC4A1F" stroke-width="2"/>
<!-- Prometheus flame icon adapted for monitoring -->
<path d="M50 15 L60 35 L80 35 L65 48 L72 68 L50 55 L28 68 L35 48 L20 35 L40 35 Z"
fill="#FFF" opacity="0.95"/>
<!-- Graph/Chart lines representing monitoring -->
<path d="M 20 75 L 30 65 L 40 70 L 50 60 L 60 65 L 70 55 L 80 60"
stroke="#FFF" stroke-width="3" fill="none" stroke-linecap="round" opacity="0.8"/>
<!-- Data points on the graph -->
<circle cx="20" cy="75" r="2.5" fill="#FFF"/>
<circle cx="30" cy="65" r="2.5" fill="#FFF"/>
<circle cx="40" cy="70" r="2.5" fill="#FFF"/>
<circle cx="50" cy="60" r="2.5" fill="#FFF"/>
<circle cx="60" cy="65" r="2.5" fill="#FFF"/>
<circle cx="70" cy="55" r="2.5" fill="#FFF"/>
<circle cx="80" cy="60" r="2.5" fill="#FFF"/>
</svg>

After

Width:  |  Height:  |  Size: 979 B

@@ -0,0 +1,17 @@
[variables]
main_domain = "${domain}"
monitoring_token = "${password:32}"
callback_url = "http://dokploy:3000/api/trpc/notification.receiveNotification"
server_type = "Dokploy"
refresh_rate = "30"
retention_days = "7"
cpu_threshold = "80"
memory_threshold = "85"
[[config.domains]]
serviceName = "dokploy-monitoring"
port = 3001
host = "${main_domain}"
[config.env]
METRICS_CONFIG = "{\"server\":{\"refreshRate\":${refresh_rate},\"port\":3001,\"type\":\"${server_type}\",\"token\":\"${monitoring_token}\",\"urlCallback\":\"${callback_url}\",\"retentionDays\":${retention_days},\"cronJob\":\"0 0 * * *\",\"thresholds\":{\"cpu\":${cpu_threshold},\"memory\":${memory_threshold}},\"prometheus\":{\"enabled\":true}},\"containers\":{\"refreshRate\":${refresh_rate},\"services\":{\"include\":[],\"exclude\":[]}}}"
-4
View File
@@ -51,9 +51,5 @@ services:
DRAWIO_GITLAB_SECRET: ${DRAWIO_GITLAB_SECRET}
DRAWIO_GITLAB_URL: ${DRAWIO_GITLAB_URL}
DRAWIO_CLOUD_CONVERT_APIKEY: ${DRAWIO_CLOUD_CONVERT_APIKEY}
networks:
dokploy-network:
external: true
volumes:
fonts_volume:
+13 -6
View File
@@ -1,18 +1,25 @@
services:
enshrouded:
image: sknnr/enshrouded-dedicated-server:latest
image: mornedhels/enshrouded-server:latest
container_name: enshrouded
hostname: enshrouded
restart: unless-stopped
stop_grace_period: 90s
ports:
- "15637:15637/udp"
- "27015:27015/udp"
volumes:
- enshrouded-persistent-data:/opt/enshrouded
# only add ntsync device if your kernel supports it (6.14 or newer)
# devices:
# - /dev/ntsync:/dev/ntsync
environment:
- SERVER_NAME=${SERVER_NAME}
- SERVER_PASSWORD=${SERVER_PASSWORD}
- PORT=15637
- SERVER_SLOTS=6
- SERVER_IP=0.0.0.0
volumes:
- enshrouded-persistent-data:/home/steam/enshrouded/savegame
- SERVER_SLOT_COUNT=6
- UPDATE_CRON=0 3 * * *
- PUID=4711
- PGID=4711
volumes:
enshrouded-persistent-data:
@@ -47,11 +47,6 @@ services:
volumes:
- evolution-redis-data:/data
networks:
dokploy-network:
external: true
volumes:
evolution-instances:
evolution-postgres-data:
+3
View File
@@ -1,5 +1,8 @@
version: "3.8"
services:
excalidraw:
restart: unless-stopped
image: excalidraw/excalidraw:latest
healthcheck:
test:
-9
View File
@@ -124,15 +124,6 @@ services:
interval: 10s
timeout: 5s
retries: 10
networks:
- backend
- dokploy-network
networks:
backend:
driver: bridge
dokploy-network:
external: true
volumes:
nuq_pg_data:
+206
View File
@@ -0,0 +1,206 @@
services:
dashboard:
image: fonoster/dashboard:0.15.15
restart: unless-stopped
ports:
- 3030
environment:
- SERVER_DASHBOARD_SESSION_SECRET=${SERVER_DASHBOARD_SESSION_SECRET}
apiserver:
image: fonoster/apiserver:0.15.15
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
- APISERVER_APP_URL=${APISERVER_APP_URL}
- APISERVER_ASTERISK_ARI_PROXY_URL=${APISERVER_ASTERISK_ARI_PROXY_URL}
- APISERVER_ASTERISK_ARI_SECRET=${APISERVER_ASTERISK_ARI_SECRET}
- APISERVER_ASTERISK_ARI_USERNAME=${APISERVER_ASTERISK_ARI_USERNAME}
- APISERVER_AUTHZ_SERVICE_ENABLED=${APISERVER_AUTHZ_SERVICE_ENABLED}
- APISERVER_AUTHZ_SERVICE_HOST=${APISERVER_AUTHZ_SERVICE_HOST}
- APISERVER_AUTHZ_SERVICE_METHODS=${APISERVER_AUTHZ_SERVICE_METHODS}
- APISERVER_AUTHZ_SERVICE_PORT=${APISERVER_AUTHZ_SERVICE_PORT}
- APISERVER_CLOAK_ENCRYPTION_KEY=${APISERVER_CLOAK_ENCRYPTION_KEY}
- APISERVER_DATABASE_URL=${APISERVER_DATABASE_URL}
- APISERVER_IDENTITY_DATABASE_URL=${APISERVER_IDENTITY_DATABASE_URL}
- APISERVER_IDENTITY_ISSUER=${APISERVER_IDENTITY_ISSUER}
- APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED=${APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED}
- APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED=${APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED}
- APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION=${APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION}
- APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL=${APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL}
- APISERVER_IDENTITY_WORKSPACE_INVITE_URL=${APISERVER_IDENTITY_WORKSPACE_INVITE_URL}
- APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID=${APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID}
- APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET=${APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET}
- APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED=${APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED}
- APISERVER_INFLUXDB_INIT_ORG=${APISERVER_INFLUXDB_INIT_ORG}
- APISERVER_INFLUXDB_INIT_PASSWORD=${APISERVER_INFLUXDB_INIT_PASSWORD}
- APISERVER_INFLUXDB_INIT_TOKEN=${APISERVER_INFLUXDB_INIT_TOKEN}
- APISERVER_INFLUXDB_INIT_USERNAME=${APISERVER_INFLUXDB_INIT_USERNAME}
- APISERVER_INFLUXDB_URL=${APISERVER_INFLUXDB_URL}
- APISERVER_LOGS_FORMAT=${APISERVER_LOGS_FORMAT}
- APISERVER_LOGS_LEVEL=${APISERVER_LOGS_LEVEL}
- APISERVER_LOGS_TRANSPORT=${APISERVER_LOGS_TRANSPORT}
- APISERVER_NATS_URL=${APISERVER_NATS_URL}
- APISERVER_OWNER_EMAIL=${APISERVER_OWNER_EMAIL}
- APISERVER_OWNER_NAME=${APISERVER_OWNER_NAME}
- APISERVER_OWNER_PASSWORD=${APISERVER_OWNER_PASSWORD}
- APISERVER_ROOT_DOMAIN=${APISERVER_ROOT_DOMAIN}
- APISERVER_SMTP_AUTH_PASS=${APISERVER_SMTP_AUTH_PASS}
- APISERVER_SMTP_AUTH_USER=${APISERVER_SMTP_AUTH_USER}
- APISERVER_SMTP_HOST=${APISERVER_SMTP_HOST}
- APISERVER_SMTP_PORT=${APISERVER_SMTP_PORT}
- APISERVER_SMTP_SECURE=${APISERVER_SMTP_SECURE}
- APISERVER_SMTP_SENDER=${APISERVER_SMTP_SENDER}
- APISERVER_SIGNALING_SERVER=${APISERVER_SIGNALING_SERVER}
- APISERVER_TWILIO_ACCOUNT_SID=${APISERVER_TWILIO_ACCOUNT_SID}
- APISERVER_TWILIO_AUTH_TOKEN=${APISERVER_TWILIO_AUTH_TOKEN}
- APISERVER_TWILIO_PHONE_NUMBER=${APISERVER_TWILIO_PHONE_NUMBER}
expose:
- 50051
volumes:
- ../files/config/keys:/opt/fonoster/keys:ro
- ../files/config/integrations.json:/opt/fonoster/integrations.json:ro
autopilot:
image: fonoster/autopilot:0.15.15
restart: unless-stopped
expose:
- 50061
environment:
- AUTOPILOT_AWS_S3_ACCESS_KEY_ID=${AUTOPILOT_AWS_S3_ACCESS_KEY_ID}
- AUTOPILOT_AWS_S3_ENDPOINT=${AUTOPILOT_AWS_S3_ENDPOINT}
- AUTOPILOT_AWS_S3_REGION=${AUTOPILOT_AWS_S3_REGION}
- AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY=${AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY}
- AUTOPILOT_CONVERSATION_PROVIDER=${AUTOPILOT_CONVERSATION_PROVIDER}
- AUTOPILOT_KNOWLEDGE_BASE_ENABLED=${AUTOPILOT_KNOWLEDGE_BASE_ENABLED}
- AUTOPILOT_LOGS_FORMAT=${AUTOPILOT_LOGS_FORMAT}
- AUTOPILOT_LOGS_LEVEL=${AUTOPILOT_LOGS_LEVEL}
- AUTOPILOT_LOGS_TRANSPORT=${AUTOPILOT_LOGS_TRANSPORT}
- AUTOPILOT_OPENAI_API_KEY=${AUTOPILOT_OPENAI_API_KEY}
- AUTOPILOT_UNSTRUCTURED_API_KEY=${AUTOPILOT_UNSTRUCTURED_API_KEY}
- AUTOPILOT_UNSTRUCTURED_API_URL=${AUTOPILOT_UNSTRUCTURED_API_URL}
volumes:
- ../files/config/integrations.json:/opt/fonoster/integrations.json:ro
routr:
image: fonoster/routr-one:2.13.13
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
DATABASE_URL: ${ROUTR_DATABASE_URL}
EXTERNAL_ADDRS: ${ROUTR_EXTERNAL_ADDRS}
LOGS_FORMAT: ${ROUTR_LOGS_FORMAT}
LOGS_LEVEL: ${ROUTR_LOGS_LEVEL}
LOGS_TRANSPORT: ${ROUTR_LOGS_TRANSPORT}
NATS_PUBLISHER_ENABLED: "true"
NATS_PUBLISHER_URL: ${ROUTR_NATS_PUBLISHER_URL}
RTPENGINE_HOST: ${ROUTR_RTPENGINE_HOST}
START_INTERNAL_DB: "false"
CONNECT_VERIFIER_PUBLIC_KEY_PATH: /etc/routr/keys/public.pem
expose:
- 51907
- 51908
ports:
- 5060:5060/udp
- 5060-5063:5060-5063
volumes:
- ../files/config/keys/public.pem:/etc/routr/keys/public.pem
# RTPEngine uses a range of ports to handle RTP traffic. Because exposing a large range of ports
# is not possible in Docker, we need to use network_mode: host.
#
# Unfortunately, network_mode: host is not supported for Windows or Mac.
# In those cases, we need to use a different approach.
#
# By default we are opening a small range of ports (10000-10100) to handle RTP traffic.
# However, this is not enough for production environments.
#
# We recommend that when using Linux you use network_mode: host and remove the ports section.
rtpengine:
image: fonoster/rtpengine:0.3.17
restart: unless-stopped
platform: linux/x86_64
ports:
- 10000-10100:10000-10100/udp
- 8080:8080
environment:
PORT_MAX: ${RTPENGINE_PORT_MAX}
PORT_MIN: ${RTPENGINE_PORT_MIN}
PUBLIC_IP: ${RTPENGINE_PUBLIC_IP}
asterisk:
image: fonoster/asterisk:20
restart: unless-stopped
environment:
ARI_PROXY_URL: ${ASTERISK_ARI_PROXY_URL}
ARI_SECRET: ${ASTERISK_ARI_SECRET}
ARI_USERNAME: ${ASTERISK_ARI_USERNAME}
CODECS: ${ASTERISK_CODECS}
DTMF_MODE: ${ASTERISK_DTMF_MODE}
RTP_PORT_END: ${ASTERISK_RTP_PORT_END}
RTP_PORT_START: ${ASTERISK_RTP_PORT_START}
SIPPROXY_HOST: ${ASTERISK_SIPPROXY_HOST}
SIPPROXY_PORT: ${ASTERISK_SIPPROXY_PORT}
SIPPROXY_SECRET: ${ASTERISK_SIPPROXY_SECRET}
SIPPROXY_USERNAME: ${ASTERISK_SIPPROXY_USERNAME}
expose:
- 6060
postgres:
image: postgres:16.10-alpine3.22
restart: unless-stopped
environment:
PGTZ: UTC
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_DB: ${POSTGRES_DB}
TZ: UTC
expose:
- 5432
volumes:
- db:/var/lib/postgresql/data
- ../files/config/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
influxdb:
image: influxdb:2.7
restart: unless-stopped
expose:
- 8086
environment:
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: ${INFLUXDB_INIT_TOKEN}
DOCKER_INFLUXDB_INIT_BUCKET: calls
DOCKER_INFLUXDB_INIT_MODE: setup
DOCKER_INFLUXDB_INIT_ORG: ${INFLUXDB_INIT_ORG}
DOCKER_INFLUXDB_INIT_PASSWORD: ${INFLUXDB_INIT_PASSWORD}
DOCKER_INFLUXDB_INIT_USERNAME: ${INFLUXDB_INIT_USERNAME}
volumes:
- influxdb:/var/lib/influxdb2
nats:
image: nats:2.11.8
restart: unless-stopped
expose:
- 4222
envoy:
image: envoyproxy/envoy:v1.35.0
restart: unless-stopped
command: ["/usr/local/bin/envoy", "-c", "/etc/envoy/envoy.yaml"]
volumes:
- ../files/config:/etc/envoy:ro
ports:
- 8449:8449
volumes:
db:
influxdb:
+11
View File
@@ -0,0 +1,11 @@
<svg width="248" height="51" viewBox="0 0 248 51" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M64.3464 41.1284V10.7243H85.4972V16.8908H71.5429V23.4427H83.0399V29.1381H71.5429V41.1284H64.3464Z" fill="#053204"/>
<path d="M98.4011 41.5567C96.441 41.5567 94.6858 41.2426 93.1353 40.6146C91.6141 39.9865 90.3269 39.13 89.2737 38.0452C88.2206 36.9604 87.4161 35.7185 86.8603 34.3196C86.3337 32.9207 86.0704 31.4505 86.0704 29.9089C86.0704 28.3387 86.3337 26.8542 86.8603 25.4553C87.4161 24.0564 88.2206 22.8146 89.2737 21.7297C90.3269 20.6449 91.6141 19.7884 93.1353 19.1604C94.6858 18.5323 96.441 18.2183 98.4011 18.2183C100.361 18.2183 102.102 18.5323 103.623 19.1604C105.144 19.7884 106.431 20.6449 107.484 21.7297C108.538 22.8146 109.342 24.0564 109.898 25.4553C110.454 26.8542 110.732 28.3387 110.732 29.9089C110.732 31.4505 110.454 32.9207 109.898 34.3196C109.342 35.7185 108.538 36.9604 107.484 38.0452C106.431 39.13 105.144 39.9865 103.623 40.6146C102.102 41.2426 100.361 41.5567 98.4011 41.5567ZM93.2669 29.9089C93.2669 31.0794 93.4863 32.1071 93.9252 32.9921C94.3932 33.8771 95.0076 34.5623 95.7682 35.0476C96.5288 35.5329 97.4064 35.7756 98.4011 35.7756C99.3664 35.7756 100.229 35.5329 100.99 35.0476C101.78 34.5337 102.394 33.8343 102.833 32.9493C103.272 32.0643 103.491 31.0508 103.491 29.9089C103.491 28.7384 103.272 27.7106 102.833 26.8256C102.394 25.9406 101.78 25.2555 100.99 24.7702C100.229 24.2848 99.3664 24.0422 98.4011 24.0422C97.4064 24.0422 96.5288 24.2848 95.7682 24.7702C95.0076 25.2555 94.3932 25.9406 93.9252 26.8256C93.4863 27.7106 93.2669 28.7384 93.2669 29.9089Z" fill="#053204"/>
<path d="M136.418 41.1284H129.397V28.4957C129.397 27.0112 129.104 25.9406 128.519 25.284C127.963 24.5989 127.217 24.2563 126.281 24.2563C125.638 24.2563 124.979 24.4276 124.306 24.7702C123.634 25.1127 123.019 25.5838 122.463 26.1833C121.937 26.7828 121.527 27.468 121.235 28.2388V41.1284H114.214V18.6465H120.533V22.4149C121.118 21.5299 121.849 20.7734 122.727 20.1453C123.604 19.5172 124.614 19.0462 125.755 18.7322C126.895 18.3896 128.139 18.2183 129.484 18.2183C130.976 18.2183 132.176 18.4895 133.083 19.0319C134.019 19.5458 134.721 20.2309 135.189 21.0874C135.686 21.9439 136.008 22.8717 136.154 23.8709C136.33 24.8415 136.418 25.7979 136.418 26.74V41.1284Z" fill="#053204"/>
<path d="M152.053 41.5567C150.093 41.5567 148.338 41.2426 146.787 40.6146C145.266 39.9865 143.979 39.13 142.926 38.0452C141.872 36.9604 141.068 35.7185 140.512 34.3196C139.985 32.9207 139.722 31.4505 139.722 29.9089C139.722 28.3387 139.985 26.8542 140.512 25.4553C141.068 24.0564 141.872 22.8146 142.926 21.7297C143.979 20.6449 145.266 19.7884 146.787 19.1604C148.338 18.5323 150.093 18.2183 152.053 18.2183C154.013 18.2183 155.753 18.5323 157.275 19.1604C158.796 19.7884 160.083 20.6449 161.136 21.7297C162.189 22.8146 162.994 24.0564 163.55 25.4553C164.106 26.8542 164.383 28.3387 164.383 29.9089C164.383 31.4505 164.106 32.9207 163.55 34.3196C162.994 35.7185 162.189 36.9604 161.136 38.0452C160.083 39.13 158.796 39.9865 157.275 40.6146C155.753 41.2426 154.013 41.5567 152.053 41.5567ZM146.919 29.9089C146.919 31.0794 147.138 32.1071 147.577 32.9921C148.045 33.8771 148.659 34.5623 149.42 35.0476C150.181 35.5329 151.058 35.7756 152.053 35.7756C153.018 35.7756 153.881 35.5329 154.642 35.0476C155.432 34.5337 156.046 33.8343 156.485 32.9493C156.924 32.0643 157.143 31.0508 157.143 29.9089C157.143 28.7384 156.924 27.7106 156.485 26.8256C156.046 25.9406 155.432 25.2555 154.642 24.7702C153.881 24.2848 153.018 24.0422 152.053 24.0422C151.058 24.0422 150.181 24.2848 149.42 24.7702C148.659 25.2555 148.045 25.9406 147.577 26.8256C147.138 27.7106 146.919 28.7384 146.919 29.9089Z" fill="#053204"/>
<path d="M176.686 41.5567C174.726 41.5567 172.809 41.2426 170.937 40.6146C169.065 39.9865 167.485 39.0587 166.198 37.8311L168.612 33.506C170.016 34.5052 171.376 35.2617 172.692 35.7756C174.038 36.2895 175.296 36.5464 176.466 36.5464C177.373 36.5464 178.075 36.4037 178.573 36.1182C179.07 35.8327 179.319 35.3902 179.319 34.7907C179.319 34.3624 179.172 34.0341 178.88 33.8057C178.587 33.5488 178.134 33.3204 177.519 33.1206C176.934 32.9207 176.203 32.7066 175.325 32.4782C173.57 31.9073 172.107 31.3506 170.937 30.8082C169.767 30.2657 168.889 29.6091 168.304 28.8383C167.719 28.039 167.427 27.0112 167.427 25.7551C167.427 24.242 167.807 22.9288 168.568 21.8154C169.357 20.6734 170.469 19.7884 171.903 19.1604C173.336 18.5323 175.047 18.2183 177.037 18.2183C178.616 18.2183 180.152 18.4609 181.644 18.9463C183.165 19.4316 184.584 20.2452 185.901 21.3872L183.18 25.6694C181.864 24.7844 180.693 24.1421 179.67 23.7424C178.646 23.3427 177.651 23.1429 176.686 23.1429C176.188 23.1429 175.735 23.2 175.325 23.3142C174.916 23.4284 174.579 23.6282 174.316 23.9137C174.082 24.1706 173.965 24.5132 173.965 24.9414C173.965 25.3697 174.082 25.7123 174.316 25.9692C174.579 26.2261 174.974 26.4545 175.501 26.6544C176.057 26.8256 176.744 27.0398 177.563 27.2967C179.465 27.8391 181.045 28.3958 182.302 28.9668C183.56 29.5092 184.497 30.1944 185.111 31.0223C185.754 31.8216 186.076 32.8922 186.076 34.234C186.076 36.5179 185.228 38.3164 183.531 39.6296C181.864 40.9143 179.582 41.5567 176.686 41.5567Z" fill="#053204"/>
<path d="M204.426 39.9294C203.782 40.1863 203.066 40.4433 202.276 40.7002C201.515 40.9571 200.711 41.157 199.862 41.2997C199.014 41.471 198.18 41.5567 197.361 41.5567C196.191 41.5567 195.108 41.3711 194.114 41C193.148 40.6003 192.373 39.9579 191.788 39.0729C191.232 38.1879 190.954 37.0175 190.954 35.5615V23.8281H188.014V18.6465H190.954V11.4951H197.975V18.6465H202.671V23.8281H197.975V33.2062C197.975 33.9485 198.165 34.4909 198.546 34.8335C198.926 35.1475 199.409 35.3045 199.994 35.3045C200.491 35.3045 201.018 35.2189 201.574 35.0476C202.159 34.8763 202.656 34.6908 203.066 34.4909L204.426 39.9294Z" fill="#053204"/>
<path d="M217.919 41.5567C215.959 41.5567 214.218 41.2569 212.697 40.6574C211.176 40.0293 209.874 39.1871 208.791 38.1308C207.738 37.0745 206.934 35.8612 206.378 34.4909C205.822 33.092 205.544 31.6361 205.544 30.123C205.544 27.9533 206.027 25.9835 206.992 24.2135C207.987 22.4149 209.406 20.9732 211.249 19.8884C213.092 18.775 215.315 18.2183 217.919 18.2183C220.522 18.2183 222.731 18.7607 224.545 19.8455C226.388 20.9304 227.792 22.3578 228.757 24.1278C229.723 25.8693 230.205 27.7677 230.205 29.8232C230.205 30.2229 230.176 30.6226 230.118 31.0223C230.088 31.3934 230.059 31.7217 230.03 32.0072H213.004C213.092 33.0064 213.37 33.8486 213.838 34.5337C214.335 35.2189 214.964 35.747 215.725 36.1182C216.485 36.4608 217.29 36.632 218.138 36.632C219.191 36.632 220.171 36.3894 221.078 35.9041C222.014 35.4187 222.658 34.7621 223.009 33.9342L228.977 35.5615C228.392 36.732 227.558 37.774 226.476 38.6875C225.422 39.5725 224.164 40.272 222.702 40.7859C221.268 41.2997 219.674 41.5567 217.919 41.5567ZM212.828 27.8106H222.833C222.716 26.8685 222.438 26.0548 222 25.3697C221.561 24.656 220.976 24.1135 220.244 23.7424C219.513 23.3427 218.709 23.1429 217.831 23.1429C216.924 23.1429 216.105 23.3427 215.374 23.7424C214.671 24.1135 214.101 24.656 213.662 25.3697C213.223 26.0548 212.945 26.8685 212.828 27.8106Z" fill="#053204"/>
<path d="M248 24.5132C246.303 24.5132 244.767 24.7844 243.392 25.3268C242.018 25.8407 241.023 26.6115 240.409 27.6393V41.1284H233.388V18.6465H239.838V23.1857C240.628 21.6726 241.652 20.4879 242.91 19.6314C244.168 18.775 245.484 18.3325 246.859 18.3039C247.181 18.3039 247.415 18.3039 247.561 18.3039C247.737 18.3039 247.883 18.3182 248 18.3467V24.5132Z" fill="#053204"/>
<path d="M48.2593 23.9108C48.2593 10.7052 37.4561 0 24.1297 0C10.8032 0 0 10.7052 0 23.9108V50.9404H22.556C36.7516 50.9404 48.2593 39.537 48.2593 25.4702V23.9108Z" fill="#39E19E"/>
</svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

+331
View File
@@ -0,0 +1,331 @@
[variables]
main_domain = "${domain}"
# Critical: Set these to your host machine's IP address
# For cloud deployments, use the public IP of your server
# For local deployments, use your local machine's IP
host_ip = "CHANGE_ME_TO_HOST_IP"
# Secrets - auto-generated strong passwords
dashboard_session_secret = "${password:64}"
ari_secret = "${password:32}"
asterisk_ari_secret = "${password:32}"
asterisk_sipproxy_secret = "${password:32}"
postgres_password = "${password:32}"
influxdb_password = "${password:32}"
influxdb_token = "${password:64}"
cloak_encryption_key = "${base64:32}"
# Database credentials
postgres_user = "postgres"
postgres_db_fonoster = "fonoster"
postgres_db_identity = "fnidentity"
postgres_db_routr = "routr"
# API Server Configuration
api_server_app_url = "https://${main_domain}"
api_server_root_domain = "${main_domain}"
api_server_owner_email = "admin@${main_domain}"
api_server_owner_name = "Admin User"
api_server_owner_password = "${password:32}"
# InfluxDB Configuration
influxdb_init_org = "fonoster"
influxdb_init_username = "influxdb"
# Asterisk Configuration
asterisk_codecs = "g722,ulaw,alaw"
asterisk_dtmf_mode = "auto_info"
asterisk_rtp_port_start = "10000"
asterisk_rtp_port_end = "20000"
asterisk_sipproxy_port = "5060"
asterisk_sipproxy_username = "voice"
# RTP Engine Configuration
rtpengine_port_min = "10000"
rtpengine_port_max = "20000"
# Routr Configuration
routr_nats_publisher_url = "nats://nats:4222"
# Logging Configuration
logs_format = "json"
logs_level = "verbose"
logs_transport = "none"
[config]
env = [
# Dashboard
"SERVER_DASHBOARD_SESSION_SECRET=${dashboard_session_secret}",
# API Server - Core
"APISERVER_APP_URL=${api_server_app_url}",
"APISERVER_ROOT_DOMAIN=${api_server_root_domain}",
"APISERVER_OWNER_EMAIL=${api_server_owner_email}",
"APISERVER_OWNER_NAME=${api_server_owner_name}",
"APISERVER_OWNER_PASSWORD=${api_server_owner_password}",
# API Server - Database
"APISERVER_DATABASE_URL=postgresql://${postgres_user}:${postgres_password}@postgres:5432/${postgres_db_fonoster}",
"APISERVER_IDENTITY_DATABASE_URL=postgresql://${postgres_user}:${postgres_password}@postgres:5432/${postgres_db_identity}",
# API Server - Asterisk ARI
"APISERVER_ASTERISK_ARI_PROXY_URL=http://asterisk:8088",
"APISERVER_ASTERISK_ARI_SECRET=${ari_secret}",
"APISERVER_ASTERISK_ARI_USERNAME=ari",
# API Server - Identity
"APISERVER_IDENTITY_ISSUER=https://${api_server_root_domain}",
"APISERVER_IDENTITY_CONTACT_VERIFICATION_REQUIRED=false",
"APISERVER_IDENTITY_TWO_FACTOR_AUTHENTICATION_REQUIRED=false",
"APISERVER_IDENTITY_WORKSPACE_INVITE_EXPIRATION=1d",
"APISERVER_IDENTITY_WORKSPACE_INVITE_FAIL_URL=${api_server_app_url}/invite-fail",
"APISERVER_IDENTITY_WORKSPACE_INVITE_URL=https://${api_server_root_domain}:8449/api/identity/accept-invite",
"APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_ID=",
"APISERVER_IDENTITY_OAUTH2_GITHUB_CLIENT_SECRET=",
"APISERVER_IDENTITY_OAUTH2_GITHUB_ENABLED=false",
# API Server - InfluxDB
"APISERVER_INFLUXDB_URL=http://influxdb:8086",
"APISERVER_INFLUXDB_INIT_ORG=${influxdb_init_org}",
"APISERVER_INFLUXDB_INIT_USERNAME=${influxdb_init_username}",
"APISERVER_INFLUXDB_INIT_PASSWORD=${influxdb_password}",
"APISERVER_INFLUXDB_INIT_TOKEN=${influxdb_token}",
# API Server - NATS
"APISERVER_NATS_URL=nats://nats:4222",
# API Server - Logging
"APISERVER_LOGS_FORMAT=${logs_format}",
"APISERVER_LOGS_LEVEL=${logs_level}",
"APISERVER_LOGS_TRANSPORT=${logs_transport}",
# API Server - Encryption
"APISERVER_CLOAK_ENCRYPTION_KEY=${cloak_encryption_key}",
# API Server - AuthZ Service (disabled by default)
"APISERVER_AUTHZ_SERVICE_ENABLED=false",
"APISERVER_AUTHZ_SERVICE_HOST=fnauthz",
"APISERVER_AUTHZ_SERVICE_METHODS=/fonoster.calls.v1beta2.Calls/CreateCall,/fonoster.identity.v1beta2.Identity/CreateWorkspace",
"APISERVER_AUTHZ_SERVICE_PORT=50071",
# API Server - SMTP (optional, configure if needed)
"APISERVER_SMTP_HOST=your-smtp-server",
"APISERVER_SMTP_PORT=587",
"APISERVER_SMTP_SECURE=true",
"APISERVER_SMTP_AUTH_USER=postmaster@${api_server_root_domain}",
"APISERVER_SMTP_AUTH_PASS=secret",
"APISERVER_SMTP_SENDER=Fonoster Info <info@${api_server_root_domain}>",
# API Server - Signaling
"APISERVER_SIGNALING_SERVER=ws://${api_server_root_domain}:5062",
# API Server - Twilio (optional, configure if needed)
"APISERVER_TWILIO_ACCOUNT_SID=",
"APISERVER_TWILIO_AUTH_TOKEN=",
"APISERVER_TWILIO_PHONE_NUMBER=",
# Autopilot
"AUTOPILOT_CONVERSATION_PROVIDER=api",
"AUTOPILOT_KNOWLEDGE_BASE_ENABLED=false",
"AUTOPILOT_LOGS_FORMAT=${logs_transport}",
"AUTOPILOT_LOGS_LEVEL=${logs_level}",
"AUTOPILOT_LOGS_TRANSPORT=${logs_transport}",
"AUTOPILOT_AWS_S3_ACCESS_KEY_ID=",
"AUTOPILOT_AWS_S3_ENDPOINT=",
"AUTOPILOT_AWS_S3_REGION=us-east-1",
"AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY=",
"AUTOPILOT_OPENAI_API_KEY=",
"AUTOPILOT_UNSTRUCTURED_API_KEY=",
"AUTOPILOT_UNSTRUCTURED_API_URL=",
# Routr
"ROUTR_DATABASE_URL=postgresql://${postgres_user}:${postgres_password}@postgres:5432/${postgres_db_routr}",
"ROUTR_EXTERNAL_ADDRS=${host_ip}",
"ROUTR_RTPENGINE_HOST=rtpengine",
"ROUTR_NATS_PUBLISHER_URL=${routr_nats_publisher_url}",
"ROUTR_LOGS_FORMAT=${logs_transport}",
"ROUTR_LOGS_LEVEL=${logs_level}",
"ROUTR_LOGS_TRANSPORT=${logs_transport}",
# Asterisk
"ASTERISK_ARI_PROXY_URL=http://asterisk:8088",
"ASTERISK_ARI_SECRET=${asterisk_ari_secret}",
"ASTERISK_ARI_USERNAME=ari",
"ASTERISK_CODECS=${asterisk_codecs}",
"ASTERISK_DTMF_MODE=${asterisk_dtmf_mode}",
"ASTERISK_RTP_PORT_START=${asterisk_rtp_port_start}",
"ASTERISK_RTP_PORT_END=${asterisk_rtp_port_end}",
"ASTERISK_SIPPROXY_HOST=${host_ip}",
"ASTERISK_SIPPROXY_PORT=${asterisk_sipproxy_port}",
"ASTERISK_SIPPROXY_SECRET=${asterisk_sipproxy_secret}",
"ASTERISK_SIPPROXY_USERNAME=${asterisk_sipproxy_username}",
# RTP Engine
"RTPENGINE_PUBLIC_IP=${host_ip}",
"RTPENGINE_PORT_MIN=${rtpengine_port_min}",
"RTPENGINE_PORT_MAX=${rtpengine_port_max}",
# InfluxDB
"INFLUXDB_INIT_ORG=${influxdb_init_org}",
"INFLUXDB_INIT_USERNAME=${influxdb_init_username}",
"INFLUXDB_INIT_PASSWORD=${influxdb_password}",
"INFLUXDB_INIT_TOKEN=${influxdb_token}",
# PostgreSQL
"POSTGRES_USER=${postgres_user}",
"POSTGRES_PASSWORD=${postgres_password}",
"POSTGRES_DB=${postgres_db_fonoster}",
]
[[config.domains]]
serviceName = "dashboard"
port = 3030
host = "${main_domain}"
[[config.mounts]]
filePath = "config/integrations.json"
content = """
{
"integrations": []
}
"""
[[config.mounts]]
filePath = "config/init-db.sh"
content = """#!/bin/bash
set -e
# Create additional databases (ignore error if they already exist)
psql -v ON_ERROR_STOP=0 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
CREATE DATABASE fnidentity;
CREATE DATABASE routr;
EOSQL
# Grant privileges
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
GRANT ALL PRIVILEGES ON DATABASE fnidentity TO $POSTGRES_USER;
GRANT ALL PRIVILEGES ON DATABASE routr TO $POSTGRES_USER;
EOSQL
"""
[[config.mounts]]
filePath = "config/keys/.gitkeep"
content = "# Placeholder - RSA keys need to be generated manually after deployment"
[[config.mounts]]
filePath = "config/keys/public.pem"
content = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyVvQZ8v3xq7p8BmXdS3C
G9fk654bAbl30tsqq4h9d3N4F11hlue8bGAY=
-----END PUBLIC KEY-----
"""
[[config.mounts]]
filePath = "config/envoy.yaml"
content = """
# Envoy configuration without tls for development and testing.
# Do not use this configuration in production. Please check the docs for examples using tls.
static_resources:
listeners:
- name: listener_http
address:
socket_address: { address: 0.0.0.0, port_value: 8449 }
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
codec_type: auto
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/api"
route:
cluster: apiserver-cluster-http
timeout: 0s
- match:
prefix: "/"
headers:
- name: "content-type"
safe_regex_match:
google_re2: {}
regex: "^(application/grpc|application/grpc-web-text)$"
route:
cluster: apiserver-cluster
timeout: 0s
max_stream_duration:
grpc_timeout_header_max: 0s
- match:
prefix: "/"
route:
cluster: dashboard-cluster
timeout: 0s
cors:
allow_origin_string_match:
- prefix: "*"
allow_methods: GET, PUT, DELETE, POST, OPTIONS
allow_headers: token,accesskeyid,keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout
max_age: "1728000"
expose_headers: grpc-status,grpc-message
http_filters:
- name: envoy.filters.http.grpc_web
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb
- name: envoy.filters.http.cors
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors
- name: envoy.filters.http.router
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
clusters:
- name: apiserver-cluster
type: logical_dns
connect_timeout: 20s
http2_protocol_options: {}
lb_policy: round_robin
load_assignment:
cluster_name: apiserver-cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: apiserver
port_value: 50051
- name: apiserver-cluster-http
type: logical_dns
connect_timeout: 20s
lb_policy: round_robin
load_assignment:
cluster_name: apiserver-cluster-http
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: apiserver
port_value: 9876
- name: dashboard-cluster
type: logical_dns
connect_timeout: 20s
lb_policy: round_robin
load_assignment:
cluster_name: dashboard-cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: dashboard
port_value: 3030
"""
-4
View File
@@ -20,7 +20,3 @@ services:
volumes:
glpi-mysql-data:
glpi-www-data:
networks:
dokploy-network:
external: true
-4
View File
@@ -36,9 +36,5 @@ services:
volumes:
- pg_hi-events_data:/var/lib/postgresql/data
networks:
dokploy-network:
external: true
volumes:
pg_hi-events_data:
-4
View File
@@ -96,10 +96,6 @@ services:
]
restart: always
networks:
dokploy-network:
external: true
volumes:
immich-model-cache:
immich-postgres:
+3 -6
View File
@@ -3,7 +3,7 @@ services:
depends_on:
db:
condition: service_healthy
image: infisical/infisical:v0.90.1-postgres
image: infisical/infisical:v0.135.0-postgres
environment:
- NODE_ENV=production
- ENCRYPTION_KEY
@@ -20,7 +20,6 @@ services:
command: npm run migration:latest
pull_policy: always
backend:
restart: unless-stopped
depends_on:
@@ -30,7 +29,7 @@ services:
condition: service_started
db-migration:
condition: service_completed_successfully
image: infisical/infisical:v0.90.1-postgres
image: infisical/infisical:v0.135.0-postgres
pull_policy: always
environment:
- NODE_ENV=production
@@ -77,7 +76,5 @@ volumes:
pg_infisical_data:
redis_infisical_data:
networks:
dokploy-network:
external: true
@@ -47,10 +47,6 @@ services:
invoiceshelf-postgres:
condition: service_healthy
networks:
dokploy-network:
external: true
volumes:
invoiceshelf-postgres-data:
invoiceshelf-app-data:
-4
View File
@@ -40,10 +40,6 @@ services:
start_period: 30s
networks:
dokploy-network:
external: true
volumes:
kimai-data:
mysql-data:
+23
View File
@@ -0,0 +1,23 @@
services:
kokoro-tts:
build:
context: https://github.com/remsky/Kokoro-FastAPI.git#master
dockerfile: docker/cpu/Dockerfile
restart: unless-stopped
ports:
- 8880
environment:
- MODEL_PATH=/app/models
- DEVICE=${DEVICE:-cpu}
- HOST=0.0.0.0
- PORT=8880
volumes:
- kokoro-models:/app/models
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8880/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
volumes:
kokoro-models:
+12
View File
@@ -0,0 +1,12 @@
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="64" height="64" rx="12" fill="#3B82F6"/>
<path d="M16 24C16 20.6863 18.6863 18 22 18H42C45.3137 18 48 20.6863 48 24V40C48 43.3137 45.3137 46 42 46H22C18.6863 46 16 43.3137 16 40V24Z" fill="white"/>
<path d="M24 28H40V32H24V28Z" fill="#3B82F6"/>
<path d="M24 34H36V38H24V34Z" fill="#3B82F6"/>
<circle cx="32" cy="42" r="2" fill="#3B82F6"/>
<path d="M20 22L44 22" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/>
<path d="M20 26L44 26" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/>
<path d="M20 30L44 30" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/>
<path d="M20 34L44 34" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/>
<path d="M20 38L44 38" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/>
</svg>

After

Width:  |  Height:  |  Size: 885 B

+72
View File
@@ -0,0 +1,72 @@
[variables]
main_domain = "${domain}"
device = "cpu"
[config]
env = [
"DEVICE=${device}",
"MODEL_PATH=/app/models",
"HOST=0.0.0.0",
"PORT=8880",
"PYTHONUNBUFFERED=1",
"UV_SYSTEM_PYTHON=1"
]
[[config.domains]]
serviceName = "kokoro-tts"
port = 8880
host = "${main_domain}"
path = "/"
[[config.mounts]]
filePath = "README.md"
content = """# Kokoro TTS FastAPI
This template provides a Dockerized FastAPI wrapper for the Kokoro-82M text-to-speech model.
## Features
- Multi-language support (English, Japanese, Chinese)
- OpenAI-compatible speech endpoint
- CPU and GPU support
- Web interface for monitoring
- RESTful API with comprehensive documentation
- Streaming audio generation
- Word-level timestamps and phonemes
## Usage
- **Web Interface**: Access the web UI at `https://${main_domain}/web`
- **API Documentation**: Available at `https://${main_domain}/docs`
- **Health Check**: Monitor service health at `https://${main_domain}/health`
## Configuration
The service runs on port 8880 and supports both CPU and GPU inference.
For GPU support, ensure your Dokploy instance has NVIDIA GPU support enabled.
## API Endpoints
- `POST /v1/audio/speech` - Generate speech from text (OpenAI compatible)
- `POST /dev/captioned_speech` - Generate speech with timestamps
- `POST /dev/phonemize` - Convert text to phonemes
- `POST /dev/generate_from_phonemes` - Generate audio from phonemes
- `GET /health` - Health check endpoint
- `GET /docs` - Interactive API documentation
- `GET /web` - Web interface
## Model Information
- Model: Kokoro-82M
- License: Apache-2.0
- Repository: https://github.com/remsky/Kokoro-FastAPI
- HuggingFace Model: https://huggingface.co/hexgrad/Kokoro-82M
## Notes
- This template builds the image from source during deployment
- Uses CPU-optimized Dockerfile by default
- Initial build may take several minutes due to model download
- Ensure sufficient disk space for model storage
- For GPU support, change dockerfile path to `docker/gpu/Dockerfile` in docker-compose.yml
"""
+1 -1
View File
@@ -7,7 +7,7 @@ services:
environment:
DB_FILENAME: "/var/lib/kutt/data.sqlite"
JWT_SECRET: ${JWT_SECRET}
DEFAULT_DOMAIN: ${DOMAIN}
DEFAULT_DOMAIN: ${DEFAULT_DOMAIN}
TRUST_PROXY: ${TRUST_PROXY}
DISALLOW_ANONYMOUS_LINKS: ${DISALLOW_ANONYMOUS_LINKS}
CUSTOM_DOMAIN_USE_HTTPS: ${CUSTOM_DOMAIN_USE_HTTPS}
+110
View File
@@ -0,0 +1,110 @@
# LibreChat Docker Compose for Dokploy Template
# Setting up authentication: "npm run create-user", refer to https://www.librechat.ai/docs/configuration/authentication
services:
librechat:
image: ghcr.io/danny-avila/librechat-dev:latest
restart: always
depends_on:
- mongodb
- rag_api
environment:
# Server Configuration
- HOST=0.0.0.0
- PORT=${PORT:-3080}
# Domain Configuration
- DOMAIN_CLIENT=${DOMAIN_CLIENT}
- DOMAIN_SERVER=${DOMAIN_SERVER}
# Database and Search Configuration
- MONGO_URI=mongodb://mongodb:27017/LibreChat
- MEILI_HOST=http://meilisearch:7700
- SEARCH=true
- NO_INDEX=true
- MEILI_NO_ANALYTICS=true
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
# Security & Sessions
- JWT_SECRET=${JWT_SECRET}
- JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET}
- CREDS_KEY=${CREDS_KEY}
- CREDS_IV=${CREDS_IV}
- RAG_PORT=${RAG_PORT:-8000}
- RAG_API_URL=http://rag_api:${RAG_PORT:-8000}
# API Keys and Secrets
- OPENAI_API_KEY=${OPENAI_API_KEY}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- OPENROUTER_KEY=${OPENROUTER_KEY}
- GOOGLE_KEY=${GOOGLE_KEY}
- ENDPOINTS=google,openAI,assistants,azureOpenAI,anthropic
# ... Additional Endpoints
# UI
- APP_TITLE=${APP_TITLE:-LibreChat}
- CUSTOM_FOOTER=${CUSTOM_FOOTER:-Made with ❤️ by LibreChat}
- ALLOW_EMAIL_LOGIN=${ALLOW_EMAIL_LOGIN:-true}
- ALLOW_SOCIAL_LOGIN=${ALLOW_SOCIAL_LOGIN:-false}
- ALLOW_REGISTRATION=${ALLOW_REGISTRATION:-false}
volumes:
- type: bind
source: ../files/librechat.yaml
target: /app/librechat.yaml
- librechat_data:/app/client/public/images
- librechat_data:/app/uploads
- librechat_data:/app/logs
mongodb:
image: mongo
restart: always
volumes:
- mongo_data:/data/db
command: mongod --noauth
meilisearch:
image: getmeili/meilisearch:v1.12.3
restart: always
environment:
- MEILI_HOST=http://meilisearch:7700
- MEILI_NO_ANALYTICS=true
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
volumes:
- meili_data:/meili_data
vectordb:
image: pgvector/pgvector:0.8.0-pg15-trixie
environment:
- POSTGRES_DB=${POSTGRES_DB:-mydatabase}
- POSTGRES_USER=${POSTGRES_USER:-myuser}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-mypassword}
restart: always
volumes:
- postgres_data:/var/lib/postgresql/data
rag_api:
image: ghcr.io/danny-avila/librechat-rag-api-dev-lite:latest
environment:
- DB_HOST=vectordb
- VECTOR_DB_TYPE=pgvector
- POSTGRES_DB=${POSTGRES_DB:-mydatabase}
- POSTGRES_USER=${POSTGRES_USER:-myuser}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-mypassword}
- RAG_PORT=${RAG_PORT:-8000}
- OPENAI_API_KEY=${OPENAI_API_KEY}
- RAG_OPENAI_API_KEY=${RAG_OPENAI_API_KEY}
- GOOGLE_KEY=${GOOGLE_KEY}
- RAG_GOOGLE_API_KEY=${RAG_GOOGLE_API_KEY}
- JWT_SECRET=${JWT_SECRET}
- COLLECTION_NAME=${COLLECTION_NAME:-librechat_collection}
- CHUNK_SIZE=${CHUNK_SIZE:-1500}
- CHUNK_OVERLAP=${CHUNK_OVERLAP:-100}
- EMBEDDINGS_PROVIDER=${EMBEDDINGS_PROVIDER:-openai}
- EMBEDDINGS_MODEL=${EMBEDDINGS_MODEL:-text-embedding-3-small}
- DEBUG_RAG_API=false
- DEBUG_PGVECTOR_QUERIES=false
- CONSOLE_JSON=false
restart: always
depends_on:
- vectordb
volumes:
mongo_data:
meili_data:
postgres_data:
librechat_data:
Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

+93
View File
@@ -0,0 +1,93 @@
[variables]
# Domain Configuration
main_domain = "${domain}"
# Security & Authentication
jwt_secret = "${password:64}"
jwt_refresh_secret = "${password:64}"
creds_key = "f34be427ebb29de8d88c107a71546019685ed8b241d8f2ed00c3df97ad2566f0"
creds_iv = "e2341419ec3dd3d19b13a1a87fafcbfb"
meili_master_key = "${password:32}"
# Database Configuration
mongo_password = "${password:16}"
postgresql_password = "${password:16}"
[config]
version = "1.0.0"
# Main service domain mapping
[[config.domains]]
serviceName = "librechat"
port = 3080
host = "${main_domain}"
[config.env]
# Basic Configuration
HOST="0.0.0.0"
PORT="3080"
DOMAIN_CLIENT="https://${main_domain}"
DOMAIN_SERVER="https://${main_domain}"
# Search Configuration
MEILI_MASTER_KEY="${meili_master_key}"
# Security
JWT_SECRET="${jwt_secret}"
JWT_REFRESH_SECRET="${jwt_refresh_secret}"
CREDS_KEY="${creds_key}"
CREDS_IV="${creds_iv}"
# API Keys
OPENAI_API_KEY=""
ANTHROPIC_API_KEY=""
GOOGLE_KEY=""
OPENROUTER_KEY=""
# Database
POSTGRES_DB="librechat_db"
POSTGRES_USER="librechat_user"
POSTGRES_PASSWORD="${postgresql_password}"
# Security & Sessions
# User Interface
APP_TITLE="LibreChat"
CUSTOM_FOOTER="Made with ❤️ by LibreChat"
ALLOW_EMAIL_LOGIN="true"
ALLOW_REGISTRATION="false"
ALLOW_SOCIAL_LOGIN="false"
# RAG
RAG_OPENAI_API_KEY=""
RAG_GOOGLE_API_KEY=""
EMBEDDINGS_PROVIDER="openai"
EMBEDDINGS_MODEL="text-embedding-3-small"
CHUNK_SIZE=1500
CHUNK_OVERLAP=100
[[config.mounts]]
filePath = "librechat.yaml"
content = """
### librechat.yaml configs ###
version: 1.2.8
cache: true
endpoints:
custom:
- name: "OpenRouter"
apiKey: "${OPENROUTER_KEY}"
baseURL: "https://openrouter.ai/api/v1"
models:
default: ["meta-llama/llama-3.3-70b-instruct:free"]
fetch: true
titleConvo: true
titleModel: "current_model"
summarize: false
summaryModel: "current_model"
forcePrompt: false
dropParams: ["stop"]
modelDisplayLabel: "OpenRouter"
"""
-3
View File
@@ -46,9 +46,6 @@ services:
volumes:
- redis-data:/data
networks:
libredesk:
volumes:
postgres-data:
redis-data:
-3
View File
@@ -31,9 +31,6 @@ services:
timeout: 5s
retries: 5
networks:
dokploy-network:
external: true
volumes:
logto-connectors:
+26
View File
@@ -0,0 +1,26 @@
# https://docs.mage.ai/getting-started/setup#docker-compose
#
# The default credentials are:
# USERNAME: admin@admin.com
# PASSWORD: admin
services:
mage-ai:
image: mageai/mageai:0.9.78
command: mage start ${PROJECT_NAME}
environment:
USER_CODE_PATH: /home/src/${PROJECT_NAME}
ENV: ${ENV}
expose:
- 6789
volumes:
- mageai_data:/home/src/
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-s", "-f", "-o", "/dev/null", "http://localhost:6789"]
interval: 30s
timeout: 10s
retries: 5
volumes:
mageai_data:
+38
View File
@@ -0,0 +1,38 @@
<!-- https://github.com/mage-ai/mage-ai/blob/14f0154629b33968535cf3e23bdf5fd1f4fa6957/docs/favicons/logo/m1.svg -->
<svg width="1000" height="1000" viewBox="0 0 1000 1000" fill="none"
xmlns="http://www.w3.org/2000/svg">
<path
d="M458.083 24.2003C484.021 9.22512 515.978 9.22511 541.916 24.2003L891.096 225.8C917.034 240.775 933.012 268.45 933.012 298.401V701.599C933.012 731.55 917.034 759.225 891.096 774.2L541.916 975.8C515.978 990.775 484.021 990.775 458.083 975.8L108.903 774.2C82.9652 759.225 66.9868 731.55 66.9868 701.599V298.401C66.9868 268.45 82.9652 240.775 108.903 225.8L458.083 24.2003Z"
fill="black" />
<path fill-rule="evenodd" clip-rule="evenodd"
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
fill="#313131" />
<path fill-rule="evenodd" clip-rule="evenodd"
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
fill="url(#paint0_linear_7285_95)" />
<path fill-rule="evenodd" clip-rule="evenodd"
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
fill="url(#paint1_linear_7285_95)" />
<path
d="M687.125 317.066L747.006 423.353L699.7 457.186L700.428 543.86V707.764L411.377 712.575H276.062L236.526 617.365L309.05 500.908L395.509 317.066H687.125Z"
fill="black" />
<path opacity="0.4"
d="M578.227 368.959L657.132 368.96L510.123 650.724L431.219 650.724L578.227 368.959Z"
fill="white" />
<path
d="M510.124 368.96L431.66 368.959L284.652 650.724H363.556L431.22 521.037V650.724H510.123V368.961L510.124 368.96Z"
fill="white" />
<path d="M578.228 368.96H657.131V650.724H578.228V368.96Z" fill="white" />
<defs>
<linearGradient id="paint0_linear_7285_95" x1="500" y1="74.4204" x2="272.155" y2="925.748"
gradientUnits="userSpaceOnUse">
<stop stop-color="#00FB82" stop-opacity="0" />
<stop offset="1" stop-color="#00FB82" />
</linearGradient>
<linearGradient id="paint1_linear_7285_95" x1="431.137" y1="500" x2="626.946" y2="191.018"
gradientUnits="userSpaceOnUse">
<stop stop-color="#1DE4FF" stop-opacity="0.1" />
<stop offset="1" stop-color="#0A7BFF" />
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

+11
View File
@@ -0,0 +1,11 @@
[variables]
main_domain = "${domain}"
[[config.domains]]
serviceName = "mage-ai"
port = 6789
host = "${main_domain}"
[config.env]
PROJECT_NAME = "mage-ai"
ENV = "production"
+29
View File
@@ -0,0 +1,29 @@
services:
web:
image: githubyumao/mcsmanager-web:latest
restart: unless-stopped
ports:
- 23333
volumes:
- /etc/localtime:/etc/localtime:ro
- mcsmanager-web-data:/opt/mcsmanager/web/data
- mcsmanager-web-logs:/opt/mcsmanager/web/logs
daemon:
image: githubyumao/mcsmanager-daemon:latest
restart: unless-stopped
ports:
- 24444
environment:
- MCSM_DOCKER_WORKSPACE_PATH=/opt/mcsmanager/daemon/data/InstanceData
volumes:
- /etc/localtime:/etc/localtime:ro
- mcsmanager-daemon-data:/opt/mcsmanager/daemon/data
- mcsmanager-daemon-logs:/opt/mcsmanager/daemon/logs
- /var/run/docker.sock:/var/run/docker.sock
volumes:
mcsmanager-web-data:
mcsmanager-web-logs:
mcsmanager-daemon-data:
mcsmanager-daemon-logs:
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

+12
View File
@@ -0,0 +1,12 @@
[variables]
main_domain = "${domain}"
[config]
env = []
mounts = []
[[config.domains]]
serviceName = "web"
port = 23333
host = "${main_domain}"
+134
View File
@@ -0,0 +1,134 @@
version: "3"
services:
migrations:
image: mediacms/mediacms:latest
volumes:
- mediacms_data:/home/mediacms.io/mediacms/media
- mediacms_static:/home/mediacms.io/mediacms/staticfiles
environment:
ENABLE_UWSGI: 'no'
ENABLE_NGINX: 'no'
ENABLE_CELERY_SHORT: 'no'
ENABLE_CELERY_LONG: 'no'
ENABLE_CELERY_BEAT: 'no'
ENABLE_MIGRATIONS: 'yes'
ADMIN_USER: 'admin'
ADMIN_EMAIL: 'admin@localhost'
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
DATABASE_HOST: db
DATABASE_PORT: 5432
DATABASE_USER: mediacms
DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
DATABASE_NAME: mediacms
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
REDIS_HOST: redis
REDIS_PORT: 6379
command: "./deploy/docker/prestart.sh"
restart: on-failure
depends_on:
redis:
condition: service_healthy
db:
condition: service_healthy
web:
image: mediacms/mediacms:latest
deploy:
replicas: 1
ports:
- 80
volumes:
- mediacms_data:/home/mediacms.io/mediacms/media
- mediacms_static:/home/mediacms.io/mediacms/staticfiles
environment:
ENABLE_CELERY_BEAT: 'no'
ENABLE_CELERY_SHORT: 'no'
ENABLE_CELERY_LONG: 'no'
ENABLE_MIGRATIONS: 'no'
DATABASE_HOST: db
DATABASE_PORT: 5432
DATABASE_USER: mediacms
DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
DATABASE_NAME: mediacms
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
REDIS_HOST: redis
REDIS_PORT: 6379
depends_on:
- migrations
celery_beat:
image: mediacms/mediacms:latest
volumes:
- mediacms_data:/home/mediacms.io/mediacms/media
- mediacms_static:/home/mediacms.io/mediacms/staticfiles
environment:
ENABLE_UWSGI: 'no'
ENABLE_NGINX: 'no'
ENABLE_CELERY_SHORT: 'no'
ENABLE_CELERY_LONG: 'no'
ENABLE_MIGRATIONS: 'no'
DATABASE_HOST: db
DATABASE_PORT: 5432
DATABASE_USER: mediacms
DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
DATABASE_NAME: mediacms
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
REDIS_HOST: redis
REDIS_PORT: 6379
depends_on:
- redis
celery_worker:
image: mediacms/mediacms:latest
deploy:
replicas: 1
volumes:
- mediacms_data:/home/mediacms.io/mediacms/media
- mediacms_static:/home/mediacms.io/mediacms/staticfiles
environment:
ENABLE_UWSGI: 'no'
ENABLE_NGINX: 'no'
ENABLE_CELERY_BEAT: 'no'
ENABLE_MIGRATIONS: 'no'
DATABASE_HOST: db
DATABASE_PORT: 5432
DATABASE_USER: mediacms
DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
DATABASE_NAME: mediacms
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
REDIS_HOST: redis
REDIS_PORT: 6379
depends_on:
- migrations
db:
image: postgres:17.2-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
restart: always
environment:
POSTGRES_USER: mediacms
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: mediacms
TZ: Europe/London
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: "redis:alpine"
restart: always
healthcheck:
test: ["CMD", "redis-cli","ping"]
interval: 10s
timeout: 5s
retries: 3
volumes:
postgres_data:
mediacms_data:
mediacms_static:
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="200" height="64" viewBox="0 0 200 64" xmlns="http://www.w3.org/2000/svg">
<text x="0" y="45" font-family="'Helvetica Neue', Helvetica, Arial, sans-serif" font-size="40" font-weight="200" fill="#FFFFFF">Media</text>
<text x="105" y="45" font-family="'Helvetica Neue', Helvetica, Arial, sans-serif" font-size="40" font-weight="200" fill="#00C853">CMS</text>
</svg>

After

Width:  |  Height:  |  Size: 419 B

+17
View File
@@ -0,0 +1,17 @@
[variables]
main_domain = "${domain}"
postgres_password = "${password}"
admin_password = "${password}"
[config]
mounts = []
[[config.domains]]
serviceName = "web"
port = 80
host = "${main_domain}"
[config.env]
POSTGRES_PASSWORD = "${postgres_password}"
ADMIN_PASSWORD = "${admin_password}"
+1 -1
View File
@@ -1,10 +1,10 @@
version: "3.8"
services:
minio:
# after RELEASE.2025-04-22T22-12-26Z, minio removed most of the admin UI, if you want to use the admin UI, uncomment the line below
# image: minio/minio:RELEASE.2025-04-22T22-12-26Z
# if you uncommented the line above, comment the line below
image: minio/minio
restart: unless-stopped
volumes:
# by default, the MinIO container will use a volume named minio-data
# to store its data. This volume is created automatically by Docker.
@@ -0,0 +1,22 @@
version: "3.8"
services:
mule:
image: yogeshmulecraft/mulece-esb:latest
restart: unless-stopped
ports:
- "8081"
environment:
- MULE_VERSION=${MULE_VERSION:-4.9.0}
- HTTP_PORT=${HTTP_PORT:-8081}
- MULE_HOME=/opt/mule-standalone
- MULE_BASE=/opt/mule-standalone
- TZ=UTC
- MULE_VERBOSE_EXCEPTIONS=true
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:${HTTP_PORT:-8081}/ || exit 0"]
interval: 60s
timeout: 20s
retries: 5
start_period: 120s
Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

+23
View File
@@ -0,0 +1,23 @@
# MuleSoft ESB Deployment Configuration
[variables]
main_domain = "${domain}"
timezone = "UTC"
mule_version = "4.9.0"
http_port = "8081"
[config]
[[config.domains]]
serviceName = "mule"
port = 8081
host = "${main_domain}"
path = "/"
[config.env]
MULE_VERSION = "${mule_version}"
HTTP_PORT = "${http_port}"
MULE_HOME = "/opt/mule-standalone"
MULE_BASE = "/opt/mule-standalone"
TZ = "${timezone}"
MULE_VERBOSE_EXCEPTIONS = "true"
+16
View File
@@ -0,0 +1,16 @@
services:
mumble-server:
image: mumblevoip/mumble-server:latest
restart: unless-stopped
ports:
- 64738
- 64738/udp
volumes:
- mumble-data:/data
environment:
- MUMBLE_SUPERUSER_PASSWORD=${SUPERUSER_PASSWORD}
- MUMBLE_CONFIG_WELCOMETEXT=${WELCOME_TEXT}
- MUMBLE_CONFIG_USERS=${MAX_USERS}
volumes:
mumble-data:
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

+12
View File
@@ -0,0 +1,12 @@
[variables]
superuser_password = "${password:32}"
welcome_text = "Welcome to Mumble Server! Low-latency voice chat."
max_users = "50"
[config]
[config.env]
SUPERUSER_PASSWORD = "${superuser_password}"
WELCOME_TEXT = "${welcome_text}"
MAX_USERS = "${max_users}"
@@ -30,7 +30,3 @@ services:
volumes:
nextcloud_data:
nextcloud_db_data:
networks:
dokploy-network:
external: true
+184
View File
@@ -0,0 +1,184 @@
services:
postgres:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_USER: oneuptime
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
POSTGRES_DB: oneuptime
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U oneuptime"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
environment:
REDISCLI_AUTH: ${REDIS_PASSWORD}
volumes:
- redis_data:/data
healthcheck:
test: ["CMD-SHELL", "redis-cli ping"]
interval: 10s
timeout: 5s
retries: 5
clickhouse:
image: clickhouse/clickhouse-server:23.8-alpine
restart: unless-stopped
environment:
CLICKHOUSE_DB: oneuptime
CLICKHOUSE_USER: default
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1
volumes:
- clickhouse_data:/var/lib/clickhouse
healthcheck:
test: ["CMD-SHELL", "clickhouse-client --query 'SELECT 1'"]
interval: 10s
timeout: 5s
retries: 5
home:
image: oneuptime/home:${ONEUPTIME_VERSION}
restart: unless-stopped
environment:
DATABASE_HOST: postgres
DATABASE_PORT: 5432
DATABASE_USERNAME: oneuptime
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
DATABASE_NAME: oneuptime
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ${REDIS_PASSWORD}
CLICKHOUSE_HOST: clickhouse
CLICKHOUSE_PORT: 8123
CLICKHOUSE_USER: default
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
CLICKHOUSE_DATABASE: oneuptime
SERVER_URL: http://${ONEUPTIME_HOST}
ENCRYPTION_SECRET: ${ENCRYPTION_SECRET}
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
clickhouse:
condition: service_healthy
dashboard:
image: oneuptime/dashboard:${ONEUPTIME_VERSION}
restart: unless-stopped
environment:
DATABASE_HOST: postgres
DATABASE_PORT: 5432
DATABASE_USERNAME: oneuptime
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
DATABASE_NAME: oneuptime
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ${REDIS_PASSWORD}
SERVER_URL: http://${ONEUPTIME_HOST}
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
accounts:
image: oneuptime/accounts:${ONEUPTIME_VERSION}
restart: unless-stopped
environment:
DATABASE_HOST: postgres
DATABASE_PORT: 5432
DATABASE_USERNAME: oneuptime
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
DATABASE_NAME: oneuptime
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ${REDIS_PASSWORD}
SERVER_URL: http://${ONEUPTIME_HOST}
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
status-page:
image: oneuptime/status-page:${ONEUPTIME_VERSION}
restart: unless-stopped
environment:
DATABASE_HOST: postgres
DATABASE_PORT: 5432
DATABASE_USERNAME: oneuptime
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
DATABASE_NAME: oneuptime
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ${REDIS_PASSWORD}
SERVER_URL: http://${ONEUPTIME_HOST}
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
app:
image: oneuptime/app:${ONEUPTIME_VERSION}
restart: unless-stopped
environment:
DATABASE_HOST: postgres
DATABASE_PORT: 5432
DATABASE_USERNAME: oneuptime
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
DATABASE_NAME: oneuptime
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ${REDIS_PASSWORD}
CLICKHOUSE_HOST: clickhouse
CLICKHOUSE_PORT: 8123
CLICKHOUSE_USER: default
CLICKHOUSE_PASSWORD: ${CLICKHOUSE_PASSWORD}
CLICKHOUSE_DATABASE: oneuptime
SERVER_URL: http://${ONEUPTIME_HOST}
ENCRYPTION_SECRET: ${ENCRYPTION_SECRET}
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
clickhouse:
condition: service_healthy
probe:
image: oneuptime/probe:${ONEUPTIME_VERSION}
restart: unless-stopped
environment:
DATABASE_HOST: postgres
DATABASE_PORT: 5432
DATABASE_USERNAME: oneuptime
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
DATABASE_NAME: oneuptime
SERVER_URL: http://${ONEUPTIME_HOST}
ONEUPTIME_URL: http://${ONEUPTIME_HOST}
ONEUPTIME_SECRET: ${ONEUPTIME_SECRET}
PROBE_KEY: ${PROBE_KEY}
PROBE_NAME: ${PROBE_NAME}
depends_on:
postgres:
condition: service_healthy
volumes:
postgres_data:
redis_data:
clickhouse_data:
+25
View File
@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<defs>
<linearGradient id="gradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#4F46E5;stop-opacity:1" />
<stop offset="100%" style="stop-color:#7C3AED;stop-opacity:1" />
</linearGradient>
</defs>
<!-- Background circle -->
<circle cx="256" cy="256" r="240" fill="url(#gradient)"/>
<!-- Uptime arrow/chart icon -->
<g fill="white">
<!-- Base line -->
<rect x="120" y="340" width="272" height="12" rx="6"/>
<!-- Vertical bars representing uptime -->
<rect x="140" y="260" width="40" height="80" rx="8"/>
<rect x="200" y="200" width="40" height="140" rx="8"/>
<rect x="260" y="160" width="40" height="180" rx="8"/>
<rect x="320" y="140" width="40" height="200" rx="8"/>
<!-- Up arrow -->
<path d="M 380 180 L 420 200 L 420 240 L 400 240 L 400 280 L 360 280 L 360 240 L 340 240 L 340 200 Z" opacity="0.9"/>
</g>
<!-- Check/tick mark overlay -->
<circle cx="380" cy="150" r="45" fill="#10B981"/>
<path d="M 360 150 L 375 165 L 400 140" stroke="white" stroke-width="8" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+30
View File
@@ -0,0 +1,30 @@
[variables]
main_domain = "${domain}"
oneuptime_version = "release"
database_password = "${password:32}"
redis_password = "${password:32}"
clickhouse_password = "${password:32}"
encryption_secret = "${password:64}"
oneuptime_secret = "${password:64}"
probe_key = "${password:32}"
probe_name = "Dokploy Probe"
[config]
env = [
"ONEUPTIME_HOST=${main_domain}",
"ONEUPTIME_VERSION=${oneuptime_version}",
"DATABASE_PASSWORD=${database_password}",
"REDIS_PASSWORD=${redis_password}",
"CLICKHOUSE_PASSWORD=${clickhouse_password}",
"ENCRYPTION_SECRET=${encryption_secret}",
"ONEUPTIME_SECRET=${oneuptime_secret}",
"PROBE_KEY=${probe_key}",
"PROBE_NAME=${probe_name}",
]
mounts = []
[[config.domains]]
serviceName = "home"
port = 3002
host = "${main_domain}"
+26
View File
@@ -0,0 +1,26 @@
version: "3.8"
services:
openinary:
image: openinary/openinary:${IMAGE_TAG:-latest}
pull_policy: always
restart: unless-stopped
expose:
- 3000
environment:
NODE_ENV: production
MODE: fullstack
NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL:-/api}
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
BETTER_AUTH_URL: ${BETTER_AUTH_URL}
ALLOWED_ORIGIN: ${ALLOWED_ORIGIN:-http://${domain}}
DOCKER_CONTAINER: "true"
volumes:
- cache-data:/app/apps/api/cache
- public-files:/app/apps/api/public
- db-data:/app/data
- db-data:/app/web-standalone/data
volumes:
cache-data:
public-files:
db-data:
+18
View File
@@ -0,0 +1,18 @@
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_58_6)">
<path d="M192.271 500.089C140.241 500.089 114.225 500.082 93.2175 493.075C52.5263 479.5 20.5887 447.563 7.01375 406.871C0.00749722 385.864 8.16246e-06 359.848 1.27111e-05 307.818L1.77754e-05 249.889L156.139 249.889L43.5238 297.763L76.9262 319.935L186.19 277.744L134.899 345.614L171.786 355.713L228.426 292.236L232.644 363.725L270.219 363.725L274.503 292.236L331.099 355.713L367.964 345.614L316.739 277.765L425.937 319.935L459.34 297.763L346.746 249.889L500 249.889L500 307.818C500 359.848 499.993 385.864 492.987 406.871C479.411 447.563 447.474 479.5 406.783 493.075C385.775 500.082 359.759 500.089 307.729 500.089L192.271 500.089Z" fill="white"/>
<rect y="131.18" width="500" height="233.853" rx="116.927" fill="white"/>
<path d="M208.22 500H192.261C150.806 500 125.865 499.993 106.812 496.449L217.075 350.43L208.22 500Z" fill="#FC1F1C"/>
<path d="M390.595 496.894C371.87 499.986 347.336 500.001 307.721 500.001H288.855L279.955 350.388L390.595 496.894Z" fill="#FC1F1C"/>
<path d="M495.886 395.884C495.081 399.716 494.133 403.318 492.978 406.782C485.413 429.458 472.132 449.402 454.826 464.977L330.492 325.549L495.886 395.884Z" fill="#FC1F1C"/>
<path d="M43.5623 463.491C27.0439 448.14 14.3367 428.751 7.00782 406.784C5.73871 402.979 4.68498 399.014 3.83398 394.755L166.543 325.574L43.5623 463.491Z" fill="#FC1F1C"/>
<path d="M500.011 307.73C500.011 321.786 499.971 333.944 499.833 344.616L352.172 287.576H500.011V307.73Z" fill="#FC1F1C"/>
<path d="M144.952 287.576L0.133167 343.508C0.00882632 333.103 0 321.301 0 307.73V287.576H144.952Z" fill="#FC1F1C"/>
<path d="M307.729 0C359.759 0 385.775 0.00692083 406.782 7.0135C447.474 20.5891 479.411 52.526 492.986 93.2174C499.993 114.225 500 140.241 500 192.271V250.2H343.861L456.476 202.326L423.074 180.154L313.81 222.345L365.101 154.475L328.214 144.376L271.574 207.853L267.356 136.364H229.781L225.498 207.853L168.901 144.376L132.036 154.475L183.261 222.324L74.0634 180.154L40.6605 202.326L153.254 250.2H0V192.271C0 140.241 0.00692083 114.225 7.0135 93.2174C20.5891 52.526 52.526 20.5891 93.2174 7.0135C114.225 0.00692083 140.241 0 192.271 0H307.729Z" fill="#FC1F1C"/>
</g>
<defs>
<clipPath id="clip0_58_6">
<rect width="500" height="500" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+40
View File
@@ -0,0 +1,40 @@
[variables]
main_domain = "${domain}"
image_tag = "latest"
better_auth_secret = "${password:64}"
better_auth_url = "http://${main_domain}"
allowed_origin = "http://${main_domain}"
next_public_api_base_url = "/api"
[config]
[[config.domains]]
serviceName = "openinary"
port = 3000
host = "${main_domain}"
[config.env]
IMAGE_TAG = "${image_tag}"
BETTER_AUTH_SECRET = "${better_auth_secret}"
BETTER_AUTH_URL = "${better_auth_url}"
ALLOWED_ORIGIN = "${allowed_origin}"
NEXT_PUBLIC_API_BASE_URL = "${next_public_api_base_url}"
[[config.mounts]]
serviceName = "openinary"
volumeName = "cache-data"
mountPath = "/app/apps/api/cache"
[[config.mounts]]
serviceName = "openinary"
volumeName = "public-files"
mountPath = "/app/apps/api/public"
[[config.mounts]]
serviceName = "openinary"
volumeName = "db-data"
mountPath = "/app/data"
[[config.mounts]]
serviceName = "openinary"
volumeName = "db-data"
mountPath = "/app/web-standalone/data"
+39 -64
View File
@@ -1,8 +1,12 @@
x-database: &x-database
DATABASE_URL: postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@op-db:5432/${OPENPANEL_POSTGRES_DB}?schema=public
DATABASE_URL_DIRECT: postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@op-db:5432/${OPENPANEL_POSTGRES_DB}?schema=public
REDIS_URL: redis://default:${SERVICE_PASSWORD_REDIS}@op-kv:6379
CLICKHOUSE_URL: ${OPENPANEL_CLICKHOUSE_URL:-http://op-ch:8123/openpanel}
x-common: &x-common
NODE_ENV: production
SELF_HOSTED: "true"
API_URL: ${API_URL}
DASHBOARD_URL: ${DASHBOARD_URL}
DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@op-db:5432/${POSTGRES_DB}?schema=public
DATABASE_URL_DIRECT: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@op-db:5432/${POSTGRES_DB}?schema=public
REDIS_URL: redis://default:${REDIS_PASSWORD}@op-kv:6379
CLICKHOUSE_URL: http://op-ch:8123/openpanel
services:
op-db:
@@ -11,44 +15,46 @@ services:
volumes:
- op-db-data:/var/lib/postgresql/data
healthcheck:
test: [ 'CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}' ]
test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}']
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_DB=${OPENPANEL_POSTGRES_DB}
- POSTGRES_USER=${SERVICE_USER_POSTGRES}
- POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
op-kv:
image: redis:7.2.5-alpine
restart: always
volumes:
- op-kv-data:/data
command: redis-server --requirepass ${SERVICE_PASSWORD_REDIS} --maxmemory-policy noeviction
command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory-policy noeviction
healthcheck:
test: [CMD, redis-cli, -a, "${SERVICE_PASSWORD_REDIS}", ping]
test: ['CMD', 'redis-cli', '-a', '${REDIS_PASSWORD}', 'ping']
interval: 10s
timeout: 5s
retries: 5
op-ch:
image: clickhouse/clickhouse-server:24.3.2-alpine
image: clickhouse/clickhouse-server:25.10.2.65
restart: always
volumes:
- op-ch-data:/var/lib/clickhouse
- op-ch-logs:/var/log/clickhouse-server
- ../files/clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/op-config.xml:ro
- ../files/clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/op-user-config.xml:ro
- ../files/clickhouse/init-db.sql:/docker-entrypoint-initdb.d/1_init-db.sql:ro
- ../files/clickhouse_config:/etc/clickhouse-server/config.d
- ../files/clickhouse_users:/etc/clickhouse-server/users.d
- ../files/clickhouse_init:/docker-entrypoint-initdb.d
environment:
- CLICKHOUSE_SKIP_USER_SETUP=1
healthcheck:
test: [CMD-SHELL, 'clickhouse-client --query "SELECT 1" -d openpanel']
test: ['CMD-SHELL', 'clickhouse-client --query "SELECT 1" -d openpanel']
interval: 10s
timeout: 5s
retries: 5
op-api:
image: lindesvard/openpanel-api:${OP_API_VERSION:-latest}
image: lindesvard/openpanel-api:2.0.0
restart: always
command: >
sh -c "
@@ -57,39 +63,28 @@ services:
sleep 1
done
echo 'PostgreSQL is ready'
echo 'Waiting for ClickHouse to be ready...'
while ! nc -z op-ch 8123; do
sleep 1
done
echo 'ClickHouse is ready'
echo 'Running migrations...'
echo '$DATABASE_URL'
CI=true pnpm -r run migrate:deploy
pnpm start
"
environment:
# Common
NODE_ENV: production
NEXT_PUBLIC_SELF_HOSTED: true
# URLs
SERVICE_FQDN_OPAPI: /api
# Set coolify FQDN domain
NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
NEXT_PUBLIC_DASHBOARD_URL: $SERVICE_FQDN_OPDASHBOARD
# Others
COOKIE_SECRET: ${SERVICE_BASE64_COOKIESECRET}
ALLOW_REGISTRATION: ${OPENPANEL_ALLOW_REGISTRATION:-false}
ALLOW_INVITATION: ${OPENPANEL_ALLOW_INVITATION:-true}
EMAIL_SENDER: ${OPENPANEL_EMAIL_SENDER}
COOKIE_SECRET: ${COOKIE_SECRET}
ALLOW_REGISTRATION: ${ALLOW_REGISTRATION}
ALLOW_INVITATION: ${ALLOW_INVITATION}
EMAIL_SENDER: ${EMAIL_SENDER}
RESEND_API_KEY: ${RESEND_API_KEY}
<<: *x-database
<<: *x-common
healthcheck:
test: [ "CMD-SHELL", "curl -f http://localhost:3000/healthcheck || exit 1" ]
test: ['CMD-SHELL', 'curl -f http://localhost:3000/healthcheck || exit 1']
interval: 10s
timeout: 5s
retries: 5
@@ -102,55 +97,35 @@ services:
condition: service_healthy
op-dashboard:
image: lindesvard/openpanel-dashboard:${OP_DASHBOARD_VERSION:-latest}
image: lindesvard/openpanel-dashboard:2.0.0
restart: always
depends_on:
op-api:
condition: service_healthy
environment:
# Common
NODE_ENV: production
NEXT_PUBLIC_SELF_HOSTED: true
# URLs
SERVICE_FQDN_OPDASHBOARD:
# Set coolify FQDN domain
NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
NEXT_PUBLIC_DASHBOARD_URL: $SERVICE_FQDN_OPDASHBOARD
<<: *x-database
<<: *x-common
healthcheck:
test: [ 'CMD-SHELL', 'curl -f http://localhost:3000/api/healthcheck || exit 1' ]
test: ['CMD-SHELL', 'curl -f http://localhost:3000/api/healthcheck || exit 1']
interval: 10s
timeout: 5s
retries: 5
op-worker:
image: lindesvard/openpanel-worker:${OP_WORKER_VERSION:-latest}
image: lindesvard/openpanel-worker:2.0.0
restart: always
depends_on:
op-api:
condition: service_healthy
environment:
# FQDN
SERVICE_FQDN_OPBULLBOARD:
# Common
NODE_ENV=production:
NEXT_PUBLIC_SELF_HOSTED: true
# Set coolify FQDN domain
NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
<<: *x-database
<<: *x-common
healthcheck:
test: [ 'CMD-SHELL', 'curl -f http://localhost:3000/healthcheck || exit 1' ]
test: ['CMD-SHELL', 'curl -f http://localhost:3000/healthcheck || exit 1']
interval: 10s
timeout: 5s
retries: 5
deploy:
mode: replicated
replicas: $OP_WORKER_REPLICAS
volumes:
op-db-data:
op-kv-data:
op-ch-data:
op-ch-logs:
op-proxy-data:
op-proxy-config:
+58 -49
View File
@@ -1,82 +1,91 @@
[variables]
main_domain = "${domain}"
api_domain = "${domain}"
db_password = "${password}"
db_password = "${password:32}"
cookie_secret = "${base64:32}"
redis_password = "${password}"
redis_password = "${password:32}"
[config]
# ClickHouse config files - mounted as directories
[[config.mounts]]
filePath = "clickhouse/clickhouse-config.xml"
filePath = "./clickhouse_config/op-config.xml"
content = """
<clickhouse>
<logger>
<level>warning</level>
<console>true</console>
</logger>
<keep_alive_timeout>10</keep_alive_timeout>
<!-- Stop all the unnecessary logging -->
<query_thread_log remove="remove"/>
<query_log remove="remove"/>
<text_log remove="remove"/>
<trace_log remove="remove"/>
<metric_log remove="remove"/>
<asynchronous_metric_log remove="remove"/>
<session_log remove="remove"/>
<part_log remove="remove"/>
<listen_host>0.0.0.0</listen_host>
<interserver_listen_host>0.0.0.0</interserver_listen_host>
<interserver_http_host>opch</interserver_http_host>
<!-- Disable cgroup memory observer -->
<cgroups_memory_usage_observer_wait_time>0</cgroups_memory_usage_observer_wait_time>
<!-- Not used anymore, but kept for backwards compatibility -->
<macros>
<shard>1</shard>
<replica>replica1</replica>
<cluster>openpanel_cluster</cluster>
</macros>
</clickhouse>
<clickhouse>
<logger>
<level>warning</level>
<console>true</console>
</logger>
<keep_alive_timeout>10</keep_alive_timeout>
<!-- Stop all the unnecessary logging -->
<query_thread_log remove="remove"/>
<query_log remove="remove"/>
<text_log remove="remove"/>
<trace_log remove="remove"/>
<metric_log remove="remove"/>
<asynchronous_metric_log remove="remove"/>
<session_log remove="remove"/>
<part_log remove="remove"/>
<listen_host>0.0.0.0</listen_host>
<interserver_listen_host>0.0.0.0</interserver_listen_host>
<interserver_http_host>opch</interserver_http_host>
<!-- Disable cgroup memory observer -->
<cgroups_memory_usage_observer_wait_time>0</cgroups_memory_usage_observer_wait_time>
<!-- Not used anymore, but kept for backwards compatibility -->
<macros>
<shard>1</shard>
<replica>replica1</replica>
<cluster>openpanel_cluster</cluster>
</macros>
</clickhouse>
"""
[[config.mounts]]
filePath = "clickhouse/clickhouse-user-config.xml"
filePath = "./clickhouse_users/op-user-config.xml"
content = """
<clickhouse>
<profiles>
<clickhouse>
<profiles>
<default>
<log_queries>0</log_queries>
<log_query_threads>0</log_query_threads>
</default>
</profiles>
</clickhouse>
</clickhouse>
"""
[[config.mounts]]
filePath = "clickhouse/init-db.sql"
filePath = "./clickhouse_init/1_init-db.sql"
content = """
CREATE DATABASE IF NOT EXISTS openpanel;
"""
[[config.domains]]
serviceName = "op-dashboard"
port = 3_000
port = 3000
host = "${main_domain}"
[[config.domains]]
serviceName = "op-api"
port = 3_000
host = "${api_domain}"
port = 3000
host = "${main_domain}"
path = "/api"
stripPath = true
[config.env]
SERVICE_FQDN_OPDASHBOARD = "http://${main_domain}"
SERVICE_FQDN_OPAPI = "http://${api_domain}"
OPENPANEL_POSTGRES_DB = "openpanel-db"
SERVICE_USER_POSTGRES = "openpanel"
SERVICE_PASSWORD_POSTGRES = "${db_password}"
SERVICE_PASSWORD_REDIS = "${redis_password}"
SERVICE_BASE64_COOKIESECRET = "${cookie_secret}"
OP_WORKER_REPLICAS = "1"
DASHBOARD_URL = "http://${main_domain}"
API_URL = "http://${main_domain}/api"
# Database configuration
POSTGRES_DB = "openpanel"
POSTGRES_USER = "openpanel"
POSTGRES_PASSWORD = "${db_password}"
REDIS_PASSWORD = "${redis_password}"
# Security
COOKIE_SECRET = "${cookie_secret}"
# Registration settings
ALLOW_REGISTRATION = "true"
ALLOW_INVITATION = "true"
# Email configuration (optional - configure for email notifications)
EMAIL_SENDER = ""
RESEND_API_KEY = ""
OPENPANEL_ALLOW_REGISTRATION = "true"
OPENPANEL_ALLOW_INVITATION = "true"
+23
View File
@@ -0,0 +1,23 @@
version: "3.8"
services:
parseable:
image: parseable/parseable:v1.6.0
command: parseable local-store
restart: unless-stopped
volumes:
- parseable-staging:/parseable/staging
- parseable-data:/parseable/data
environment:
- P_ADDR=0.0.0.0:8000
- P_USERNAME=${PARSEABLE_USERNAME}
- P_PASSWORD=${PARSEABLE_PASSWORD}
- P_STAGING_DIR=/parseable/staging
- P_FS_DIR=/parseable/data
ports:
- 8000
- 8001
- 8002
volumes:
parseable-staging: {}
parseable-data: {}
+70
View File
@@ -0,0 +1,70 @@
<svg width="273" height="42" viewBox="0 0 273 42" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M35.2135 23.2556L19.1407 39.3284C18.4321 40.037 18.9903 41.2523 19.9879 41.1732C24.2476 40.8406 28.4162 39.0473 31.6743 35.7892C34.9324 32.5311 36.7258 28.3624 37.0583 24.1028C37.1375 23.1012 35.9221 22.543 35.2135 23.2556Z" fill="#3A3A8C"/>
<path d="M35.3482 14.717L35.3205 14.6576C34.3704 12.6544 31.7457 12.1675 30.182 13.7352L9.62384 34.2933C8.05615 35.861 8.54309 38.4817 10.5463 39.4318L10.6056 39.4595C11.8091 40.0257 13.2382 39.7525 14.1804 38.8143L34.7029 18.2918C35.6412 17.3535 35.9143 15.9204 35.3482 14.717Z" fill="#3A3A8C"/>
<path d="M17.9213 5.96275C18.6299 5.25412 18.0717 4.03877 17.0741 4.11794C12.8144 4.45048 8.64576 6.24383 5.38766 9.50193C2.12956 12.76 0.336226 16.9287 0.0036852 21.1883C-0.0754911 22.1899 1.13985 22.7481 1.84848 22.0355L17.9213 5.96275Z" fill="#3A3A8C"/>
<path d="M4.71905 24.6381L2.35962 26.9976C1.4095 27.9477 1.15613 29.3926 1.73016 30.608L1.75391 30.6634C2.69215 32.6547 5.32476 33.11 6.88058 31.5542L9.25586 29.1789C10.5108 27.9239 10.5108 25.8931 9.25586 24.6381C8.00092 23.3832 5.97004 23.3832 4.71509 24.6381H4.71905Z" fill="#3A3A8C"/>
<path d="M16.7027 21.7362L27.4429 10.9959C28.9988 9.44012 28.5435 6.81146 26.5522 5.86927L26.4968 5.84551C25.2814 5.27149 23.8365 5.52089 22.8863 6.47496L12.1619 17.1994C10.907 18.4543 10.907 20.4852 12.1619 21.7402C13.4169 22.9951 15.4477 22.9951 16.7027 21.7402V21.7362Z" fill="#00A896"/>
<path d="M49.2139 7.77294H55.4609V10.7262C57.4799 8.31529 60.3817 7.28204 63.331 7.28204C70.1204 7.28204 74.4514 12.9907 74.4514 20.0255C74.4514 27.0603 70.0214 32.8679 63.2321 32.8679C60.3778 32.8679 57.5749 31.7356 55.8014 29.5702V39.4593H49.21V7.77294H49.2139ZM67.7134 20.073C67.7134 16.1854 65.2036 13.3826 61.6129 13.3826C58.2677 13.3826 55.7578 16.1379 55.7578 20.073C55.7578 24.008 58.2163 26.7634 61.6129 26.7634C65.2036 26.7634 67.7134 23.9605 67.7134 20.073Z" fill="#3A3A8C"/>
<mask id="mask0_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="49" y="7" width="26" height="33">
<path d="M49.2139 7.77294H55.4609V10.7262C57.4799 8.31529 60.3817 7.28204 63.331 7.28204C70.1204 7.28204 74.4514 12.9907 74.4514 20.0255C74.4514 27.0603 70.0214 32.8679 63.2321 32.8679C60.3778 32.8679 57.5749 31.7356 55.8014 29.5702V39.4593H49.21V7.77294H49.2139ZM67.7134 20.073C67.7134 16.1854 65.2036 13.3826 61.6129 13.3826C58.2677 13.3826 55.7578 16.1379 55.7578 20.073C55.7578 24.008 58.2163 26.7634 61.6129 26.7634C65.2036 26.7634 67.7134 23.9605 67.7134 20.073Z" fill="white"/>
</mask>
<g mask="url(#mask0_694_4489)">
<path d="M281.79 -3.60468H42.8398V53.6556H281.79V-3.60468Z" fill="#3A3A8C"/>
</g>
<path d="M77.9941 20.073C77.9941 12.9867 82.3251 7.28204 89.1144 7.28204C91.9687 7.28204 95.017 8.41426 96.7906 10.7737V7.77294H103.236V32.373H96.7906V29.4197C95.0685 31.7831 91.9687 32.8639 89.1144 32.8639C82.3251 32.8639 77.9941 27.1553 77.9941 20.073ZM96.6401 20.073C96.6401 16.2329 94.1817 13.3826 90.7851 13.3826C87.3884 13.3826 84.6845 16.2369 84.6845 20.073C84.6845 23.9091 87.2419 26.7634 90.7851 26.7634C94.3282 26.7634 96.6401 24.008 96.6401 20.073Z" fill="#3A3A8C"/>
<mask id="mask1_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="77" y="7" width="27" height="26">
<path d="M77.9941 20.073C77.9941 12.9867 82.3251 7.28204 89.1144 7.28204C91.9687 7.28204 95.017 8.41426 96.7906 10.7737V7.77294H103.236V32.373H96.7906V29.4197C95.0685 31.7831 91.9687 32.8639 89.1144 32.8639C82.3251 32.8639 77.9941 27.1553 77.9941 20.073ZM96.6401 20.073C96.6401 16.2329 94.1817 13.3826 90.7851 13.3826C87.3884 13.3826 84.6845 16.2369 84.6845 20.073C84.6845 23.9091 87.2419 26.7634 90.7851 26.7634C94.3282 26.7634 96.6401 24.008 96.6401 20.073Z" fill="white"/>
</mask>
<g mask="url(#mask1_694_4489)">
<path d="M281.972 -3.64346H43.0225V53.6168H281.972V-3.64346Z" fill="#3A3A8C"/>
</g>
<path d="M108.252 7.77294H114.744V12.4958C115.433 10.4808 117.943 7.28204 123.355 7.28204V14.4673C117.646 14.4673 114.843 17.0761 114.843 22.9312V32.377H108.252V7.77294Z" fill="#3A3A8C"/>
<mask id="mask2_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="108" y="7" width="16" height="26">
<path d="M108.252 7.7907H114.744V12.5136C115.433 10.4985 117.943 7.2998 123.355 7.2998V14.4851C117.646 14.4851 114.843 17.0939 114.843 22.949V32.3947H108.252V7.7907Z" fill="white"/>
</mask>
<g mask="url(#mask2_694_4489)">
<path d="M281.972 -3.6254H43.0225V53.6349H281.972V-3.6254Z" fill="#3A3A8C"/>
</g>
<path d="M125.667 29.5187L128.03 24.4514C129.705 25.7301 132.017 27.0603 135.707 27.0603C137.231 27.0603 139.741 26.4704 139.741 24.9938C139.741 23.5171 137.627 23.1727 135.509 22.5829C130.639 21.3042 126.653 19.681 126.653 14.9582C126.653 9.93841 131.574 7.28204 136.197 7.28204C140.232 7.28204 142.789 8.26779 145.35 9.74047L143.137 14.6613C140.726 13.4815 138.462 12.9392 136.3 12.9392C134.776 12.9392 133.347 13.628 133.347 14.6613C133.347 16.0389 135.414 16.4823 137.678 16.9732C141.859 17.959 146.435 19.7761 146.435 24.7958C146.435 30.8489 140.283 32.8639 135.711 32.8639C130.445 32.8639 127.053 30.7974 125.675 29.5187H125.667Z" fill="#3A3A8C"/>
<mask id="mask3_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="125" y="7" width="22" height="26">
<path d="M125.667 29.5187L128.03 24.4514C129.705 25.7301 132.017 27.0603 135.707 27.0603C137.231 27.0603 139.741 26.4704 139.741 24.9938C139.741 23.5171 137.627 23.1727 135.509 22.5829C130.639 21.3042 126.653 19.681 126.653 14.9582C126.653 9.93841 131.574 7.28204 136.197 7.28204C140.232 7.28204 142.789 8.26779 145.35 9.74047L143.137 14.6613C140.726 13.4815 138.462 12.9392 136.3 12.9392C134.776 12.9392 133.347 13.628 133.347 14.6613C133.347 16.0389 135.414 16.4823 137.678 16.9732C141.859 17.959 146.435 19.7761 146.435 24.7958C146.435 30.8489 140.283 32.8639 135.711 32.8639C130.445 32.8639 127.053 30.7974 125.675 29.5187H125.667Z" fill="white"/>
</mask>
<g mask="url(#mask3_694_4489)">
<path d="M281.972 -3.64325H43.0225V53.617H281.972V-3.64325Z" fill="#3A3A8C"/>
</g>
<path d="M149.63 20.073C149.63 12.9867 155.141 7.28204 162.373 7.28204C169.064 7.28204 174.329 12.9907 174.329 19.974C174.329 21.1537 174.182 22.3374 174.182 22.3374H156.324C157.112 25.7301 159.915 27.3572 163.165 27.3572C165.525 27.3572 167.987 26.6684 169.808 25.4372L172.266 30.16C169.511 31.9811 166.312 32.8639 163.118 32.8639C155.932 32.8639 149.638 28.1885 149.638 20.073H149.63ZM168.129 17.959C167.639 14.8592 165.176 12.7927 162.175 12.7927C159.175 12.7927 156.863 14.8592 156.221 17.959H168.129Z" fill="#3A3A8C"/>
<mask id="mask4_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="149" y="7" width="26" height="26">
<path d="M149.63 20.073C149.63 12.9867 155.141 7.28204 162.373 7.28204C169.064 7.28204 174.329 12.9907 174.329 19.974C174.329 21.1537 174.182 22.3374 174.182 22.3374H156.324C157.112 25.7301 159.915 27.3572 163.165 27.3572C165.525 27.3572 167.987 26.6684 169.808 25.4372L172.266 30.16C169.511 31.9811 166.312 32.8639 163.118 32.8639C155.932 32.8639 149.638 28.1885 149.638 20.073H149.63ZM168.129 17.959C167.639 14.8592 165.176 12.7927 162.175 12.7927C159.175 12.7927 156.863 14.8592 156.221 17.959H168.129Z" fill="white"/>
</mask>
<g mask="url(#mask4_694_4489)">
<path d="M281.972 -3.64346H43.0225V53.6168H281.972V-3.64346Z" fill="#3A3A8C"/>
</g>
<path d="M177.915 20.073C177.915 12.9867 182.246 7.28204 189.035 7.28204C191.89 7.28204 194.938 8.41426 196.711 10.7737V7.77294H203.156V32.373H196.711V29.4197C194.989 31.7831 191.89 32.8639 189.035 32.8639C182.246 32.8639 177.915 27.1553 177.915 20.073ZM196.561 20.073C196.561 16.2329 194.103 13.3826 190.706 13.3826C187.309 13.3826 184.605 16.2369 184.605 20.073C184.605 23.9091 187.163 26.7634 190.706 26.7634C194.249 26.7634 196.561 24.008 196.561 20.073Z" fill="#3A3A8C"/>
<mask id="mask5_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="177" y="7" width="27" height="26">
<path d="M177.915 20.073C177.915 12.9867 182.246 7.28204 189.035 7.28204C191.89 7.28204 194.938 8.41426 196.711 10.7737V7.77294H203.156V32.373H196.711V29.4197C194.989 31.7831 191.89 32.8639 189.035 32.8639C182.246 32.8639 177.915 27.1553 177.915 20.073ZM196.561 20.073C196.561 16.2329 194.103 13.3826 190.706 13.3826C187.309 13.3826 184.605 16.2369 184.605 20.073C184.605 23.9091 187.163 26.7634 190.706 26.7634C194.249 26.7634 196.561 24.008 196.561 20.073Z" fill="white"/>
</mask>
<g mask="url(#mask5_694_4489)">
<path d="M281.972 -3.64325H43.0225V53.617H281.972V-3.64325Z" fill="#3A3A8C"/>
</g>
<path d="M214.424 29.4179V32.3712H208.177V0H214.768V10.5304C216.542 8.41644 219.345 7.28422 222.199 7.28422C228.988 7.28422 233.414 12.9928 233.414 20.0751C233.414 27.1575 229.083 32.8661 222.294 32.8661C219.341 32.8661 216.241 31.7853 214.424 29.4219V29.4179ZM226.724 20.0712C226.724 16.2311 224.166 13.3808 220.623 13.3808C217.08 13.3808 214.768 16.2351 214.768 20.0712C214.768 23.9073 217.278 26.7616 220.623 26.7616C224.166 26.7616 226.724 23.9587 226.724 20.0712Z" fill="#3A3A8C"/>
<mask id="mask6_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="208" y="0" width="26" height="33">
<path d="M214.426 29.4179V32.3712H208.179V0H214.77V10.5304C216.544 8.41644 219.347 7.28422 222.201 7.28422C228.99 7.28422 233.416 12.9928 233.416 20.0751C233.416 27.1575 229.085 32.8661 222.296 32.8661C219.343 32.8661 216.243 31.7853 214.426 29.4219V29.4179ZM226.726 20.0712C226.726 16.2311 224.168 13.3808 220.625 13.3808C217.082 13.3808 214.77 16.2351 214.77 20.0712C214.77 23.9073 217.28 26.7616 220.625 26.7616C224.168 26.7616 226.726 23.9587 226.726 20.0712Z" fill="white"/>
</mask>
<g mask="url(#mask6_694_4489)">
<path d="M281.974 -3.64355H43.0244V53.6167H281.974V-3.64355Z" fill="#3A3A8C"/>
</g>
<path d="M237.694 0H244.286V32.3712H237.694V0Z" fill="#3A3A8C"/>
<mask id="mask7_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="237" y="0" width="8" height="33">
<path d="M237.696 0H244.288V32.3712H237.696V0Z" fill="white"/>
</mask>
<g mask="url(#mask7_694_4489)">
<path d="M281.975 -3.64355H43.0254V53.6167H281.975V-3.64355Z" fill="#3A3A8C"/>
</g>
<path d="M247.663 19.8271C247.663 12.7408 253.174 7.03613 260.407 7.03613C267.097 7.03613 272.362 12.7447 272.362 19.7281C272.362 20.9078 272.216 22.0915 272.216 22.0915H254.357C255.145 25.4842 257.948 27.1113 261.194 27.1113C263.558 27.1113 266.016 26.4224 267.837 25.1912L270.296 29.9141C267.54 31.7352 264.342 32.618 261.143 32.618C253.958 32.618 247.663 27.9426 247.663 19.8271ZM266.163 17.7131C265.672 14.6133 263.209 12.5468 260.209 12.5468C257.208 12.5468 254.896 14.6133 254.255 17.7131H266.163Z" fill="#3A3A8C"/>
<mask id="mask8_694_4489" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="247" y="7" width="26" height="26">
<path d="M247.665 19.8266C247.665 12.7403 253.176 7.03564 260.408 7.03564C267.099 7.03564 272.364 12.7443 272.364 19.7276C272.364 20.9073 272.218 22.091 272.218 22.091H254.359C255.147 25.4837 257.95 27.1108 261.196 27.1108C263.56 27.1108 266.018 26.422 267.839 25.1908L270.298 29.9136C267.542 31.7347 264.344 32.6175 261.145 32.6175C253.96 32.6175 247.665 27.9421 247.665 19.8266ZM266.165 17.7126C265.674 14.6128 263.211 12.5463 260.211 12.5463C257.21 12.5463 254.898 14.6128 254.256 17.7126H266.165Z" fill="white"/>
</mask>
<g mask="url(#mask8_694_4489)">
<path d="M281.805 -4.62891H42.8555V52.6314H281.805V-4.62891Z" fill="#3A3A8C"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

+16
View File
@@ -0,0 +1,16 @@
[variables]
main_domain = "${domain}"
parseable_username = "${username}"
parseable_password = "${password:32}"
[config]
[[config.domains]]
serviceName = "parseable"
port = 8000
host = "${main_domain}"
[config.env]
PARSEABLE_USERNAME = "${parseable_username}"
PARSEABLE_PASSWORD = "${parseable_password}"
+79
View File
@@ -0,0 +1,79 @@
# =============================================================================
# PASSBOLT TEMPLATE - SETUP INSTRUCTIONS
# =============================================================================
#
# After successful deployment, you need to create an admin user:
#
# 1. Go to your Dokploy dashboard
# 2. Navigate to your Passbolt application
# 3. Wait for both containers to be healthy - check the "Monitoring" tab
# 4. Go to the "General" tab and click "Open Terminal" button
# 5. In the terminal, run this command to create admin user:
# su -s /bin/bash -c "/usr/share/php/passbolt/bin/cake passbolt register_user -u youremail@example.com -f FirstName -l LastName -r admin" www-data
# 6. Replace youremail@example.com, FirstName, LastName with your actual details
# 7. The command will output a registration link - copy and paste it in your browser to complete setup
#
# NOTE: If you change the domain after deployment, you will need to manually
# update the PASSBOLT_APP_FULL_BASE_URL environment variable in the "Environment" tab.
# =============================================================================
services:
passbolt:
image: passbolt/passbolt:latest-ce
environment:
APP_FULL_BASE_URL: ${PASSBOLT_APP_FULL_BASE_URL}
DATASOURCES_DEFAULT_HOST: ${PASSBOLT_DB_HOST}
DATASOURCES_DEFAULT_PORT: ${PASSBOLT_DB_PORT}
DATASOURCES_DEFAULT_USERNAME: ${PASSBOLT_DB_USER}
DATASOURCES_DEFAULT_PASSWORD: ${PASSBOLT_DB_PASSWORD}
DATASOURCES_DEFAULT_DATABASE: ${PASSBOLT_DB_NAME}
PASSBOLT_PLUGINS_JWT_AUTHENTICATION_ENABLED: ${PASSBOLT_PLUGINS_JWT_AUTHENTICATION_ENABLED}
EMAIL_DEFAULT_FROM: ${PASSBOLT_EMAIL_FROM}
EMAIL_TRANSPORT_DEFAULT_HOST: ${PASSBOLT_EMAIL_HOST}
EMAIL_TRANSPORT_DEFAULT_PORT: ${PASSBOLT_EMAIL_PORT}
EMAIL_TRANSPORT_DEFAULT_USERNAME: ${PASSBOLT_EMAIL_USER}
EMAIL_TRANSPORT_DEFAULT_PASSWORD: ${PASSBOLT_EMAIL_PASS}
EMAIL_TRANSPORT_DEFAULT_TLS: ${PASSBOLT_EMAIL_TLS}
volumes:
- gpg_volume:/etc/passbolt/gpg
- jwt_volume:/etc/passbolt/jwt
command:
- /usr/bin/wait-for.sh
- "-t"
- "0"
- "${PASSBOLT_DB_HOST}:${PASSBOLT_DB_PORT}"
- "--"
- /docker-entrypoint.sh
depends_on:
mariadb:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:80"]
interval: 5s
timeout: 20s
retries: 10
mariadb:
image: mariadb:11
environment:
MARIADB_ROOT_PASSWORD: ${PASSBOLT_DB_ROOT_PASSWORD}
MARIADB_DATABASE: ${PASSBOLT_DB_NAME}
MARIADB_USER: ${PASSBOLT_DB_USER}
MARIADB_PASSWORD: ${PASSBOLT_DB_PASSWORD}
volumes:
- passbolt_mariadb_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mariadb-admin", "ping", "-h", "localhost", "--silent"]
interval: 10s
timeout: 5s
retries: 5
volumes:
gpg_volume: {}
jwt_volume: {}
passbolt_mariadb_data: {}
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 -11.5 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M137.909029,-1.42108547e-14 L138.299882,0.00665661441 L139.385479,0.058225354 C144.798564,0.43000267 149.972107,2.50593255 154.184596,6.06768781 L155.014066,6.79978518 L155.800417,7.55667891 L248.925059,101.10948 C258.253112,110.478741 258.336122,125.115979 249.298721,134.753634 L248.668404,135.402879 L248.021048,136.024321 L151.471312,225.509442 C141.706629,234.563959 126.65745,234.838713 116.794145,226.278968 L116.114553,225.667442 L115.462423,225.035796 L61.5142946,170.873587 C60.7818881,170.138274 60.9019526,168.917458 61.7635739,168.338914 C73.1512822,160.692529 81.4377541,149.275295 85.0279509,136.172686 L85.3712573,134.856884 L85.6961343,133.473353 C85.8493708,132.820775 86.3779379,132.335554 87.020905,132.224445 L87.3027056,132.200334 L127.549722,132.200334 C128.359872,132.200334 129.033672,132.784118 129.173404,133.553966 L129.199992,133.850604 L129.199992,149.478435 C129.199992,154.222094 132.74898,158.145884 137.337533,158.681753 L137.892989,158.729631 L138.467796,158.746239 L158.270185,158.746239 C163.013844,158.746239 166.937634,155.197251 167.473503,150.608698 L167.521381,150.053242 L167.537989,149.478435 L167.537989,133.850604 C167.537989,133.040454 168.121772,132.366654 168.89162,132.226922 L169.188258,132.200334 L176.252894,132.200334 C181.084451,132.200334 185.033328,128.625645 185.564912,123.955751 L185.612136,123.390266 L185.627738,122.82549 L185.627738,112.549656 C185.627738,107.695532 182.030926,103.672904 177.379762,103.131755 L176.816725,103.083698 L176.252894,103.067772 L85.1619068,103.067772 C84.4705096,103.067772 83.8524089,102.636779 83.6133884,101.988011 C78.8618873,89.091124 69.4434357,78.2982105 57.238194,71.6262684 L56.0084501,70.9728855 L54.7717556,70.3523729 C53.8356353,69.8826736 53.5878579,68.6944707 54.1855354,67.8940896 L54.3903594,67.6667163 L119.791162,7.08249617 C124.188153,3.00527816 129.749747,0.573963824 135.555952,0.117913872 L136.661296,0.0393970067 L137.519706,0.00322737148 L137.909029,-1.42108547e-14 Z M28.6493897,93.4974121 C44.4647034,93.4974121 57.2987782,106.077272 57.2987782,121.61201 C57.2987782,137.146744 44.4647015,149.726608 28.6493897,149.726608 C12.8340773,149.726608 0,137.146744 0,121.61201 C0,106.077272 12.8340754,93.4974121 28.6493897,93.4974121 Z" fill="#D40000">
</path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

+41
View File
@@ -0,0 +1,41 @@
[variables]
main_domain = "${domain}"
db_password = "${password:32}"
db_root_password = "${password:32}"
email_host = "smtp.example.com"
email_user = "noreply@example.com"
email_pass = "${password:16}"
[config]
[[config.domains]]
serviceName = "passbolt"
port = 80
host = "${main_domain}"
[config.env]
PASSBOLT_APP_FULL_BASE_URL = "http://${main_domain}"
PASSBOLT_DB_HOST = "mariadb"
PASSBOLT_DB_PORT = "3306"
PASSBOLT_DB_NAME = "passbolt"
PASSBOLT_DB_USER = "passbolt"
PASSBOLT_DB_PASSWORD = "${db_password}"
PASSBOLT_DB_ROOT_PASSWORD = "${db_root_password}"
PASSBOLT_PLUGINS_JWT_AUTHENTICATION_ENABLED = "true"
PASSBOLT_EMAIL_FROM = "passbolt@${main_domain}"
PASSBOLT_EMAIL_HOST = "${email_host}"
PASSBOLT_EMAIL_PORT = "587"
PASSBOLT_EMAIL_USER = "${email_user}"
PASSBOLT_EMAIL_PASS = "${email_pass}"
PASSBOLT_EMAIL_TLS = "true"
[[config.mounts]]
volume = "gpg_volume"
target = "/etc/passbolt/gpg"
[[config.mounts]]
volume = "jwt_volume"
target = "/etc/passbolt/jwt"
[[config.mounts]]
volume = "passbolt_mariadb_data"
target = "/var/lib/mysql"
+187
View File
@@ -0,0 +1,187 @@
name: peerdb-quickstart
x-minio-config: &minio-config
PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_ACCESS_KEY_ID: ${MINIO_ROOT_USER}
PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD}
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_REGION: ${PEERDB_CLICKHOUSE_AWS_REGION}
PEERDB_CLICKHOUSE_AWS_CREDENTIALS_AWS_ENDPOINT_URL_S3: ${PEERDB_CLICKHOUSE_AWS_ENDPOINT_URL_S3}
PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME: ${PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME}
x-catalog-config: &catalog-config
PEERDB_CATALOG_HOST: ${PEERDB_CATALOG_HOST}
PEERDB_CATALOG_PORT: ${PEERDB_CATALOG_PORT}
PEERDB_CATALOG_USER: ${PEERDB_CATALOG_USER}
PEERDB_CATALOG_PASSWORD: ${PEERDB_CATALOG_PASSWORD}
PEERDB_CATALOG_DATABASE: ${PEERDB_CATALOG_DATABASE}
x-flow-worker-env: &flow-worker-env
TEMPORAL_HOST_PORT: temporal:7233
TEMPORAL_CLIENT_CERT:
TEMPORAL_CLIENT_KEY:
PEERDB_TEMPORAL_NAMESPACE: default
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID:-}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY:-}
AWS_REGION: ${AWS_REGION:-}
AWS_ENDPOINT: ${AWS_ENDPOINT:-}
services:
catalog:
image: postgres:18-alpine@sha256:eca6fb2d91fda290eb8cfb8ba53dd0dcbf3508a08011e30adb039ea7c8e1e9f2
command: -c config_file=/etc/postgresql.conf
restart: unless-stopped
expose:
- 5432
environment:
PGUSER: ${PEERDB_CATALOG_USER}
POSTGRES_PASSWORD: ${PEERDB_CATALOG_PASSWORD}
POSTGRES_DB: ${PEERDB_CATALOG_DATABASE}
POSTGRES_INITDB_ARGS: --locale=C.UTF-8
volumes:
- pgdata:/var/lib/postgresql/data
- ../files/postgresql.conf:/etc/postgresql.conf
- ../files/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
healthcheck:
test: ["CMD", "pg_isready", "-d", "${PEERDB_CATALOG_DATABASE}", "-U", "${PEERDB_CATALOG_USER}"]
interval: 10s
timeout: 30s
retries: 5
start_period: 60s
temporal:
restart: unless-stopped
depends_on:
catalog:
condition: service_healthy
environment:
DB: postgres12
DB_PORT: ${PEERDB_CATALOG_PORT}
POSTGRES_USER: ${PEERDB_CATALOG_USER}
POSTGRES_PWD: ${PEERDB_CATALOG_PASSWORD}
POSTGRES_SEEDS: catalog
DYNAMIC_CONFIG_FILE_PATH: config/dynamicconfig/production-sql.yaml
image: temporalio/auto-setup:1.29@sha256:5b3502a3b685f9eff1b925af90c57c9e3dbeccbef367cc28a2a9712c63379312
expose:
- 7233
volumes:
- ../files/temporal-dynamicconfig:/etc/temporal/config/dynamicconfig
temporal-admin-tools:
restart: unless-stopped
depends_on:
- temporal
environment:
TEMPORAL_ADDRESS: temporal:7233
TEMPORAL_CLI_ADDRESS: temporal:7233
TEMPORAL_CLI_SHOW_STACKS: 1
image: temporalio/admin-tools:1.25.2-tctl-1.18.1-cli-1.1.1@sha256:da0c7a7982b571857173ab8f058e7f139b3054800abb4dcb100445d29a563ee8
stdin_open: true
tty: true
entrypoint: ["sh", "/etc/temporal/entrypoint.sh"]
healthcheck:
test: ["CMD", "tctl", "workflow", "list"]
interval: 10s
timeout: 30s
retries: 5
volumes:
- ../files/scripts/mirror-name-search.sh:/etc/temporal/entrypoint.sh
temporal-ui:
restart: unless-stopped
depends_on:
- temporal
environment:
TEMPORAL_ADDRESS: temporal:7233
TEMPORAL_CORS_ORIGINS: http://localhost:3000
TEMPORAL_CSRF_COOKIE_INSECURE: "true"
image: temporalio/ui:2.43.3@sha256:31f0d8c1ed0bfc49c9c20ea9613ee9dd5c52f5f989bacb8a30210f847028e9cd
expose:
- 8080
flow-api:
image: ghcr.io/peerdb-io/flow-api:stable-v0.35.5
restart: unless-stopped
expose:
- 8112
- 8113
environment:
<<: [*catalog-config, *flow-worker-env, *minio-config]
PEERDB_ALLOWED_TARGETS: ${PEERDB_ALLOWED_TARGETS}
depends_on:
temporal-admin-tools:
condition: service_healthy
flow-snapshot-worker:
image: ghcr.io/peerdb-io/flow-snapshot-worker:stable-v0.35.5
restart: unless-stopped
environment:
<<: [*catalog-config, *flow-worker-env, *minio-config]
depends_on:
temporal-admin-tools:
condition: service_healthy
flow-worker:
image: ghcr.io/peerdb-io/flow-worker:stable-v0.35.5
restart: unless-stopped
environment:
<<: [*catalog-config, *flow-worker-env, *minio-config]
depends_on:
temporal-admin-tools:
condition: service_healthy
peerdb:
stop_signal: SIGINT
image: ghcr.io/peerdb-io/peerdb-server:stable-v0.35.5
restart: unless-stopped
environment:
<<: *catalog-config
PEERDB_PASSWORD: ${PEERDB_PASSWORD}
PEERDB_FLOW_SERVER_ADDRESS: ${PEERDB_FLOW_SERVER_ADDRESS}
RUST_LOG: info
RUST_BACKTRACE: 1
expose:
- 9900
depends_on:
catalog:
condition: service_healthy
peerdb-ui:
image: ghcr.io/peerdb-io/peerdb-ui:stable-v0.35.5
restart: unless-stopped
expose:
- 3000
environment:
<<: *catalog-config
DATABASE_URL: ${DATABASE_URL}
PEERDB_FLOW_SERVER_HTTP: ${PEERDB_FLOW_SERVER_HTTP}
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
NEXTAUTH_URL: ${NEXTAUTH_URL}
PEERDB_ALLOWED_TARGETS: ${PEERDB_ALLOWED_TARGETS}
PEERDB_CLICKHOUSE_ALLOWED_DOMAINS: ${PEERDB_CLICKHOUSE_ALLOWED_DOMAINS}
PEERDB_EXPERIMENTAL_ENABLE_SCRIPTING: ${PEERDB_EXPERIMENTAL_ENABLE_SCRIPTING}
depends_on:
- flow-api
minio:
image: minio/minio:latest@sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e
restart: unless-stopped
volumes:
- minio-data:/data
expose:
- 9000
- 9001
environment:
<<: *minio-config
entrypoint: >
/bin/sh -c "
minio server /data --console-address=:9001 &
sleep 2;
mc alias set myminiopeerdb http://minio:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD;
mc mb myminiopeerdb/$$PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME;
wait
"
volumes:
pgdata:
minio-data:
Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

+93
View File
@@ -0,0 +1,93 @@
[variables]
main_domain = "${domain}"
peerdb_password = "${password:32}"
postgres_password = "${password:32}"
minio_root_user = "_peerdb_minioadmin"
minio_root_password = "${password:32}"
nextauth_secret = "${password:32}"
[[config.domains]]
serviceName = "peerdb-ui"
port = 3000
host = "${main_domain}"
[[config.domains]]
serviceName = "minio"
port = 9001
host = "${main_domain}"
[[config.domains]]
serviceName = "temporal-ui"
port = 8080
host = "${main_domain}"
[config.env]
PEERDB_PASSWORD = "${peerdb_password}"
PEERDB_CATALOG_HOST = "catalog"
PEERDB_CATALOG_PORT = "5432"
PEERDB_CATALOG_USER = "postgres"
PEERDB_CATALOG_PASSWORD = "${postgres_password}"
PEERDB_CATALOG_DATABASE = "postgres"
PEERDB_FLOW_SERVER_ADDRESS = "grpc://flow-api:8112"
NEXTAUTH_URL = "http://localhost:3000"
NEXTAUTH_SECRET = "${nextauth_secret}"
DATABASE_URL = "postgres://postgres:${postgres_password}@catalog:5432/postgres"
PEERDB_FLOW_SERVER_HTTP = "http://flow-api:8113"
PEERDB_EXPERIMENTAL_ENABLE_SCRIPTING = "true"
MINIO_ROOT_USER = "${minio_root_user}"
MINIO_ROOT_PASSWORD = "${minio_root_password}"
PEERDB_CLICKHOUSE_AWS_REGION = "us-east-1"
PEERDB_CLICKHOUSE_AWS_ENDPOINT_URL_S3 = "http://minio:9000"
PEERDB_CLICKHOUSE_AWS_S3_BUCKET_NAME = "peerdbbucket"
PEERDB_ALLOWED_TARGETS = ""
PEERDB_CLICKHOUSE_ALLOWED_DOMAINS = ""
AWS_ACCESS_KEY_ID = ""
AWS_SECRET_ACCESS_KEY = ""
AWS_REGION = ""
AWS_ENDPOINT = ""
[[config.mounts]]
filePath = "./postgresql.conf"
content = """
listen_addresses = '*'
wal_level = logical
max_wal_senders = 4
max_replication_slots = 4
"""
[[config.mounts]]
filePath = "./docker-entrypoint-initdb.d/pg-hba-replication.sh"
content = """
#!/bin/sh
echo "host replication $POSTGRES_USER 0.0.0.0/0 trust" >> "$PGDATA/pg_hba.conf"
"""
[[config.mounts]]
filePath = "./temporal-dynamicconfig/production-sql.yaml"
content = """
limit.maxIDLength:
- value: 255
constraints: {}
system.forceSearchAttributesCacheRefreshOnRead:
- value: false
constraints: {}
frontend.enableUpdateWorkflowExecution:
- value: true
"""
[[config.mounts]]
filePath = "./scripts/mirror-name-search.sh"
content = """
#!/bin/sh
sleep 5
# Check if MirrorName attribute exists
if ! temporal operator search-attribute list | grep -w MirrorName >/dev/null 2>&1; then
# If not, create MirrorName attribute
temporal operator search-attribute create --name MirrorName --type Text --namespace default
fi
tini -s -- sleep infinity
"""
-4
View File
@@ -30,9 +30,5 @@ services:
DB_HOST: "peppermint-postgres"
SECRET: ${SECRET}
networks:
dokploy-network:
external: true
volumes:
peppermint-postgres-data:
-4
View File
@@ -54,10 +54,6 @@ services:
volumes:
- postiz-redis-data:/data
networks:
dokploy-network:
external: true
volumes:
postiz-postgres-data:
postiz-redis-data:
+1
View File
@@ -9,6 +9,7 @@ services:
- "--web.console.templates=/usr/share/prometheus/consoles"
- "--web.enable-lifecycle"
volumes:
- ../files/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
volumes:
prometheus-data: {}
+4 -1
View File
@@ -10,7 +10,10 @@ port = 9_090
host = "${main_domain}"
[[config.mounts]]
filePath = "/etc/prometheus/prometheus.yml"
# Note: this relative path is resolved by Dokploy to the file mounted from
# ../files/prometheus.yml in docker-compose, and mapped inside the container
# to /etc/prometheus/prometheus.yml.
filePath = "prometheus.yml"
serviceName = "prometheus"
content = """
# Prometheus Configuration
+69
View File
@@ -0,0 +1,69 @@
version: '3'
services:
mongo:
restart: always
image: mongo
volumes:
- mongo_data:/data/db
qux-fe:
restart: always
image: klausenschaefersinho/quant-ux
environment:
- QUX_PROXY_URL=http://quant-ux-backend:8080
- QUX_AUTH=${QUX_AUTH}
- QUX_KEYCLOAK_REALM=${QUX_KEYCLOAK_REALM}
- QUX_KEYCLOAK_CLIENT=${QUX_KEYCLOAK_CLIENT}
- QUX_KEYCLOAK_URL=${QUX_KEYCLOAK_URL}
- QUX_WS_URL=${QUX_WS_URL}
links:
- mongo
- qux-be
ports:
- 8082
depends_on:
- qux-be
qux-be:
restart: always
image: klausenschaefersinho/quant-ux-backend
volumes:
- quant_ux_data:/app-data
environment:
- QUX_HTTP_HOST=${QUX_HTTP_HOST}
- QUX_HTTP_PORT=8080
- QUX_MONGO_DB_NAME=${QUX_MONGO_DB_NAME}
- QUX_MONGO_TABLE_PREFIX=${QUX_MONGO_TABLE_PREFIX}
- QUX_MONGO_CONNECTION_STRING=mongodb://quant-ux-mongo:27017
- QUX_MAIL_USER=${QUX_MAIL_USER}
- QUX_MAIL_PASSWORD=${QUX_MAIL_PASSWORD}
- QUX_MAIL_HOST=${QUX_MAIL_HOST}
- QUX_JWT_PASSWORD=${QUX_JWT_PASSWORD}
- QUX_IMAGE_FOLDER_USER=/app-data/qux-images
- QUX_IMAGE_FOLDER_APPS=/app-data/qux-image-apps
- TZ=${TZ}
- QUX_AUTH_SERVICE=${QUX_AUTH_SERVICE}
- QUX_KEYCLOAK_SERVER=${QUX_KEYCLOAK_SERVER}
- QUX_KEYCLOAK_REALM=${QUX_KEYCLOAK_REALM}
- QUX_USER_ALLOW_SIGNUP=${QUX_USER_ALLOW_SIGNUP}
- QUX_USER_ALLOWED_DOMAINS=${QUX_USER_ALLOWED_DOMAINS}
depends_on:
- mongo
qux-ws:
restart: always
image: klausenschaefersinho/quant-ux-websocket
environment:
- QUX_SERVER=http://quant-ux-backend:8080/
- QUX_SERVER_PORT=8086
ports:
- 8086
links:
- qux-be
depends_on:
- qux-be
volumes:
mongo_data:
quant_ux_data:
+2
View File
@@ -0,0 +1,2 @@
<svg width="24" height="24" viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M44 11C61.3021 11 75.4941 24.3155 76.8877 41.2581C81.2234 43.4103 84.888 46.7112 87.4835 50.7627C87.8236 48.5582 88 46.2997 88 44C88 19.6995 68.3005 0 44 0C19.6995 0 0 19.6995 0 44C0 68.3005 19.6995 88 44 88C46.2997 88 48.5582 87.8236 50.7627 87.4835C46.7112 84.888 43.4103 81.2234 41.2581 76.8877C24.3155 75.4941 11 61.3021 11 44C11 25.7746 25.7746 11 44 11Z" fill="white"></path><path d="M66 47.6667C55.8748 47.6667 47.6667 55.8748 47.6667 66C47.6667 76.1252 55.8748 84.3333 66 84.3333H84.3333V66C84.3333 55.8748 76.1252 47.6667 66 47.6667Z" fill="white"></path></svg>

After

Width:  |  Height:  |  Size: 676 B

+50
View File
@@ -0,0 +1,50 @@
[variables]
main_domain = "${domain}"
ws_domain = "${domain}"
qux_auth = "qux"
qux_jwt_password = "${password:64}"
qux_mongo_db_name = "quantux"
qux_mongo_table_prefix = "quantux"
qux_mail_user = "${email}"
qux_mail_password = "${password:32}"
qux_mail_host = "mail.example.com"
qux_timezone = "America/Chicago"
qux_auth_service = "qux"
qux_user_allow_signup = "true"
qux_user_allowed_domains = "*"
qux_keycloak_realm = ""
qux_keycloak_client = ""
qux_keycloak_url = ""
qux_keycloak_server = ""
[config]
env = [
"QUX_HTTP_HOST=https://${main_domain}",
"QUX_AUTH=${qux_auth}",
"QUX_JWT_PASSWORD=${qux_jwt_password}",
"QUX_MONGO_DB_NAME=${qux_mongo_db_name}",
"QUX_MONGO_TABLE_PREFIX=${qux_mongo_table_prefix}",
"QUX_MAIL_USER=${qux_mail_user}",
"QUX_MAIL_PASSWORD=${qux_mail_password}",
"QUX_MAIL_HOST=${qux_mail_host}",
"TZ=${qux_timezone}",
"QUX_AUTH_SERVICE=${qux_auth_service}",
"QUX_KEYCLOAK_SERVER=${qux_keycloak_server}",
"QUX_KEYCLOAK_REALM=${qux_keycloak_realm}",
"QUX_KEYCLOAK_CLIENT=${qux_keycloak_client}",
"QUX_KEYCLOAK_URL=${qux_keycloak_url}",
"QUX_USER_ALLOW_SIGNUP=${qux_user_allow_signup}",
"QUX_USER_ALLOWED_DOMAINS=${qux_user_allowed_domains}",
"QUX_WS_URL=wss://${ws_domain}"
]
[[config.domains]]
serviceName = "qux-fe"
port = 8082
host = "${main_domain}"
[[config.domains]]
serviceName = "qux-ws"
port = 8086
host = "${ws_domain}"
@@ -0,0 +1,67 @@
version: "3.8"
services:
postgres:
image: postgres:16-alpine
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
interval: 10s
timeout: 5s
retries: 5
minio:
image: minio/minio:latest
command: server /data
volumes:
- minio_data:/data
environment:
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
chrome:
image: ghcr.io/browserless/chromium:v2.18.0
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
TIMEOUT: 10000
CONCURRENT: 10
TOKEN: ${CHROME_TOKEN}
EXIT_ON_HEALTH_FAILURE: "true"
PRE_REQUEST_HEALTH_CHECK: "true"
app:
image: amruthpillai/reactive-resume:latest
depends_on:
- postgres
- minio
- chrome
environment:
PORT: 3000
NODE_ENV: production
PUBLIC_URL: https://${APP_DOMAIN}
STORAGE_URL: https://${APP_DOMAIN}/default
CHROME_TOKEN: ${CHROME_TOKEN}
CHROME_URL: ws://chrome:3000
DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
ACCESS_TOKEN_SECRET: ${ACCESS_TOKEN_SECRET}
REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
MAIL_FROM: ${MAIL_FROM}
STORAGE_ENDPOINT: minio
STORAGE_PORT: 9000
STORAGE_REGION: us-east-1
STORAGE_BUCKET: default
STORAGE_ACCESS_KEY: ${MINIO_ROOT_USER}
STORAGE_SECRET_KEY: ${MINIO_ROOT_PASSWORD}
STORAGE_USE_SSL: "false"
STORAGE_SKIP_BUCKET_CHECK: "false"
volumes:
minio_data:
postgres_data:
+20
View File
@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200">
<defs>
<linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#3b82f6;stop-opacity:1" />
<stop offset="100%" style="stop-color:#8b5cf6;stop-opacity:1" />
</linearGradient>
</defs>
<!-- Background circle -->
<circle cx="100" cy="100" r="95" fill="url(#grad)"/>
<!-- Document icon -->
<rect x="60" y="45" width="80" height="110" rx="5" fill="white"/>
<rect x="70" y="60" width="60" height="6" rx="3" fill="#3b82f6"/>
<rect x="70" y="75" width="60" height="6" rx="3" fill="#3b82f6"/>
<rect x="70" y="90" width="45" height="6" rx="3" fill="#8b5cf6"/>
<rect x="70" y="105" width="60" height="6" rx="3" fill="#8b5cf6"/>
<rect x="70" y="120" width="50" height="6" rx="3" fill="#8b5cf6"/>
<rect x="70" y="135" width="40" height="6" rx="3" fill="#8b5cf6"/>
</svg>

After

Width:  |  Height:  |  Size: 937 B

+33
View File
@@ -0,0 +1,33 @@
[variables]
main_domain = "${domain}"
postgres_password = "${password:32}"
minio_user = "minioadmin"
minio_password = "${password:32}"
chrome_token = "${password:32}"
access_token_secret = "${password:64}"
refresh_token_secret = "${password:64}"
mail_from = "noreply@${main_domain}"
[config]
env = [
"APP_DOMAIN=${main_domain}",
"POSTGRES_PASSWORD=${postgres_password}",
"MINIO_ROOT_USER=${minio_user}",
"MINIO_ROOT_PASSWORD=${minio_password}",
"CHROME_TOKEN=${chrome_token}",
"ACCESS_TOKEN_SECRET=${access_token_secret}",
"REFRESH_TOKEN_SECRET=${refresh_token_secret}",
"MAIL_FROM=${mail_from}",
]
mounts = []
[[config.domains]]
serviceName = "app"
port = 3000
host = "${main_domain}"
[[config.domains]]
serviceName = "minio"
port = 9000
host = "${main_domain}"
path = "/default"
+45
View File
@@ -0,0 +1,45 @@
services:
rote-backend:
image: rabithua/rote-backend:${IMAGE_TAG:-latest}
pull_policy: always
environment:
POSTGRESQL_URL: postgresql://rote:${POSTGRES_PASSWORD}@rote-postgres:5432/rote
depends_on:
rote-postgres:
condition: service_healthy
restart: unless-stopped
command:
[
"sh",
"-c",
"sleep 15 && bun run dist/scripts/runMigrations.js && bun run dist/server.js",
]
rote-frontend:
image: rabithua/rote-frontend:${IMAGE_TAG:-latest}
pull_policy: always
depends_on:
- rote-backend
environment:
# VITE_API_BASE must point to an address that reaches rote-backend (reverse-proxy domain or host IP:port)
VITE_API_BASE: ${VITE_API_BASE}
restart: unless-stopped
rote-postgres:
image: postgres:17
restart: unless-stopped
environment:
POSTGRES_USER: rote
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: rote
volumes:
- rote-postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U rote -d rote"]
interval: 5s
timeout: 3s
retries: 10
start_period: 30s
volumes:
rote-postgres-data: {}
Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Some files were not shown because too many files have changed in this diff Show More