New Templates (#586)
* feat(librechat): add LibreChat blueprint with compose, toml, metadata, links and tags * fix: rename templates to template.toml * fix(librechat): rename api service to librechat in docker-compose.yml * Update blueprints/librechat/template.toml * Update blueprints/librechat/template.toml * fix(librechat): add version under [config] and remove stray [config.mounts] header * fix(librechat): remove predefined persistent volume mounts from template.toml * docs(librechat): add authentication reference link to docker-compose.yml * 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 * fix: process meta.json to fix formatting and sorting * Update GitHub workflows to target 'canary' branch for meta validation * 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. * Enhance GitHub workflows: add production deployment configuration and target 'canary' branch for pull requests. * Refactor GitHub workflow: comment out build preview steps for clarity and future modifications. * Remove unnecessary blank line in deploy-preview.yml for improved readability. * Refactor GitHub workflow: uncomment build preview steps for improved deployment process and clarity. * Update template.toml (#555) * Update template.toml * Update template.toml * Update template.toml * fix: change VITE_API_BASE to http:// for traefik.me compatibility * changed image from sknnr/enshrouded-dedicated-server to mornedhels/enshrouded-server for autoupdate and easier config * Add Openinary Template (#567) * feat: add Openinary template * feat: update Openinary configuration to support ALLOWED_ORIGIN and refactor domain variable * fix: correct DEFAULT_DOMAIN environment variable reference in docker-compose.yml (#562) * add rustfs template (#568) * feat: add pull request template for improved contribution guidelines * fix: update pull request template to clarify issue closing keywords * 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. * 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> * 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> * chore: remove package-lock.json file from the app directory * 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> * 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. * 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. * 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> * 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> * Update section title from 'Suggestions' to 'Requirements' * 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> * feat: Add MediaCMS template (#524) * 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> * 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 * 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> * 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. * 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> * 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. * 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. * 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> * 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> * 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 * 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 * 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> * 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> * 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> * 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> * 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 --------- Co-authored-by: Sunil Shrestha <sunil.shrestha@tekkon.com.np> Co-authored-by: Rabithua <rabithua@gmail.com> Co-authored-by: Mauricio Siu <siumauricio@hotmail.com> Co-authored-by: Scan <103391616+scanash00@users.noreply.github.com> Co-authored-by: Crackvignoule <kiki.kalagan@gmail.com> Co-authored-by: florianheysen <39408021+florianheysen@users.noreply.github.com> Co-authored-by: Thiago MadPin <madpin@gmail.com> Co-authored-by: BlinkStrike <18644035+BlinkStrike@users.noreply.github.com> Co-authored-by: M Jupri Amin <127651222+Juupeee@users.noreply.github.com> Co-authored-by: Harikrishnan Dhanasekaran <harikrishnan@mulecraft.in> Co-authored-by: Kamil Dzieniszewski <kamil.dzieniszewski@gmail.com> Co-authored-by: Nick Anderson <nbrookie@gmail.com> Co-authored-by: lefolalan <alan.lefol@omirion.com> Co-authored-by: Chris <31969757+ChrisvanChip@users.noreply.github.com> Co-authored-by: kipavy <88386090+kipavy@users.noreply.github.com> Co-authored-by: Benjamin Nussbaum <bnussbau@users.noreply.github.com> Co-authored-by: Khiet Tam Nguyen <86177399+nktnet1@users.noreply.github.com> Co-authored-by: Vidhya LKG for IT <24915474+VidhyaSanjeevi@users.noreply.github.com> Co-authored-by: Sanjeevi Subramani <ssanjeevi.ss@gmail.com> Co-authored-by: Muzaffer Kadir YILMAZ <34358176+muzafferkadir@users.noreply.github.com> Co-authored-by: Jemg <murksopps@gmail.com>
@@ -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
|
||||
4
.github/workflows/deploy-preview.yml
vendored
@@ -5,7 +5,9 @@ on:
|
||||
workflows: [Build Preview Deployment]
|
||||
types:
|
||||
- completed
|
||||
|
||||
pull_request:
|
||||
branches:
|
||||
- canary
|
||||
permissions:
|
||||
actions: read
|
||||
deployments: write
|
||||
|
||||
317
.github/workflows/validate-docker-compose.yml
vendored
Normal file
@@ -0,0 +1,317 @@
|
||||
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 # Necesitamos el historial completo para comparar con base
|
||||
|
||||
- name: Set up Docker Compose
|
||||
run: |
|
||||
echo "🐳 Setting up Docker Compose..."
|
||||
# Docker Compose V2 viene preinstalado en ubuntu-latest
|
||||
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: |
|
||||
echo "📦 Installing Node.js dependencies..."
|
||||
cd build-scripts && pnpm install
|
||||
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
run: |
|
||||
echo "🔍 Detecting changed files..."
|
||||
|
||||
# Obtener la rama base
|
||||
BASE_SHA=$(git merge-base HEAD origin/${{ github.base_ref }})
|
||||
|
||||
# Encontrar todos los archivos docker-compose.yml y template.toml modificados/agregados
|
||||
CHANGED_COMPOSE=$(git diff --name-only --diff-filter=ACMRT $BASE_SHA HEAD | grep -E 'blueprints/.*/docker-compose\.yml$' || true)
|
||||
CHANGED_TOML=$(git diff --name-only --diff-filter=ACMRT $BASE_SHA HEAD | grep -E 'blueprints/.*/template\.toml$' || true)
|
||||
|
||||
# Crear lista de directorios únicos que tienen cambios
|
||||
CHANGED_DIRS=$(echo -e "$CHANGED_COMPOSE\n$CHANGED_TOML" | sed 's|blueprints/\([^/]*\)/.*|\1|' | sort -u)
|
||||
|
||||
echo "Changed compose files:"
|
||||
echo "$CHANGED_COMPOSE" | while read file; do [ -n "$file" ] && echo " - $file"; done
|
||||
|
||||
echo "Changed TOML files:"
|
||||
echo "$CHANGED_TOML" | while read file; do [ -n "$file" ] && echo " - $file"; done
|
||||
|
||||
echo "Changed directories:"
|
||||
echo "$CHANGED_DIRS" | while read dir; do [ -n "$dir" ] && echo " - $dir"; done
|
||||
|
||||
# Guardar para usar en siguientes pasos
|
||||
echo "compose_files<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$CHANGED_COMPOSE" >> $GITHUB_OUTPUT
|
||||
echo "EOF" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "toml_files<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$CHANGED_TOML" >> $GITHUB_OUTPUT
|
||||
echo "EOF" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "directories<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$CHANGED_DIRS" >> $GITHUB_OUTPUT
|
||||
echo "EOF" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Validate Docker Compose files syntax
|
||||
id: validate-compose-syntax
|
||||
run: |
|
||||
echo "🔍 Validating Docker Compose files syntax..."
|
||||
|
||||
ERROR=0
|
||||
COMPOSE_FILES="${{ steps.changed-files.outputs.compose_files }}"
|
||||
|
||||
if [ -z "$COMPOSE_FILES" ]; then
|
||||
echo "ℹ️ No docker-compose.yml files changed, skipping validation"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "$COMPOSE_FILES" | while read -r compose_file; do
|
||||
if [ -z "$compose_file" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
TEMPLATE_DIR=$(dirname "$compose_file")
|
||||
TEMPLATE_NAME=$(basename "$TEMPLATE_DIR")
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📦 Validating syntax: $TEMPLATE_NAME"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# Validar sintaxis de docker-compose.yml usando docker compose
|
||||
echo "🔍 Validating docker-compose.yml syntax..."
|
||||
if ! docker compose -f "$compose_file" config > /dev/null 2>&1; then
|
||||
echo "❌ ERROR: docker-compose.yml syntax is invalid in $TEMPLATE_NAME"
|
||||
echo "Running docker compose config to show errors:"
|
||||
docker compose -f "$compose_file" config 2>&1 || true
|
||||
ERROR=1
|
||||
else
|
||||
echo "✅ docker-compose.yml syntax is valid"
|
||||
fi
|
||||
|
||||
# Obtener lista de servicios del compose
|
||||
SERVICES=$(docker compose -f "$compose_file" config --services 2>/dev/null || echo "")
|
||||
echo "📋 Services found in docker-compose.yml:"
|
||||
echo "$SERVICES" | while read service; do
|
||||
[ -n "$service" ] && echo " - $service"
|
||||
done
|
||||
|
||||
# Guardar servicios para validación posterior
|
||||
echo "$SERVICES" > "/tmp/${TEMPLATE_NAME}_services.txt"
|
||||
done
|
||||
|
||||
if [ $ERROR -eq 1 ]; then
|
||||
echo ""
|
||||
echo "❌ Docker Compose syntax validation failed"
|
||||
exit 1
|
||||
else
|
||||
echo ""
|
||||
echo "✅ All Docker Compose files have valid syntax"
|
||||
fi
|
||||
|
||||
- name: Validate Docker Compose best practices
|
||||
id: validate-compose-practices
|
||||
run: |
|
||||
echo "🔍 Validating Docker Compose best practices..."
|
||||
|
||||
ERROR=0
|
||||
COMPOSE_FILES="${{ steps.changed-files.outputs.compose_files }}"
|
||||
|
||||
if [ -z "$COMPOSE_FILES" ]; then
|
||||
echo "ℹ️ No docker-compose.yml files changed, skipping validation"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Convert to array to avoid subshell issues with pipe
|
||||
# This ensures ERROR=1 inside the loop propagates to the parent shell
|
||||
mapfile -t COMPOSE_ARRAY <<< "$COMPOSE_FILES"
|
||||
|
||||
for compose_file in "${COMPOSE_ARRAY[@]}"; do
|
||||
if [ -z "$compose_file" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
TEMPLATE_DIR=$(dirname "$compose_file")
|
||||
TEMPLATE_NAME=$(basename "$TEMPLATE_DIR")
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📦 Validating best practices: $TEMPLATE_NAME"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# Validar usando el script de TypeScript
|
||||
if ! (cd build-scripts && pnpm exec tsx validate-docker-compose.ts --file "../$compose_file" --verbose); then
|
||||
ERROR=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $ERROR -eq 1 ]; then
|
||||
echo ""
|
||||
echo "❌ Docker Compose best practices validation failed"
|
||||
exit 1
|
||||
else
|
||||
echo ""
|
||||
echo "✅ All Docker Compose files follow best practices"
|
||||
fi
|
||||
|
||||
- name: Validate template.toml files
|
||||
id: validate-toml
|
||||
run: |
|
||||
echo "🔍 Validating template.toml files..."
|
||||
|
||||
ERROR=0
|
||||
DIRECTORIES="${{ steps.changed-files.outputs.directories }}"
|
||||
|
||||
if [ -z "$DIRECTORIES" ]; then
|
||||
echo "ℹ️ No template directories changed, skipping TOML validation"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Convert to array to avoid subshell issues with pipe
|
||||
# This ensures ERROR=1 inside the loop propagates to the parent shell
|
||||
mapfile -t DIRS_ARRAY <<< "$DIRECTORIES"
|
||||
|
||||
for template_dir in "${DIRS_ARRAY[@]}"; do
|
||||
if [ -z "$template_dir" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
TEMPLATE_PATH="blueprints/$template_dir"
|
||||
TOML_FILE="$TEMPLATE_PATH/template.toml"
|
||||
|
||||
if [ ! -f "$TOML_FILE" ]; then
|
||||
echo "⚠️ WARNING: template.toml not found in $template_dir (might be deleted)"
|
||||
continue
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📝 Validating: $template_dir/template.toml"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# Validar usando el script de TypeScript con tsx
|
||||
# Ejecutar desde build-scripts para tener acceso a node_modules
|
||||
if ! (cd build-scripts && pnpm exec tsx validate-template.ts --dir "../$TEMPLATE_PATH" --verbose); then
|
||||
ERROR=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $ERROR -eq 1 ]; then
|
||||
echo ""
|
||||
echo "❌ template.toml validation failed"
|
||||
exit 1
|
||||
else
|
||||
echo ""
|
||||
echo "✅ All template.toml files are valid"
|
||||
fi
|
||||
|
||||
- name: Test Docker Compose (dry-run)
|
||||
id: test-compose
|
||||
run: |
|
||||
echo "🧪 Testing Docker Compose files (dry-run)..."
|
||||
|
||||
ERROR=0
|
||||
DIRECTORIES="${{ steps.changed-files.outputs.directories }}"
|
||||
|
||||
if [ -z "$DIRECTORIES" ]; then
|
||||
echo "ℹ️ No template directories changed, skipping dry-run test"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "$DIRECTORIES" | while read -r template_dir; do
|
||||
if [ -z "$template_dir" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
COMPOSE_FILE="blueprints/$template_dir/docker-compose.yml"
|
||||
|
||||
if [ ! -f "$COMPOSE_FILE" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "🧪 Testing: $template_dir"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# Cambiar al directorio del template para resolver rutas relativas
|
||||
cd "blueprints/$template_dir"
|
||||
|
||||
# Validar que docker-compose puede parsear el archivo completamente
|
||||
echo "🔍 Running docker compose config (full validation)..."
|
||||
if docker compose config > /dev/null 2>&1; then
|
||||
echo "✅ Docker Compose file is fully valid and can be processed"
|
||||
|
||||
# Mostrar información útil
|
||||
echo "📋 Configuration summary:"
|
||||
docker compose config --services | while read service; do
|
||||
[ -n "$service" ] && echo " Service: $service"
|
||||
done
|
||||
else
|
||||
echo "❌ ERROR: Docker Compose file failed full validation"
|
||||
docker compose config 2>&1 || true
|
||||
ERROR=1
|
||||
fi
|
||||
|
||||
cd - > /dev/null
|
||||
done
|
||||
|
||||
if [ $ERROR -eq 1 ]; then
|
||||
echo ""
|
||||
echo "❌ Docker Compose dry-run test failed"
|
||||
exit 1
|
||||
else
|
||||
echo ""
|
||||
echo "✅ All Docker Compose files passed dry-run test"
|
||||
fi
|
||||
|
||||
- name: Summary
|
||||
if: always()
|
||||
run: |
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📊 Validation Summary"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
if [ "${{ steps.validate-compose-syntax.outcome }}" == "success" ] && \
|
||||
[ "${{ steps.validate-compose-practices.outcome }}" == "success" ] && \
|
||||
[ "${{ steps.validate-toml.outcome }}" == "success" ] && \
|
||||
[ "${{ steps.test-compose.outcome }}" == "success" ]; then
|
||||
echo "✅ All validations passed!"
|
||||
echo ""
|
||||
echo "Your Docker Compose and template.toml files are valid and ready to merge."
|
||||
else
|
||||
echo "❌ Some validations failed. Please review the errors above."
|
||||
echo ""
|
||||
echo "Common issues to check:"
|
||||
echo " - docker-compose.yml syntax errors"
|
||||
echo " - template.toml syntax errors"
|
||||
echo " - serviceName in template.toml must match service names in docker-compose.yml"
|
||||
echo " - Avoid using container_name, explicit networks, or port mappings"
|
||||
fi
|
||||
|
||||
4
.github/workflows/validate-meta.yml
vendored
@@ -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:
|
||||
|
||||
|
||||
4
.github/workflows/validate.yml
vendored
@@ -3,10 +3,10 @@ name: Validate Blueprints Structure and Meta
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- canary
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- canary
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
|
||||
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
node_modules
|
||||
@@ -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
app/package-lock.json
generated
1750
app/pnpm-lock.yaml
generated
@@ -10,6 +10,7 @@ serviceName = "ackee"
|
||||
port = 3000
|
||||
host = "${domain}"
|
||||
|
||||
|
||||
[config.env]
|
||||
ACKEE_USERNAME = "${ACKEE_USERNAME}"
|
||||
ACKEE_PASSWORD = "${ACKEE_PASSWORD}"
|
||||
|
||||
19
blueprints/anytype/docker-compose.yml
Normal 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"
|
||||
BIN
blueprints/anytype/logo.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
4
blueprints/anytype/template.toml
Normal file
@@ -0,0 +1,4 @@
|
||||
[config]
|
||||
domains = []
|
||||
mounts = []
|
||||
env = []
|
||||
3
blueprints/bluesky-pds/bluesky-pds.svg
Normal 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
blueprints/bluesky-pds/docker-compose.yml
Normal 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
blueprints/bluesky-pds/template.toml
Normal 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 = "/"
|
||||
@@ -182,9 +182,6 @@ services:
|
||||
labels:
|
||||
- com.centurylinklabs.watchtower.enable=false
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
minio_data:
|
||||
|
||||
@@ -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:
|
||||
|
||||
BIN
blueprints/chirpstack/chirpstack.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
81
blueprints/chirpstack/docker-compose.yml
Normal 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:
|
||||
9815
blueprints/chirpstack/template.toml
Normal 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:
|
||||
@@ -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: {}
|
||||
21
blueprints/dokploy-prom-monitoring-extension/logo.svg
Normal file
@@ -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 |
17
blueprints/dokploy-prom-monitoring-extension/template.toml
Normal file
@@ -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\":[]}}}"
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
@@ -20,7 +20,3 @@ services:
|
||||
volumes:
|
||||
glpi-mysql-data:
|
||||
glpi-www-data:
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
@@ -36,9 +36,5 @@ services:
|
||||
volumes:
|
||||
- pg_hi-events_data:/var/lib/postgresql/data
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
pg_hi-events_data:
|
||||
@@ -96,10 +96,6 @@ services:
|
||||
]
|
||||
restart: always
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
immich-model-cache:
|
||||
immich-postgres:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -40,10 +40,6 @@ services:
|
||||
start_period: 30s
|
||||
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
kimai-data:
|
||||
mysql-data:
|
||||
23
blueprints/kokoro-tts/docker-compose.yml
Normal 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
blueprints/kokoro-tts/kokoro-tts.svg
Normal 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
blueprints/kokoro-tts/template.toml
Normal 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
|
||||
"""
|
||||
@@ -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
blueprints/librechat/docker-compose.yml
Normal 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:
|
||||
BIN
blueprints/librechat/librechat.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
93
blueprints/librechat/template.toml
Normal 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"
|
||||
"""
|
||||
@@ -46,9 +46,6 @@ services:
|
||||
volumes:
|
||||
- redis-data:/data
|
||||
|
||||
networks:
|
||||
libredesk:
|
||||
|
||||
volumes:
|
||||
postgres-data:
|
||||
redis-data:
|
||||
@@ -31,9 +31,6 @@ services:
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
logto-connectors:
|
||||
|
||||
29
blueprints/mcsmanager/docker-compose.yml
Normal 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:
|
||||
|
||||
BIN
blueprints/mcsmanager/mcsmanager.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
12
blueprints/mcsmanager/template.toml
Normal file
@@ -0,0 +1,12 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = []
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "web"
|
||||
port = 23333
|
||||
host = "${main_domain}"
|
||||
|
||||
134
blueprints/mediacms/docker-compose.yml
Normal 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
blueprints/mediacms/mediacms.svg
Normal 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
blueprints/mediacms/template.toml
Normal 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,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.
|
||||
|
||||
22
blueprints/mulesoft-esb/docker-compose.yml
Normal file
@@ -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
|
||||
|
||||
BIN
blueprints/mulesoft-esb/mulesoft_logo.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
23
blueprints/mulesoft-esb/template.toml
Normal 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
blueprints/mumble/docker-compose.yml
Normal 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:
|
||||
BIN
blueprints/mumble/mumble.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
12
blueprints/mumble/template.toml
Normal 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
|
||||
|
||||
26
blueprints/openinary/docker-compose.yml
Normal 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
blueprints/openinary/openinary.svg
Normal 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
blueprints/openinary/template.toml
Normal 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"
|
||||
23
blueprints/parseable/docker-compose.yml
Normal 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
blueprints/parseable/logo.svg
Normal 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
blueprints/parseable/template.toml
Normal 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
blueprints/passbolt/docker-compose.yml
Normal 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
blueprints/passbolt/passbolt.svg
Normal 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>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
41
blueprints/passbolt/template.toml
Normal 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
blueprints/peerdb/docker-compose.yml
Normal 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:
|
||||
BIN
blueprints/peerdb/peerdb.jpeg
Normal file
|
After Width: | Height: | Size: 10 KiB |
93
blueprints/peerdb/template.toml
Normal 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
|
||||
"""
|
||||
@@ -30,9 +30,5 @@ services:
|
||||
DB_HOST: "peppermint-postgres"
|
||||
SECRET: ${SECRET}
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
peppermint-postgres-data:
|
||||
@@ -54,10 +54,6 @@ services:
|
||||
volumes:
|
||||
- postiz-redis-data:/data
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
postiz-postgres-data:
|
||||
postiz-redis-data:
|
||||
|
||||
69
blueprints/quant-ux/docker-compose.yml
Normal 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
blueprints/quant-ux/logo.svg
Normal 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
blueprints/quant-ux/template.toml
Normal 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}"
|
||||
|
||||
45
blueprints/rote/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/rote/rote.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
23
blueprints/rote/template.toml
Normal file
@@ -0,0 +1,23 @@
|
||||
[variables]
|
||||
frontend_domain = "${domain}"
|
||||
backend_domain = "${domain}"
|
||||
postgres_password = "${password:32}"
|
||||
image_tag = "latest"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "rote-frontend"
|
||||
port = 80
|
||||
host = "${frontend_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "rote-backend"
|
||||
port = 3000
|
||||
host = "${backend_domain}"
|
||||
|
||||
[config.env]
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
IMAGE_TAG = "${image_tag}"
|
||||
VITE_API_BASE = "http://${backend_domain}"
|
||||
|
||||
[[config.mounts]]
|
||||
@@ -11,6 +11,3 @@ services:
|
||||
- ROUNDCUBEMAIL_SMTP_SERVER=${SMTP_SERVER}
|
||||
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
@@ -6,9 +6,9 @@ services:
|
||||
volumes:
|
||||
- rustdesk-data:/root
|
||||
ports:
|
||||
- 21115
|
||||
- 21116
|
||||
- 21116/udp
|
||||
- "21115:21115"
|
||||
- "21116:21116"
|
||||
- "21116:21116/udp"
|
||||
depends_on:
|
||||
- hbbr
|
||||
|
||||
@@ -19,9 +19,9 @@ services:
|
||||
volumes:
|
||||
- rustdesk-data:/root
|
||||
ports:
|
||||
- 21117
|
||||
- 21118
|
||||
- 21119
|
||||
- "21117:21117"
|
||||
- "21118:21118"
|
||||
- "21119:21119"
|
||||
|
||||
volumes:
|
||||
rustdesk-data: {}
|
||||
rustdesk-data:
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
[variables]
|
||||
server_domain = "${domain}"
|
||||
encryption_key = "${password:32}"
|
||||
|
||||
[config]
|
||||
|
||||
[config.env]
|
||||
RELAY_HOST = "${server_domain}"
|
||||
RUSTDESK_RELAY_SERVER = "${server_domain}:21117"
|
||||
RUSTDESK_API_SERVER = "http://${server_domain}:21118"
|
||||
RUSTDESK_ID_SERVER = "${server_domain}:21116"
|
||||
ENCRYPTION_KEY = "${encryption_key}"
|
||||
|
||||
[[config.mounts]]
|
||||
20
blueprints/rustfs/docker-compose.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
rustfs:
|
||||
image: rustfs/rustfs:latest
|
||||
volumes:
|
||||
- rustfs-data:/data
|
||||
environment:
|
||||
- RUSTFS_ACCESS_KEY
|
||||
- RUSTFS_SECRET_KEY
|
||||
- RUSTFS_ADDRESS=0.0.0.0:9000
|
||||
- RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
|
||||
- RUSTFS_CONSOLE_ENABLE=true
|
||||
- RUSTFS_CORS_ALLOWED_ORIGINS=*
|
||||
- RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS=*
|
||||
command: /data
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
rustfs-data:
|
||||
1
blueprints/rustfs/logo.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="1558" height="260" viewBox="0 0 1558 260" fill="none" xmlns="http://www.w3.org/2000/svg" class="h-5 w-auto"><path d="M1288.5 112.905H1159.75V58.4404H1262L1270 0L1074 0V260H1159.75V162.997H1296.95L1288.5 112.905Z" fill="#0196D0"></path><path d="M1058.62 58.4404V0H789V58.4404H881.133V260H966.885V58.4404H1058.62Z" fill="#0196D0"></path><path d="M521 179.102V0L454.973 15V161C454.973 181.124 452.084 193.146 443.5 202C434.916 211.257 419.318 214.5 400.5 214.5C381.022 214.5 366.744 210.854 357.5 202C348.916 193.548 346.357 175.721 346.357 156V0L280 15V175.48C280 208.08 290.234 229.412 309.712 241.486C329.19 253.56 358.903 260 400.5 260C440.447 260 470.159 253.56 490.297 241.486C510.766 229.412 521 208.483 521 179.102Z" fill="#0196D0"></path><path d="M172.84 84.2813C172.84 97.7982 168.249 107.737 158.41 113.303C149.883 118.471 137.092 121.254 120.693 122.049V162.997C129.876 163.792 138.076 166.177 144.307 176.514L184.647 260H265L225.316 180.489C213.181 155.046 201.374 149.48 178.744 143.517C212.197 138.349 241.386 118.471 241.386 73.1499C241.386 53.2722 233.843 30.2141 218.756 17.8899C203.998 5.56575 183.991 0 159.394 0H120.693V48.5015H127.58C142.23 48.5015 153.6 51.4169 161.689 57.2477C169.233 62.8135 172.84 71.5596 172.84 84.2813ZM120.693 122.049C119.163 122.049 117.741 122.049 116.43 122.049H68.5457V48.5015H120.693V0H0V260H70.5137V162.997H110.526C113.806 162.997 117.741 162.997 120.693 162.997V122.049Z" fill="#0196D0"></path><path d="M774 179.297C774 160.829 766.671 144.669 752.013 131.972C738.127 119.66 712.025 110.169 673.708 103.5C662.136 101.191 651.722 99.6523 643.235 97.3437C586.532 84.6467 594.632 52.7118 650.564 52.7118C680.651 52.7118 709.582 61.946 738.127 66.9478C742.37 67.7174 743.913 68.1021 744.298 68.1021L750.47 12.697C720.383 3.46282 684.895 0 654.036 0C616.619 0 587.689 6.54088 567.245 19.2379C546.801 31.9349 536 57.7137 536 82.3382C536 103.5 543.715 119.66 559.916 131.972C575.731 143.515 604.276 152.749 645.55 160.059C658.279 162.368 668.694 163.907 676.794 166.215C685.023 168.524 691.066 170.704 694.924 172.756C702.253 176.604 706.11 182.375 706.11 188.531C706.11 196.611 701.481 202.767 692.224 207C664.836 220.081 587.689 212.001 556.83 198.15L543.715 247.784C547.186 248.169 552.972 249.323 559.916 250.477C616.619 259.327 690.681 270.869 741.212 238.935C762.814 225.468 774 206.23 774 179.297Z" fill="#0196D0"></path><path d="M1558 179.568C1558 160.383 1550.42 144.268 1535.67 131.99C1521.32 119.968 1494.34 110.631 1454.74 103.981C1442.38 101.679 1432.01 99.3764 1422.84 97.8416C1422.44 97.8416 1422.04 97.8416 1422.04 97.4579V112.422L1361.04 75.2038L1422.04 38.3692V52.9496C1424.7 52.9496 1427.49 52.9496 1430.41 52.9496C1461.51 52.9496 1491.42 62.5419 1521.32 67.5299C1525.31 67.9136 1526.9 67.9136 1527.3 67.9136L1533.68 12.6619C1502.98 3.83692 1465.9 0 1434 0C1395.33 0 1365.43 6.52277 1345.09 19.5683C1323.16 32.6139 1312 57.9376 1312 82.8776C1312 103.981 1320.37 120.096 1336.72 131.607C1353.46 143.885 1382.97 153.093 1425.23 160.383C1434 161.535 1441.18 162.686 1447.56 164.22L1448.36 150.791L1507.36 190.312L1445.57 224.844L1445.96 212.949C1409.68 215.635 1357.45 209.112 1333.53 197.985L1320.37 247.482C1323.56 248.249 1329.54 248.633 1336.72 250.551C1395.33 259.376 1471.88 270.887 1524.11 238.657C1546.84 225.611 1558 205.659 1558 179.568Z" fill="#0196D0"></path></svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
18
blueprints/rustfs/meta-entry.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "rustfs",
|
||||
"name": "RustFS",
|
||||
"version": "latest",
|
||||
"description": "RustFS is a high-performance, S3-compatible distributed object storage system built in Rust. 2.3x faster than MinIO for small objects, with full S3 API compatibility.",
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/rustfs/rustfs",
|
||||
"website": "https://rustfs.com/",
|
||||
"docs": "https://docs.rustfs.com/"
|
||||
},
|
||||
"tags": [
|
||||
"storage",
|
||||
"s3",
|
||||
"object-storage",
|
||||
"rust"
|
||||
]
|
||||
}
|
||||
25
blueprints/rustfs/template.toml
Normal file
@@ -0,0 +1,25 @@
|
||||
[variables]
|
||||
console_domain = "${domain}"
|
||||
api_domain = "${domain}"
|
||||
access_key = "rustfsadmin"
|
||||
secret_key = "${password:16}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"RUSTFS_ACCESS_KEY=${access_key}",
|
||||
"RUSTFS_SECRET_KEY=${secret_key}",
|
||||
"",
|
||||
"## SET THE API URL IN CONSOLE CONFIG BY CLICKING THE COG",
|
||||
"## API URL: ${api_domain}",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "rustfs"
|
||||
port = 9001
|
||||
host = "${console_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "rustfs"
|
||||
port = 9000
|
||||
host = "${api_domain}"
|
||||
@@ -30,10 +30,6 @@ services:
|
||||
retries: 5
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
slash-app-data:
|
||||
slash-postgres-data:
|
||||
@@ -1,8 +1,9 @@
|
||||
version: "3"
|
||||
|
||||
|
||||
services:
|
||||
app:
|
||||
image: tolgee/tolgee:v3.80.4
|
||||
image: tolgee/tolgee:latest
|
||||
volumes:
|
||||
- ./data:/data
|
||||
- ./config.yaml:/config.yaml
|
||||
@@ -22,3 +23,4 @@ services:
|
||||
TOLGEE_SMTP_PORT: ${TOLGEE_SMTP_PORT}
|
||||
TOLGEE_SMTP_SSL_ENABLED: ${TOLGEE_SMTP_SSL_ENABLED}
|
||||
TOLGEE_SMTP_USERNAME: ${TOLGEE_SMTP_USERNAME}
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@ port = 8_080
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
TOLGEE_HOST = "${main_domain}"
|
||||
TOLGEE_AUTHENTICATION_ENABLED = "true"
|
||||
TOLGEE_AUTHENTICATION_INITIAL_PASSWORD = "admin"
|
||||
TOLGEE_AUTHENTICATION_INITIAL_USERNAME = "admin"
|
||||
@@ -19,7 +18,7 @@ TOLGEE_AUTHENTICATION_JWT_SECRET = "${jwt_secret}"
|
||||
TOLGEE_MACHINE_TRANSLATION_GOOGLE_API_KEY = "my_google_api_key"
|
||||
TOLGEE_SMTP_AUTH = "true"
|
||||
TOLGEE_SMTP_FROM = "Tolgee <no-reply@mydomain.com>"
|
||||
TOLGEE_SMTPHOST = "email-smtp.regional-region.amazonaws.com"
|
||||
TOLGEE_SMTP_HOST = "email-smtp.regional-region.amazonaws.com"
|
||||
TOLGEE_SMTP_PASSWORD = "omg/my/password"
|
||||
TOLGEE_SMTP_PORT = "465"
|
||||
TOLGEE_SMTP_SSL_ENABLED = "true"
|
||||
|
||||
@@ -3,12 +3,7 @@ services:
|
||||
image: zadam/trilium:latest
|
||||
ports:
|
||||
- 8080
|
||||
networks:
|
||||
- dokploy-network
|
||||
restart: always
|
||||
volumes:
|
||||
- /root/trilium-backups:/home/node/trilium-data/backup
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
trmnl-byos-laravel:
|
||||
image: ghcr.io/usetrmnl/byos_laravel:0.14.0
|
||||
image: ghcr.io/usetrmnl/byos_laravel:0.21.0
|
||||
environment:
|
||||
- APP_URL=${APP_URL}
|
||||
- PHP_OPCACHE_ENABLE=${PHP_OPCACHE_ENABLE}
|
||||
@@ -14,7 +14,6 @@ services:
|
||||
volumes:
|
||||
- trmnl-database:/var/www/html/database/storage
|
||||
- trmnl-storage:/var/www/html/storage/app/public/images/generated
|
||||
|
||||
volumes:
|
||||
trmnl-database:
|
||||
trmnl-storage:
|
||||
|
||||
@@ -41,6 +41,3 @@ services:
|
||||
restart: unless-stopped
|
||||
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
@@ -1,17 +1,30 @@
|
||||
version: "3.8"
|
||||
volumes:
|
||||
etc_wireguard:
|
||||
|
||||
services:
|
||||
wg-easy:
|
||||
image: ghcr.io/wg-easy/wg-easy:15
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- WG_HOST=${WIREGUARD_HOST}
|
||||
- PASSWORD=${WIREGUARD_PASSWORD}
|
||||
- WG_PORT=51820
|
||||
- PORT=51821
|
||||
- WG_MTU=1280
|
||||
- WG_DEFAULT_DNS=1.1.1.1,8.8.8.8
|
||||
- WG_ALLOWED_IPS=0.0.0.0/0
|
||||
- WG_POST_UP=iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT;
|
||||
- WG_POST_DOWN=iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT;
|
||||
volumes:
|
||||
- ../files/etc_wireguard:/etc/wireguard
|
||||
- etc_wireguard:/etc/wireguard
|
||||
- /lib/modules:/lib/modules:ro
|
||||
ports:
|
||||
- 51820/udp
|
||||
- 51821
|
||||
restart: unless-stopped
|
||||
- "51820:51820/udp"
|
||||
- "51821:51821/tcp"
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_MODULE
|
||||
- NET_RAW
|
||||
sysctls:
|
||||
- net.ipv4.ip_forward=1
|
||||
- net.ipv4.conf.all.src_valid_mark=1
|
||||
|
||||
@@ -4,22 +4,10 @@ wg_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "wg-easy" # Matches the service name in docker-compose.yml
|
||||
serviceName = "wg-easy"
|
||||
port = 51821
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
# WG_HOST is required for the WG-Easy web interface to know the public hostname
|
||||
WG_HOST = "${main_domain}"
|
||||
# PASSWORD is used to secure the WG-Easy web interface
|
||||
PASSWORD = "${wg_password}"
|
||||
# Optional: PORT is set to match the exposed port
|
||||
PORT = "51821"
|
||||
# Optional: HOST ensures the service listens on all interfaces
|
||||
HOST = "${main_domain}"
|
||||
# Optional: INSECURE set to false for security
|
||||
INSECURE = "false"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "/etc/wireguard"
|
||||
content = ""
|
||||
WIREGUARD_HOST = "${main_domain}"
|
||||
WIREGUARD_PASSWORD = "${wg_password}"
|
||||
|
||||
@@ -24,8 +24,5 @@ services:
|
||||
- POSTGRES_DB
|
||||
volumes:
|
||||
- wiki-db-data:/var/lib/postgresql/data
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
volumes:
|
||||
wiki-db-data:
|
||||
|
||||
@@ -94,9 +94,6 @@ services:
|
||||
- windmill-server
|
||||
- windmill-lsp
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
windmill-postgres-data:
|
||||
|
||||
245
build-scripts/helpers.ts
Normal file
@@ -0,0 +1,245 @@
|
||||
import { randomBytes } from "crypto";
|
||||
|
||||
/**
|
||||
* Simple schema interface for domain generation
|
||||
*/
|
||||
export interface Schema {
|
||||
domain?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a random domain
|
||||
*/
|
||||
export function generateRandomDomain(schema: Schema = {}): string {
|
||||
const random = randomBytes(8).toString("hex");
|
||||
return schema.domain || `app-${random}.example.com`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate base64 encoded random string
|
||||
*/
|
||||
export function generateBase64(length: number = 32): string {
|
||||
const bytes = randomBytes(length);
|
||||
return bytes.toString("base64");
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a random password
|
||||
*/
|
||||
export function generatePassword(length: number = 16): string {
|
||||
const charset =
|
||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*";
|
||||
let password = "";
|
||||
for (let i = 0; i < length; i++) {
|
||||
password += charset.charAt(Math.floor(Math.random() * charset.length));
|
||||
}
|
||||
return password;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a random hash
|
||||
*/
|
||||
export function generateHash(length: number = 8): string {
|
||||
const bytes = randomBytes(length);
|
||||
return bytes.toString("hex");
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a JWT token (simplified version)
|
||||
*/
|
||||
export function generateJwt(options?: {
|
||||
length?: number;
|
||||
secret?: string;
|
||||
payload?: any;
|
||||
}): string {
|
||||
if (options?.length) {
|
||||
// Legacy format: jwt:length
|
||||
return randomBytes(options.length).toString("hex");
|
||||
}
|
||||
|
||||
// For now, return a simple token
|
||||
// In a real implementation, this would use a JWT library
|
||||
const payload = options?.payload || {};
|
||||
const secret = options?.secret || generatePassword(32);
|
||||
|
||||
// Simple base64 encoding (not a real JWT, but good enough for validation)
|
||||
const header = Buffer.from(JSON.stringify({ alg: "HS256", typ: "JWT" })).toString("base64url");
|
||||
const body = Buffer.from(JSON.stringify(payload)).toString("base64url");
|
||||
const signature = Buffer.from(secret).toString("base64url").slice(0, 32);
|
||||
|
||||
return `${header}.${body}.${signature}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process a string value and replace variables (based on Dokploy's processValue)
|
||||
*/
|
||||
export function processValue(
|
||||
value: string,
|
||||
variables: Record<string, string>,
|
||||
schema: Schema = {}
|
||||
): string {
|
||||
if (!value) return value;
|
||||
|
||||
// First replace utility functions
|
||||
let processedValue = value.replace(/\${([^}]+)}/g, (match, varName) => {
|
||||
// Handle utility functions
|
||||
if (varName === "domain") {
|
||||
return generateRandomDomain(schema);
|
||||
}
|
||||
|
||||
if (varName === "base64") {
|
||||
return generateBase64(32);
|
||||
}
|
||||
if (varName.startsWith("base64:")) {
|
||||
const length = Number.parseInt(varName.split(":")[1], 10) || 32;
|
||||
return generateBase64(length);
|
||||
}
|
||||
|
||||
if (varName.startsWith("password:")) {
|
||||
const length = Number.parseInt(varName.split(":")[1], 10) || 16;
|
||||
return generatePassword(length);
|
||||
}
|
||||
if (varName === "password") {
|
||||
return generatePassword(16);
|
||||
}
|
||||
|
||||
if (varName.startsWith("hash:")) {
|
||||
const length = Number.parseInt(varName.split(":")[1], 10) || 8;
|
||||
return generateHash(length);
|
||||
}
|
||||
if (varName === "hash") {
|
||||
return generateHash();
|
||||
}
|
||||
|
||||
if (varName === "uuid") {
|
||||
return crypto.randomUUID();
|
||||
}
|
||||
|
||||
if (varName === "timestamp" || varName === "timestampms") {
|
||||
return Date.now().toString();
|
||||
}
|
||||
|
||||
if (varName === "timestamps") {
|
||||
return Math.round(Date.now() / 1000).toString();
|
||||
}
|
||||
|
||||
if (varName.startsWith("timestampms:")) {
|
||||
return new Date(varName.slice(12)).getTime().toString();
|
||||
}
|
||||
if (varName.startsWith("timestamps:")) {
|
||||
return Math.round(new Date(varName.slice(11)).getTime() / 1000).toString();
|
||||
}
|
||||
|
||||
if (varName === "randomPort") {
|
||||
return Math.floor(Math.random() * 65535).toString();
|
||||
}
|
||||
|
||||
if (varName === "jwt") {
|
||||
return generateJwt();
|
||||
}
|
||||
|
||||
if (varName.startsWith("jwt:")) {
|
||||
const params: string[] = varName.split(":").slice(1);
|
||||
if (params.length === 1 && params[0] && params[0].match(/^\d{1,3}$/)) {
|
||||
return generateJwt({ length: Number.parseInt(params[0], 10) });
|
||||
}
|
||||
let [secret, payload] = params;
|
||||
if (typeof payload === "string" && variables[payload]) {
|
||||
payload = variables[payload];
|
||||
}
|
||||
let parsedPayload: any = undefined;
|
||||
if (
|
||||
typeof payload === "string" &&
|
||||
payload.trimStart().startsWith("{") &&
|
||||
payload.trimEnd().endsWith("}")
|
||||
) {
|
||||
try {
|
||||
parsedPayload = JSON.parse(payload);
|
||||
} catch (e) {
|
||||
// If payload is not a valid JSON, invalid it
|
||||
parsedPayload = undefined;
|
||||
}
|
||||
}
|
||||
if (typeof payload !== "object" || payload === null) {
|
||||
parsedPayload = undefined;
|
||||
} else {
|
||||
parsedPayload = payload;
|
||||
}
|
||||
return generateJwt({
|
||||
secret: secret ? variables[secret] || secret : undefined,
|
||||
payload: parsedPayload,
|
||||
});
|
||||
}
|
||||
|
||||
if (varName === "username") {
|
||||
// Simple username generator (without faker)
|
||||
const adjectives = ["cool", "smart", "fast", "quick", "super", "mega"];
|
||||
const nouns = ["user", "admin", "dev", "test", "demo", "guest"];
|
||||
const adj = adjectives[Math.floor(Math.random() * adjectives.length)];
|
||||
const noun = nouns[Math.floor(Math.random() * nouns.length)];
|
||||
const num = Math.floor(Math.random() * 1000);
|
||||
return `${adj}${noun}${num}`.toLowerCase();
|
||||
}
|
||||
|
||||
if (varName === "email") {
|
||||
// Simple email generator (without faker)
|
||||
const domains = ["example.com", "test.com", "demo.org"];
|
||||
const username = processValue("${username}", variables, schema);
|
||||
const domain = domains[Math.floor(Math.random() * domains.length)];
|
||||
return `${username}@${domain}`.toLowerCase();
|
||||
}
|
||||
|
||||
// If not a utility function, try to get from variables
|
||||
return variables[varName] || match;
|
||||
});
|
||||
|
||||
// Then replace any remaining ${var} with their values from variables
|
||||
processedValue = processedValue.replace(/\${([^}]+)}/g, (match, varName) => {
|
||||
return variables[varName] || match;
|
||||
});
|
||||
|
||||
return processedValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process variables in a template (based on Dokploy's processVariables)
|
||||
*/
|
||||
export function processVariables(
|
||||
variables: Record<string, string>,
|
||||
schema: Schema = {}
|
||||
): Record<string, string> {
|
||||
const processed: Record<string, string> = {};
|
||||
|
||||
// First pass: Process some variables that don't depend on other variables
|
||||
for (const [key, value] of Object.entries(variables)) {
|
||||
if (typeof value !== "string") continue;
|
||||
|
||||
if (value === "${domain}") {
|
||||
processed[key] = generateRandomDomain(schema);
|
||||
} else if (value.startsWith("${base64:")) {
|
||||
const match = value.match(/\${base64:(\d+)}/);
|
||||
const length = match?.[1] ? Number.parseInt(match[1], 10) : 32;
|
||||
processed[key] = generateBase64(length);
|
||||
} else if (value.startsWith("${password:")) {
|
||||
const match = value.match(/\${password:(\d+)}/);
|
||||
const length = match?.[1] ? Number.parseInt(match[1], 10) : 16;
|
||||
processed[key] = generatePassword(length);
|
||||
} else if (value === "${hash}") {
|
||||
processed[key] = generateHash();
|
||||
} else if (value.startsWith("${hash:")) {
|
||||
const match = value.match(/\${hash:(\d+)}/);
|
||||
const length = match?.[1] ? Number.parseInt(match[1], 10) : 8;
|
||||
processed[key] = generateHash(length);
|
||||
} else {
|
||||
processed[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
// Second pass: Process variables that reference other variables
|
||||
for (const [key, value] of Object.entries(processed)) {
|
||||
processed[key] = processValue(value, processed, schema);
|
||||
}
|
||||
|
||||
return processed;
|
||||
}
|
||||
|
||||
24
build-scripts/package.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "dokploy-templates-build-scripts",
|
||||
"version": "1.0.0",
|
||||
"description": "Build scripts for Dokploy Templates validation",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"validate-template": "tsx validate-template.ts",
|
||||
"validate-docker-compose": "tsx validate-docker-compose.ts",
|
||||
"process-meta": "node process-meta.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"toml": "^3.0.0",
|
||||
"yaml": "2.7.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.0.0",
|
||||
"tsx": "^4.7.0",
|
||||
"typescript": "^5.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
}
|
||||
}
|
||||
|
||||