Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
984cf0b4d4 | ||
|
|
5b54bdf266 | ||
|
|
0438165d43 | ||
|
|
7528f73265 | ||
|
|
37dc848e71 | ||
|
|
76049e3628 | ||
|
|
726a8c6bc9 | ||
|
|
54eccbe32b | ||
|
|
b23e3320f0 | ||
|
|
be933bdc54 | ||
|
|
32da868c01 | ||
|
|
efea22e1f0 | ||
|
|
40aa695a73 | ||
|
|
4367e2a42a | ||
|
|
87ab908a32 | ||
|
|
a9740da9cb | ||
|
|
b4efed26a0 | ||
|
|
0e84b284d8 | ||
|
|
4c36b7d6ca | ||
|
|
7c540d158a | ||
|
|
a00b179ddf | ||
|
|
6e1aece2e7 | ||
|
|
eb41d83963 | ||
|
|
385906aa4c | ||
|
|
640abda5d8 | ||
|
|
9e4da9c806 | ||
|
|
f3c1060443 | ||
|
|
c0ff3ca788 | ||
|
|
dcc456d18b | ||
|
|
b7f7c9ffb8 | ||
|
|
30ecc96168 | ||
|
|
c59fbf0f36 | ||
|
|
0aad2a0231 | ||
|
|
aa48af7856 | ||
|
|
abd316fd6e | ||
|
|
f78cc8d51f | ||
|
|
7834542c9c | ||
|
|
5905579eab | ||
|
|
f569d1379c | ||
|
|
3205b672c4 | ||
|
|
0fd2456a2a | ||
|
|
b4ebb8d9c5 | ||
|
|
daae16de16 | ||
|
|
88bff5f2a0 | ||
|
|
bba48c0a57 | ||
|
|
7efe2226ff | ||
|
|
8ec4ad1d9c | ||
|
|
3ec51b85bf | ||
|
|
a91730e582 | ||
|
|
d58cc15c54 | ||
|
|
ac07aa2ed8 | ||
|
|
46dc5b9be3 | ||
|
|
2e1fb3b3a9 | ||
|
|
1d70294310 | ||
|
|
60796a9084 | ||
|
|
3e8b431031 | ||
|
|
47daea92f8 | ||
|
|
758cf1d873 | ||
|
|
1e21b7e785 |
@@ -0,0 +1,11 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: 📚 Documentation
|
||||
url: https://docs.dokploy.com
|
||||
about: Check out the official Dokploy documentation for guides and references
|
||||
- name: 🌐 Website
|
||||
url: https://dokploy.com
|
||||
about: Visit the official Dokploy website
|
||||
- name: 💬 GitHub Discussions
|
||||
url: https://github.com/Dokploy/dokploy/discussions
|
||||
about: Join the community discussions for questions and support
|
||||
@@ -8,7 +8,6 @@ Key components:
|
||||
|
||||
- **Blueprints**: Self-contained templates with `docker-compose.yml` (service definitions) and `template.toml` (Dokploy-specific configuration for domains, env vars, mounts).
|
||||
- **meta.json**: Centralized index of all templates, aggregated from blueprint metadata. Entries include `id`, `name`, `version`, `description`, `logo`, `links`, and `tags`.
|
||||
- **app/**: Vite-based React frontend for local preview/development (runs at http://localhost:5173). Copies blueprints and meta.json to dist during build.
|
||||
- **Scripts**: Node.js tools in root and `build-scripts/` for maintaining `meta.json` (deduplication, sorting, validation).
|
||||
|
||||
Data flow: New templates added to `blueprints/` → Metadata updated in `meta.json` → Processing scripts ensure consistency → App builds include static blueprints/meta for preview.
|
||||
@@ -22,7 +21,6 @@ The "why": Enables rapid, standardized deployment of 200+ OSS apps on Dokploy wi
|
||||
- `docker-compose.yml`: Standard Docker Compose v3.8. Avoid `ports`, `container_name`, `networks`—Dokploy handles isolation via internal networks.
|
||||
- `template.toml`: Defines variables (e.g., `${domain}`), domains (service:port → host), env vars, and mounts. Use helpers like `${password:32}`, `${uuid}`, `${jwt:secret_var}`.
|
||||
- `logo.svg/png`: Service icon, referenced in `meta.json`.
|
||||
- `app/vite.config.ts`: Configures build to copy `blueprints/*` and `meta.json` to dist root for static serving.
|
||||
- `dedupe-and-sort-meta.js`: Standalone script—reads `meta.json`, removes duplicate `id`s (keeps first), sorts by `id` (case-insensitive), creates timestamped backup.
|
||||
- `build-scripts/process-meta.js`: Advanced processor with CLI options (`--verbose`, `--no-backup`, `--input`/`--output`), JSON schema validation (required: `id`, `name`, `version`, `description`, `links.github`, `logo`, `tags` array).
|
||||
|
||||
@@ -39,14 +37,7 @@ Exemplary blueprint: `blueprints/ghost/`—`docker-compose.yml` exposes port 236
|
||||
- Run `node dedupe-and-sort-meta.js --backup` to validate/sort.
|
||||
- Commit; PR triggers Dokploy preview (base64 import for testing).
|
||||
|
||||
2. **Local Development**:
|
||||
|
||||
- App: `cd app && pnpm install && pnpm dev` (Vite dev server).
|
||||
- Meta processing: `npm run process-meta` or `make process-meta` (uses Makefile targets: `validate`, `check`, `build`).
|
||||
- Build app: `cd app && pnpm build`—copies blueprints/meta to `dist/` for static hosting.
|
||||
- Test template: Use PR preview URL or local Dokploy instance; import base64 from template card.
|
||||
|
||||
3. **CI/CD**:
|
||||
2. **CI/CD**:
|
||||
- `.github/workflows/validate-meta.yml` (if present): Runs validation on push/PR—fails on duplicates, invalid JSON, missing fields.
|
||||
- Integrate processing: Add `npm run process-meta` to build steps; use `--no-backup` in CI.
|
||||
|
||||
@@ -67,7 +58,7 @@ No tests in repo—focus on manual validation via scripts and Dokploy deploys. D
|
||||
- **Versions**: Pin images to specific versions in `docker-compose.yml` (e.g., `ghost:5.82.0-alpine`); match in `meta.json.version`.
|
||||
- **Logos**: SVG preferred; size ~128x128; file name in `meta.json.logo` (e.g., "ghost.svg").
|
||||
|
||||
Cross-component: No runtime communication—templates independent. App consumes static blueprints/meta for UI rendering (e.g., search, cards via React components in `app/src/`).
|
||||
Cross-component: Templates are independent and ship as static blueprints/meta.
|
||||
|
||||
## Integration Points
|
||||
|
||||
|
||||
@@ -6,12 +6,13 @@ New PR of [Template Name]
|
||||
|
||||
Before submitting this PR, please make sure that:
|
||||
|
||||
- [ ] I have read the suggestions in the README.md file https://github.com/Dokploy/templates?tab=readme-ov-file#general-suggestions-when-creating-a-template
|
||||
- [ ] I have read the suggestions in the README.md file https://github.com/Dokploy/templates?tab=readme-ov-file#general-requirements-when-creating-a-template
|
||||
- [ ] I have tested the template in my instance, so the maintainers don't spend time trying to figure out what's wrong.
|
||||
- [ ] I have added tests that demonstrate that my correction works or that my new feature works.
|
||||
|
||||
## Issues related (if applicable)
|
||||
|
||||
Close automatically the related issues using the keywords: `closes #ISSUE_NUMBER`, `fixes #ISSUE_NUMBER`, `resolves #ISSUE_NUMBER`
|
||||
Close automatically the related issues using the keywords: `closes #ISSUE_NUMBER`
|
||||
|
||||
Example: `closes #123`
|
||||
|
||||
## Screenshots or Videos
|
||||
@@ -8,7 +8,6 @@ on:
|
||||
pull_request:
|
||||
branches:
|
||||
- canary
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
deployments: write
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
node_modules
|
||||
@@ -0,0 +1,212 @@
|
||||
# AGENTS.md: AI Collaboration Guide
|
||||
|
||||
This document provides essential context for AI models interacting with this project. Adhering to these guidelines will ensure consistency and maintain code quality.
|
||||
|
||||
## 1. Project Overview & Purpose
|
||||
|
||||
- **Primary Goal:** This is the official repository for Dokploy Open Source Templates, maintaining Docker Compose templates for deploying 200+ open-source applications via Dokploy (a self-hosted PaaS alternative to Heroku). The project enables rapid, standardized deployment of OSS applications without manual configuration.
|
||||
- **Business Domain:** Self-hosted Platform as a Service (PaaS), DevOps tooling, containerized application deployment, and open-source software distribution.
|
||||
|
||||
## 2. Core Technologies & Stack
|
||||
|
||||
- **Languages:** JavaScript (Node.js), TypeScript (React frontend), YAML (Docker Compose), TOML (template configuration), JSON (metadata), Shell (build scripts).
|
||||
- **Frameworks & Runtimes:** Node.js runtime, Vite 5.x (for React 19.x frontend), Docker Compose v3.8+, React Router 7.x.
|
||||
- **Databases:** No direct database usage in core project (templates may include various databases like PostgreSQL, MySQL, Redis, etc.).
|
||||
- **Key Libraries/Dependencies:**
|
||||
- **Core:** `nodemon` for development, custom Node.js scripts for meta processing.
|
||||
- **Frontend:** `fuse.js` (fuzzy search), `zustand` (state management), `@iarna/toml` (TOML parsing), `shadcn/ui` components, `@radix-ui` primitives, `@codemirror` (code editor), `react-router-dom`, `tailwindcss`.
|
||||
- **Build:** `vite-plugin-static-copy` for copying blueprints to dist.
|
||||
- **Platforms:** Linux (primary), Docker containers, Dokploy PaaS, Web browsers (for frontend preview), Cloudflare Pages (for PR previews).
|
||||
- **Package Manager:** npm for root project, pnpm for frontend (`app/` directory).
|
||||
|
||||
## 3. Architectural Patterns
|
||||
|
||||
- **Overall Architecture:** Template collection and management system with decentralized blueprint architecture. Each blueprint is a self-contained Docker Compose application with Dokploy-specific configuration.
|
||||
- **Directory Structure Philosophy:**
|
||||
- `/blueprints`: Contains all deployable application templates, each as a subdirectory with `docker-compose.yml`, `template.toml`, and logo files. Each blueprint is independent with no shared state.
|
||||
- `/app`: Vite + React + TypeScript frontend for local preview and development.
|
||||
- `/src/components`: React components (UI components in `/ui` subdirectory using shadcn/ui).
|
||||
- `/src/hooks`: Custom React hooks (e.g., `useFuseSearch.ts` for fuzzy search).
|
||||
- `/src/store`: Zustand state management store.
|
||||
- `/src/lib`: Utility functions and helpers.
|
||||
- `/build-scripts`: Advanced meta.json processing tools with CLI options and JSON schema validation.
|
||||
- `/.github/workflows`: CI/CD workflows for validation, preview builds, and deployments.
|
||||
- Root level: Core processing scripts (`dedupe-and-sort-meta.js`), metadata index (`meta.json`), build configuration (`Makefile`, `package.json`).
|
||||
- **Module Organization:** Node.js scripts for metadata processing, React components for frontend UI, Docker Compose files for service definitions, TOML files for Dokploy configuration. Frontend uses component-based architecture with hooks for business logic and Zustand for global state.
|
||||
|
||||
## 4. Coding Conventions & Style Guide
|
||||
|
||||
- **Formatting:** JavaScript follows standard conventions with 2-space indentation. TypeScript in frontend uses ESLint configuration. YAML uses 2-space indentation. TOML files use standard formatting.
|
||||
- **Naming Conventions:**
|
||||
- Variables, functions: camelCase (`myVariable`, `myFunction`)
|
||||
- React components: PascalCase (`TemplateGrid`, `SearchBar`)
|
||||
- Constants: SCREAMING_SNAKE_CASE (`MAX_BUFFER_SIZE`)
|
||||
- Template IDs: lowercase, kebab-case (`activepieces`, `ghost`) - **MUST** be unique across repository
|
||||
- Files: snake_case for scripts (`dedupe-and-sort-meta.js`), PascalCase for React components (`TemplateGrid.tsx`), kebab-case for directories (`build-scripts`)
|
||||
- Docker services: **MUST** match blueprint folder name exactly (e.g., `ghost` service in `blueprints/ghost/`)
|
||||
- **API Design:**
|
||||
- **Backend:** Procedural scripting approach with CLI interfaces. Template system uses declarative configuration over imperative code.
|
||||
- **Frontend:** Component-based React architecture with hooks for logic separation. Zustand for centralized state management. Custom hooks encapsulate complex logic (e.g., `useFuseSearch` for search functionality).
|
||||
- **Common Patterns & Idioms:**
|
||||
- **Metaprogramming:** Minimal use of advanced JavaScript features in scripts, focusing on simple, maintainable code.
|
||||
- **Memory Management:** Relies on Node.js garbage collection and React's automatic memory management.
|
||||
- **Polymorphism:** Uses JavaScript prototype-based objects and functional programming patterns. React components use composition over inheritance.
|
||||
- **Type Safety:**
|
||||
- Backend scripts: JavaScript with JSDoc comments for documentation.
|
||||
- Frontend: TypeScript with strict type checking enabled.
|
||||
- **Concurrency:**
|
||||
- Backend: Synchronous processing model for meta.json operations.
|
||||
- Frontend: React's concurrent rendering, `useDeferredValue` for debouncing, `useEffect` for async operations.
|
||||
- **State Management:** Zustand store pattern with selectors for optimal re-renders. URL params synced with search state via React Router.
|
||||
- **Error Handling:**
|
||||
- Backend: Node.js error-first callback pattern and try-catch blocks. Scripts validate JSON structure and fail fast on errors.
|
||||
- Frontend: Error boundaries for React components, try-catch for async operations, user-friendly error messages via toast notifications.
|
||||
|
||||
## 5. Key Files & Entrypoints
|
||||
|
||||
- **Main Entrypoints:**
|
||||
- **Backend:** `dedupe-and-sort-meta.js` - Primary script for processing meta.json file.
|
||||
- **Frontend:** `app/src/main.tsx` - React application entry point.
|
||||
- **Configuration:**
|
||||
- `package.json` - Root Node.js project configuration and npm scripts.
|
||||
- `app/package.json` - Frontend dependencies and pnpm scripts.
|
||||
- `meta.json` - Centralized template registry (200+ entries).
|
||||
- `Makefile` - Build automation with targets for processing, validation, and cleanup.
|
||||
- `app/vite.config.ts` - Vite build configuration with static copy plugin.
|
||||
- `app/tsconfig.json` - TypeScript compiler configuration.
|
||||
- **CI/CD Pipeline:**
|
||||
- `.github/workflows/validate-meta.yml` - Validates meta.json structure, duplicates, and sort order.
|
||||
- `.github/workflows/build-preview.yml` - Builds preview deployments for PRs.
|
||||
- `.github/workflows/deploy-preview.yml` - Deploys previews to Cloudflare Pages.
|
||||
|
||||
## 6. Development & Testing Workflow
|
||||
|
||||
- **Local Development Environment:**
|
||||
- **Install dependencies**
|
||||
|
||||
```bash
|
||||
# Root project
|
||||
npm install
|
||||
|
||||
# Frontend (uses pnpm)
|
||||
cd app && pnpm install
|
||||
```
|
||||
|
||||
- **Process meta.json** (CRITICAL: Run after ANY meta.json edits)
|
||||
```bash
|
||||
npm run process-meta
|
||||
# or
|
||||
make process-meta
|
||||
# or
|
||||
node dedupe-and-sort-meta.js
|
||||
```
|
||||
- **Validate without modifying**
|
||||
```bash
|
||||
npm run validate-meta
|
||||
# or
|
||||
make validate
|
||||
```
|
||||
- **Quick check for duplicates/sort status**
|
||||
```bash
|
||||
make check
|
||||
```
|
||||
- **Clean backup files**
|
||||
```bash
|
||||
make clean
|
||||
```
|
||||
- **Task Configuration:**
|
||||
- **NPM Scripts:** Run `npm run` to list available scripts. Key scripts:
|
||||
- `process-meta`: Remove duplicates and sort meta.json
|
||||
- `process-meta-verbose`: Process with detailed output
|
||||
- `validate-meta`: Validate structure without changes
|
||||
- **Makefile Targets:** Run `make help` to list targets. Key targets:
|
||||
- `process-meta`: Process meta.json
|
||||
- `validate`: Validate without modifying
|
||||
- `check`: Quick duplicate/sort check
|
||||
- `build`: Full build process
|
||||
- `clean`: Remove backup files
|
||||
- **Testing:** No formal unit testing framework. Validation occurs through:
|
||||
- Script-based validation of meta.json structure and schema
|
||||
- Manual testing via Dokploy preview deployments (import base64 from PR preview)
|
||||
- JSON schema validation in `build-scripts/process-meta.js`
|
||||
- TypeScript compilation errors caught during build
|
||||
- ESLint for code quality in frontend
|
||||
- **CI/CD Process:**
|
||||
- **On meta.json changes:** Validates structure, checks for duplicates, verifies sort order, compares processed vs original.
|
||||
- **On PR creation:** Builds preview deployment, generates base64 import for testing in Dokploy.
|
||||
- **Preview testing:** Use PR description link → Search template → Copy base64 → Import in Dokploy instance.
|
||||
|
||||
## 7. Specific Instructions for AI Collaboration
|
||||
|
||||
- **Contribution Guidelines:**
|
||||
- Follow existing Dokploy template structure strictly. Each blueprint must be independent with no shared state.
|
||||
- **CRITICAL:** Always run `node dedupe-and-sort-meta.js` or `npm run process-meta` after ANY meta.json edits.
|
||||
- Test templates in Dokploy preview before submitting PRs (use base64 import from PR preview).
|
||||
- Add logo file (SVG preferred, ~128x128px) to blueprint folder.
|
||||
- Ensure template `id` in meta.json exactly matches blueprint folder name (lowercase kebab-case).
|
||||
- **Docker Compose Conventions (CRITICAL):**
|
||||
|
||||
- **Version:** MUST be `3.8`
|
||||
- **NEVER include:** `ports` (use `expose` only), `container_name`, `networks` (Dokploy handles isolation)
|
||||
- **ALWAYS include:** `restart: unless-stopped` or `restart: always`, persistent volumes
|
||||
- **Service naming:** MUST match blueprint folder name exactly
|
||||
- **Example:**
|
||||
```yaml
|
||||
version: "3.8"
|
||||
services:
|
||||
ghost:
|
||||
image: ghost:6-alpine
|
||||
restart: always
|
||||
volumes:
|
||||
- ghost:/var/lib/ghost/content
|
||||
volumes:
|
||||
ghost:
|
||||
```
|
||||
|
||||
- **template.toml Conventions:**
|
||||
|
||||
- **Variables:** Define in `[variables]` section, use helpers for secrets
|
||||
- **Domains:** `[[config.domains]]` with `serviceName`, `port`, `host` (path optional)
|
||||
- **Env:** Array of strings: `env = ["KEY=VALUE", "DB_PASSWORD=${db_pass}"]`
|
||||
- **Available helpers:** `${domain}`, `${password:length}`, `${base64:length}`, `${hash:length}`, `${uuid}`, `${randomPort}`, `${email}`, `${username}`, `${timestamp}`, `${timestamps:datetime}`, `${timestampms:datetime}`, `${jwt:secret_var:payload_var}`
|
||||
- **JWT helper example:** `${jwt:mysecret:mypayload}` with payload containing `exp: ${timestamps:2030-01-01T00:00:00Z}`
|
||||
|
||||
- **meta.json Requirements:**
|
||||
|
||||
- **Required fields:** `id`, `name`, `version`, `description`, `links` (with `github`), `logo`, `tags` (array)
|
||||
- **Tags:** Lowercase strings (e.g., `["monitoring", "database"]`)
|
||||
- **Version:** MUST match Docker image version in docker-compose.yml
|
||||
- **Logo:** Filename only (e.g., `"ghost.jpeg"`), file must exist in blueprint folder
|
||||
|
||||
- **Frontend Development:**
|
||||
|
||||
- Use TypeScript with strict type checking
|
||||
- Follow React hooks patterns, avoid class components
|
||||
- Use Zustand selectors for state access to optimize re-renders
|
||||
- Fuse.js searches across `name`, `description`, `tags`, `id` fields
|
||||
- Use shadcn/ui components for consistency
|
||||
- Sync URL params with search state via React Router
|
||||
|
||||
- **Security:**
|
||||
|
||||
- Be mindful of security when handling template configurations
|
||||
- NEVER hardcode secrets in templates - use Dokploy's variable system with helpers
|
||||
- Pin Docker images to specific versions to avoid supply chain attacks
|
||||
- Validate user input in frontend before processing
|
||||
|
||||
- **Dependencies:**
|
||||
|
||||
- When adding new templates, ensure Docker images are pinned to specific versions
|
||||
- Update meta.json with exact version matching Docker Compose image version
|
||||
- For frontend dependencies: Use `pnpm add <package>` in `app/` directory
|
||||
- For root dependencies: Use `npm install <package>` in root directory
|
||||
|
||||
- **Commit Messages:** Follow conventional commit patterns (e.g., `feat:`, `fix:`, `docs:`, `chore:`).
|
||||
|
||||
- **Common Pitfalls to Avoid:**
|
||||
1. Forgetting to process meta.json after editing (CI will fail)
|
||||
2. Template ID mismatch between meta.json and folder name
|
||||
3. Including `ports`, `container_name`, or `networks` in docker-compose.yml
|
||||
4. Using object syntax for env vars in template.toml (must be array of strings)
|
||||
5. Logo file missing or filename mismatch in meta.json
|
||||
6. Version mismatch between meta.json and docker-compose.yml image tag
|
||||
@@ -148,7 +148,6 @@ Use these in `${}` for dynamic values:
|
||||
|
||||
- Omit explicit ports; let Dokploy handle exposure.
|
||||
- Use persistent volumes for data (e.g., databases).
|
||||
- Set `restart: unless-stopped` for services.
|
||||
|
||||
- **Template.toml**:
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -9,6 +9,7 @@ services:
|
||||
- ACKEE_USERNAME=${ACKEE_USERNAME}
|
||||
- ACKEE_PASSWORD=${ACKEE_PASSWORD}
|
||||
- ACKEE_MONGODB=${ACKEE_MONGODB}
|
||||
|
||||
mongo:
|
||||
image: mongo:4
|
||||
environment:
|
||||
@@ -17,6 +18,7 @@ services:
|
||||
volumes:
|
||||
- mongo-data:/data/db
|
||||
|
||||
|
||||
volumes:
|
||||
mongo-data:
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ serviceName = "ackee"
|
||||
port = 3000
|
||||
host = "${domain}"
|
||||
|
||||
|
||||
[config.env]
|
||||
ACKEE_USERNAME = "${ACKEE_USERNAME}"
|
||||
ACKEE_PASSWORD = "${ACKEE_PASSWORD}"
|
||||
|
||||
@@ -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"
|
||||
|
After Width: | Height: | Size: 50 KiB |
@@ -0,0 +1,4 @@
|
||||
[config]
|
||||
domains = []
|
||||
mounts = []
|
||||
env = []
|
||||
@@ -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 |
@@ -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:
|
||||
@@ -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:
|
||||
|
||||
|
After Width: | Height: | Size: 12 KiB |
@@ -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:
|
||||
@@ -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: {}
|
||||
@@ -0,0 +1,21 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="128" height="128">
|
||||
<!-- Background circle -->
|
||||
<circle cx="50" cy="50" r="48" fill="#E6522C" stroke="#CC4A1F" stroke-width="2"/>
|
||||
|
||||
<!-- Prometheus flame icon adapted for monitoring -->
|
||||
<path d="M50 15 L60 35 L80 35 L65 48 L72 68 L50 55 L28 68 L35 48 L20 35 L40 35 Z"
|
||||
fill="#FFF" opacity="0.95"/>
|
||||
|
||||
<!-- Graph/Chart lines representing monitoring -->
|
||||
<path d="M 20 75 L 30 65 L 40 70 L 50 60 L 60 65 L 70 55 L 80 60"
|
||||
stroke="#FFF" stroke-width="3" fill="none" stroke-linecap="round" opacity="0.8"/>
|
||||
|
||||
<!-- Data points on the graph -->
|
||||
<circle cx="20" cy="75" r="2.5" fill="#FFF"/>
|
||||
<circle cx="30" cy="65" r="2.5" fill="#FFF"/>
|
||||
<circle cx="40" cy="70" r="2.5" fill="#FFF"/>
|
||||
<circle cx="50" cy="60" r="2.5" fill="#FFF"/>
|
||||
<circle cx="60" cy="65" r="2.5" fill="#FFF"/>
|
||||
<circle cx="70" cy="55" r="2.5" fill="#FFF"/>
|
||||
<circle cx="80" cy="60" r="2.5" fill="#FFF"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 979 B |
@@ -0,0 +1,17 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
monitoring_token = "${password:32}"
|
||||
callback_url = "http://dokploy:3000/api/trpc/notification.receiveNotification"
|
||||
server_type = "Dokploy"
|
||||
refresh_rate = "30"
|
||||
retention_days = "7"
|
||||
cpu_threshold = "80"
|
||||
memory_threshold = "85"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "dokploy-monitoring"
|
||||
port = 3001
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
METRICS_CONFIG = "{\"server\":{\"refreshRate\":${refresh_rate},\"port\":3001,\"type\":\"${server_type}\",\"token\":\"${monitoring_token}\",\"urlCallback\":\"${callback_url}\",\"retentionDays\":${retention_days},\"cronJob\":\"0 0 * * *\",\"thresholds\":{\"cpu\":${cpu_threshold},\"memory\":${memory_threshold}},\"prometheus\":{\"enabled\":true}},\"containers\":{\"refreshRate\":${refresh_rate},\"services\":{\"include\":[],\"exclude\":[]}}}"
|
||||
@@ -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:
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
excalidraw:
|
||||
restart: unless-stopped
|
||||
image: excalidraw/excalidraw:latest
|
||||
healthcheck:
|
||||
test:
|
||||
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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 |
@@ -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}
|
||||
|
||||
@@ -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:
|
||||
|
After Width: | Height: | Size: 58 KiB |
@@ -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:
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
# https://docs.mage.ai/getting-started/setup#docker-compose
|
||||
#
|
||||
# The default credentials are:
|
||||
# USERNAME: admin@admin.com
|
||||
# PASSWORD: admin
|
||||
|
||||
services:
|
||||
mage-ai:
|
||||
image: mageai/mageai:0.9.78
|
||||
command: mage start ${PROJECT_NAME}
|
||||
environment:
|
||||
USER_CODE_PATH: /home/src/${PROJECT_NAME}
|
||||
ENV: ${ENV}
|
||||
expose:
|
||||
- 6789
|
||||
volumes:
|
||||
- mageai_data:/home/src/
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-s", "-f", "-o", "/dev/null", "http://localhost:6789"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
mageai_data:
|
||||
@@ -0,0 +1,38 @@
|
||||
<!-- https://github.com/mage-ai/mage-ai/blob/14f0154629b33968535cf3e23bdf5fd1f4fa6957/docs/favicons/logo/m1.svg -->
|
||||
<svg width="1000" height="1000" viewBox="0 0 1000 1000" fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M458.083 24.2003C484.021 9.22512 515.978 9.22511 541.916 24.2003L891.096 225.8C917.034 240.775 933.012 268.45 933.012 298.401V701.599C933.012 731.55 917.034 759.225 891.096 774.2L541.916 975.8C515.978 990.775 484.021 990.775 458.083 975.8L108.903 774.2C82.9652 759.225 66.9868 731.55 66.9868 701.599V298.401C66.9868 268.45 82.9652 240.775 108.903 225.8L458.083 24.2003Z"
|
||||
fill="black" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
|
||||
fill="#313131" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
|
||||
fill="url(#paint0_linear_7285_95)" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
|
||||
fill="url(#paint1_linear_7285_95)" />
|
||||
<path
|
||||
d="M687.125 317.066L747.006 423.353L699.7 457.186L700.428 543.86V707.764L411.377 712.575H276.062L236.526 617.365L309.05 500.908L395.509 317.066H687.125Z"
|
||||
fill="black" />
|
||||
<path opacity="0.4"
|
||||
d="M578.227 368.959L657.132 368.96L510.123 650.724L431.219 650.724L578.227 368.959Z"
|
||||
fill="white" />
|
||||
<path
|
||||
d="M510.124 368.96L431.66 368.959L284.652 650.724H363.556L431.22 521.037V650.724H510.123V368.961L510.124 368.96Z"
|
||||
fill="white" />
|
||||
<path d="M578.228 368.96H657.131V650.724H578.228V368.96Z" fill="white" />
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_7285_95" x1="500" y1="74.4204" x2="272.155" y2="925.748"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#00FB82" stop-opacity="0" />
|
||||
<stop offset="1" stop-color="#00FB82" />
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_7285_95" x1="431.137" y1="500" x2="626.946" y2="191.018"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1DE4FF" stop-opacity="0.1" />
|
||||
<stop offset="1" stop-color="#0A7BFF" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
@@ -0,0 +1,11 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "mage-ai"
|
||||
port = 6789
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
PROJECT_NAME = "mage-ai"
|
||||
ENV = "production"
|
||||
@@ -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:
|
||||
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,12 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = []
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "web"
|
||||
port = 23333
|
||||
host = "${main_domain}"
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 |
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
After Width: | Height: | Size: 44 KiB |
@@ -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"
|
||||
@@ -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:
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
@@ -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
|
||||
|
||||
@@ -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:
|
||||
@@ -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 |
@@ -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"
|
||||
@@ -1,8 +1,12 @@
|
||||
x-database: &x-database
|
||||
DATABASE_URL: postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@op-db:5432/${OPENPANEL_POSTGRES_DB}?schema=public
|
||||
DATABASE_URL_DIRECT: postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@op-db:5432/${OPENPANEL_POSTGRES_DB}?schema=public
|
||||
REDIS_URL: redis://default:${SERVICE_PASSWORD_REDIS}@op-kv:6379
|
||||
CLICKHOUSE_URL: ${OPENPANEL_CLICKHOUSE_URL:-http://op-ch:8123/openpanel}
|
||||
x-common: &x-common
|
||||
NODE_ENV: production
|
||||
SELF_HOSTED: "true"
|
||||
API_URL: ${API_URL}
|
||||
DASHBOARD_URL: ${DASHBOARD_URL}
|
||||
DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@op-db:5432/${POSTGRES_DB}?schema=public
|
||||
DATABASE_URL_DIRECT: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@op-db:5432/${POSTGRES_DB}?schema=public
|
||||
REDIS_URL: redis://default:${REDIS_PASSWORD}@op-kv:6379
|
||||
CLICKHOUSE_URL: http://op-ch:8123/openpanel
|
||||
|
||||
services:
|
||||
op-db:
|
||||
@@ -11,44 +15,46 @@ services:
|
||||
volumes:
|
||||
- op-db-data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: [ 'CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}' ]
|
||||
test: ['CMD-SHELL', 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
environment:
|
||||
- POSTGRES_DB=${OPENPANEL_POSTGRES_DB}
|
||||
- POSTGRES_USER=${SERVICE_USER_POSTGRES}
|
||||
- POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES}
|
||||
- POSTGRES_DB=${POSTGRES_DB}
|
||||
- POSTGRES_USER=${POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
|
||||
op-kv:
|
||||
image: redis:7.2.5-alpine
|
||||
restart: always
|
||||
volumes:
|
||||
- op-kv-data:/data
|
||||
command: redis-server --requirepass ${SERVICE_PASSWORD_REDIS} --maxmemory-policy noeviction
|
||||
command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory-policy noeviction
|
||||
healthcheck:
|
||||
test: [CMD, redis-cli, -a, "${SERVICE_PASSWORD_REDIS}", ping]
|
||||
test: ['CMD', 'redis-cli', '-a', '${REDIS_PASSWORD}', 'ping']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
op-ch:
|
||||
image: clickhouse/clickhouse-server:24.3.2-alpine
|
||||
image: clickhouse/clickhouse-server:25.10.2.65
|
||||
restart: always
|
||||
volumes:
|
||||
- op-ch-data:/var/lib/clickhouse
|
||||
- op-ch-logs:/var/log/clickhouse-server
|
||||
- ../files/clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/op-config.xml:ro
|
||||
- ../files/clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/op-user-config.xml:ro
|
||||
- ../files/clickhouse/init-db.sql:/docker-entrypoint-initdb.d/1_init-db.sql:ro
|
||||
- ../files/clickhouse_config:/etc/clickhouse-server/config.d
|
||||
- ../files/clickhouse_users:/etc/clickhouse-server/users.d
|
||||
- ../files/clickhouse_init:/docker-entrypoint-initdb.d
|
||||
environment:
|
||||
- CLICKHOUSE_SKIP_USER_SETUP=1
|
||||
healthcheck:
|
||||
test: [CMD-SHELL, 'clickhouse-client --query "SELECT 1" -d openpanel']
|
||||
test: ['CMD-SHELL', 'clickhouse-client --query "SELECT 1" -d openpanel']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
op-api:
|
||||
image: lindesvard/openpanel-api:${OP_API_VERSION:-latest}
|
||||
image: lindesvard/openpanel-api:2.0.0
|
||||
restart: always
|
||||
command: >
|
||||
sh -c "
|
||||
@@ -57,39 +63,28 @@ services:
|
||||
sleep 1
|
||||
done
|
||||
echo 'PostgreSQL is ready'
|
||||
|
||||
|
||||
echo 'Waiting for ClickHouse to be ready...'
|
||||
while ! nc -z op-ch 8123; do
|
||||
sleep 1
|
||||
done
|
||||
echo 'ClickHouse is ready'
|
||||
|
||||
|
||||
echo 'Running migrations...'
|
||||
|
||||
echo '$DATABASE_URL'
|
||||
|
||||
|
||||
CI=true pnpm -r run migrate:deploy
|
||||
|
||||
|
||||
pnpm start
|
||||
"
|
||||
environment:
|
||||
# Common
|
||||
NODE_ENV: production
|
||||
NEXT_PUBLIC_SELF_HOSTED: true
|
||||
# URLs
|
||||
SERVICE_FQDN_OPAPI: /api
|
||||
# Set coolify FQDN domain
|
||||
NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
|
||||
NEXT_PUBLIC_DASHBOARD_URL: $SERVICE_FQDN_OPDASHBOARD
|
||||
# Others
|
||||
COOKIE_SECRET: ${SERVICE_BASE64_COOKIESECRET}
|
||||
ALLOW_REGISTRATION: ${OPENPANEL_ALLOW_REGISTRATION:-false}
|
||||
ALLOW_INVITATION: ${OPENPANEL_ALLOW_INVITATION:-true}
|
||||
EMAIL_SENDER: ${OPENPANEL_EMAIL_SENDER}
|
||||
COOKIE_SECRET: ${COOKIE_SECRET}
|
||||
ALLOW_REGISTRATION: ${ALLOW_REGISTRATION}
|
||||
ALLOW_INVITATION: ${ALLOW_INVITATION}
|
||||
EMAIL_SENDER: ${EMAIL_SENDER}
|
||||
RESEND_API_KEY: ${RESEND_API_KEY}
|
||||
<<: *x-database
|
||||
<<: *x-common
|
||||
healthcheck:
|
||||
test: [ "CMD-SHELL", "curl -f http://localhost:3000/healthcheck || exit 1" ]
|
||||
test: ['CMD-SHELL', 'curl -f http://localhost:3000/healthcheck || exit 1']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
@@ -102,55 +97,35 @@ services:
|
||||
condition: service_healthy
|
||||
|
||||
op-dashboard:
|
||||
image: lindesvard/openpanel-dashboard:${OP_DASHBOARD_VERSION:-latest}
|
||||
image: lindesvard/openpanel-dashboard:2.0.0
|
||||
restart: always
|
||||
depends_on:
|
||||
op-api:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
# Common
|
||||
NODE_ENV: production
|
||||
NEXT_PUBLIC_SELF_HOSTED: true
|
||||
# URLs
|
||||
SERVICE_FQDN_OPDASHBOARD:
|
||||
# Set coolify FQDN domain
|
||||
NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
|
||||
NEXT_PUBLIC_DASHBOARD_URL: $SERVICE_FQDN_OPDASHBOARD
|
||||
<<: *x-database
|
||||
<<: *x-common
|
||||
healthcheck:
|
||||
test: [ 'CMD-SHELL', 'curl -f http://localhost:3000/api/healthcheck || exit 1' ]
|
||||
test: ['CMD-SHELL', 'curl -f http://localhost:3000/api/healthcheck || exit 1']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
op-worker:
|
||||
image: lindesvard/openpanel-worker:${OP_WORKER_VERSION:-latest}
|
||||
image: lindesvard/openpanel-worker:2.0.0
|
||||
restart: always
|
||||
depends_on:
|
||||
op-api:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
# FQDN
|
||||
SERVICE_FQDN_OPBULLBOARD:
|
||||
# Common
|
||||
NODE_ENV=production:
|
||||
NEXT_PUBLIC_SELF_HOSTED: true
|
||||
# Set coolify FQDN domain
|
||||
NEXT_PUBLIC_API_URL: $SERVICE_FQDN_OPAPI
|
||||
<<: *x-database
|
||||
<<: *x-common
|
||||
healthcheck:
|
||||
test: [ 'CMD-SHELL', 'curl -f http://localhost:3000/healthcheck || exit 1' ]
|
||||
test: ['CMD-SHELL', 'curl -f http://localhost:3000/healthcheck || exit 1']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
deploy:
|
||||
mode: replicated
|
||||
replicas: $OP_WORKER_REPLICAS
|
||||
|
||||
volumes:
|
||||
op-db-data:
|
||||
op-kv-data:
|
||||
op-ch-data:
|
||||
op-ch-logs:
|
||||
op-proxy-data:
|
||||
op-proxy-config:
|
||||
|
||||
@@ -1,82 +1,91 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
api_domain = "${domain}"
|
||||
db_password = "${password}"
|
||||
db_password = "${password:32}"
|
||||
cookie_secret = "${base64:32}"
|
||||
redis_password = "${password}"
|
||||
redis_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
# ClickHouse config files - mounted as directories
|
||||
[[config.mounts]]
|
||||
filePath = "clickhouse/clickhouse-config.xml"
|
||||
filePath = "./clickhouse_config/op-config.xml"
|
||||
content = """
|
||||
<clickhouse>
|
||||
<logger>
|
||||
<level>warning</level>
|
||||
<console>true</console>
|
||||
</logger>
|
||||
<keep_alive_timeout>10</keep_alive_timeout>
|
||||
<!-- Stop all the unnecessary logging -->
|
||||
<query_thread_log remove="remove"/>
|
||||
<query_log remove="remove"/>
|
||||
<text_log remove="remove"/>
|
||||
<trace_log remove="remove"/>
|
||||
<metric_log remove="remove"/>
|
||||
<asynchronous_metric_log remove="remove"/>
|
||||
<session_log remove="remove"/>
|
||||
<part_log remove="remove"/>
|
||||
<listen_host>0.0.0.0</listen_host>
|
||||
<interserver_listen_host>0.0.0.0</interserver_listen_host>
|
||||
<interserver_http_host>opch</interserver_http_host>
|
||||
<!-- Disable cgroup memory observer -->
|
||||
<cgroups_memory_usage_observer_wait_time>0</cgroups_memory_usage_observer_wait_time>
|
||||
<!-- Not used anymore, but kept for backwards compatibility -->
|
||||
<macros>
|
||||
<shard>1</shard>
|
||||
<replica>replica1</replica>
|
||||
<cluster>openpanel_cluster</cluster>
|
||||
</macros>
|
||||
</clickhouse>
|
||||
<clickhouse>
|
||||
<logger>
|
||||
<level>warning</level>
|
||||
<console>true</console>
|
||||
</logger>
|
||||
<keep_alive_timeout>10</keep_alive_timeout>
|
||||
<!-- Stop all the unnecessary logging -->
|
||||
<query_thread_log remove="remove"/>
|
||||
<query_log remove="remove"/>
|
||||
<text_log remove="remove"/>
|
||||
<trace_log remove="remove"/>
|
||||
<metric_log remove="remove"/>
|
||||
<asynchronous_metric_log remove="remove"/>
|
||||
<session_log remove="remove"/>
|
||||
<part_log remove="remove"/>
|
||||
<listen_host>0.0.0.0</listen_host>
|
||||
<interserver_listen_host>0.0.0.0</interserver_listen_host>
|
||||
<interserver_http_host>opch</interserver_http_host>
|
||||
<!-- Disable cgroup memory observer -->
|
||||
<cgroups_memory_usage_observer_wait_time>0</cgroups_memory_usage_observer_wait_time>
|
||||
<!-- Not used anymore, but kept for backwards compatibility -->
|
||||
<macros>
|
||||
<shard>1</shard>
|
||||
<replica>replica1</replica>
|
||||
<cluster>openpanel_cluster</cluster>
|
||||
</macros>
|
||||
</clickhouse>
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "clickhouse/clickhouse-user-config.xml"
|
||||
filePath = "./clickhouse_users/op-user-config.xml"
|
||||
content = """
|
||||
<clickhouse>
|
||||
<profiles>
|
||||
<clickhouse>
|
||||
<profiles>
|
||||
<default>
|
||||
<log_queries>0</log_queries>
|
||||
<log_query_threads>0</log_query_threads>
|
||||
</default>
|
||||
</profiles>
|
||||
</clickhouse>
|
||||
</clickhouse>
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "clickhouse/init-db.sql"
|
||||
filePath = "./clickhouse_init/1_init-db.sql"
|
||||
content = """
|
||||
CREATE DATABASE IF NOT EXISTS openpanel;
|
||||
"""
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "op-dashboard"
|
||||
port = 3_000
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "op-api"
|
||||
port = 3_000
|
||||
host = "${api_domain}"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
path = "/api"
|
||||
stripPath = true
|
||||
|
||||
[config.env]
|
||||
SERVICE_FQDN_OPDASHBOARD = "http://${main_domain}"
|
||||
SERVICE_FQDN_OPAPI = "http://${api_domain}"
|
||||
OPENPANEL_POSTGRES_DB = "openpanel-db"
|
||||
SERVICE_USER_POSTGRES = "openpanel"
|
||||
SERVICE_PASSWORD_POSTGRES = "${db_password}"
|
||||
SERVICE_PASSWORD_REDIS = "${redis_password}"
|
||||
SERVICE_BASE64_COOKIESECRET = "${cookie_secret}"
|
||||
OP_WORKER_REPLICAS = "1"
|
||||
DASHBOARD_URL = "http://${main_domain}"
|
||||
API_URL = "http://${main_domain}/api"
|
||||
|
||||
# Database configuration
|
||||
POSTGRES_DB = "openpanel"
|
||||
POSTGRES_USER = "openpanel"
|
||||
POSTGRES_PASSWORD = "${db_password}"
|
||||
REDIS_PASSWORD = "${redis_password}"
|
||||
|
||||
# Security
|
||||
COOKIE_SECRET = "${cookie_secret}"
|
||||
|
||||
# Registration settings
|
||||
ALLOW_REGISTRATION = "true"
|
||||
ALLOW_INVITATION = "true"
|
||||
|
||||
# Email configuration (optional - configure for email notifications)
|
||||
EMAIL_SENDER = ""
|
||||
RESEND_API_KEY = ""
|
||||
OPENPANEL_ALLOW_REGISTRATION = "true"
|
||||
OPENPANEL_ALLOW_INVITATION = "true"
|
||||
|
||||
@@ -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: {}
|
||||
|
||||
@@ -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 |
@@ -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}"
|
||||
|
||||
@@ -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: {}
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 -11.5 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
|
||||
<g>
|
||||
<path d="M137.909029,-1.42108547e-14 L138.299882,0.00665661441 L139.385479,0.058225354 C144.798564,0.43000267 149.972107,2.50593255 154.184596,6.06768781 L155.014066,6.79978518 L155.800417,7.55667891 L248.925059,101.10948 C258.253112,110.478741 258.336122,125.115979 249.298721,134.753634 L248.668404,135.402879 L248.021048,136.024321 L151.471312,225.509442 C141.706629,234.563959 126.65745,234.838713 116.794145,226.278968 L116.114553,225.667442 L115.462423,225.035796 L61.5142946,170.873587 C60.7818881,170.138274 60.9019526,168.917458 61.7635739,168.338914 C73.1512822,160.692529 81.4377541,149.275295 85.0279509,136.172686 L85.3712573,134.856884 L85.6961343,133.473353 C85.8493708,132.820775 86.3779379,132.335554 87.020905,132.224445 L87.3027056,132.200334 L127.549722,132.200334 C128.359872,132.200334 129.033672,132.784118 129.173404,133.553966 L129.199992,133.850604 L129.199992,149.478435 C129.199992,154.222094 132.74898,158.145884 137.337533,158.681753 L137.892989,158.729631 L138.467796,158.746239 L158.270185,158.746239 C163.013844,158.746239 166.937634,155.197251 167.473503,150.608698 L167.521381,150.053242 L167.537989,149.478435 L167.537989,133.850604 C167.537989,133.040454 168.121772,132.366654 168.89162,132.226922 L169.188258,132.200334 L176.252894,132.200334 C181.084451,132.200334 185.033328,128.625645 185.564912,123.955751 L185.612136,123.390266 L185.627738,122.82549 L185.627738,112.549656 C185.627738,107.695532 182.030926,103.672904 177.379762,103.131755 L176.816725,103.083698 L176.252894,103.067772 L85.1619068,103.067772 C84.4705096,103.067772 83.8524089,102.636779 83.6133884,101.988011 C78.8618873,89.091124 69.4434357,78.2982105 57.238194,71.6262684 L56.0084501,70.9728855 L54.7717556,70.3523729 C53.8356353,69.8826736 53.5878579,68.6944707 54.1855354,67.8940896 L54.3903594,67.6667163 L119.791162,7.08249617 C124.188153,3.00527816 129.749747,0.573963824 135.555952,0.117913872 L136.661296,0.0393970067 L137.519706,0.00322737148 L137.909029,-1.42108547e-14 Z M28.6493897,93.4974121 C44.4647034,93.4974121 57.2987782,106.077272 57.2987782,121.61201 C57.2987782,137.146744 44.4647015,149.726608 28.6493897,149.726608 C12.8340773,149.726608 0,137.146744 0,121.61201 C0,106.077272 12.8340754,93.4974121 28.6493897,93.4974121 Z" fill="#D40000">
|
||||
</path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
@@ -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"
|
||||
@@ -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:
|
||||
|
After Width: | Height: | Size: 10 KiB |
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 |
@@ -0,0 +1,50 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
ws_domain = "${domain}"
|
||||
qux_auth = "qux"
|
||||
qux_jwt_password = "${password:64}"
|
||||
qux_mongo_db_name = "quantux"
|
||||
qux_mongo_table_prefix = "quantux"
|
||||
qux_mail_user = "${email}"
|
||||
qux_mail_password = "${password:32}"
|
||||
qux_mail_host = "mail.example.com"
|
||||
qux_timezone = "America/Chicago"
|
||||
qux_auth_service = "qux"
|
||||
qux_user_allow_signup = "true"
|
||||
qux_user_allowed_domains = "*"
|
||||
qux_keycloak_realm = ""
|
||||
qux_keycloak_client = ""
|
||||
qux_keycloak_url = ""
|
||||
qux_keycloak_server = ""
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"QUX_HTTP_HOST=https://${main_domain}",
|
||||
"QUX_AUTH=${qux_auth}",
|
||||
"QUX_JWT_PASSWORD=${qux_jwt_password}",
|
||||
"QUX_MONGO_DB_NAME=${qux_mongo_db_name}",
|
||||
"QUX_MONGO_TABLE_PREFIX=${qux_mongo_table_prefix}",
|
||||
"QUX_MAIL_USER=${qux_mail_user}",
|
||||
"QUX_MAIL_PASSWORD=${qux_mail_password}",
|
||||
"QUX_MAIL_HOST=${qux_mail_host}",
|
||||
"TZ=${qux_timezone}",
|
||||
"QUX_AUTH_SERVICE=${qux_auth_service}",
|
||||
"QUX_KEYCLOAK_SERVER=${qux_keycloak_server}",
|
||||
"QUX_KEYCLOAK_REALM=${qux_keycloak_realm}",
|
||||
"QUX_KEYCLOAK_CLIENT=${qux_keycloak_client}",
|
||||
"QUX_KEYCLOAK_URL=${qux_keycloak_url}",
|
||||
"QUX_USER_ALLOW_SIGNUP=${qux_user_allow_signup}",
|
||||
"QUX_USER_ALLOWED_DOMAINS=${qux_user_allowed_domains}",
|
||||
"QUX_WS_URL=wss://${ws_domain}"
|
||||
]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "qux-fe"
|
||||
port = 8082
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "qux-ws"
|
||||
port = 8086
|
||||
host = "${ws_domain}"
|
||||
|
||||
@@ -0,0 +1,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: {}
|
||||
|
After Width: | Height: | Size: 54 KiB |
@@ -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]]
|
||||
@@ -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:
|
||||
@@ -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 |
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
# IMPORTANT: The initial admin credentials will be printed in the logs after the container starts
|
||||
# Access TrailBase Admin UI at: https://your-domain.com/_/admin (replace with your configured domain)
|
||||
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
trailbase:
|
||||
image: trailbase/trailbase:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- trailbase-data:/app/traildepot
|
||||
# If you want to use a local directory instead, uncomment the line below and specify the path to your local
|
||||
# directory. Make sure this directory is writable by the trailbase user (UID 1000) and the group (GID 1000) i.e.
|
||||
# chown -R 1000:1000 /path/to/your/local/directory
|
||||
# - /path/to/your/local/directory:/app/traildepot
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "--fail", "http://localhost:4000/api/healthcheck"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
# comment the line below if you specified a local directory in the volumes section of the trailbase service
|
||||
trailbase-data: {}
|
||||
@@ -0,0 +1,194 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="512"
|
||||
height="512"
|
||||
viewBox="0 0 135.46667 135.46667"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
|
||||
sodipodi:docname="logo.svg"
|
||||
xml:space="preserve"
|
||||
inkscape:export-filename="logo_512.webp"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.0485567"
|
||||
inkscape:cx="316.14885"
|
||||
inkscape:cy="254.63573"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1131"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g43570-56-7"
|
||||
showguides="false" /><defs
|
||||
id="defs2"><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath16302"><circle
|
||||
style="fill:#0273aa;fill-opacity:1;stroke:none;stroke-width:2.13168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
id="circle16304"
|
||||
cx="420.85474"
|
||||
cy="71.167152"
|
||||
r="57.454071"
|
||||
transform="scale(-1,1)" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath16302-3"><circle
|
||||
style="fill:#0273aa;fill-opacity:1;stroke:none;stroke-width:2.13168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
id="circle16304-6"
|
||||
cx="420.85474"
|
||||
cy="71.167152"
|
||||
r="57.454071"
|
||||
transform="scale(-1,1)" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath16302-36-7"><circle
|
||||
style="fill:#0273aa;fill-opacity:1;stroke:none;stroke-width:2.13168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
id="circle16304-75-5"
|
||||
cx="420.85474"
|
||||
cy="71.167152"
|
||||
r="57.454071"
|
||||
transform="scale(-1,1)" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath656"><path
|
||||
style="fill:#0273aa;fill-opacity:1;stroke:none;stroke-width:1.85208;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
d="m -432.00265,67.318698 c -1.73616,0.139667 -3.50154,0.246024 -4.3977,0.178677 -1.81069,-4.111525 1.52048,-8.953296 4.44978,-8.84645 6.20224,0.226235 4.32785,8.328991 -0.0521,8.667773 z"
|
||||
id="path658"
|
||||
sodipodi:nodetypes="ccscc" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath953"><circle
|
||||
style="fill:#0273aa;fill-opacity:1;stroke:none;stroke-width:2.13168;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
id="circle955"
|
||||
cx="420.85474"
|
||||
cy="71.167152"
|
||||
r="57.454071"
|
||||
transform="scale(-1,1)" /></clipPath></defs><g
|
||||
id="g43570-56-7"
|
||||
transform="matrix(1.1789127,0,0,1.1789127,563.88433,-16.166525)"
|
||||
style="stroke-width:0.5"><g
|
||||
id="g951"
|
||||
inkscape:label="all"
|
||||
clip-path="url(#clipPath953)"><circle
|
||||
style="fill:#0073aa;fill-opacity:1;stroke:none;stroke-width:1.06584;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
id="path11937-0-2-5"
|
||||
cx="420.85474"
|
||||
cy="71.167152"
|
||||
transform="scale(-1,1)"
|
||||
inkscape:label="circle"
|
||||
r="57.454071" /><g
|
||||
id="g16298-9-3"
|
||||
clip-path="none"
|
||||
inkscape:label="squirrel"
|
||||
style="stroke-width:0.5"><path
|
||||
style="display:inline;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.66502;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
|
||||
d="m -394.37046,131.47753 c 5.12125,-4.34385 11.67689,-7.38652 14.74179,-13.66074 7.51252,-10.78724 9.93689,-23.023486 7.08569,-35.021399 -3.59312,-12.873181 -10.70247,-24.576135 -20.0541,-34.075166 -6.49968,-8.652975 -17.65011,-20.955638 -5.00797,-28.104256 -6.30691,-4.056153 -18.75609,-4.63811 -25.70383,-1.749206 -15.25854,5.960156 -26.03291,19.153286 -31.66631,33.953367 -3.2501,8.538654 -0.75393,16.12354 -1.76923,25.046648 -0.35669,4.145274 17.319,8.98466 17.65317,13.107967 13.49706,14.623365 15.84552,37.512255 36.89824,39.290795 2.60748,0.40399 5.21497,0.80799 7.82245,1.21199 z"
|
||||
id="path41116-1-5"
|
||||
sodipodi:nodetypes="ccccccsccccc"
|
||||
inkscape:label="tail" /><path
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.66502;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
|
||||
d="m -404.67281,53.96564 c -15.1265,-12.030261 -8.8751,-28.360639 7.06776,-33.349671 -6.30691,-4.056153 -18.75609,-4.63811 -25.70383,-1.749206 -15.25854,5.960156 -26.03291,19.153286 -31.66631,33.953367 -3.2501,8.538654 -0.75393,16.12354 -1.76923,25.046648 -0.35669,4.145274 17.319,8.98466 17.65317,13.107967 26.5708,-16.773958 21.84372,-0.325359 34.41844,-37.009105 z"
|
||||
id="path3419-6"
|
||||
sodipodi:nodetypes="cccsccc"
|
||||
inkscape:label="tail_highlight" /><path
|
||||
style="opacity:1;fill:#0073aa;fill-opacity:1;stroke:none;stroke-width:0.79375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
|
||||
d="m -457.72736,69.431518 c 3.3896,-13.264962 8.17328,-20.647211 18.28329,-28.817159 2.54315,-3.757231 5.89263,-9.337896 8.31222,-10.306417 2.7432,1.237322 3.70892,3.928026 5.27209,6.366975 l 6.12486,-1.227345 c 1.63581,-5.260125 3.12238,-8.447075 7.62011,-10.654554 6.27135,4.105499 10.78712,9.441913 8.73926,18.138952 13.09917,13.464505 16.44363,20.397287 24.60428,39.658663 0.49305,9.347413 -0.27747,21.544127 -1.46969,29.794347 0,0 -1.69258,6.25854 -2.47729,5.72446 -0.7847,-0.53409 -4.76437,-5.18721 -4.76437,-5.18721 l -14.10706,-45.69118 -26.40483,-16.864179 c 0,0 -13.84655,5.577975 -14.887,5.946963 -1.04044,0.368988 -13.53338,18.760194 -13.53338,18.760194 z"
|
||||
id="path41710-2-2"
|
||||
sodipodi:nodetypes="cccccccccscccscc"
|
||||
inkscape:label="outline" /><path
|
||||
style="display:inline;fill:#ffffff;stroke:none;stroke-width:0.92604;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
d="m -384.87624,121.37652 c 3.75488,-12.90478 3.79893,-25.678538 3.46109,-38.414706 -3.68701,-9.015838 -6.90659,-16.25675 -11.00759,-22.767045 -33.4486,11.590743 -41.50958,10.306557 -48.19197,20.239302 -0.97945,7.933407 -6.13515,12.228544 -0.80529,12.978815 -3.93992,6.715814 -7.95535,17.147064 -7.099,28.870934 4.52456,2.43084 9.62565,4.76081 14.50144,6.38118 4.0208,1.03673 8.17605,1.37868 12.37812,1.36613 3.83891,0.3095 7.67953,0.82426 11.5103,0.15208 4.55232,-0.17052 8.85841,-1.80004 13.22085,-2.94852 2.98304,-1.36738 4.01069,-1.56562 6.99373,-2.933 z"
|
||||
id="path11884-0-6-7-9"
|
||||
sodipodi:nodetypes="cccccccccccc"
|
||||
inkscape:label="body" /><path
|
||||
id="path12948-3-0-1"
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.92604;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
d="m -396.08075,90.674118 c -0.0102,-2.186513 -0.31014,-3.657934 0.73553,-8.452944 -0.56307,-1.566319 -1.3733,-3.116694 -4.37726,-4.129161 l -27.88609,-5.756495 -13.8158,21.085237 c -0.37346,0.632177 -1.5594,2.73663 -2.3232,4.495613 l 7.33211,2.007166 3.04952,16.392586 c -1.01658,5.79059 -1.71085,11.2009 1.8533,14.8264 l 35.36206,2.99202 c -0.42715,-3.20821 -4.12887,-11.82958 -2.52045,-19.80255 z"
|
||||
inkscape:label="body shade"
|
||||
sodipodi:nodetypes="cccccccccccc"
|
||||
transform="translate(-1.6924549e-5)" /><g
|
||||
id="g682"
|
||||
inkscape:label="head"
|
||||
style="stroke-width:0.5"><path
|
||||
style="fill:#ffffff;stroke:none;stroke-width:0.92604;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
d="m -389.17548,65.820707 c -4.29469,-8.08968 -9.26583,-14.81462 -16.99742,-21.788301 2.53845,-7.601334 -0.90679,-11.83714 -5.95942,-15.95915 -3.96817,2.763543 -4.35541,5.263903 -5.51422,9.53362 l -10.07786,1.87569 c -0.60659,-1.465688 -1.69634,-5.47392 -3.58709,-5.947589 -2.69409,2.292964 -3.62617,7.287264 -9.06298,11.06401 -10.71811,8.957439 -16.27586,23.967124 -17.44664,36.400021 -0.60434,3.593749 1.28377,5.083628 2.17454,7.084879 4.0042,4.344485 8.87315,4.771188 14.22657,5.328999 12.38671,1.290659 47.91435,-12.996238 52.24452,-27.592179 z"
|
||||
id="path593"
|
||||
sodipodi:nodetypes="cccccccccsc" /><path
|
||||
style="fill:#0273aa;fill-opacity:1;stroke:none;stroke-width:0.92604;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
d="m -432.00265,67.318696 c -1.73616,0.139669 -3.50154,0.246026 -4.3977,0.17868 -1.81069,-4.111526 1.52048,-8.953299 4.44978,-8.84645 6.20224,0.226233 4.32785,8.328992 -0.0521,8.66777 z"
|
||||
id="path11890-1-0-3-2"
|
||||
sodipodi:nodetypes="ccscc" /><circle
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.17961;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
|
||||
id="path16232-2-7"
|
||||
cx="-435.367"
|
||||
cy="65.691788"
|
||||
r="2.1497555"
|
||||
clip-path="url(#clipPath656)"
|
||||
transform="translate(-1.6924549e-5)" /><path
|
||||
style="fill:#0273aa;fill-opacity:1;stroke:none;stroke-width:0.92604;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
d="m -412.33041,46.837035 c 3.38872,-4.79066 4.27837,-5.677734 3.5344,-11.123199 -1.28741,-2.525126 -3.55942,-0.0091 -3.5778,0.37371 -0.0793,0.268859 0.62604,5.692511 0.0434,10.749489 z"
|
||||
id="path11888-6-2-9-0"
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:label="path11888-6-2-9"
|
||||
transform="translate(-1.6924549e-5)" /><path
|
||||
style="opacity:1;fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.79375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
|
||||
d="m -439.13116,43.583622 c 3.72307,-1.614419 7.3675,-3.483388 11.41474,-4.048403 l -1.36077,-3.617316 c -0.80217,-1.389627 -1.75454,-2.490926 -2.27688,-2.366713 -0.0768,0.01826 -0.1989,0.05969 -1.03532,1.145831 -1.08724,1.411848 -2.19455,3.571613 -3.52156,5.397558 -1.46888,2.021146 -2.98564,3.50213 -3.22021,3.489043 z"
|
||||
id="path26944-3-9"
|
||||
sodipodi:nodetypes="cccsssc"
|
||||
transform="translate(-1.6924549e-5)" /><path
|
||||
style="fill:#e6e6e6;fill-opacity:1;stroke:none;stroke-width:0.92604;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
d="m -406.08838,44.108528 -3.38124,5.263692 6.11582,-2.679375 z"
|
||||
id="path13150-5-2-3"
|
||||
sodipodi:nodetypes="cccc" /><g
|
||||
id="g665"
|
||||
inkscape:label="nose"
|
||||
transform="translate(-1.6924549e-5)"
|
||||
style="stroke-width:0.5"><path
|
||||
style="opacity:1;fill:#0073aa;fill-opacity:1;stroke:none;stroke-width:0.79375;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
|
||||
d="m -457.87586,83.179939 c 0,0 -1.17624,2.935047 1.46367,5.058495 4.10609,-3.375529 4.34075,-6.079122 3.99985,-6.604356 -0.61922,-0.0073 -3.50156,0.755828 -5.46352,1.545857 z"
|
||||
id="path31425-0-6"
|
||||
sodipodi:nodetypes="ccccc" /><path
|
||||
style="opacity:1;fill:#0073aa;fill-opacity:1;stroke:none;stroke-width:0.887605;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
|
||||
d="m -454.56334,85.363491 c 0.18842,1.165661 1.1436,2.897617 2.73115,3.885001 -0.0329,0.217466 -0.86381,0.708773 -0.86381,0.708773 0,0 -2.31741,-1.087639 -3.14466,-3.035718"
|
||||
id="path33246-2-0"
|
||||
sodipodi:nodetypes="cccc" /></g></g><g
|
||||
id="g16795-61-6"
|
||||
transform="translate(0,-2.6458334)"
|
||||
inkscape:label="acorn"
|
||||
style="display:inline;stroke-width:0.5"><path
|
||||
style="fill:#0273aa;fill-opacity:1;stroke:none;stroke-width:1.06653;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
d="m -398.79932,116.98984 c 2.14816,-3.18843 5.3282,-9.00453 6.86159,-16.2357 -1.68801,-8.452686 -5.41474,-9.528969 -12.67201,-13.175064 l -6.77667,-2.1655 c -0.59411,-4.916754 3.66346,-6.007316 1.95818,-7.562799 -0.60935,-0.60799 -0.85772,-1.152153 -2.92807,-0.747044 -0.68887,2.828557 -1.5891,4.882655 -1.38413,7.856743 -10.88291,-0.324825 -19.86773,1.21596 -23.75555,10.917323 l 0.59462,6.157521 c 0.40774,4.06454 0.90942,8.36039 1.19673,10.7182 2.51007,9.53776 7.2756,12.84946 15.14952,17.9473 10.80658,-1.60382 18.0178,-8.23239 21.75579,-13.71098 z"
|
||||
id="path11886-3-5-8-2"
|
||||
sodipodi:nodetypes="cccccccccccc" /><path
|
||||
style="display:inline;fill:#01557e;fill-opacity:1;stroke:none;stroke-width:0.92604;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40;stroke-dasharray:none;paint-order:normal"
|
||||
d="m -437.24943,98.587152 c 15.47059,5.160838 28.853,6.210908 44.45035,5.528858 l -0.33269,1.00136 c -2.84453,8.48885 -7.11438,16.19984 -14.78081,20.77251 -4.22299,2.87641 -8.95937,4.24265 -12.64118,4.80585 4.90186,-1.9411 6.28154,-3.13013 9.44127,-5.62107 7.30314,-5.75735 10.53897,-13.79201 -7.2632,-17.54634 -2.04827,-0.7546 -6.97065,-1.79557 -8.95696,-2.4842 -3.78691,-1.31289 -5.87451,-2.69569 -8.49494,-4.19919 -0.64857,-0.55614 -1.05123,-1.499972 -1.42184,-2.257778 z"
|
||||
id="path14904-79-6"
|
||||
sodipodi:nodetypes="cccccscscc" /><path
|
||||
style="fill:#01557e;fill-opacity:1;stroke-width:0.44886;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40"
|
||||
d="m -412.38484,74.540497 c 1.04648,1.02564 2.03773,1.53722 3.32802,1.217522 0.0656,0.210395 0.0231,0.418915 -0.0326,0.627204 -1.5334,2.409182 -2.45327,4.552421 -2.21329,7.284672 l 0.16083,1.055961 c -0.9361,0.0984 -1.87578,0.258567 -2.4535,-0.468121 0.75107,0.18109 0.90263,0.01389 1.42464,-0.485892 -0.17483,-2.661716 0.30288,-4.511654 1.49152,-6.770675 -0.34469,-1.051553 -1.02053,-1.564634 -1.70561,-2.460671 z"
|
||||
id="path567-1"
|
||||
sodipodi:nodetypes="ccccccccc"
|
||||
transform="translate(-1.6924549e-5,2.6458344)" /></g><path
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.253293;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40"
|
||||
d="m -425.34578,109.54285 c -4.28572,-3.13939 -8.22729,-6.28553 -13.56434,-7.79875 l -2.74389,-0.63156 -1.54247,5.90823 3.47191,4.95663 c 4.23416,-0.0815 11.40165,1.60574 14.77029,-0.71646 0.83261,-0.45672 0.27535,-1.182 -0.3915,-1.71809 z"
|
||||
id="path2086-8"
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
transform="translate(-1.6924549e-5,-2.6458352)"
|
||||
inkscape:label="hand right" /><path
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:0.44886;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:40"
|
||||
d="m -395.66357,114.61895 c -3.65971,-0.56995 -7.76016,-0.93577 -11.11157,-1.77569 -2.18796,-0.93216 -3.00632,-2.3589 -1.70861,-3.71925 0.37365,-0.39735 5.69577,-2.25753 8.58864,-3.25262 2.85206,-1.18646 5.57388,-2.652 8.32495,-4.05099 l 3.67759,-2.614861 2.4911,6.808421 -2.29694,7.91659 -3.92475,1.47713 z"
|
||||
id="path2472-7"
|
||||
sodipodi:nodetypes="cccccccccc"
|
||||
inkscape:label="hand left" /></g></g></g></svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |