Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
984cf0b4d4 | ||
|
|
5b54bdf266 |
@@ -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
|
||||
@@ -30,8 +30,6 @@ Exemplary blueprint: `blueprints/ghost/`—`docker-compose.yml` exposes port 236
|
||||
|
||||
1. **Add/Update Template**:
|
||||
|
||||
- **REQUIREMENT**: Service **MUST** be open source. Only add templates for applications with an open-source license (e.g., MIT, Apache, GPL, AGPL). Proprietary or closed-source services are not allowed.
|
||||
- **Verify Docker Images**: Before using any Docker image in `docker-compose.yml`, verify it exists using `docker manifest inspect <image:tag>` (e.g., `docker manifest inspect docker.io/bitnami/discourse:3.5.0`). This ensures the image is available and prevents deployment failures.
|
||||
- Create `blueprints/<id>/` (e.g., `ghost`).
|
||||
- Implement `docker-compose.yml` (single service typical; use volumes for persistence).
|
||||
- Configure `template.toml`—reference vars in `[config.domains]`, `[config.env]`, `[config.mounts]`.
|
||||
@@ -47,19 +45,17 @@ No tests in repo—focus on manual validation via scripts and Dokploy deploys. D
|
||||
|
||||
## Conventions and Patterns
|
||||
|
||||
- **Open Source Requirement**: **ALL services MUST be open source**. Only applications with open-source licenses (MIT, Apache, GPL, AGPL, etc.) are allowed. Proprietary or closed-source services are strictly prohibited.
|
||||
- **Template IDs**: Lowercase, kebab-case (e.g., `active-pieces`); unique across repo—enforced by dedupe script.
|
||||
- **Docker Compose**: Minimal—omit `ports` (Dokploy proxies), persistent volumes (e.g., `- db-data:/var/lib/postgresql/data`). Services named after folder (e.g., `ghost` service).
|
||||
- **Docker Compose**: Minimal—omit `ports` (Dokploy proxies), `restart: unless-stopped`, persistent volumes (e.g., `- db-data:/var/lib/postgresql/data`). Services named after folder (e.g., `ghost` service).
|
||||
- **template.toml**:
|
||||
- Variables: `[variables] main_domain = "${domain}"`; use helpers for secrets (`${password:64}`, `${base64:32}`).
|
||||
- Domains: `[[config.domains]] serviceName = "<service>" port = 80 host = "${main_domain}"` (path="/" optional).
|
||||
- Env: `[[config.env]]` array of "KEY=VALUE" strings, interpolating vars (e.g., "DB_PASSWORD=${db_pass}").
|
||||
- **URL Variables**: When environment variables require URLs (e.g., `WEB_URL`, `NEXTAUTH_URL`, `PUBLIC_URL`), **always use HTTP by default** (e.g., `"http://${main_domain}"`). HTTPS should only be used if explicitly required by the application or when using a reverse proxy with SSL termination.
|
||||
- Mounts: `[[config.mounts]] filePath = "/etc/config" content = """multi-line\ncontent"""`.
|
||||
- JWT helper: `${jwt:secret_var:payload_var}` for auth tokens; payload as JSON string with `exp: ${timestamps:YYYY-MM-DDTHH:mm:ssZ}`.
|
||||
- **Meta.json**: Entries as JSON objects; tags array of lowercase strings (e.g., ["monitoring", "database"]); links object with `github`, `website`, `docs`.
|
||||
- **No Networks**: Rely on Dokploy's isolated deployments—avoid explicit `networks:`.
|
||||
- **Versions**: Pin images to specific versions in `docker-compose.yml` (e.g., `ghost:5.82.0-alpine`); match in `meta.json.version`. **NEVER use `latest` tag**—it can break templates when upstream images change unexpectedly. **Always verify image exists** using `docker manifest inspect <image:tag>` before committing.
|
||||
- **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: Templates are independent and ship as static blueprints/meta.
|
||||
|
||||
@@ -5,6 +5,9 @@ on:
|
||||
workflows: [Build Preview Deployment]
|
||||
types:
|
||||
- completed
|
||||
pull_request:
|
||||
branches:
|
||||
- canary
|
||||
permissions:
|
||||
actions: read
|
||||
deployments: write
|
||||
|
||||
@@ -17,10 +17,13 @@ jobs:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
fetch-depth: 0 # Necesitamos el historial completo para comparar con base
|
||||
|
||||
- name: Set up Docker Compose
|
||||
run: docker compose version
|
||||
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
|
||||
@@ -33,89 +36,282 @@ jobs:
|
||||
version: 8
|
||||
|
||||
- name: Install dependencies
|
||||
run: cd build-scripts && pnpm install
|
||||
|
||||
- name: Detect changed blueprints
|
||||
id: changed
|
||||
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 }})
|
||||
|
||||
# Obtener todos los blueprints que tienen cambios (en docker-compose.yml o template.toml)
|
||||
CHANGED_BLUEPRINTS=$(git diff --name-only --diff-filter=ACMRT $BASE_SHA HEAD | \
|
||||
grep -E 'blueprints/[^/]+/(docker-compose\.yml|template\.toml)$' | \
|
||||
sed 's|blueprints/\([^/]*\)/.*|\1|' | \
|
||||
sort -u)
|
||||
# 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)
|
||||
|
||||
echo "Changed blueprints:"
|
||||
echo "$CHANGED_BLUEPRINTS" | while read blueprint; do
|
||||
[ -n "$blueprint" ] && echo " - $blueprint"
|
||||
done
|
||||
# Crear lista de directorios únicos que tienen cambios
|
||||
CHANGED_DIRS=$(echo -e "$CHANGED_COMPOSE\n$CHANGED_TOML" | sed 's|blueprints/\([^/]*\)/.*|\1|' | sort -u)
|
||||
|
||||
# Guardar lista de blueprints (una por línea)
|
||||
echo "blueprints<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$CHANGED_BLUEPRINTS" >> $GITHUB_OUTPUT
|
||||
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 blueprints
|
||||
- name: Validate Docker Compose files syntax
|
||||
id: validate-compose-syntax
|
||||
run: |
|
||||
BLUEPRINTS="${{ steps.changed.outputs.blueprints }}"
|
||||
echo "🔍 Validating Docker Compose files syntax..."
|
||||
|
||||
if [ -z "$BLUEPRINTS" ] || [ "$BLUEPRINTS" = "" ]; then
|
||||
echo "ℹ️ No blueprints changed, skipping validation"
|
||||
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
|
||||
|
||||
ERROR=0
|
||||
|
||||
# Convertir a array para evitar problemas con subshells
|
||||
mapfile -t BLUEPRINT_ARRAY <<< "$BLUEPRINTS"
|
||||
|
||||
# Iterar sobre cada blueprint
|
||||
for blueprint in "${BLUEPRINT_ARRAY[@]}"; do
|
||||
[ -z "$blueprint" ] && continue
|
||||
echo "$COMPOSE_FILES" | while read -r compose_file; do
|
||||
if [ -z "$compose_file" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
BLUEPRINT_PATH="blueprints/$blueprint"
|
||||
COMPOSE_FILE="$BLUEPRINT_PATH/docker-compose.yml"
|
||||
TOML_FILE="$BLUEPRINT_PATH/template.toml"
|
||||
TEMPLATE_DIR=$(dirname "$compose_file")
|
||||
TEMPLATE_NAME=$(basename "$TEMPLATE_DIR")
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📦 Validating: $blueprint"
|
||||
echo "📦 Validating syntax: $TEMPLATE_NAME"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# 1. Validar best practices de docker-compose.yml
|
||||
if [ ! -f "$COMPOSE_FILE" ]; then
|
||||
echo "⚠️ WARNING: docker-compose.yml not found"
|
||||
# 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
|
||||
continue
|
||||
fi
|
||||
echo "🔍 Validating docker-compose.yml best practices..."
|
||||
if ! (cd build-scripts && pnpm exec tsx validate-docker-compose.ts --file "../$COMPOSE_FILE" --verbose); then
|
||||
ERROR=1
|
||||
continue
|
||||
fi
|
||||
|
||||
# 3. Validar template.toml
|
||||
if [ -f "$TOML_FILE" ]; then
|
||||
echo "🔍 Validating template.toml..."
|
||||
if ! (cd build-scripts && pnpm exec tsx validate-template.ts --dir "../$BLUEPRINT_PATH" --verbose); then
|
||||
ERROR=1
|
||||
continue
|
||||
fi
|
||||
else
|
||||
echo "⚠️ WARNING: template.toml not found"
|
||||
ERROR=1
|
||||
continue
|
||||
echo "✅ docker-compose.yml syntax is valid"
|
||||
fi
|
||||
|
||||
echo "✅ All validations passed for $blueprint"
|
||||
# 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 "❌ Validation failed for one or more blueprints"
|
||||
echo "❌ Docker Compose syntax validation failed"
|
||||
exit 1
|
||||
else
|
||||
echo ""
|
||||
echo "✅ All blueprints validated successfully"
|
||||
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
|
||||
|
||||
|
||||
@@ -1,3 +1 @@
|
||||
node_modules
|
||||
package-lock.json
|
||||
meta.json.backup.*
|
||||
node_modules
|
||||
@@ -170,16 +170,6 @@ This document provides essential context for AI models interacting with this pro
|
||||
- **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}`
|
||||
- **Volume bind mounts (in docker-compose.yml):** When mounting host paths, do NOT use absolute paths like `"/folder:/path/in/container"`. Use relative paths instead:
|
||||
```yaml
|
||||
# Invalid
|
||||
volumes:
|
||||
- "/folder:/path/in/container" ❌
|
||||
# Valid
|
||||
volumes:
|
||||
- "../files/my-database:/var/lib/mysql" ✅
|
||||
- "../files/my-configs:/etc/my-app/config" ✅
|
||||
```
|
||||
|
||||
- **meta.json Requirements:**
|
||||
|
||||
|
||||
@@ -20,11 +20,6 @@ This project adheres to the [Contributor Covenant Code of Conduct](https://www.c
|
||||
|
||||
For larger changes or questions, open an issue first to discuss your ideas.
|
||||
|
||||
### Pull Request Guidelines
|
||||
|
||||
- **Keep PRs small and focused.** Avoid very large PRs; prefer several smaller PRs (e.g., one template or one logical change per PR). This speeds up review and keeps the history clear.
|
||||
- **Test before submitting.** Any PR that has not been tested by the contributor will be closed. This keeps the PR queue tidy and ensures that only contributions that have been verified by their authors are considered.
|
||||
|
||||
## Adding a New Template
|
||||
|
||||
To add a new template, follow these steps:
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
## Instructions
|
||||
|
||||
We don't have nothing to show here....
|
||||
@@ -1,7 +1,7 @@
|
||||
version: '3.3'
|
||||
services:
|
||||
alist:
|
||||
image: xhofe/alist:v3.55.0
|
||||
image: xhofe/alist:v3.41.0
|
||||
volumes:
|
||||
- alist-data:/opt/alist/data
|
||||
environment:
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
appsmith:
|
||||
image: appsmith/appsmith-ee:v1.94
|
||||
image: index.docker.io/appsmith/appsmith-ee:v1.29
|
||||
volumes:
|
||||
- appsmith-data:/appsmith-stacks
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
appsmith-data:
|
||||
- ../files/stacks:/appsmith-stacks
|
||||
|
||||
@@ -6,32 +6,31 @@ x-logging: &x-logging
|
||||
options:
|
||||
max-file: "5"
|
||||
max-size: "10m"
|
||||
|
||||
services:
|
||||
appwrite:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
container_name: appwrite
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
labels:
|
||||
- traefik.enable=true
|
||||
- traefik.constraint-label-stack=appwrite
|
||||
volumes:
|
||||
- appwrite-uploads:/storage/uploads:rw
|
||||
- appwrite-imports:/storage/imports:rw
|
||||
- appwrite-cache:/storage/cache:rw
|
||||
- appwrite-config:/storage/config:rw
|
||||
- appwrite-certificates:/storage/certificates:rw
|
||||
- appwrite-functions:/storage/functions:rw
|
||||
- appwrite-sites:/storage/sites:rw
|
||||
- appwrite-builds:/storage/builds:rw
|
||||
depends_on:
|
||||
- mariadb
|
||||
- redis
|
||||
# - clamav
|
||||
environment:
|
||||
- _APP_ENV
|
||||
- _APP_WORKER_PER_CORE
|
||||
- _APP_LOCALE
|
||||
- _APP_COMPRESSION_MIN_SIZE_BYTES
|
||||
- _APP_CONSOLE_WHITELIST_ROOT
|
||||
- _APP_CONSOLE_WHITELIST_EMAILS
|
||||
- _APP_CONSOLE_SESSION_ALERTS
|
||||
@@ -44,14 +43,10 @@ services:
|
||||
- _APP_OPTIONS_ABUSE
|
||||
- _APP_OPTIONS_ROUTER_PROTECTION
|
||||
- _APP_OPTIONS_FORCE_HTTPS
|
||||
- _APP_OPTIONS_ROUTER_FORCE_HTTPS
|
||||
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS
|
||||
- _APP_OPENSSL_KEY_V1
|
||||
- _APP_DOMAIN
|
||||
- _APP_DOMAIN_TARGET_CNAME
|
||||
- _APP_DOMAIN_TARGET_AAAA
|
||||
- _APP_DOMAIN_TARGET_A
|
||||
- _APP_DOMAIN_TARGET_CAA
|
||||
- _APP_DNS
|
||||
- _APP_DOMAIN_TARGET
|
||||
- _APP_DOMAIN_FUNCTIONS
|
||||
- _APP_REDIS_HOST
|
||||
- _APP_REDIS_PORT
|
||||
@@ -78,7 +73,6 @@ services:
|
||||
- _APP_STORAGE_S3_SECRET
|
||||
- _APP_STORAGE_S3_REGION
|
||||
- _APP_STORAGE_S3_BUCKET
|
||||
- _APP_STORAGE_S3_ENDPOINT
|
||||
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||
- _APP_STORAGE_DO_SPACES_SECRET
|
||||
- _APP_STORAGE_DO_SPACES_REGION
|
||||
@@ -95,26 +89,21 @@ services:
|
||||
- _APP_STORAGE_WASABI_SECRET
|
||||
- _APP_STORAGE_WASABI_REGION
|
||||
- _APP_STORAGE_WASABI_BUCKET
|
||||
- _APP_COMPUTE_SIZE_LIMIT
|
||||
- _APP_FUNCTIONS_SIZE_LIMIT
|
||||
- _APP_FUNCTIONS_TIMEOUT
|
||||
- _APP_SITES_TIMEOUT
|
||||
- _APP_COMPUTE_BUILD_TIMEOUT
|
||||
- _APP_COMPUTE_CPUS
|
||||
- _APP_COMPUTE_MEMORY
|
||||
- _APP_FUNCTIONS_BUILD_TIMEOUT
|
||||
- _APP_FUNCTIONS_CPUS
|
||||
- _APP_FUNCTIONS_MEMORY
|
||||
- _APP_FUNCTIONS_RUNTIMES
|
||||
- _APP_SITES_RUNTIMES
|
||||
- _APP_DOMAIN_SITES
|
||||
- _APP_EXECUTOR_SECRET
|
||||
- _APP_EXECUTOR_HOST
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_MAINTENANCE_INTERVAL
|
||||
- _APP_MAINTENANCE_DELAY
|
||||
- _APP_MAINTENANCE_START_TIME
|
||||
- _APP_MAINTENANCE_RETENTION_EXECUTION
|
||||
- _APP_MAINTENANCE_RETENTION_CACHE
|
||||
- _APP_MAINTENANCE_RETENTION_ABUSE
|
||||
- _APP_MAINTENANCE_RETENTION_AUDIT
|
||||
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
|
||||
- _APP_MAINTENANCE_RETENTION_USAGE_HOURLY
|
||||
- _APP_MAINTENANCE_RETENTION_SCHEDULES
|
||||
- _APP_SMS_PROVIDER
|
||||
@@ -131,25 +120,94 @@ services:
|
||||
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID
|
||||
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
|
||||
- _APP_ASSISTANT_OPENAI_API_KEY
|
||||
|
||||
appwrite-console:
|
||||
image: appwrite/console:5.0.12
|
||||
container_name: appwrite-console
|
||||
<<: *x-logging
|
||||
image: appwrite/console:7.4.7
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.constraint-label-stack=appwrite"
|
||||
environment:
|
||||
- _APP_ENV
|
||||
- _APP_WORKER_PER_CORE
|
||||
- _APP_LOCALE
|
||||
- _APP_CONSOLE_WHITELIST_ROOT
|
||||
- _APP_CONSOLE_WHITELIST_EMAILS
|
||||
- _APP_CONSOLE_SESSION_ALERTS
|
||||
- _APP_CONSOLE_WHITELIST_IPS
|
||||
- _APP_CONSOLE_HOSTNAMES
|
||||
- _APP_SYSTEM_EMAIL_NAME
|
||||
- _APP_SYSTEM_EMAIL_ADDRESS
|
||||
- _APP_EMAIL_SECURITY
|
||||
- _APP_SYSTEM_RESPONSE_FORMAT
|
||||
- _APP_OPTIONS_ABUSE
|
||||
- _APP_OPTIONS_ROUTER_PROTECTION
|
||||
- _APP_OPTIONS_FORCE_HTTPS
|
||||
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS
|
||||
- _APP_OPENSSL_KEY_V1
|
||||
- _APP_DOMAIN
|
||||
- _APP_DOMAIN_TARGET
|
||||
- _APP_DOMAIN_FUNCTIONS
|
||||
- _APP_REDIS_HOST
|
||||
- _APP_REDIS_PORT
|
||||
- _APP_REDIS_USER
|
||||
- _APP_REDIS_PASS
|
||||
- _APP_DB_HOST
|
||||
- _APP_DB_PORT
|
||||
- _APP_DB_SCHEMA
|
||||
- _APP_DB_USER
|
||||
- _APP_DB_PASS
|
||||
- _APP_SMTP_HOST
|
||||
- _APP_SMTP_PORT
|
||||
- _APP_SMTP_SECURE
|
||||
- _APP_SMTP_USERNAME
|
||||
- _APP_SMTP_PASSWORD
|
||||
- _APP_USAGE_STATS
|
||||
- _APP_STORAGE_LIMIT
|
||||
- _APP_STORAGE_PREVIEW_LIMIT
|
||||
- _APP_STORAGE_ANTIVIRUS
|
||||
- _APP_STORAGE_ANTIVIRUS_HOST
|
||||
- _APP_STORAGE_ANTIVIRUS_PORT
|
||||
- _APP_STORAGE_DEVICE
|
||||
- _APP_STORAGE_S3_ACCESS_KEY
|
||||
- _APP_STORAGE_S3_SECRET
|
||||
- _APP_STORAGE_S3_REGION
|
||||
- _APP_STORAGE_S3_BUCKET
|
||||
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||
- _APP_STORAGE_DO_SPACES_SECRET
|
||||
- _APP_STORAGE_DO_SPACES_REGION
|
||||
- _APP_STORAGE_DO_SPACES_BUCKET
|
||||
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY
|
||||
- _APP_STORAGE_BACKBLAZE_SECRET
|
||||
- _APP_STORAGE_BACKBLAZE_REGION
|
||||
- _APP_STORAGE_BACKBLAZE_BUCKET
|
||||
- _APP_STORAGE_LINODE_ACCESS_KEY
|
||||
- _APP_STORAGE_LINODE_SECRET
|
||||
- _APP_STORAGE_LINODE_REGION
|
||||
- _APP_STORAGE_LINODE_BUCKET
|
||||
- _APP_STORAGE_WASABI_ACCESS_KEY
|
||||
- _APP_STORAGE_WASABI_SECRET
|
||||
- _APP_STORAGE_WASABI_REGION
|
||||
- _APP_STORAGE_WASABI_BUCKET
|
||||
|
||||
appwrite-realtime:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: realtime
|
||||
container_name: appwrite-realtime
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.constraint-label-stack=appwrite"
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- mariadb
|
||||
- redis
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.constraint-label-stack=appwrite"
|
||||
environment:
|
||||
- _APP_ENV
|
||||
- _APP_WORKER_PER_CORE
|
||||
@@ -169,10 +227,13 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-audits:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-audits
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-audits
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -192,10 +253,13 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-webhooks:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-webhooks
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-webhooks
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -217,10 +281,13 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-deletes:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-deletes
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-deletes
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -228,7 +295,6 @@ services:
|
||||
- appwrite-uploads:/storage/uploads:rw
|
||||
- appwrite-cache:/storage/cache:rw
|
||||
- appwrite-functions:/storage/functions:rw
|
||||
- appwrite-sites:/storage/sites:rw
|
||||
- appwrite-builds:/storage/builds:rw
|
||||
- appwrite-certificates:/storage/certificates:rw
|
||||
environment:
|
||||
@@ -249,7 +315,6 @@ services:
|
||||
- _APP_STORAGE_S3_SECRET
|
||||
- _APP_STORAGE_S3_REGION
|
||||
- _APP_STORAGE_S3_BUCKET
|
||||
- _APP_STORAGE_S3_ENDPOINT
|
||||
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||
- _APP_STORAGE_DO_SPACES_SECRET
|
||||
- _APP_STORAGE_DO_SPACES_REGION
|
||||
@@ -271,16 +336,16 @@ services:
|
||||
- _APP_EXECUTOR_HOST
|
||||
- _APP_MAINTENANCE_RETENTION_ABUSE
|
||||
- _APP_MAINTENANCE_RETENTION_AUDIT
|
||||
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
|
||||
- _APP_MAINTENANCE_RETENTION_EXECUTION
|
||||
- _APP_SYSTEM_SECURITY_EMAIL_ADDRESS
|
||||
- _APP_EMAIL_CERTIFICATES
|
||||
|
||||
appwrite-worker-databases:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-databases
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-databases
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -300,18 +365,19 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-builds:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-builds
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-builds
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
volumes:
|
||||
- appwrite-functions:/storage/functions:rw
|
||||
- appwrite-sites:/storage/sites:rw
|
||||
- appwrite-builds:/storage/builds:rw
|
||||
- appwrite-uploads:/storage/uploads:rw
|
||||
environment:
|
||||
- _APP_ENV
|
||||
- _APP_WORKER_PER_CORE
|
||||
@@ -332,20 +398,18 @@ services:
|
||||
- _APP_VCS_GITHUB_PRIVATE_KEY
|
||||
- _APP_VCS_GITHUB_APP_ID
|
||||
- _APP_FUNCTIONS_TIMEOUT
|
||||
- _APP_SITES_TIMEOUT
|
||||
- _APP_COMPUTE_BUILD_TIMEOUT
|
||||
- _APP_COMPUTE_CPUS
|
||||
- _APP_COMPUTE_MEMORY
|
||||
- _APP_COMPUTE_SIZE_LIMIT
|
||||
- _APP_FUNCTIONS_BUILD_TIMEOUT
|
||||
- _APP_FUNCTIONS_CPUS
|
||||
- _APP_FUNCTIONS_MEMORY
|
||||
- _APP_FUNCTIONS_SIZE_LIMIT
|
||||
- _APP_OPTIONS_FORCE_HTTPS
|
||||
- _APP_OPTIONS_ROUTER_FORCE_HTTPS
|
||||
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS
|
||||
- _APP_DOMAIN
|
||||
- _APP_STORAGE_DEVICE
|
||||
- _APP_STORAGE_S3_ACCESS_KEY
|
||||
- _APP_STORAGE_S3_SECRET
|
||||
- _APP_STORAGE_S3_REGION
|
||||
- _APP_STORAGE_S3_BUCKET
|
||||
- _APP_STORAGE_S3_ENDPOINT
|
||||
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||
- _APP_STORAGE_DO_SPACES_SECRET
|
||||
- _APP_STORAGE_DO_SPACES_REGION
|
||||
@@ -362,13 +426,15 @@ services:
|
||||
- _APP_STORAGE_WASABI_SECRET
|
||||
- _APP_STORAGE_WASABI_REGION
|
||||
- _APP_STORAGE_WASABI_BUCKET
|
||||
- _APP_DOMAIN_SITES
|
||||
|
||||
appwrite-worker-certificates:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-certificates
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-certificates
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -380,11 +446,7 @@ services:
|
||||
- _APP_WORKER_PER_CORE
|
||||
- _APP_OPENSSL_KEY_V1
|
||||
- _APP_DOMAIN
|
||||
- _APP_DOMAIN_TARGET_CNAME
|
||||
- _APP_DOMAIN_TARGET_AAAA
|
||||
- _APP_DOMAIN_TARGET_A
|
||||
- _APP_DOMAIN_TARGET_CAA
|
||||
- _APP_DNS
|
||||
- _APP_DOMAIN_TARGET
|
||||
- _APP_DOMAIN_FUNCTIONS
|
||||
- _APP_EMAIL_CERTIFICATES
|
||||
- _APP_REDIS_HOST
|
||||
@@ -399,10 +461,13 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-functions:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-functions
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-functions
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -423,10 +488,9 @@ services:
|
||||
- _APP_DB_USER
|
||||
- _APP_DB_PASS
|
||||
- _APP_FUNCTIONS_TIMEOUT
|
||||
- _APP_SITES_TIMEOUT
|
||||
- _APP_COMPUTE_BUILD_TIMEOUT
|
||||
- _APP_COMPUTE_CPUS
|
||||
- _APP_COMPUTE_MEMORY
|
||||
- _APP_FUNCTIONS_BUILD_TIMEOUT
|
||||
- _APP_FUNCTIONS_CPUS
|
||||
- _APP_FUNCTIONS_MEMORY
|
||||
- _APP_EXECUTOR_SECRET
|
||||
- _APP_EXECUTOR_HOST
|
||||
- _APP_USAGE_STATS
|
||||
@@ -435,10 +499,13 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-mails:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-mails
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-mails
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
environment:
|
||||
@@ -462,14 +529,15 @@ services:
|
||||
- _APP_SMTP_USERNAME
|
||||
- _APP_SMTP_PASSWORD
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_DOMAIN
|
||||
- _APP_OPTIONS_FORCE_HTTPS
|
||||
|
||||
appwrite-worker-messaging:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-messaging
|
||||
container_name: appwrite-worker-messaging
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
volumes:
|
||||
- appwrite-uploads:/storage/uploads:rw
|
||||
depends_on:
|
||||
@@ -495,7 +563,6 @@ services:
|
||||
- _APP_STORAGE_S3_SECRET
|
||||
- _APP_STORAGE_S3_REGION
|
||||
- _APP_STORAGE_S3_BUCKET
|
||||
- _APP_STORAGE_S3_ENDPOINT
|
||||
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||
- _APP_STORAGE_DO_SPACES_SECRET
|
||||
- _APP_STORAGE_DO_SPACES_REGION
|
||||
@@ -514,12 +581,13 @@ services:
|
||||
- _APP_STORAGE_WASABI_BUCKET
|
||||
|
||||
appwrite-worker-migrations:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-migrations
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-migrations
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- appwrite-imports:/storage/imports:rw
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- mariadb
|
||||
environment:
|
||||
@@ -527,11 +595,7 @@ services:
|
||||
- _APP_WORKER_PER_CORE
|
||||
- _APP_OPENSSL_KEY_V1
|
||||
- _APP_DOMAIN
|
||||
- _APP_DOMAIN_TARGET_CNAME
|
||||
- _APP_DOMAIN_TARGET_AAAA
|
||||
- _APP_DOMAIN_TARGET_A
|
||||
- _APP_DOMAIN_TARGET_CAA
|
||||
- _APP_DNS
|
||||
- _APP_DOMAIN_TARGET
|
||||
- _APP_EMAIL_SECURITY
|
||||
- _APP_REDIS_HOST
|
||||
- _APP_REDIS_PORT
|
||||
@@ -547,21 +611,20 @@ services:
|
||||
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
|
||||
|
||||
appwrite-task-maintenance:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: maintenance
|
||||
<<: *x-logging
|
||||
container_name: appwrite-task-maintenance
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
environment:
|
||||
- _APP_ENV
|
||||
- _APP_WORKER_PER_CORE
|
||||
- _APP_DOMAIN
|
||||
- _APP_DOMAIN_TARGET_CNAME
|
||||
- _APP_DOMAIN_TARGET_AAAA
|
||||
- _APP_DOMAIN_TARGET_A
|
||||
- _APP_DOMAIN_TARGET_CAA
|
||||
- _APP_DNS
|
||||
- _APP_DOMAIN_TARGET
|
||||
- _APP_DOMAIN_FUNCTIONS
|
||||
- _APP_OPENSSL_KEY_V1
|
||||
- _APP_REDIS_HOST
|
||||
@@ -578,15 +641,17 @@ services:
|
||||
- _APP_MAINTENANCE_RETENTION_CACHE
|
||||
- _APP_MAINTENANCE_RETENTION_ABUSE
|
||||
- _APP_MAINTENANCE_RETENTION_AUDIT
|
||||
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
|
||||
- _APP_MAINTENANCE_RETENTION_USAGE_HOURLY
|
||||
- _APP_MAINTENANCE_RETENTION_SCHEDULES
|
||||
|
||||
appwrite-task-stats-resources:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: stats-resources
|
||||
appwrite-worker-usage:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-usage
|
||||
container_name: appwrite-worker-usage
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -605,39 +670,15 @@ services:
|
||||
- _APP_REDIS_PASS
|
||||
- _APP_USAGE_STATS
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_STATS_RESOURCES_INTERVAL
|
||||
- _APP_USAGE_AGGREGATION_INTERVAL
|
||||
|
||||
appwrite-worker-stats-resources:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-stats-resources
|
||||
appwrite-worker-usage-dump:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-usage-dump
|
||||
container_name: appwrite-worker-usage-dump
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
environment:
|
||||
- _APP_ENV
|
||||
- _APP_WORKER_PER_CORE
|
||||
- _APP_OPENSSL_KEY_V1
|
||||
- _APP_DB_HOST
|
||||
- _APP_DB_PORT
|
||||
- _APP_DB_SCHEMA
|
||||
- _APP_DB_USER
|
||||
- _APP_DB_PASS
|
||||
- _APP_REDIS_HOST
|
||||
- _APP_REDIS_PORT
|
||||
- _APP_REDIS_USER
|
||||
- _APP_REDIS_PASS
|
||||
- _APP_USAGE_STATS
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_STATS_RESOURCES_INTERVAL
|
||||
|
||||
appwrite-worker-stats-usage:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-stats-usage
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -659,10 +700,13 @@ services:
|
||||
- _APP_USAGE_AGGREGATION_INTERVAL
|
||||
|
||||
appwrite-task-scheduler-functions:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: schedule-functions
|
||||
container_name: appwrite-task-scheduler-functions
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- mariadb
|
||||
- redis
|
||||
@@ -681,10 +725,13 @@ services:
|
||||
- _APP_DB_PASS
|
||||
|
||||
appwrite-task-scheduler-executions:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: schedule-executions
|
||||
container_name: appwrite-task-scheduler-executions
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- mariadb
|
||||
- redis
|
||||
@@ -703,10 +750,13 @@ services:
|
||||
- _APP_DB_PASS
|
||||
|
||||
appwrite-task-scheduler-messages:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: schedule-messages
|
||||
container_name: appwrite-task-scheduler-messages
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- mariadb
|
||||
- redis
|
||||
@@ -725,48 +775,44 @@ services:
|
||||
- _APP_DB_PASS
|
||||
|
||||
appwrite-assistant:
|
||||
image: appwrite/assistant:0.8.3
|
||||
image: appwrite/assistant:0.4.0
|
||||
container_name: appwrite-assistant
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
environment:
|
||||
- _APP_ASSISTANT_OPENAI_API_KEY
|
||||
|
||||
appwrite-browser:
|
||||
image: appwrite/browser:0.2.4
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
|
||||
openruntimes-executor:
|
||||
container_name: openruntimes-executor
|
||||
hostname: exc1
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
stop_signal: SIGINT
|
||||
image: openruntimes/executor:0.7.22
|
||||
image: openruntimes/executor:0.6.11
|
||||
networks:
|
||||
- dokploy-network
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- appwrite-builds:/storage/builds:rw
|
||||
- appwrite-functions:/storage/functions:rw
|
||||
- appwrite-sites:/storage/sites:rw
|
||||
# Host mount necessary to share files between executor and runtimes.
|
||||
# It's not possible to share mount file between 2 containers without host mount (copying is too slow)
|
||||
- /tmp:/tmp:rw
|
||||
environment:
|
||||
- OPR_EXECUTOR_INACTIVE_TRESHOLD=$_APP_COMPUTE_INACTIVE_THRESHOLD
|
||||
- OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_COMPUTE_MAINTENANCE_INTERVAL
|
||||
- OPR_EXECUTOR_NETWORK=$_APP_COMPUTE_RUNTIMES_NETWORK
|
||||
- OPR_EXECUTOR_INACTIVE_TRESHOLD=$_APP_FUNCTIONS_INACTIVE_THRESHOLD
|
||||
- OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_FUNCTIONS_MAINTENANCE_INTERVAL
|
||||
- OPR_EXECUTOR_NETWORK=$_APP_FUNCTIONS_RUNTIMES_NETWORK
|
||||
- OPR_EXECUTOR_DOCKER_HUB_USERNAME=$_APP_DOCKER_HUB_USERNAME
|
||||
- OPR_EXECUTOR_DOCKER_HUB_PASSWORD=$_APP_DOCKER_HUB_PASSWORD
|
||||
- OPR_EXECUTOR_ENV=$_APP_ENV
|
||||
- OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES,$_APP_SITES_RUNTIMES
|
||||
- OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES
|
||||
- OPR_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET
|
||||
- OPR_EXECUTOR_RUNTIME_VERSIONS=v5
|
||||
- OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG
|
||||
- OPR_EXECUTOR_STORAGE_DEVICE=$_APP_STORAGE_DEVICE
|
||||
- OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=$_APP_STORAGE_S3_ACCESS_KEY
|
||||
- OPR_EXECUTOR_STORAGE_S3_SECRET=$_APP_STORAGE_S3_SECRET
|
||||
- OPR_EXECUTOR_STORAGE_S3_REGION=$_APP_STORAGE_S3_REGION
|
||||
- OPR_EXECUTOR_STORAGE_S3_BUCKET=$_APP_STORAGE_S3_BUCKET
|
||||
- OPR_EXECUTOR_STORAGE_S3_ENDPOINT=$_APP_STORAGE_S3_ENDPOINT
|
||||
- OPR_EXECUTOR_STORAGE_DO_SPACES_ACCESS_KEY=$_APP_STORAGE_DO_SPACES_ACCESS_KEY
|
||||
- OPR_EXECUTOR_STORAGE_DO_SPACES_SECRET=$_APP_STORAGE_DO_SPACES_SECRET
|
||||
- OPR_EXECUTOR_STORAGE_DO_SPACES_REGION=$_APP_STORAGE_DO_SPACES_REGION
|
||||
@@ -785,9 +831,12 @@ services:
|
||||
- OPR_EXECUTOR_STORAGE_WASABI_BUCKET=$_APP_STORAGE_WASABI_BUCKET
|
||||
|
||||
mariadb:
|
||||
image: mariadb:10.11 # fix issues when upgrading using: mysql_upgrade -u root -p
|
||||
image: mariadb:10.11
|
||||
container_name: appwrite-mariadb
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
volumes:
|
||||
- appwrite-mariadb:/var/lib/mysql:rw
|
||||
environment:
|
||||
@@ -800,30 +849,39 @@ services:
|
||||
|
||||
redis:
|
||||
image: redis:7.2.4-alpine
|
||||
container_name: appwrite-redis
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
command: >
|
||||
redis-server
|
||||
--maxmemory 512mb
|
||||
--maxmemory-policy allkeys-lru
|
||||
--maxmemory-samples 5
|
||||
--maxmemory 512mb
|
||||
--maxmemory-policy allkeys-lru
|
||||
--maxmemory-samples 5
|
||||
networks:
|
||||
- dokploy-network
|
||||
volumes:
|
||||
- appwrite-redis:/data:rw
|
||||
|
||||
# clamav:
|
||||
# image: appwrite/clamav:1.2.0
|
||||
# restart: unless-stopped
|
||||
# volumes:
|
||||
# - appwrite-uploads:/storage/uploads
|
||||
# Uncomment and configure if ClamAV is needed
|
||||
# clamav:
|
||||
# image: appwrite/clamav:1.2.0
|
||||
# container_name: appwrite-clamav
|
||||
# restart: unless-stopped
|
||||
# networks:
|
||||
# - dokploy-network
|
||||
# volumes:
|
||||
# - appwrite-uploads:/storage/uploads
|
||||
|
||||
volumes:
|
||||
appwrite-mariadb:
|
||||
appwrite-redis:
|
||||
appwrite-cache:
|
||||
appwrite-uploads:
|
||||
appwrite-imports:
|
||||
appwrite-certificates:
|
||||
appwrite-functions:
|
||||
appwrite-sites:
|
||||
appwrite-builds:
|
||||
appwrite-config:
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
@@ -1,11 +1,5 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
functions_domain = "functions.${main_domain}"
|
||||
sites_domain = "sites.${main_domain}"
|
||||
openssl_key = "${password:32}"
|
||||
db_root_pw = "${password:32}"
|
||||
db_user_pw = "${password:32}"
|
||||
executor_secret = "${password:32}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
@@ -14,19 +8,11 @@ env = [
|
||||
"_APP_OPTIONS_ABUSE=enabled",
|
||||
"_APP_OPTIONS_FORCE_HTTPS=disabled",
|
||||
"_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS=disabled",
|
||||
"_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled",
|
||||
"_APP_OPTIONS_ROUTER_PROTECTION=disabled",
|
||||
"_APP_OPENSSL_KEY_V1=${openssl_key}",
|
||||
"_APP_OPENSSL_KEY_V1=your-secret-key",
|
||||
"_APP_DOMAIN=${main_domain}",
|
||||
"_APP_CUSTOM_DOMAIN_DENY_LIST=example.com,test.com,app.example.com",
|
||||
"_APP_DOMAIN_FUNCTIONS=${functions_domain}",
|
||||
"_APP_DOMAIN_SITES=${sites_domain}",
|
||||
"_APP_DOMAIN_TARGET=localhost",
|
||||
"_APP_DOMAIN_TARGET_CNAME=localhost",
|
||||
"_APP_DOMAIN_TARGET_AAAA=::1",
|
||||
"_APP_DOMAIN_TARGET_A=127.0.0.1",
|
||||
"_APP_DOMAIN_TARGET_CAA=",
|
||||
"_APP_DNS=8.8.8.8",
|
||||
"_APP_DOMAIN_FUNCTIONS=${main_domain}",
|
||||
"_APP_DOMAIN_TARGET=${main_domain}",
|
||||
"_APP_CONSOLE_WHITELIST_ROOT=enabled",
|
||||
"_APP_CONSOLE_WHITELIST_EMAILS=",
|
||||
"_APP_CONSOLE_WHITELIST_IPS=",
|
||||
@@ -46,8 +32,6 @@ env = [
|
||||
"_APP_USAGE_DATABASE_INTERVAL=900",
|
||||
"_APP_WORKER_PER_CORE=6",
|
||||
"_APP_CONSOLE_SESSION_ALERTS=disabled",
|
||||
"_APP_COMPRESSION_ENABLED=enabled",
|
||||
"_APP_COMPRESSION_MIN_SIZE_BYTES=1024",
|
||||
"_APP_REDIS_HOST=redis",
|
||||
"_APP_REDIS_PORT=6379",
|
||||
"_APP_REDIS_USER=",
|
||||
@@ -56,8 +40,8 @@ env = [
|
||||
"_APP_DB_PORT=3306",
|
||||
"_APP_DB_SCHEMA=appwrite",
|
||||
"_APP_DB_USER=user",
|
||||
"_APP_DB_PASS=${db_user_pw}",
|
||||
"_APP_DB_ROOT_PASS=${db_root_pw}",
|
||||
"_APP_DB_PASS=password",
|
||||
"_APP_DB_ROOT_PASS=rootsecretpassword",
|
||||
"_APP_INFLUXDB_HOST=influxdb",
|
||||
"_APP_INFLUXDB_PORT=8086",
|
||||
"_APP_STATSD_HOST=telegraf",
|
||||
@@ -79,7 +63,6 @@ env = [
|
||||
"_APP_STORAGE_S3_SECRET=",
|
||||
"_APP_STORAGE_S3_REGION=us-east-1",
|
||||
"_APP_STORAGE_S3_BUCKET=",
|
||||
"_APP_STORAGE_S3_ENDPOINT=",
|
||||
"_APP_STORAGE_DO_SPACES_ACCESS_KEY=",
|
||||
"_APP_STORAGE_DO_SPACES_SECRET=",
|
||||
"_APP_STORAGE_DO_SPACES_REGION=us-east-1",
|
||||
@@ -97,36 +80,27 @@ env = [
|
||||
"_APP_STORAGE_WASABI_REGION=eu-central-1",
|
||||
"_APP_STORAGE_WASABI_BUCKET=",
|
||||
"_APP_FUNCTIONS_SIZE_LIMIT=30000000",
|
||||
"_APP_COMPUTE_SIZE_LIMIT=30000000",
|
||||
"_APP_FUNCTIONS_BUILD_SIZE_LIMIT=2000000000",
|
||||
"_APP_FUNCTIONS_TIMEOUT=900",
|
||||
"_APP_FUNCTIONS_BUILD_TIMEOUT=900",
|
||||
"_APP_COMPUTE_BUILD_TIMEOUT=900",
|
||||
"_APP_FUNCTIONS_CONTAINERS=10",
|
||||
"_APP_FUNCTIONS_CPUS=0",
|
||||
"_APP_COMPUTE_CPUS=0",
|
||||
"_APP_FUNCTIONS_MEMORY=0",
|
||||
"_APP_COMPUTE_MEMORY=0",
|
||||
"_APP_FUNCTIONS_MEMORY_SWAP=0",
|
||||
"_APP_FUNCTIONS_RUNTIMES=node-16.0,php-8.0,python-3.9,ruby-3.0",
|
||||
"_APP_EXECUTOR_SECRET=${executor_secret}",
|
||||
"_APP_EXECUTOR_SECRET=your-secret-key",
|
||||
"_APP_EXECUTOR_HOST=http://exc1/v1",
|
||||
"_APP_EXECUTOR_RUNTIME_NETWORK=appwrite_runtimes",
|
||||
"_APP_FUNCTIONS_ENVS=node-16.0,php-7.4,python-3.9,ruby-3.0",
|
||||
"_APP_FUNCTIONS_INACTIVE_THRESHOLD=60",
|
||||
"_APP_COMPUTE_INACTIVE_THRESHOLD=60",
|
||||
"DOCKERHUB_PULL_USERNAME=",
|
||||
"DOCKERHUB_PULL_PASSWORD=",
|
||||
"DOCKERHUB_PULL_EMAIL=",
|
||||
"OPEN_RUNTIMES_NETWORK=appwrite_runtimes",
|
||||
"_APP_FUNCTIONS_RUNTIMES_NETWORK=dokploy-network",
|
||||
"_APP_COMPUTE_RUNTIMES_NETWORK=dokploy-network",
|
||||
"_APP_FUNCTIONS_RUNTIMES_NETWORK=runtimes",
|
||||
"_APP_DOCKER_HUB_USERNAME=",
|
||||
"_APP_DOCKER_HUB_PASSWORD=",
|
||||
"_APP_FUNCTIONS_MAINTENANCE_INTERVAL=3600",
|
||||
"_APP_COMPUTE_MAINTENANCE_INTERVAL=3600",
|
||||
"_APP_SITES_TIMEOUT=900",
|
||||
"_APP_SITES_RUNTIMES=static-1,node-22,flutter-3.29",
|
||||
"_APP_VCS_GITHUB_APP_NAME=",
|
||||
"_APP_VCS_GITHUB_PRIVATE_KEY=",
|
||||
"_APP_VCS_GITHUB_APP_ID=",
|
||||
@@ -135,11 +109,9 @@ env = [
|
||||
"_APP_VCS_GITHUB_WEBHOOK_SECRET=",
|
||||
"_APP_MAINTENANCE_INTERVAL=86400",
|
||||
"_APP_MAINTENANCE_DELAY=0",
|
||||
"_APP_MAINTENANCE_START_TIME=00:00",
|
||||
"_APP_MAINTENANCE_RETENTION_CACHE=2592000",
|
||||
"_APP_MAINTENANCE_RETENTION_EXECUTION=1209600",
|
||||
"_APP_MAINTENANCE_RETENTION_AUDIT=1209600",
|
||||
"_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=15778800",
|
||||
"_APP_MAINTENANCE_RETENTION_ABUSE=86400",
|
||||
"_APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000",
|
||||
"_APP_MAINTENANCE_RETENTION_SCHEDULES=86400",
|
||||
@@ -158,18 +130,6 @@ port = 80
|
||||
host = "${main_domain}"
|
||||
path = "/"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appwrite"
|
||||
port = 80
|
||||
host = "${sites_domain}"
|
||||
path = "/"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appwrite"
|
||||
port = 80
|
||||
host = "${functions_domain}"
|
||||
path = "/"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appwrite-console"
|
||||
port = 80
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
autobase-console:
|
||||
image: autobase/console:2.5.2
|
||||
image: autobase/console:2.3.0
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "80"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
services:
|
||||
|
||||
apps:
|
||||
image: budibase/apps:3.23.47
|
||||
image: budibase.docker.scarf.sh/budibase/apps:3.5.3
|
||||
restart: unless-stopped
|
||||
|
||||
environment:
|
||||
SELF_HOSTED: 1
|
||||
LOG_LEVEL: info
|
||||
@@ -39,10 +39,10 @@ services:
|
||||
timeout: 15s
|
||||
retries: 5
|
||||
start_period: 10s
|
||||
|
||||
worker:
|
||||
image: budibase/worker:3.23.47
|
||||
image: budibase.docker.scarf.sh/budibase/worker:3.2.25
|
||||
restart: unless-stopped
|
||||
|
||||
environment:
|
||||
SELF_HOSTED: 1
|
||||
LOG_LEVEL: info
|
||||
@@ -78,10 +78,10 @@ services:
|
||||
timeout: 15s
|
||||
retries: 5
|
||||
start_period: 10s
|
||||
|
||||
minio:
|
||||
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
|
||||
image: minio/minio:RELEASE.2024-11-07T00-52-20Z
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
- 'minio_data:/data'
|
||||
environment:
|
||||
@@ -98,10 +98,10 @@ services:
|
||||
interval: 30s
|
||||
timeout: 20s
|
||||
retries: 3
|
||||
|
||||
proxy:
|
||||
image: budibase/proxy:3.23.47
|
||||
image: budibase/proxy:3.2.25
|
||||
restart: unless-stopped
|
||||
|
||||
environment:
|
||||
PROXY_RATE_LIMIT_WEBHOOKS_PER_SECOND: 10
|
||||
PROXY_RATE_LIMIT_API_PER_SECOND: 20
|
||||
@@ -130,10 +130,10 @@ services:
|
||||
timeout: 15s
|
||||
retries: 5
|
||||
start_period: 10s
|
||||
|
||||
couchdb:
|
||||
image: budibase/couchdb:v3.3.3
|
||||
restart: unless-stopped
|
||||
|
||||
environment:
|
||||
COUCHDB_USER: budibase
|
||||
COUCHDB_PASSWORD: ${BB_COUCHDB_PASSWORD}
|
||||
@@ -150,9 +150,9 @@ services:
|
||||
start_period: 10s
|
||||
volumes:
|
||||
- 'couchdb3_data:/opt/couchdb/data'
|
||||
|
||||
redis:
|
||||
image: redis:8.4-alpine
|
||||
image: redis:7.2-alpine
|
||||
|
||||
restart: unless-stopped
|
||||
command: 'redis-server --requirepass "${BB_REDIS_PASSWORD}"'
|
||||
volumes:
|
||||
@@ -168,9 +168,22 @@ services:
|
||||
timeout: 15s
|
||||
retries: 5
|
||||
start_period: 10s
|
||||
watchtower:
|
||||
restart: unless-stopped
|
||||
|
||||
image: containrrr/watchtower:1.7.1
|
||||
volumes:
|
||||
- '/var/run/docker.sock:/var/run/docker.sock'
|
||||
command: '--debug --http-api-update bbapps bbworker bbproxy'
|
||||
environment:
|
||||
WATCHTOWER_HTTP_API: true
|
||||
WATCHTOWER_HTTP_API_TOKEN: ${BB_WATCHTOWER_PASSWORD}
|
||||
WATCHTOWER_CLEANUP: true
|
||||
labels:
|
||||
- com.centurylinklabs.watchtower.enable=false
|
||||
|
||||
|
||||
volumes:
|
||||
minio_data:
|
||||
couchdb3_data:
|
||||
redis_data:
|
||||
redis_data:
|
||||
@@ -17,9 +17,6 @@ services:
|
||||
S3_INTERNAL_ENDPOINT: "http://minio:3902"
|
||||
expose:
|
||||
- 3000
|
||||
depends_on:
|
||||
- ps-mysql
|
||||
- minio
|
||||
|
||||
ps-mysql:
|
||||
image: mysql:8.0
|
||||
@@ -37,10 +34,11 @@ services:
|
||||
- ps-mysql:/var/lib/mysql
|
||||
|
||||
minio:
|
||||
image: quay.io/minio/minio:RELEASE.2025-05-24T17-08-30Z
|
||||
image: bitnami/minio:latest
|
||||
restart: unless-stopped
|
||||
command: server /bitnami/minio/data --address ":3902" --console-address ":3903"
|
||||
environment:
|
||||
MINIO_API_PORT_NUMBER: 3902
|
||||
MINIO_CONSOLE_PORT_NUMBER: 3903
|
||||
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
|
||||
expose:
|
||||
@@ -49,11 +47,6 @@ services:
|
||||
volumes:
|
||||
- minio-data:/bitnami/minio/data
|
||||
- minio-certs:/certs
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3902/minio/health/ready"]
|
||||
interval: 30s
|
||||
timeout: 20s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
ps-mysql:
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 116" preserveAspectRatio="xMidYMid meet">
|
||||
<path fill="#FFF" d="m202.357 49.394-5.311-2.124C172.085 103.434 72.786 69.289 66.81 85.997c-.996 11.286 54.227 2.146 93.706 4.059 12.039.583 18.076 9.671 12.964 24.484l10.069.031c11.615-36.209 48.683-17.73 50.232-29.68-2.545-7.857-42.601 0-31.425-35.497Z"/>
|
||||
<path fill="#F4811F" d="M176.332 108.348c1.593-5.31 1.062-10.622-1.593-13.809-2.656-3.187-6.374-5.31-11.154-5.842L71.17 87.634c-.531 0-1.062-.53-1.593-.53-.531-.532-.531-1.063 0-1.594.531-1.062 1.062-1.594 2.124-1.594l92.946-1.062c11.154-.53 22.839-9.56 27.087-20.182l5.312-13.809c0-.532.531-1.063 0-1.594C191.203 20.182 166.772 0 138.091 0 111.535 0 88.697 16.995 80.73 40.896c-5.311-3.718-11.684-5.843-19.12-5.31-12.747 1.061-22.838 11.683-24.432 24.43-.531 3.187 0 6.374.532 9.56C16.996 70.107 0 87.103 0 108.348c0 2.124 0 3.718.531 5.842 0 1.063 1.062 1.594 1.594 1.594h170.489c1.062 0 2.125-.53 2.125-1.594l1.593-5.842Z"/>
|
||||
<path fill="#FAAD3F" d="M205.544 48.863h-2.656c-.531 0-1.062.53-1.593 1.062l-3.718 12.747c-1.593 5.31-1.062 10.623 1.594 13.809 2.655 3.187 6.373 5.31 11.153 5.843l19.652 1.062c.53 0 1.062.53 1.593.53.53.532.53 1.063 0 1.594-.531 1.063-1.062 1.594-2.125 1.594l-20.182 1.062c-11.154.53-22.838 9.56-27.087 20.182l-1.063 4.78c-.531.532 0 1.594 1.063 1.594h70.108c1.062 0 1.593-.531 1.593-1.593 1.062-4.25 2.124-9.03 2.124-13.81 0-27.618-22.838-50.456-50.456-50.456"/>
|
||||
<text x="128" y="65" text-anchor="middle" dominant-baseline="middle" font-size="32" font-family="Arial, Helvetica, sans-serif" font-weight="bold" fill="#fff">
|
||||
DDNS
|
||||
</text>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,16 +0,0 @@
|
||||
# For more details, see:
|
||||
# - https://github.com/favonia/cloudflare-ddns
|
||||
services:
|
||||
cloudflare-ddns:
|
||||
image: favonia/cloudflare-ddns:1
|
||||
network_mode: host
|
||||
restart: unless-stopped
|
||||
user: "1000:1000"
|
||||
read_only: true
|
||||
cap_drop: [all]
|
||||
security_opt: [no-new-privileges:true]
|
||||
environment:
|
||||
- CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN:?}
|
||||
- DOMAINS=${DOMAINS:?}
|
||||
- PROXIED=false
|
||||
- IP6_PROVIDER=none
|
||||
@@ -1,9 +0,0 @@
|
||||
variables = {}
|
||||
|
||||
[config]
|
||||
domains = []
|
||||
mounts = []
|
||||
|
||||
[config.env]
|
||||
CLOUDFLARE_API_TOKEN = "<INSERT YOUR TOKEN>"
|
||||
DOMAINS = "example.org,www.example.org,example.io"
|
||||
@@ -3,14 +3,14 @@ services:
|
||||
image: 'cloudflare/cloudflared:latest'
|
||||
environment:
|
||||
# Don't forget to set this in your Dokploy Environment
|
||||
- 'TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN:?}'
|
||||
- 'TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN}'
|
||||
network_mode: host
|
||||
restart: unless-stopped
|
||||
command: [
|
||||
"tunnel",
|
||||
|
||||
# More tunnel run parameters here:
|
||||
# https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/configure-tunnels/cloudflared-parameters/run-parameters/
|
||||
# https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/configure-tunnels/tunnel-run-parameters/
|
||||
"--no-autoupdate",
|
||||
#"--protocol", "http2",
|
||||
|
||||
|
||||
@@ -2,7 +2,5 @@ variables = {}
|
||||
|
||||
[config]
|
||||
domains = []
|
||||
env = ["CLOUDFLARE_TUNNEL_TOKEN=\"<INSERT TOKEN>\""]
|
||||
mounts = []
|
||||
|
||||
[config.env]
|
||||
CLOUDFLARE_TUNNEL_TOKEN = ""
|
||||
|
||||
|
Before Width: | Height: | Size: 6.8 KiB |
@@ -1,48 +0,0 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
cloudreve:
|
||||
image: cloudreve/cloudreve:4.10.1
|
||||
depends_on:
|
||||
postgresql:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_started
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- CR_CONF_Database.Type=postgres
|
||||
- CR_CONF_Database.Host=postgresql
|
||||
- CR_CONF_Database.User=${POSTGRES_USER}
|
||||
- CR_CONF_Database.Password=${POSTGRES_PASSWORD}
|
||||
- CR_CONF_Database.Name=${POSTGRES_DB}
|
||||
- CR_CONF_Database.Port=5432
|
||||
- CR_CONF_Redis.Server=redis:6379
|
||||
volumes:
|
||||
- cloudreve_data:/cloudreve/data
|
||||
|
||||
postgresql:
|
||||
image: postgres:17
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- POSTGRES_USER
|
||||
- POSTGRES_PASSWORD
|
||||
- POSTGRES_DB
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
|
||||
redis:
|
||||
image: redis:8.4.0
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
|
||||
volumes:
|
||||
cloudreve_data:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
@@ -1,16 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
db_password = "${password:32}"
|
||||
db_user = "cloudreve"
|
||||
db_name = "cloudreve"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "cloudreve"
|
||||
port = 5212
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
POSTGRES_PASSWORD = "${db_password}"
|
||||
POSTGRES_USER = "${db_user}"
|
||||
POSTGRES_DB = "${db_name}"
|
||||
@@ -1,9 +1,9 @@
|
||||
services:
|
||||
backend:
|
||||
image: ghcr.io/get-convex/convex-backend:5cdea511cd6527a95dd24152ea0d3c3bb2ab379f
|
||||
expose:
|
||||
- "3210"
|
||||
- "3211"
|
||||
image: ghcr.io/get-convex/convex-backend:33cef775a8a6228cbacee4a09ac2c4073d62ed13
|
||||
ports:
|
||||
- "${PORT:-3210}:3210"
|
||||
- "${SITE_PROXY_PORT:-3211}:3211"
|
||||
volumes:
|
||||
- data:/convex/data
|
||||
environment:
|
||||
@@ -14,7 +14,7 @@ services:
|
||||
- CONVEX_CLOUD_ORIGIN=${CONVEX_CLOUD_ORIGIN:-http://127.0.0.1:3210}
|
||||
- CONVEX_SITE_ORIGIN=${CONVEX_SITE_ORIGIN:-http://127.0.0.1:3211}
|
||||
- DATABASE_URL=${DATABASE_URL:-}
|
||||
- DISABLE_BEACON=${DISABLE_BEACON:-FALSE}
|
||||
- DISABLE_BEACON=${DISABLE_BEACON:-}
|
||||
- REDACT_LOGS_TO_CLIENT=${REDACT_LOGS_TO_CLIENT:-}
|
||||
- RUST_LOG=${RUST_LOG:-info}
|
||||
- RUST_BACKTRACE=${RUST_BACKTRACE:-}
|
||||
@@ -24,9 +24,9 @@ services:
|
||||
start_period: 5s
|
||||
|
||||
dashboard:
|
||||
image: ghcr.io/get-convex/convex-dashboard:5cdea511cd6527a95dd24152ea0d3c3bb2ab379f
|
||||
expose:
|
||||
- "6791"
|
||||
image: ghcr.io/get-convex/convex-dashboard:33cef775a8a6228cbacee4a09ac2c4073d62ed13
|
||||
ports:
|
||||
- "${DASHBOARD_PORT:-6791}:6791"
|
||||
environment:
|
||||
- NEXT_PUBLIC_DEPLOYMENT_URL=${NEXT_PUBLIC_DEPLOYMENT_URL:-http://127.0.0.1:3210}
|
||||
depends_on:
|
||||
|
||||
@@ -32,7 +32,7 @@ services:
|
||||
restart: unless-stopped
|
||||
|
||||
discourse-app:
|
||||
image: docker.io/bitnamilegacy/discourse:3.5.0
|
||||
image: docker.io/bitnami/discourse:3.3.2
|
||||
|
||||
volumes:
|
||||
- discourse-data:/bitnami/discourse
|
||||
@@ -59,7 +59,7 @@ services:
|
||||
restart: unless-stopped
|
||||
|
||||
discourse-sidekiq:
|
||||
image: docker.io/bitnamilegacy/discourse:3.5.0
|
||||
image: docker.io/bitnami/discourse:3.3.2
|
||||
|
||||
volumes:
|
||||
- discourse-sidekiq-data:/bitnami/discourse
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
services:
|
||||
dolibarr:
|
||||
image: dolibarr/dolibarr:21.0.0
|
||||
restart: always
|
||||
environment:
|
||||
DOLI_DB_HOST: db
|
||||
DOLI_DB_NAME: $DB_NAME
|
||||
DOLI_DB_USER: $DB_USER
|
||||
DOLI_DB_PASSWORD: $DB_PASSWORD
|
||||
DOLI_URL_ROOT: ${DOLIBARR_HOST}
|
||||
DOLI_ADMIN_LOGIN: admin
|
||||
DOLI_ADMIN_PASSWORD: $ADMIN_PASSWORD
|
||||
volumes:
|
||||
- dolibarr_documents:/var/www/documents
|
||||
- dolibarr_html:/var/www/html
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
|
||||
db:
|
||||
image: mariadb:10.11
|
||||
restart: always
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
|
||||
MYSQL_DATABASE: $DB_NAME
|
||||
MYSQL_USER: $DB_USER
|
||||
MYSQL_PASSWORD: $DB_PASSWORD
|
||||
volumes:
|
||||
- db_data:/var/lib/mysql
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "healthcheck.sh --connect --innodb_initialized"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
|
||||
volumes:
|
||||
dolibarr_documents:
|
||||
dolibarr_html:
|
||||
db_data:
|
||||
@@ -1 +0,0 @@
|
||||
<svg width="625.57" height="144.4" viewBox="0 0 176.55 40.754" xmlns="http://www.w3.org/2000/svg"><g stroke-width=".265"><path d="m90.28 4.132v22.06c0 4.053.955 7.353 2.864 9.902 1.098 1.469 2.491 2.637 4.178 3.504 1.703.867 3.445 1.144 5.228 1.159 2.894.023 6.707-1.086 8.976-3.84 2.291-2.78 3.653-5.92 3.653-9.795 0-3.787-1.202-7.03-3.605-9.716-2.386-2.69-5.26-4.03-8.617-4.03-.541 0-2.386.06-2.386.06l.066 10.08s1.526.004 2.178.004c.923 0 1.703.371 2.339 1.115.637.725.955 1.628.955 2.708 0 1.044-.342 1.938-1.027 2.681-.668.725-1.488 1.089-2.459 1.089-2.276 0-3.414-1.761-3.414-5.283v-21.688h-8.928zm-90.28.259v36.24l9.692.106v-25.937h3.271c5.554 0 8.331 2.468 8.331 7.406 0 5.256-1.707 7.84-7.357 7.87l-2.67.014v10.644c1.32.005 2.381.023 2.971.023 5.01 0 9.03-1.651 12.21-5.12 3.183-3.469 4.776-7.945 4.776-13.433 0-5.734-1.863-10.273-5.585-13.618-3.135-2.796-7.472-4.195-13.01-4.195h-12.628zm62.45.024v36.34h8.928v-36.34h-8.928m-16.02 8.787c-3.597 0-6.62 1.328-9.07 3.982-2.451 2.637-3.676 5.893-3.676 9.769 0 3.805 1.225 7.06 3.676 9.769 2.451 2.69 5.403 4.03 8.857 4.03s6.398-1.345 8.833-4.03c2.451-2.69 3.676-5.946 3.676-9.769 0-3.77-1.209-7-3.628-9.69-2.402-2.708-5.292-4.061-8.666-4.061m127.38.424c-3.135 0-5.641 1.142-7.519 3.425-1.878 2.265-2.817 5.31-2.817 9.132v14.573h8.928v-12.662c0-2.761.812-4.141 2.435-4.141.509 0 1.703-.02 1.703-.02l.008-10.304s-2.038-.003-2.738-.003zm-15.66.0001c-3.135 0-5.642 1.141-7.52 3.424-1.878 2.265-2.817 5.31-2.817 9.132v14.573h8.928v-12.662c0-2.761.811-4.141 2.434-4.141.509 0 1.679-.028 1.679-.028v-10.296s-2-.002-2.704-.002m-27.977.026c-3.453 0-6.39 1.336-8.808 4.01-2.402 2.672-3.605 5.928-3.605 9.769 0 3.947 1.194 7.23 3.581 9.85 2.386 2.619 5.371 3.477 8.952 3.477h1.947l.041-9.373s-1.376.029-2.155.029c-.955 0-1.743-.354-2.364-1.061-.621-.708-.931-1.61-.931-2.708 0-1.044.342-1.947 1.026-2.708.684-.761 1.496-1.141 2.435-1.141 1.035 0 1.855.416 2.459 1.247.621.832.935 1.947.931 3.345l-.033 12.37h8.945l.017-13.09c0-4.336-1.114-7.752-3.342-10.247-2.212-2.513-5.244-3.77-9.09-3.77m-53.585.116v26.987h8.928v-26.987h-8.928m-30.395 9.228c.971 0 1.79.39 2.459 1.168.668.761 1 1.699 1 2.814 0 1.097-.342 2.035-1.027 2.814-.668.779-1.48 1.168-2.434 1.168-.939 0-1.751-.39-2.435-1.168-.668-.779-1-1.717-1-2.814 0-1.115.335-2.053 1-2.814.668-.779 1.48-1.168 2.435-1.168" fill="#263c5c"/><g fill="#007b8c"><path d="m153.43-.041l-2.088 9.501h.713l2.083-9.501h-.707m4.608 0c-.635 0-1.218.186-1.749.558-.527.368-.935.908-1.223 1.623-.285.71-.428 1.544-.428 2.5 0 .877.126 1.699.378 2.463.256.765.626 1.35 1.111 1.755.488.401 1.12.601 1.896.601.75 0 1.384-.261 1.901-.783.521-.527.881-1.289 1.081-2.288l-.953-.307c-.131.773-.382 1.356-.752 1.748s-.822.589-1.356.589c-.439 0-.847-.144-1.223-.432-.377-.288-.655-.723-.835-1.304-.177-.585-.265-1.268-.265-2.05 0-.606.075-1.193.226-1.761.151-.573.411-1.028.781-1.366.373-.338.837-.508 1.39-.508.481 0 .881.153 1.199.458.318.305.56.792.727 1.46l.939-.282c-.193-.848-.535-1.506-1.027-1.974-.491-.468-1.097-.702-1.818-.702m-26.586.157v9.188h5.374v-1.084h-4.421v-3.127h3.984v-1.079h-3.984v-2.814h4.254v-1.085h-5.207m6.705 0v9.188h.953v-4.08h1.105c.246 0 .422.015.53.044.147.046.292.127.433.244.144.117.306.322.486.614.18.293.409.715.688 1.266l.953 1.911h1.199l-1.253-2.5c-.249-.489-.513-.896-.791-1.222-.131-.15-.323-.303-.575-.458.691-.121 1.202-.405 1.533-.852s.496-.997.496-1.648c0-.506-.1-.968-.3-1.385-.2-.418-.466-.708-.8-.871-.334-.167-.822-.251-1.464-.251h-3.194m7.251 0v9.188h.953v-3.736h1.847c1.018 0 1.723-.269 2.113-.808.39-.543.584-1.204.584-1.987 0-.455-.073-.874-.221-1.254-.144-.38-.336-.675-.575-.884-.239-.213-.535-.357-.889-.432-.252-.059-.617-.088-1.095-.088h-2.717m16.788 0v9.188h.953v-4.08h1.105c.246 0 .423.015.531.044.147.046.291.127.432.244.144.117.307.322.487.614s.409.715.688 1.266l.953 1.911h1.199l-1.253-2.5c-.249-.489-.512-.896-.791-1.222-.131-.15-.323-.303-.575-.458.691-.121 1.202-.405 1.533-.852s.496-.997.496-1.648c0-.506-.1-.968-.3-1.385-.2-.418-.467-.708-.801-.871-.334-.167-.822-.251-1.464-.251h-3.193m7.222 0v9.188h.918v-7.821l2.083 7.821h.86l2.093-7.69v7.69h.919v-9.188h-1.283l-1.724 6.393c-.174.648-.301 1.139-.383 1.473-.072-.302-.186-.754-.344-1.36l-1.705-6.506h-1.435m-30.31 1.016h2.279c.534 0 .923.14 1.169.42.249.28.374.637.374 1.072 0 .297-.064.573-.192.827-.128.251-.315.435-.56.551-.246.113-.586.169-1.022.169h-2.048v-3.04m24.04 0h2.279c.534 0 .924.14 1.169.42.249.28.373.637.373 1.072 0 .297-.064.573-.191.827-.128.251-.315.435-.56.551-.246.113-.587.169-1.022.169h-2.048v-3.04m-16.786.069h1.842c.432 0 .728.027.889.081.249.088.449.269.599.545.154.272.231.601.231.984 0 .531-.129.942-.388 1.235s-.696.439-1.311.439h-1.862v-3.284"/><ellipse cx="81.02" cy="6.143" rx="4.619" ry="4.794"/></g></g></svg>
|
||||
|
Before Width: | Height: | Size: 4.6 KiB |
@@ -1,23 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
db_name = "dolibarr"
|
||||
db_user = "dolibarr"
|
||||
db_password = "${password:32}"
|
||||
db_root_password = "${password:32}"
|
||||
admin_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"DOLIBARR_HOST=${main_domain}",
|
||||
"DB_NAME=${db_name}",
|
||||
"DB_USER=${db_user}",
|
||||
"DB_PASSWORD=${db_password}",
|
||||
"DB_ROOT_PASSWORD=${db_root_password}",
|
||||
"ADMIN_PASSWORD=${admin_password}"
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "dolibarr"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
@@ -1,29 +0,0 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
easyappointments:
|
||||
image: alextselegidis/easyappointments:1.5.0
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- BASE_URL=http://${DOMAIN}
|
||||
- DB_HOST=mysql
|
||||
- DB_NAME=easyappointments
|
||||
- DB_USERNAME=root
|
||||
- DB_PASSWORD=${DB_PASSWORD}
|
||||
volumes:
|
||||
- easyappointments:/var/www/html
|
||||
depends_on:
|
||||
- mysql
|
||||
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
|
||||
- MYSQL_DATABASE=easyappointments
|
||||
volumes:
|
||||
- mysql:/var/lib/mysql
|
||||
|
||||
volumes:
|
||||
easyappointments:
|
||||
mysql:
|
||||
|
Before Width: | Height: | Size: 5.4 KiB |
@@ -1,13 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
db_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "easyappointments"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
DOMAIN = "${main_domain}"
|
||||
DB_PASSWORD = "${db_password}"
|
||||
@@ -1,58 +0,0 @@
|
||||
# This templates requires additional traefik port mapping and entry point
|
||||
# for port 8883 (mqtts over TCP)
|
||||
#
|
||||
# For the full instructions, refer to:
|
||||
# - https://github.com/Dokploy/dokploy/discussions/3126
|
||||
#
|
||||
# The initial login credentials are:
|
||||
# - USERNAME: admin
|
||||
# - PASSWORD: public
|
||||
|
||||
services:
|
||||
emqx:
|
||||
image: emqx/emqx-enterprise:6.0.1
|
||||
hostname: node1.emqx.com
|
||||
environment:
|
||||
EMQX_NODE_NAME: emqx@node1.emqx.com
|
||||
expose:
|
||||
- 1883 # MQTT
|
||||
- 8083 # WS
|
||||
- 18083 # Dashboard
|
||||
volumes:
|
||||
- emqx_data:/opt/emqx/data
|
||||
- emqx_log:/opt/emqx/log
|
||||
networks:
|
||||
dokploy-network:
|
||||
aliases:
|
||||
- emqx-service
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
labels:
|
||||
# MQTT over TLS
|
||||
- "traefik.tcp.routers.emqx-mqtts.entrypoints=mqtts"
|
||||
- "traefik.tcp.routers.emqx-mqtts.rule=HostSNI(`broker.yourdomain.com`)" # Change domain
|
||||
- "traefik.tcp.routers.emqx-mqtts.tls.certresolver=letsencrypt"
|
||||
- "traefik.tcp.routers.emqx-mqtts.service=emqx-service"
|
||||
- "traefik.tcp.services.emqx-service.loadbalancer.server.port=1883"
|
||||
|
||||
#
|
||||
# Optional Web UI:
|
||||
# - https://github.com/emqx/MQTTX/tree/main/web
|
||||
#
|
||||
# mqttx-web:
|
||||
# image: emqx/mqttx-web:latest
|
||||
# expose:
|
||||
# - 80
|
||||
#
|
||||
|
||||
volumes:
|
||||
emqx_data:
|
||||
emqx_log:
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="40 22 240 277">
|
||||
<g fill="#5551F4" fill-rule="evenodd">
|
||||
<path d="M214.8 107.087H112.496v.021c-.142-.006-.282-.021-.425-.021-5.311 0-9.616 4.293-9.616 9.589 0 5.295 4.305 9.588 9.616 9.588.143 0 .283-.015.425-.022v.022H214.8c5.31 0 9.615-4.293 9.615-9.588 0-5.296-4.305-9.59-9.615-9.59m0 91.341H112.496v.02c-.142-.005-.282-.02-.425-.02-5.311 0-9.616 4.293-9.616 9.588s4.305 9.588 9.616 9.588c.143 0 .283-.015.425-.02v.02H214.8c5.31 0 9.615-4.293 9.615-9.588s-4.305-9.588-9.615-9.588m-26.876-36.082c0-5-3.84-9.101-8.739-9.545v-.044h-87.72v.022c-.142-.006-.281-.022-.425-.022-5.31 0-9.615 4.293-9.615 9.59 0 5.295 4.305 9.588 9.615 9.588.144 0 .283-.016.426-.022v.022h87.719v-.045c4.899-.442 8.739-4.544 8.739-9.544"/>
|
||||
<path fill-rule="nonzero" d="M280 91.25 160 22 40 91.25v138.5L160 299l120-69.25zM160 42.712l102.049 58.894V219.38L160 278.276 57.939 219.38V101.606z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 940 B |
@@ -1,11 +0,0 @@
|
||||
[variables]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "emqx"
|
||||
port = 18083
|
||||
host = "emqx.yourdomain.com"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "emqx"
|
||||
port = 8083
|
||||
host = "broker.yourdomain.com"
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
evolution-api:
|
||||
image: evoapicloud/evolution-api:latest
|
||||
image: atendai/evolution-api:v2.1.2
|
||||
restart: always
|
||||
volumes:
|
||||
- evolution-instances:/evolution/instances
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
grafana:
|
||||
image: grafana/grafana-enterprise:12.4
|
||||
image: grafana/grafana-enterprise:9.5.20
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- grafana-storage:/var/lib/grafana
|
||||
|
||||
@@ -1,18 +1,13 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
server:
|
||||
image: docker.io/awinterstein/habitica-server:latest
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
mongo:
|
||||
condition: service_healthy
|
||||
- mongo
|
||||
environment:
|
||||
NODE_DB_URI: "mongodb://${MONGO_HABITICA_USER}:${MONGO_HABITICA_PASSWORD}@mongo/habitica?authSource=habitica"
|
||||
INVITE_ONLY: "${INVITE_ONLY}"
|
||||
EMAIL_SERVER_URL: "${EMAIL_SERVER_URL}"
|
||||
EMAIL_SERVER_PORT: "${EMAIL_SERVER_PORT}"
|
||||
EMAIL_SERVER_AUTH_USER: "${EMAIL_SERVER_AUTH_USER}"
|
||||
EMAIL_SERVER_AUTH_PASSWORD: "${EMAIL_SERVER_AUTH_PASSWORD}"
|
||||
ADMIN_EMAIL: "${ADMIN_EMAIL}"
|
||||
- NODE_DB_URI=mongodb://mongo/habitica
|
||||
|
||||
client:
|
||||
image: docker.io/awinterstein/habitica-client:latest
|
||||
@@ -25,64 +20,12 @@ services:
|
||||
mongo:
|
||||
image: docker.io/mongo:latest
|
||||
restart: unless-stopped
|
||||
command: >
|
||||
bash -c "
|
||||
echo \"${MONGO_KEYFILE_CONTENT}\" > /etc/mongo-keyfile &&
|
||||
chown 999:999 /etc/mongo-keyfile &&
|
||||
chmod 400 /etc/mongo-keyfile &&
|
||||
exec docker-entrypoint.sh mongod --replSet rs --bind_ip_all --port 27017 --keyFile /etc/mongo-keyfile
|
||||
"
|
||||
environment:
|
||||
MONGO_INITDB_ROOT_USERNAME: ${MONGO_ADMIN_USER}
|
||||
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ADMIN_PASSWORD}
|
||||
MONGO_KEYFILE_CONTENT: ${MONGO_KEYFILE_CONTENT}
|
||||
MONGO_HABITICA_USER: ${MONGO_HABITICA_USER}
|
||||
MONGO_HABITICA_PASSWORD: ${MONGO_HABITICA_PASSWORD}
|
||||
# ---------------------------------------------------------
|
||||
# SMART HEALTHCHECK: Auto-fixes Hostname Mismatches for replicaSet
|
||||
# ---------------------------------------------------------
|
||||
command: ["--replSet", "rs", "--bind_ip_all", "--port", "27017"]
|
||||
healthcheck:
|
||||
test: |
|
||||
mongosh --port 27017 --quiet -u "${MONGO_ADMIN_USER}" -p "${MONGO_ADMIN_PASSWORD}" --authenticationDatabase admin --eval "
|
||||
try {
|
||||
// 1. Hostname Fix
|
||||
const config = rs.conf();
|
||||
const currentHost = require('os').hostname() + ':27017';
|
||||
if (config.members[0].host !== currentHost) {
|
||||
config.members[0].host = currentHost;
|
||||
rs.reconfig(config, { force: true });
|
||||
}
|
||||
|
||||
// 2. User Creation Logic
|
||||
const targetDb = db.getSiblingDB('habitica');
|
||||
const hUser = process.env.MONGO_HABITICA_USER;
|
||||
const hPass = process.env.MONGO_HABITICA_PASSWORD;
|
||||
|
||||
// We can only check/create users if we are Primary
|
||||
if (rs.isMaster().ismaster) {
|
||||
if (!targetDb.getUser(hUser)) {
|
||||
print('Creating missing user ' + hUser + '...');
|
||||
targetDb.createUser({ user: hUser, pwd: hPass, roles: ['readWrite'] });
|
||||
}
|
||||
// SUCCESS: User exists and we are Primary
|
||||
quit(0);
|
||||
} else {
|
||||
// We are not Primary yet (still electing), so we cannot confirm user exists.
|
||||
// Fail the check so the dependent app waits.
|
||||
print('Waiting for Primary state...');
|
||||
quit(1);
|
||||
}
|
||||
} catch (err) {
|
||||
// If not initialized, initiate and FAIL this check so we wait for the next cycle
|
||||
try {
|
||||
rs.initiate({ _id: 'rs', members: [{ _id: 0, host: require('os').hostname() + ':27017' }] });
|
||||
} catch (e) {}
|
||||
quit(1);
|
||||
}
|
||||
"
|
||||
interval: 5s
|
||||
timeout: 10s
|
||||
retries: 20
|
||||
test: echo "try { rs.status() } catch (err) { rs.initiate() }" | mongosh --port 27017 --quiet
|
||||
interval: 10s
|
||||
timeout: 30s
|
||||
retries: 30
|
||||
volumes:
|
||||
- habitica-mongo-data:/data/db
|
||||
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
mail_password = "${password:32}"
|
||||
mongo_key = "${base64:756}"
|
||||
mongo_admin_password = "${password}"
|
||||
mongo_habitica_password = "${password}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
@@ -12,21 +9,16 @@ port = 80
|
||||
host = "habitica.${main_domain}"
|
||||
|
||||
[config.env]
|
||||
BASE_URL = "https://habitica.${main_domain}"
|
||||
INVITE_ONLY = "false"
|
||||
EMAIL_SERVER_URL = "mail.example.com"
|
||||
EMAIL_SERVER_PORT = "587"
|
||||
EMAIL_SERVER_AUTH_USER = "mail_user"
|
||||
EMAIL_SERVER_AUTH_PASSWORD = "${mail_password}"
|
||||
MONGO_KEYFILE_CONTENT = "${mongo_key}"
|
||||
MONGO_ADMIN_USER = "admin"
|
||||
MONGO_ADMIN_PASSWORD = "${mongo_admin_password}"
|
||||
MONGO_HABITICA_USER = "habitica"
|
||||
MONGO_HABITICA_PASSWORD = "${mongo_habitica_password}"
|
||||
ADMIN_EMAIL = "no-reply@${main_domain}"
|
||||
|
||||
BASE_URL="https://habitica.${main_domain}"
|
||||
INVITE_ONLY="false"
|
||||
EMAIL_SERVER_URL="mail.example.com"
|
||||
EMAIL_SERVER_PORT="587"
|
||||
EMAIL_SERVER_AUTH_USER="mail_user"
|
||||
EMAIL_SERVER_AUTH_PASSWORD="${mail_password}"
|
||||
|
||||
[[config.mounts]]
|
||||
serviceName = "mongo"
|
||||
type = "volume"
|
||||
source = "habitica-mongo-data"
|
||||
target = "/data/db"
|
||||
target = "/data/db"
|
||||
@@ -1,76 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
imgproxy:
|
||||
image: darthsim/imgproxy:v3.30.1
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
IMGPROXY_KEY: ${IMGPROXY_KEY}
|
||||
IMGPROXY_SALT: ${IMGPROXY_SALT}
|
||||
IMGPROXY_ENABLE_WEBP_DETECTION: ${IMGPROXY_ENABLE_WEBP_DETECTION:-true}
|
||||
IMGPROXY_ENFORCE_WEBP: ${IMGPROXY_ENFORCE_WEBP:-true}
|
||||
IMGPROXY_TTL: ${IMGPROXY_TTL:-30600}
|
||||
IMGPROXY_DEVELOPMENT_ERRORS_MODE: ${IMGPROXY_DEVELOPMENT_ERRORS_MODE:-false}
|
||||
IMGPROXY_READ_TIMEOUT: ${IMGPROXY_READ_TIMEOUT:-10}
|
||||
IMGPROXY_WRITE_TIMEOUT: ${IMGPROXY_WRITE_TIMEOUT:-10}
|
||||
IMGPROXY_KEEP_ALIVE_TIMEOUT: ${IMGPROXY_KEEP_ALIVE_TIMEOUT:-10}
|
||||
IMGPROXY_DOWNLOAD_TIMEOUT: ${IMGPROXY_DOWNLOAD_TIMEOUT:-5}
|
||||
IMGPROXY_CONCURRENCY: ${IMGPROXY_CONCURRENCY:-}
|
||||
IMGPROXY_MAX_CLIENTS: ${IMGPROXY_MAX_CLIENTS:-10}
|
||||
IMGPROXY_SO_REUSEPORT: ${IMGPROXY_SO_REUSEPORT:-}
|
||||
IMGPROXY_USER_AGENT: ${IMGPROXY_USER_AGENT:-}
|
||||
IMGPROXY_USE_ETAG: ${IMGPROXY_USE_ETAG:-true}
|
||||
IMGPROXY_QUALITY: ${IMGPROXY_QUALITY:-80}
|
||||
IMGPROXY_ALLOWED_SOURCES: ${IMGPROXY_ALLOWED_SOURCES}
|
||||
IMGPROXY_ALLOW_ORIGIN: ${IMGPROXY_ALLOW_ORIGIN:-*}
|
||||
IMGPROXY_MAX_SRC_FILE_SIZE: ${IMGPROXY_MAX_SRC_FILE_SIZE:-20971520}
|
||||
IMGPROXY_MAX_SRC_RESOLUTION: ${IMGPROXY_MAX_SRC_RESOLUTION:-50}
|
||||
IMGPROXY_LOG_LEVEL: ${IMGPROXY_LOG_LEVEL:-error}
|
||||
|
||||
nginx:
|
||||
image: nginx:1.28.2-alpine
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 80
|
||||
environment:
|
||||
NGINX_CACHE_LEVELS: ${NGINX_CACHE_LEVELS:-1:2}
|
||||
NGINX_CACHE_KEYS_ZONE_SIZE: ${NGINX_CACHE_KEYS_ZONE_SIZE:-32m}
|
||||
NGINX_CACHE_MAX_SIZE: ${NGINX_CACHE_MAX_SIZE:-500m}
|
||||
NGINX_CACHE_INACTIVE: ${NGINX_CACHE_INACTIVE:-30d}
|
||||
NGINX_CACHE_USE_TEMP_PATH: ${NGINX_CACHE_USE_TEMP_PATH:-off}
|
||||
NGINX_CACHE_EXPIRES: ${NGINX_CACHE_EXPIRES:-30d}
|
||||
depends_on:
|
||||
- imgproxy
|
||||
volumes:
|
||||
- nginx-cache:/tmp/cache
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
cat <<EOF > /etc/nginx/conf.d/default.conf
|
||||
proxy_cache_path /tmp/cache levels=$${NGINX_CACHE_LEVELS} keys_zone=my_cache:$${NGINX_CACHE_KEYS_ZONE_SIZE} max_size=$${NGINX_CACHE_MAX_SIZE} inactive=$${NGINX_CACHE_INACTIVE} use_temp_path=$${NGINX_CACHE_USE_TEMP_PATH};
|
||||
|
||||
server {
|
||||
listen 80 default_server;
|
||||
listen [::]:80 default_server;
|
||||
|
||||
location / {
|
||||
expires $${NGINX_CACHE_EXPIRES};
|
||||
access_log off;
|
||||
set \$$handle_webp 0;
|
||||
if (\$$http_accept ~* "image/webp") {
|
||||
set \$$handle_webp 1;
|
||||
}
|
||||
proxy_cache my_cache;
|
||||
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
|
||||
proxy_cache_background_update on;
|
||||
proxy_cache_lock on;
|
||||
proxy_cache_key "\$$scheme\$$host\$$uri\$$handle_webp";
|
||||
server_tokens off;
|
||||
proxy_pass http://imgproxy:8080;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
exec nginx -g 'daemon off;'
|
||||
|
||||
volumes:
|
||||
nginx-cache:
|
||||
|
Before Width: | Height: | Size: 4.5 KiB |
@@ -1,56 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
imgproxy_key = "${hash:128}"
|
||||
imgproxy_salt = "${hash:128}"
|
||||
imgproxy_allowed_sources = "http://${main_domain},https://${main_domain}"
|
||||
imgproxy_quality = "80"
|
||||
imgproxy_ttl = "30600"
|
||||
imgproxy_max_src_file_size = "20971520"
|
||||
imgproxy_max_src_resolution = "50"
|
||||
imgproxy_log_level = "error"
|
||||
imgproxy_max_clients = "10"
|
||||
imgproxy_allow_origin = "*"
|
||||
imgproxy_enable_webp_detection = "true"
|
||||
imgproxy_enforce_webp = "true"
|
||||
imgproxy_use_etag = "true"
|
||||
nginx_cache_levels = "1:2"
|
||||
nginx_cache_keys_zone_size = "32m"
|
||||
nginx_cache_max_size = "500m"
|
||||
nginx_cache_inactive = "30d"
|
||||
nginx_cache_use_temp_path = "off"
|
||||
nginx_cache_expires = "30d"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "nginx"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
IMGPROXY_KEY = "${imgproxy_key}"
|
||||
IMGPROXY_SALT = "${imgproxy_salt}"
|
||||
IMGPROXY_ENABLE_WEBP_DETECTION = "${imgproxy_enable_webp_detection}"
|
||||
IMGPROXY_ENFORCE_WEBP = "${imgproxy_enforce_webp}"
|
||||
IMGPROXY_TTL = "${imgproxy_ttl}"
|
||||
IMGPROXY_DEVELOPMENT_ERRORS_MODE = "false"
|
||||
IMGPROXY_READ_TIMEOUT = "10"
|
||||
IMGPROXY_WRITE_TIMEOUT = "10"
|
||||
IMGPROXY_KEEP_ALIVE_TIMEOUT = "10"
|
||||
IMGPROXY_DOWNLOAD_TIMEOUT = "5"
|
||||
IMGPROXY_CONCURRENCY = ""
|
||||
IMGPROXY_MAX_CLIENTS = "${imgproxy_max_clients}"
|
||||
IMGPROXY_SO_REUSEPORT = ""
|
||||
IMGPROXY_USER_AGENT = ""
|
||||
IMGPROXY_USE_ETAG = "${imgproxy_use_etag}"
|
||||
IMGPROXY_QUALITY = "${imgproxy_quality}"
|
||||
IMGPROXY_ALLOWED_SOURCES = "${imgproxy_allowed_sources}"
|
||||
IMGPROXY_ALLOW_ORIGIN = "${imgproxy_allow_origin}"
|
||||
IMGPROXY_MAX_SRC_FILE_SIZE = "${imgproxy_max_src_file_size}"
|
||||
IMGPROXY_MAX_SRC_RESOLUTION = "${imgproxy_max_src_resolution}"
|
||||
IMGPROXY_LOG_LEVEL = "${imgproxy_log_level}"
|
||||
NGINX_CACHE_LEVELS = "${nginx_cache_levels}"
|
||||
NGINX_CACHE_KEYS_ZONE_SIZE = "${nginx_cache_keys_zone_size}"
|
||||
NGINX_CACHE_MAX_SIZE = "${nginx_cache_max_size}"
|
||||
NGINX_CACHE_INACTIVE = "${nginx_cache_inactive}"
|
||||
NGINX_CACHE_USE_TEMP_PATH = "${nginx_cache_use_temp_path}"
|
||||
NGINX_CACHE_EXPIRES = "${nginx_cache_expires}"
|
||||
@@ -1,64 +0,0 @@
|
||||
services:
|
||||
postgres:
|
||||
image: ghcr.io/instantdb/postgresql:postgresql-16-pg-hint-plan
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
POSTGRES_USER: ${POSTGRES_USER}
|
||||
POSTGRES_DB: ${POSTGRES_DB}
|
||||
volumes:
|
||||
- backend-db:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready", "-U", "${POSTGRES_USER}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
command:
|
||||
- "postgres"
|
||||
- "-c"
|
||||
- "wal_level=logical"
|
||||
- "-c"
|
||||
- "max_replication_slots=4"
|
||||
- "-c"
|
||||
- "max_wal_senders=4"
|
||||
- "-c"
|
||||
- "shared_preload_libraries=pg_hint_plan"
|
||||
- "-c"
|
||||
- "random_page_cost=1.1"
|
||||
server:
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
image: hari1367709/instantdb-server:latest
|
||||
restart: unless-stopped
|
||||
working_dir: /app
|
||||
environment:
|
||||
DATABASE_URL: "postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}"
|
||||
NREPL_BIND_ADDRESS: "0.0.0.0"
|
||||
PORT: "8888"
|
||||
HOST: "0.0.0.0"
|
||||
# AWS Credentials for KMS (required for InstantDB)
|
||||
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
|
||||
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
|
||||
AWS_REGION: ${AWS_REGION:-us-east-1}
|
||||
# Force unbuffered output for logs
|
||||
PYTHONUNBUFFERED: "1"
|
||||
NODE_ENV: "production"
|
||||
command: ["java", "-Djava.awt.headless=true", "-server", "-jar", "target/instant-standalone.jar"]
|
||||
ports:
|
||||
- "8888"
|
||||
- "6005"
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -f http://localhost:8888/health || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
volumes:
|
||||
backend-db:
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="512" height="512" fill="black"/>
|
||||
<rect x="97.0973" y="91.3297" width="140" height="330" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 223 B |
@@ -1,29 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
postgres_password = "${password:32}"
|
||||
postgres_user = "instant"
|
||||
postgres_db = "instant"
|
||||
aws_access_key_id = "FILL-YOUR-CREDENTIALS"
|
||||
aws_secret_access_key = "FILL-YOUR-CREDENTIALS"
|
||||
aws_region = "us-east-1"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"POSTGRES_PASSWORD=${postgres_password}",
|
||||
"POSTGRES_USER=${postgres_user}",
|
||||
"POSTGRES_DB=${postgres_db}",
|
||||
"DATABASE_URL=postgresql://${postgres_user}:${postgres_password}@postgres:5432/${postgres_db}",
|
||||
"NREPL_BIND_ADDRESS=0.0.0.0",
|
||||
"PORT=8888",
|
||||
"HOST=0.0.0.0",
|
||||
"AWS_ACCESS_KEY_ID=${aws_access_key_id}",
|
||||
"AWS_SECRET_ACCESS_KEY=${aws_secret_access_key}",
|
||||
"AWS_REGION=${aws_region}",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "server"
|
||||
port = 8888
|
||||
host = "${main_domain}"
|
||||
|
||||
@@ -20,7 +20,8 @@ services:
|
||||
image: invoiceshelf/invoiceshelf:nightly
|
||||
|
||||
volumes:
|
||||
- invoiceshelf-storage:/var/www/html/storage
|
||||
- invoiceshelf-app-data:/data
|
||||
- invoiceshelf-app-conf:/conf
|
||||
environment:
|
||||
- PHP_TZ=UTC
|
||||
- TIMEZONE=UTC
|
||||
@@ -48,4 +49,5 @@ services:
|
||||
|
||||
volumes:
|
||||
invoiceshelf-postgres-data:
|
||||
invoiceshelf-storage:
|
||||
invoiceshelf-app-data:
|
||||
invoiceshelf-app-conf:
|
||||
@@ -1,17 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
ipfs:
|
||||
image: ipfs/kubo:latest
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- IPFS_PROFILE=server
|
||||
volumes:
|
||||
- ipfs_data:/data/ipfs
|
||||
- ipfs_staging:/export
|
||||
ports:
|
||||
- 4001
|
||||
- 8080
|
||||
- 5001
|
||||
volumes:
|
||||
ipfs_data: {}
|
||||
ipfs_staging: {}
|
||||
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="34.3 0 443.4 512"><defs><linearGradient id="a" x1="84.315" x2="527.72" y1="771.51" y2="771.51" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#4a9ea1"/></linearGradient><linearGradient id="b" x1="99.675" x2="512.36" y1="771.48" y2="771.48" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#63d3d7"/></linearGradient></defs><path fill="url(#a)" d="m84.315 899.51 221.7 128 221.7-128v-256l-221.7-127.99-221.7 128z" transform="translate(-50.017 -515.51)"/><path fill="url(#b)" d="m283.13 546.35-160.74 92.806a38.4 38.4 0 0 1 0 8.59l160.75 92.805c13.554-10 32.043-10 45.597 0l160.75-92.807a38.3 38.3 0 0 1-.001-8.588l-160.74-92.806c-13.554 10.001-32.044 10.001-45.599 0zm221.79 127.03L344 767.22c1.884 16.739-7.361 32.751-22.799 39.489l.18 184.58a38.4 38.4 0 0 1 7.439 4.294l160.75-92.805c-1.884-16.739 7.36-32.752 22.799-39.49v-185.61a38.4 38.4 0 0 1-7.44-4.294zm-397.81 1.032a38.4 38.4 0 0 1-7.438 4.295v185.61c15.438 6.738 24.683 22.75 22.799 39.489l160.74 92.806a38.4 38.4 0 0 1 7.44-4.295v-185.61c-15.439-6.738-24.684-22.75-22.8-39.49l-160.74-92.81z" transform="translate(-50.017 -515.51)"/><path fill-opacity=".251" d="m256 512 221.7-128V128L256 256z"/><path fill-opacity=".039" d="M256 512V256L34.3 128v256z"/><path fill-opacity=".13" d="m34.298 128 221.7 128 221.7-128-221.7-128z"/><path fill="#fff" d="M103.09 186h-29.2v141.2h29.2zm50.88 141.2v-51.8c7.2.6 14.4.6 20.4.6 41.6 0 53.6-20.6 53.6-46 0-30.8-22-44-56-44h-47.2v141.2zm15.8-71.8c-5.4 0-13.4 0-15.8-.2v-48h18.2c17.6 0 27.6 8.4 27.6 23.8v.4c0 12-4.4 24-30 24M327.95 186h-88.6v141.2h29.2V265h55.4v-21.2h-55.6v-36.4h57.6zm95.56 27.6 7.6-19.6c-11.4-8.2-26.8-11.2-46.2-11.2-28.2 0-51.4 13.2-51.4 40.2 0 24.2 17.8 33.8 35.6 39.6l17.8 6c12.2 4.2 22.2 8.2 22.2 21.4 0 12-10.4 16.8-26.2 16.8-16 0-33.2-4.8-43-11l-7.6 21.2c12.8 8.2 29 12.2 50.8 12.2 31 0 55-13.6 55-42.6 0-27-20.6-35.6-41.4-42.6l-19.4-6.4c-8.4-2.8-14.8-6.6-14.8-17.4 0-11 9-15.4 22.4-15.4 16.4 0 29.2 3 38.6 8.8"/></svg>
|
||||
|
Before Width: | Height: | Size: 2.0 KiB |
@@ -1,25 +0,0 @@
|
||||
[variables]
|
||||
gateway_domain = "${domain}"
|
||||
api_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "ipfs"
|
||||
port = 8080
|
||||
host = "${gateway_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "ipfs"
|
||||
port = 5001
|
||||
host = "${api_domain}"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "/container-init.d/001-configure-api.sh"
|
||||
content = """
|
||||
#!/bin/sh
|
||||
ipfs config Addresses.API /ip4/0.0.0.0/tcp/5001
|
||||
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
|
||||
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST", "GET"]'
|
||||
"""
|
||||
@@ -1,13 +0,0 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
jenkins:
|
||||
image: jenkins/jenkins:latest
|
||||
volumes:
|
||||
- jenkins-home:/var/jenkins_home
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
ports:
|
||||
- 8080
|
||||
|
||||
volumes:
|
||||
jenkins-home: {}
|
||||
|
Before Width: | Height: | Size: 22 KiB |
@@ -1,12 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = {}
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "jenkins"
|
||||
port = 8080
|
||||
host = "${main_domain}"
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
komari:
|
||||
image: ghcr.io/komari-monitor/komari:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- komari-data:/app/data
|
||||
environment:
|
||||
- ADMIN_USERNAME
|
||||
- ADMIN_PASSWORD
|
||||
|
||||
volumes:
|
||||
komari-data: {}
|
||||
|
Before Width: | Height: | Size: 40 KiB |
@@ -1,15 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
admin_password = "${password:16}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "komari"
|
||||
port = 25_774
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
ADMIN_USERNAME = "admin"
|
||||
ADMIN_PASSWORD = "${admin_password}"
|
||||
@@ -1,41 +0,0 @@
|
||||
services:
|
||||
fix-perms:
|
||||
image: busybox:1.36
|
||||
command: >
|
||||
sh -c "mkdir -p /opt/Lavalink/plugins &&
|
||||
chmod -R 0777 /opt/Lavalink/plugins || true &&
|
||||
chown -R 1000:1000 /opt/Lavalink/plugins || true &&
|
||||
echo perms-fixed && sleep 1"
|
||||
volumes:
|
||||
- "../files/plugins/:/opt/Lavalink/plugins/"
|
||||
- "../files/application.yml:/opt/Lavalink/application.yml"
|
||||
restart: "no"
|
||||
lavalink:
|
||||
image: ghcr.io/lavalink-devs/lavalink:4
|
||||
depends_on:
|
||||
- fix-perms
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
_JAVA_OPTIONS: "${_JAVA_OPTIONS:--Xmx6G}"
|
||||
LAVALINK_SERVER_PASSWORD: "${LAVALINK_SERVER_PASSWORD:-youshallnotpass}"
|
||||
SERVER_PORT: "${SERVER_PORT:-2333}"
|
||||
volumes:
|
||||
- "../files/application.yml:/opt/Lavalink/application.yml:rw"
|
||||
- "../files/plugins/:/opt/Lavalink/plugins/:rw"
|
||||
ports:
|
||||
- ${SERVER_PORT}
|
||||
|
||||
healthcheck:
|
||||
test: >
|
||||
sh -c 'wget --header="Authorization: ${LAVALINK_SERVER_PASSWORD}" -qO- http://127.0.0.1:${SERVER_PORT}/v4/info >/dev/null 2>&1 || exit 1'
|
||||
interval: 100s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
|
||||
entrypoint: >
|
||||
sh -c 'until [ -w /opt/Lavalink/plugins ] ; do
|
||||
echo "waiting for /opt/Lavalink/plugins to be writable";
|
||||
sleep 1;
|
||||
done;
|
||||
exec java -jar /opt/Lavalink/Lavalink.jar'
|
||||
@@ -1,50 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
viewBox="0 0 100 100"
|
||||
width="100%"
|
||||
height="100%"
|
||||
version="1.1"
|
||||
id="svg13"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs7">
|
||||
<linearGradient
|
||||
id="grad"
|
||||
x1="0"
|
||||
y1="0"
|
||||
x2="100"
|
||||
y2="100"
|
||||
spreadMethod="pad"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
stop-color="#ff8c00"
|
||||
id="stop2"
|
||||
style="stop-color:#fa9800;stop-opacity:1;" />
|
||||
<stop
|
||||
offset="100"
|
||||
stop-color="#ff0000"
|
||||
id="stop4"
|
||||
style="stop-color:#ff005e;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect
|
||||
width="100%"
|
||||
height="100%"
|
||||
fill="url(#grad)"
|
||||
id="rect9"
|
||||
x="0"
|
||||
y="0"
|
||||
rx="14"
|
||||
ry="14"
|
||||
style="fill:url(#grad)" />
|
||||
<path
|
||||
style="vector-effect:none;fill:#ffffff;fill-opacity:1;stroke-width:1.27808;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000"
|
||||
d="m 57,25 h 13 l -7,27 h 12 l -2,8.5 H 48 Z"
|
||||
id="path724-5" />
|
||||
<path
|
||||
style="opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;stroke-width:1.33907;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;-inkscape-stroke:none;stop-color:#000000;stop-opacity:1"
|
||||
d="m 37.5,25 h 14 l -10,40 H 72 L 70,75 H 25 Z"
|
||||
id="path724" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1,123 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
server_port = "2333"
|
||||
lavalink_server_password = "${password}"
|
||||
|
||||
[config]
|
||||
[[config.mounts]]
|
||||
filePath = "./application.yml"
|
||||
content = """
|
||||
server: # REST and WS server
|
||||
port: 2333
|
||||
address: 0.0.0.0
|
||||
http2:
|
||||
enabled: false
|
||||
plugins:
|
||||
# name: # Name of the plugin
|
||||
# some_key: some_value # Some key-value pair for the plugin
|
||||
# another_key: another_value
|
||||
lavalink:
|
||||
plugins:
|
||||
# - dependency: "com.github.username.pluginName:pluginName-plugin:x.y.z"
|
||||
# snapshot: false
|
||||
# pluginsDir: "/opt/Lavalink/plugins"
|
||||
# defaultPluginRepository: "https://maven.lavalink.dev/releases"
|
||||
# defaultPluginSnapshotRepository: "https://maven.lavalink.dev/snapshots"
|
||||
server:
|
||||
password: "youshallnotpass"
|
||||
sources:
|
||||
# The default Youtube source is now deprecated and won't receive further updates. Please use https://github.com/lavalink-devs/youtube-source#plugin instead.
|
||||
youtube: true
|
||||
bandcamp: true
|
||||
soundcloud: true
|
||||
twitch: true
|
||||
vimeo: true
|
||||
nico: true
|
||||
http: true
|
||||
local: false
|
||||
filters:
|
||||
volume: true
|
||||
equalizer: true
|
||||
karaoke: true
|
||||
timescale: true
|
||||
tremolo: true
|
||||
vibrato: true
|
||||
distortion: true
|
||||
rotation: true
|
||||
channelMix: true
|
||||
lowPass: true
|
||||
nonAllocatingFrameBuffer: false
|
||||
bufferDurationMs: 400
|
||||
frameBufferDurationMs: 5000
|
||||
opusEncodingQuality: 10
|
||||
resamplingQuality: LOW
|
||||
trackStuckThresholdMs: 10000
|
||||
useSeekGhosting: true
|
||||
youtubePlaylistLoadLimit: 6
|
||||
playerUpdateInterval: 5
|
||||
youtubeSearchEnabled: true
|
||||
soundcloudSearchEnabled: true
|
||||
gc-warnings: true
|
||||
#ratelimit:
|
||||
#ipBlocks: ["1.0.0.0/8", "..."] # list of ip blocks
|
||||
#excludedIps: ["...", "..."] # ips which should be explicit excluded from usage by lavalink
|
||||
#strategy: "RotateOnBan" # RotateOnBan | LoadBalance | NanoSwitch | RotatingNanoSwitch
|
||||
#searchTriggersFail: true # Whether a search 429 should trigger marking the ip as failing
|
||||
#retryLimit: -1 # -1 = use default lavaplayer value | 0 = infinity | >0 = retry will happen this numbers times
|
||||
#youtubeConfig: # Required for avoiding all age restrictions by YouTube, some restricted videos still can be played without.
|
||||
#email: "" # Email of Google account
|
||||
#password: "" # Password of Google account
|
||||
#httpConfig: # Useful for blocking bad-actors from ip-grabbing your music node and attacking it, this way only the http proxy will be attacked
|
||||
#proxyHost: "localhost" # Hostname of the proxy, (ip or domain)
|
||||
#proxyPort: 3128 # Proxy port, 3128 is the default for squidProxy
|
||||
#proxyUser: "" # Optional user for basic authentication fields, leave blank if you don't use basic auth
|
||||
#proxyPassword: "" # Password for basic authentication
|
||||
timeouts:
|
||||
connectTimeoutMs: 3000
|
||||
connectionRequestTimeoutMs: 3000
|
||||
socketTimeoutMs: 3000
|
||||
|
||||
metrics:
|
||||
prometheus:
|
||||
enabled: false
|
||||
endpoint: /metrics
|
||||
|
||||
sentry:
|
||||
dsn: ""
|
||||
environment: ""
|
||||
# tags:
|
||||
# some_key: some_value
|
||||
# another_key: another_value
|
||||
|
||||
logging:
|
||||
file:
|
||||
path: ./logs/
|
||||
|
||||
level:
|
||||
root: INFO
|
||||
lavalink: INFO
|
||||
|
||||
request:
|
||||
enabled: true
|
||||
includeClientInfo: true
|
||||
includeHeaders: false
|
||||
includeQueryString: true
|
||||
includePayload: true
|
||||
maxPayloadLength: 10000
|
||||
|
||||
|
||||
logback:
|
||||
rollingpolicy:
|
||||
max-file-size: 1GB
|
||||
max-history: 30
|
||||
"""
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "lavalink"
|
||||
port = 2_333
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
_JAVA_OPTIONS = "-Xmx6G"
|
||||
LAVALINK_SERVER_PASSWORD = "${lavalink_server_password}"
|
||||
SERVER_PORT = "${server_port}"
|
||||
@@ -1,131 +0,0 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
# -------------------------------------------------------------------------
|
||||
# Service 1: Database
|
||||
# -------------------------------------------------------------------------
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
command: --default-authentication-plugin=mysql_native_password
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||
MYSQL_DATABASE: ${MAUTIC_DB_DATABASE}
|
||||
MYSQL_USER: ${MAUTIC_DB_USER}
|
||||
MYSQL_PASSWORD: ${MAUTIC_DB_PASSWORD}
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
healthcheck:
|
||||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Service 2: Mautic Web (The Leader)
|
||||
# -------------------------------------------------------------------------
|
||||
mautic:
|
||||
image: mautic/mautic:5.1.1-apache
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
ports:
|
||||
- 80
|
||||
environment:
|
||||
- DOCKER_MAUTIC_ROLE=mautic_web
|
||||
- DOCKER_MAUTIC_RUN_MIGRATIONS=true
|
||||
- MAUTIC_DB_HOST=${MAUTIC_DB_HOST}
|
||||
- MAUTIC_DB_PORT=${MAUTIC_DB_PORT}
|
||||
- MAUTIC_DB_DATABASE=${MAUTIC_DB_DATABASE}
|
||||
- MAUTIC_DB_USER=${MAUTIC_DB_USER}
|
||||
- MAUTIC_DB_PASSWORD=${MAUTIC_DB_PASSWORD}
|
||||
- MAUTIC_URL=${MAUTIC_URL}
|
||||
- MAUTIC_TRUSTED_PROXIES=${MAUTIC_TRUSTED_PROXIES}
|
||||
- MAUTIC_MESSENGER_DSN_EMAIL=${MAUTIC_MESSENGER_DSN_EMAIL}
|
||||
- MAUTIC_MESSENGER_DSN_HIT=${MAUTIC_MESSENGER_DSN_HIT}
|
||||
- PHP_INI_DATE_TIMEZONE=${PHP_INI_DATE_TIMEZONE}
|
||||
- PHP_MEMORY_LIMIT=${PHP_MEMORY_LIMIT}
|
||||
volumes:
|
||||
- mautic_data:/var/www/html
|
||||
# AUTOMATION FIX 1: Force permissions to be correct on every start
|
||||
entrypoint: ["/bin/sh", "-c", "chown -R www-data:www-data /var/www/html && /entrypoint.sh apache2-foreground"]
|
||||
# AUTOMATION FIX 2: Check if the CONFIG FILE exists. If not, report 'unhealthy'.
|
||||
# This signals the other containers to keep waiting.
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "test -f /var/www/html/config/local.php || exit 1"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 300s # Give you 5 mins to run the installer before marking failed
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Service 3: Mautic Cron (Waits for Install)
|
||||
# -------------------------------------------------------------------------
|
||||
mautic-cron:
|
||||
image: mautic/mautic:5.1.1-apache
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
mautic:
|
||||
condition: service_healthy # AUTOMATION FIX 3: Do not start until config file exists
|
||||
environment:
|
||||
- DOCKER_MAUTIC_ROLE=mautic_cron
|
||||
- MAUTIC_DB_HOST=${MAUTIC_DB_HOST}
|
||||
- MAUTIC_DB_PORT=${MAUTIC_DB_PORT}
|
||||
- MAUTIC_DB_DATABASE=${MAUTIC_DB_DATABASE}
|
||||
- MAUTIC_DB_USER=${MAUTIC_DB_USER}
|
||||
- MAUTIC_DB_PASSWORD=${MAUTIC_DB_PASSWORD}
|
||||
- MAUTIC_URL=${MAUTIC_URL}
|
||||
- PHP_INI_DATE_TIMEZONE=${PHP_INI_DATE_TIMEZONE}
|
||||
volumes:
|
||||
- mautic_data:/var/www/html
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Service 4: Mautic Worker (Waits for Install)
|
||||
# -------------------------------------------------------------------------
|
||||
mautic-worker:
|
||||
image: mautic/mautic:5.1.1-apache
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
mautic:
|
||||
condition: service_healthy # AUTOMATION FIX 3: Do not start until config file exists
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
environment:
|
||||
- DOCKER_MAUTIC_ROLE=mautic_worker
|
||||
- DOCKER_MAUTIC_WORKERS_CONSUME_EMAIL=2
|
||||
- DOCKER_MAUTIC_WORKERS_CONSUME_HIT=2
|
||||
- DOCKER_MAUTIC_WORKERS_CONSUME_FAILED=2
|
||||
- MAUTIC_DB_HOST=${MAUTIC_DB_HOST}
|
||||
- MAUTIC_DB_PORT=${MAUTIC_DB_PORT}
|
||||
- MAUTIC_DB_DATABASE=${MAUTIC_DB_DATABASE}
|
||||
- MAUTIC_DB_USER=${MAUTIC_DB_USER}
|
||||
- MAUTIC_DB_PASSWORD=${MAUTIC_DB_PASSWORD}
|
||||
- MAUTIC_URL=${MAUTIC_URL}
|
||||
- MAUTIC_MESSENGER_DSN_EMAIL=${MAUTIC_MESSENGER_DSN_EMAIL}
|
||||
- MAUTIC_MESSENGER_DSN_HIT=${MAUTIC_MESSENGER_DSN_HIT}
|
||||
- PHP_INI_DATE_TIMEZONE=${PHP_INI_DATE_TIMEZONE}
|
||||
volumes:
|
||||
- mautic_data:/var/www/html
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# Service 5: phpMyAdmin
|
||||
# -------------------------------------------------------------------------
|
||||
phpmyadmin:
|
||||
image: phpmyadmin/phpmyadmin
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
PMA_HOST: mysql
|
||||
PMA_PORT: 3306
|
||||
UPLOAD_LIMIT: 64M
|
||||
ports:
|
||||
- 80
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
mautic_data:
|
||||
@@ -1,76 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 242.6 230.8" enable-background="new 0 0 242.6 230.8" xml:space="preserve">
|
||||
<g id="tagline">
|
||||
<g>
|
||||
<path fill="#8790B8" d="M0,206.6h12.3v1.8H2.2v6.6h9.4v1.8H2.2v8H0V206.6z"/>
|
||||
<path fill="#8790B8" d="M22,213.4c-2.9,0-4.9,2.3-5,5v6.3h-2v-13h2v3.7c0.9-2.3,2.7-3.8,5-3.8V213.4z"/>
|
||||
<path fill="#8790B8" d="M25.4,218.8c0.2,2.6,2.1,4.4,4.8,4.4c1.6,0,2.8-0.5,3.7-1.4c0.4,0.4,0.8,0.8,1.1,1.1
|
||||
c-1.2,1.2-2.9,1.9-4.9,1.9c-4,0-6.7-2.7-6.7-6.6c0-3.9,2.5-6.6,6.2-6.6c3.6,0,6.1,2.7,6.1,6.6v0.6H25.4z M33.7,217.4
|
||||
c-0.1-2.5-1.8-4.1-4.1-4.1c-2.3,0-3.9,1.7-4.2,4.1H33.7z"/>
|
||||
<path fill="#8790B8" d="M39.7,218.8c0.2,2.6,2.1,4.4,4.8,4.4c1.6,0,2.8-0.5,3.7-1.4c0.4,0.4,0.8,0.8,1.1,1.1
|
||||
c-1.2,1.2-2.9,1.9-4.9,1.9c-4,0-6.7-2.7-6.7-6.6c0-3.9,2.5-6.6,6.2-6.6c3.6,0,6.1,2.7,6.1,6.6v0.6H39.7z M47.9,217.4
|
||||
c-0.1-2.5-1.8-4.1-4.1-4.1c-2.3,0-3.9,1.7-4.2,4.1H47.9z"/>
|
||||
<path fill="#8790B8" d="M67.7,227.2c-0.9,2-2,3.5-3.9,3.5c-1.2,0-2.2-0.3-2.9-1.1l1-1.1c0.4,0.4,1.1,0.5,1.8,0.5
|
||||
c1.1,0,1.8-1.1,2.4-2.5l0.9-1.8L61,211.8h2l4.8,10.7l4.9-10.7h2L67.7,227.2z"/>
|
||||
<path fill="#8790B8" d="M81.4,211.6c3.9,0,6.6,2.7,6.6,6.6c0,3.9-2.7,6.6-6.6,6.6c-3.9,0-6.6-2.7-6.6-6.6
|
||||
C74.8,214.3,77.5,211.6,81.4,211.6z M81.4,223.2c2.7,0,4.6-2,4.6-5s-1.9-5-4.6-5c-2.7,0-4.6,2-4.6,5S78.6,223.2,81.4,223.2z"/>
|
||||
<path fill="#8790B8" d="M92.1,219.4c0,2.3,1.5,3.8,3.5,3.8c2.4,0,4.1-2.2,4.1-4.8v-6.6h2v13h-2v-3.2c-0.9,2-2.7,3.4-5,3.4
|
||||
c-2.8,0-4.7-2.1-4.7-5.2v-7.9h2V219.4z"/>
|
||||
<path fill="#8790B8" d="M111.9,213.4c-2.9,0-4.9,2.3-5,5v6.3h-2v-13h2v3.7c0.9-2.3,2.7-3.8,5-3.8V213.4z"/>
|
||||
<path fill="#8790B8" d="M131.4,216.5c0-1.9-1.1-3.2-2.8-3.2c-2,0-3.5,1.7-3.5,4v7.4h-2v-13h2v2.5c0.9-1.6,2.4-2.6,4.3-2.6
|
||||
c1.7,0,3,1,3.6,2.6c0.9-1.6,2.5-2.6,4.6-2.6c2.5,0,4.2,2,4.2,4.9v8.2h-2v-8.2c0-1.9-1.1-3.2-2.8-3.2c-2,0-3.5,1.7-3.6,4v7.4h-2
|
||||
V216.5z"/>
|
||||
<path fill="#8790B8" d="M144.6,213.4c1.3-1.1,2.9-1.8,5-1.8c3.2,0,5.5,2,5.5,4.8v8.3h-2v-2.9c-0.8,1.8-2.5,3-4.7,3
|
||||
c-2.6,0-4.4-1.5-4.4-3.7c0-2.5,2.5-4.2,6.1-4.2c1,0,2,0.1,2.9,0.3v-0.8c0-1.9-1.4-3.2-3.4-3.2c-1.5,0-3,0.3-4,1.2L144.6,213.4z
|
||||
M150.2,218.2c-2.5,0-4.3,1.1-4.3,2.7c0,1.3,1.3,2.2,3.1,2.2c2.4,0,4-2.1,4-4.6C152.1,218.3,151.3,218.2,150.2,218.2z"/>
|
||||
<path fill="#8790B8" d="M165.2,213.4c-2.9,0-4.9,2.3-5,5v6.3h-2v-13h2v3.7c0.9-2.3,2.7-3.8,5-3.8V213.4z"/>
|
||||
<path fill="#8790B8" d="M167.6,224.7v-18.8h2v12.1l6.1-6.3h2.4l-5.5,5.8l6.4,7.2h-2.3l-5.3-5.9l-1.7,1.9v4H167.6z"/>
|
||||
<path fill="#8790B8" d="M181.5,218.8c0.2,2.6,2.1,4.4,4.8,4.4c1.6,0,2.8-0.5,3.7-1.4c0.4,0.4,0.8,0.8,1.1,1.1
|
||||
c-1.2,1.2-2.9,1.9-4.9,1.9c-4,0-6.7-2.7-6.7-6.6c0-3.9,2.5-6.6,6.2-6.6s6.1,2.7,6.1,6.6v0.6H181.5z M189.7,217.4
|
||||
c-0.1-2.5-1.8-4.1-4.1-4.1c-2.3,0-3.9,1.7-4.2,4.1H189.7z"/>
|
||||
<path fill="#8790B8" d="M192.9,211.8h1.9v-3h2v3h4.8v1.6h-4.8v6.8c0,1.8,1.2,3,2.8,3c0.9,0,1.6-0.3,2.1-0.8l1.1,1.1
|
||||
c-0.9,0.9-2,1.4-3.4,1.4c-2.7,0-4.6-1.9-4.6-4.7v-6.7h-1.9V211.8z"/>
|
||||
<path fill="#8790B8" d="M204.8,206.6h2v2.4h-2V206.6z M204.8,224.7v-13h2v13H204.8z"/>
|
||||
<path fill="#8790B8" d="M219.5,216.9c0-2.2-1.4-3.7-3.5-3.7c-2.5,0-4.1,2.3-4.1,5.1v6.4h-2v-13h2v3.3c0.9-2,2.7-3.4,5-3.4
|
||||
c2.8,0,4.7,2,4.7,4.9v8.2h-2V216.9z"/>
|
||||
<path fill="#8790B8" d="M225.1,227.7c0.9,0.8,2.3,1.3,4,1.3c2.7,0,4.5-1.8,4.5-4.3v-2.9c-0.9,1.8-2.6,3-4.9,3
|
||||
c-3.1,0-5.2-2.6-5.2-6.3c0-4.1,3-6.9,7.3-6.9c1.8,0,3.4,0.3,4.8,0.9v12.2c0,3.5-2.7,6-6.5,6c-2.1,0-3.8-0.7-5.1-1.9L225.1,227.7z
|
||||
M233.6,213.8c-0.9-0.3-2-0.5-3.2-0.5c-2.9,0-4.9,2.2-4.9,5.2c0,2.8,1.7,4.7,4.1,4.7c2.3,0,4-1.7,4-3.8V213.8z"/>
|
||||
<path fill="#8790B8" d="M240,219.2v-12.6h2v12.6H240z M240,221.8h2v2.9h-2V221.8z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="logo">
|
||||
<g>
|
||||
<path fill="#4E5E9E" d="M26.1,187.9v-20.8c0-5.1-2.7-9.8-8-9.8c-5.2,0-8.3,4.6-8.3,9.8v20.8H0.3V149h8.9l0.7,4.7
|
||||
c2-3.9,6.5-5.4,10.2-5.4c4.6,0,9.3,1.9,11.5,7.2c3.5-5.5,8-7.1,13-7.1c11,0,16.5,6.8,16.5,18.4v21h-9.6v-21c0-5.1-2.1-9.5-7.3-9.5
|
||||
c-5.2,0-8.4,4.5-8.4,9.6v20.8H26.1z"/>
|
||||
<path fill="#4E5E9E" d="M98.5,149.1h9.2v38.8h-9.1l-0.5-5.7c-2.2,4.6-8.3,6.8-12.6,6.9c-11.5,0.1-20-7-20-20.6
|
||||
c0-13.4,8.9-20.4,20.2-20.3c5.2,0,10.2,2.4,12.4,6.3L98.5,149.1z M75.2,168.5c0,7.4,5.1,11.8,11.5,11.8c15.1,0,15.1-23.6,0-23.6
|
||||
C80.3,156.7,75.2,161.1,75.2,168.5z"/>
|
||||
<path fill="#4E5E9E" d="M123.5,149.1v20.3c0,5.9,3.2,10.4,9.4,10.4c5.9,0,9.9-5,9.9-10.9v-19.9h9.5V188h-8.6l-0.6-5.3
|
||||
c-4,3.9-7.7,5.8-13.2,5.8c-9.3,0-16.1-7-16.1-19.1v-20.4H123.5z"/>
|
||||
<path fill="#4E5E9E" d="M174.4,138.1v11h10.7v8.3h-10.8v16.8c0,3.7,2,5.5,5,5.5c1.5,0,3.2-0.5,4.6-1.2l2.7,8.2
|
||||
c-2.8,1.1-5,1.6-8,1.7c-8.4,0.3-13.9-4.5-13.9-14.2v-16.8h-7.2v-8.3h7.2v-10L174.4,138.1z"/>
|
||||
<path fill="#4E5E9E" d="M202.7,138.1c0,7.5-11.3,7.5-11.3,0C191.4,130.7,202.7,130.7,202.7,138.1z M192.3,148.9v39h9.6v-39H192.3z
|
||||
"/>
|
||||
<path fill="#4E5E9E" d="M242.6,183c-4.5,4.4-9.2,6.1-15,6.1c-11.3,0-20.6-6.8-20.6-20.6s9.4-20.6,20.6-20.6c5.5,0,9.8,1.6,14,5.8
|
||||
l-6.1,6.4c-2.3-2-5.1-3.1-7.8-3.1c-6.5,0-11.2,4.7-11.2,11.5c0,7.4,5,11.3,11,11.3c3.1,0,6.1-0.9,8.5-3.2L242.6,183z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="brandmark">
|
||||
<g>
|
||||
<path fill="#4E5E9E" d="M121.2,119c-32.7,0-59.4-26.6-59.4-59.4S88.5,0.2,121.2,0.2c7.9,0,15.6,1.5,22.8,4.6c2,0.9,3,3.2,2.2,5.3
|
||||
c-0.9,2-3.2,3-5.3,2.2c-6.3-2.6-12.9-3.9-19.7-3.9c-28.3,0-51.3,23-51.3,51.3s23,51.3,51.3,51.3c28.3,0,51.3-23,51.3-51.3
|
||||
c0-6.1-1-12-3.1-17.6c-0.8-2.1,0.3-4.4,2.4-5.2c2.1-0.8,4.4,0.3,5.2,2.4c2.4,6.5,3.6,13.4,3.6,20.4C180.6,92.3,154,119,121.2,119z
|
||||
"/>
|
||||
</g>
|
||||
<g>
|
||||
<polygon fill="#FDB933" points="147.2,53.5 138,63.1 143.1,84.6 154.7,84.6 "/>
|
||||
</g>
|
||||
<polygon fill="#FDB933" points="143.4,25.1 146.6,28.3 121.2,55.2 99.5,32.9 87,84.6 98.6,84.6 105.5,55.9 121.2,73 154.8,36.4
|
||||
158,39.7 161.2,21.6 "/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 5.8 KiB |
@@ -1,52 +0,0 @@
|
||||
[variables]
|
||||
# Domain 1: For the main Mautic Application
|
||||
mautic_domain = "${domain}"
|
||||
|
||||
# Domain 2: For phpMyAdmin (Database Manager)
|
||||
pma_domain = "${domain}"
|
||||
|
||||
# Security: Random passwords
|
||||
db_password = "${password:32}"
|
||||
root_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
|
||||
# --- Service 1: Mautic Web ---
|
||||
[[config.domains]]
|
||||
serviceName = "mautic"
|
||||
port = 80
|
||||
host = "${mautic_domain}"
|
||||
path = "/"
|
||||
|
||||
# --- Service 2: phpMyAdmin ---
|
||||
[[config.domains]]
|
||||
serviceName = "phpmyadmin"
|
||||
port = 80
|
||||
host = "${pma_domain}"
|
||||
path = "/"
|
||||
|
||||
# --- Shared Environment Variables ---
|
||||
[config.env]
|
||||
|
||||
# URL Configuration
|
||||
MAUTIC_URL = "https://${mautic_domain}"
|
||||
|
||||
# Database Connections
|
||||
MAUTIC_DB_HOST = "mysql"
|
||||
MAUTIC_DB_PORT = "3306"
|
||||
MAUTIC_DB_DATABASE = "mautic"
|
||||
MAUTIC_DB_USER = "mautic"
|
||||
MAUTIC_DB_PASSWORD = "${db_password}"
|
||||
MYSQL_ROOT_PASSWORD = "${root_password}"
|
||||
|
||||
# Security & Proxy (JSON ARRAY FIXED)
|
||||
# We use single quotes '...' so TOML treats the inner [...] as a string
|
||||
MAUTIC_TRUSTED_PROXIES = '["0.0.0.0/0"]'
|
||||
|
||||
# Queue Settings
|
||||
MAUTIC_MESSENGER_DSN_EMAIL = "doctrine://default"
|
||||
MAUTIC_MESSENGER_DSN_HIT = "doctrine://default"
|
||||
|
||||
# PHP Settings
|
||||
PHP_INI_DATE_TIMEZONE = "UTC"
|
||||
PHP_MEMORY_LIMIT = "512M"
|
||||
@@ -1,18 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
mediafetch:
|
||||
image: lukedunsmoto/mediafetch:latest
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- "3002"
|
||||
volumes:
|
||||
- mediafetch_data:/data/downloads
|
||||
environment:
|
||||
- PORT=3002
|
||||
- BASIC_AUTH_USER=${BASIC_AUTH_USER}
|
||||
- BASIC_AUTH_PASS=${BASIC_AUTH_PASS}
|
||||
- PUBLIC_BASE_URL=https://${DOMAIN}
|
||||
- OUTPUT_DIR=/data/downloads
|
||||
|
||||
volumes:
|
||||
mediafetch_data:
|
||||
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,15 +0,0 @@
|
||||
[variables]
|
||||
BASIC_AUTH_USER = "admin"
|
||||
BASIC_AUTH_PASS = "${password:12}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
name = "Domain"
|
||||
variable = "DOMAIN"
|
||||
serviceName = "mediafetch"
|
||||
port = 3002
|
||||
|
||||
[[config.mounts]]
|
||||
name = "Downloads"
|
||||
filePath = "/data/downloads"
|
||||
content = "mediafetch"
|
||||
@@ -1,29 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
backend:
|
||||
image: ketbom/minepanel-backend:1.7.1
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- FRONTEND_URL=${FRONTEND_URL}
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
- CLIENT_PASSWORD=${CLIENT_PASSWORD}
|
||||
- CLIENT_USERNAME=${CLIENT_USERNAME}
|
||||
- BASE_DIR=${BASE_DIR}
|
||||
volumes:
|
||||
- minepanel-servers:/app/servers
|
||||
- minepanel-data:/app/data
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
frontend:
|
||||
image: ketbom/minepanel-frontend:1.7.1
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- NEXT_PUBLIC_BACKEND_URL=${NEXT_PUBLIC_BACKEND_URL}
|
||||
- NEXT_PUBLIC_DEFAULT_LANGUAGE=${NEXT_PUBLIC_DEFAULT_LANGUAGE}
|
||||
depends_on:
|
||||
- backend
|
||||
|
||||
volumes:
|
||||
minepanel-servers:
|
||||
minepanel-data:
|
||||
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,28 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
jwt_secret = "${base64:32}"
|
||||
client_username = "admin"
|
||||
client_password = "${password:16}"
|
||||
default_language = "en"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "frontend"
|
||||
port = 3_000
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "backend"
|
||||
port = 8_091
|
||||
host = "api-${main_domain}"
|
||||
|
||||
[config.env]
|
||||
JWT_SECRET = "${jwt_secret}"
|
||||
CLIENT_USERNAME = "${client_username}"
|
||||
CLIENT_PASSWORD = "${client_password}"
|
||||
FRONTEND_URL = "http://${main_domain}"
|
||||
NEXT_PUBLIC_BACKEND_URL = "http://api-${main_domain}"
|
||||
NEXT_PUBLIC_DEFAULT_LANGUAGE = "${default_language}"
|
||||
BASE_DIR = "/app"
|
||||
@@ -1,43 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:18
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- POSTGRES_PASSWORD
|
||||
- POSTGRES_USER
|
||||
- POSTGRES_DB
|
||||
- TZ=Asia/Shanghai
|
||||
volumes:
|
||||
- postgres-data:/var/lib/postgresql
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U danmuapi -d danmuapi"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
start_period: 60s
|
||||
|
||||
danmu-app:
|
||||
image: l429609201/misaka_danmu_server:latest
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- UMASK=0022
|
||||
- TZ=Asia/Shanghai
|
||||
- DANMUAPI_DATABASE__TYPE
|
||||
- DANMUAPI_DATABASE__HOST
|
||||
- DANMUAPI_DATABASE__PORT
|
||||
- DANMUAPI_DATABASE__NAME
|
||||
- DANMUAPI_DATABASE__USER
|
||||
- DANMUAPI_DATABASE__PASSWORD
|
||||
- DANMUAPI_ADMIN__INITIAL_USER
|
||||
volumes:
|
||||
- danmu-config:/app/config
|
||||
|
||||
volumes:
|
||||
postgres-data: {}
|
||||
danmu-config: {}
|
||||
|
Before Width: | Height: | Size: 14 KiB |
@@ -1,30 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
db_password = "${password:24}"
|
||||
db_user = "danmuapi"
|
||||
db_name = "danmuapi"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "danmu-app"
|
||||
port = 7768
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
# PostgreSQL
|
||||
POSTGRES_PASSWORD = "${db_password}"
|
||||
POSTGRES_USER = "${db_user}"
|
||||
POSTGRES_DB = "${db_name}"
|
||||
|
||||
# Danmu App Database Connection
|
||||
DANMUAPI_DATABASE__TYPE = "postgresql"
|
||||
DANMUAPI_DATABASE__HOST = "postgres"
|
||||
DANMUAPI_DATABASE__PORT = "5432"
|
||||
DANMUAPI_DATABASE__NAME = "${db_name}"
|
||||
DANMUAPI_DATABASE__USER = "${db_user}"
|
||||
DANMUAPI_DATABASE__PASSWORD = "${db_password}"
|
||||
|
||||
# Admin
|
||||
DANMUAPI_ADMIN__INITIAL_USER = "admin"
|
||||
@@ -1,35 +0,0 @@
|
||||
services:
|
||||
moltbot-gateway:
|
||||
image: ghcr.io/moltbot/clawdbot:2026.1.24-1
|
||||
environment:
|
||||
HOME: /home/node
|
||||
TERM: xterm-256color
|
||||
CLAWDBOT_GATEWAY_TOKEN: ${CLAWDBOT_GATEWAY_TOKEN}
|
||||
CLAUDE_AI_SESSION_KEY: ${CLAUDE_AI_SESSION_KEY}
|
||||
CLAUDE_WEB_SESSION_KEY: ${CLAUDE_WEB_SESSION_KEY}
|
||||
CLAUDE_WEB_COOKIE: ${CLAUDE_WEB_COOKIE}
|
||||
CLAWDBOT_GATEWAY_URL: ws://0.0.0.0:18789
|
||||
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
|
||||
volumes:
|
||||
- moltbot-config:/home/node/.clawdbot
|
||||
- moltbot-workspace:/home/node/clawd
|
||||
ports:
|
||||
- "18789"
|
||||
- "18790"
|
||||
init: true
|
||||
restart: unless-stopped
|
||||
command:
|
||||
[
|
||||
"node",
|
||||
"dist/index.js",
|
||||
"gateway",
|
||||
"--bind",
|
||||
"auto",
|
||||
"--port",
|
||||
"18789",
|
||||
"--allow-unconfigured"
|
||||
]
|
||||
|
||||
volumes:
|
||||
moltbot-config:
|
||||
moltbot-workspace:
|
||||
@@ -1,60 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16 16" role="img" aria-label="Pixel lobster">
|
||||
<rect width="16" height="16" fill="none"/>
|
||||
<!-- outline -->
|
||||
<g fill="#3a0a0d">
|
||||
<rect x="1" y="5" width="1" height="3"/>
|
||||
<rect x="2" y="4" width="1" height="1"/>
|
||||
<rect x="2" y="8" width="1" height="1"/>
|
||||
<rect x="3" y="3" width="1" height="1"/>
|
||||
<rect x="3" y="9" width="1" height="1"/>
|
||||
<rect x="4" y="2" width="1" height="1"/>
|
||||
<rect x="4" y="10" width="1" height="1"/>
|
||||
<rect x="5" y="2" width="6" height="1"/>
|
||||
<rect x="11" y="2" width="1" height="1"/>
|
||||
<rect x="12" y="3" width="1" height="1"/>
|
||||
<rect x="12" y="9" width="1" height="1"/>
|
||||
<rect x="13" y="4" width="1" height="1"/>
|
||||
<rect x="13" y="8" width="1" height="1"/>
|
||||
<rect x="14" y="5" width="1" height="3"/>
|
||||
<rect x="5" y="11" width="6" height="1"/>
|
||||
<rect x="4" y="12" width="1" height="1"/>
|
||||
<rect x="11" y="12" width="1" height="1"/>
|
||||
<rect x="3" y="13" width="1" height="1"/>
|
||||
<rect x="12" y="13" width="1" height="1"/>
|
||||
<rect x="5" y="14" width="6" height="1"/>
|
||||
</g>
|
||||
|
||||
<!-- body -->
|
||||
<g fill="#ff4f40">
|
||||
<rect x="5" y="3" width="6" height="1"/>
|
||||
<rect x="4" y="4" width="8" height="1"/>
|
||||
<rect x="3" y="5" width="10" height="1"/>
|
||||
<rect x="3" y="6" width="10" height="1"/>
|
||||
<rect x="3" y="7" width="10" height="1"/>
|
||||
<rect x="4" y="8" width="8" height="1"/>
|
||||
<rect x="5" y="9" width="6" height="1"/>
|
||||
<rect x="5" y="12" width="6" height="1"/>
|
||||
<rect x="6" y="13" width="4" height="1"/>
|
||||
</g>
|
||||
|
||||
<!-- claws -->
|
||||
<g fill="#ff775f">
|
||||
<rect x="1" y="6" width="2" height="1"/>
|
||||
<rect x="2" y="5" width="1" height="1"/>
|
||||
<rect x="2" y="7" width="1" height="1"/>
|
||||
<rect x="13" y="6" width="2" height="1"/>
|
||||
<rect x="13" y="5" width="1" height="1"/>
|
||||
<rect x="13" y="7" width="1" height="1"/>
|
||||
</g>
|
||||
|
||||
<!-- eyes -->
|
||||
<g fill="#081016">
|
||||
<rect x="6" y="5" width="1" height="1"/>
|
||||
<rect x="9" y="5" width="1" height="1"/>
|
||||
</g>
|
||||
<g fill="#f5fbff">
|
||||
<rect x="6" y="4" width="1" height="1"/>
|
||||
<rect x="9" y="4" width="1" height="1"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1,18 +0,0 @@
|
||||
[variables]
|
||||
gateway_token = "${password:32}"
|
||||
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "moltbot-gateway"
|
||||
port = 18789
|
||||
host = "${domain}"
|
||||
|
||||
[config.env]
|
||||
CLAWDBOT_GATEWAY_TOKEN = "${gateway_token}"
|
||||
CLAWDBOT_GATEWAY_PORT = 18789
|
||||
CLAWDBOT_BRIDGE_PORT = 18790
|
||||
CLAWDBOT_GATEWAY_BIND="lan"
|
||||
CLAWDBOT_PLUGINS="discord,memory-core"
|
||||
# Get here https://openrouter.ai/
|
||||
OPENROUTER_API_KEY="YOUR-API-KEY"
|
||||
@@ -1,34 +1,32 @@
|
||||
services:
|
||||
nextcloud:
|
||||
image: nextcloud:stable
|
||||
image: nextcloud:30.0.2
|
||||
restart: always
|
||||
|
||||
ports:
|
||||
- 80
|
||||
volumes:
|
||||
- nextcloud_data:/var/www/html
|
||||
- ../files/fix-nextcloud.sh:/usr/local/bin/fix-nextcloud.sh:ro
|
||||
environment:
|
||||
- NEXTCLOUD_TRUSTED_DOMAINS=${NEXTCLOUD_DOMAIN}
|
||||
- MYSQL_HOST=nextcloud_db
|
||||
- MYSQL_DATABASE=nextcloud
|
||||
- MYSQL_USER=nextcloud
|
||||
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
|
||||
depends_on:
|
||||
- nextcloud_db
|
||||
- nextcloud_redis
|
||||
- MYSQL_PASSWORD=${MYSQL_SECRET_PASSWORD}
|
||||
- OVERWRITEPROTOCOL=https
|
||||
|
||||
nextcloud_db:
|
||||
image: mariadb:10.11
|
||||
image: mariadb
|
||||
restart: always
|
||||
|
||||
volumes:
|
||||
- nextcloud_db_data:/var/lib/mysql
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
||||
- MYSQL_ROOT_PASSWORD=${MYSQL_SECRET_PASSWORD_ROOT}
|
||||
- MYSQL_DATABASE=nextcloud
|
||||
- MYSQL_USER=nextcloud
|
||||
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
|
||||
|
||||
nextcloud_redis:
|
||||
image: redis:alpine
|
||||
restart: always
|
||||
- MYSQL_PASSWORD=${MYSQL_SECRET_PASSWORD}
|
||||
|
||||
volumes:
|
||||
nextcloud_data:
|
||||
nextcloud_db_data:
|
||||
nextcloud_db_data:
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<svg width="256" height="128" version="1.1" viewBox="0 0 256 128" xmlns="http://www.w3.org/2000/svg"><path d="m128 7c-25.871 0-47.817 17.485-54.713 41.209-5.9795-12.461-18.642-21.209-33.287-21.209-20.304 0-37 16.696-37 37s16.696 37 37 37c14.645 0 27.308-8.7481 33.287-21.209 6.8957 23.724 28.842 41.209 54.713 41.209s47.817-17.485 54.713-41.209c5.9795 12.461 18.642 21.209 33.287 21.209 20.304 0 37-16.696 37-37s-16.696-37-37-37c-14.645 0-27.308 8.7481-33.287 21.209-6.8957-23.724-28.842-41.209-54.713-41.209zm0 22c19.46 0 35 15.54 35 35s-15.54 35-35 35-35-15.54-35-35 15.54-35 35-35zm-88 20c8.4146 0 15 6.5854 15 15s-6.5854 15-15 15-15-6.5854-15-15 6.5854-15 15-15zm176 0c8.4146 0 15 6.5854 15 15s-6.5854 15-15 15-15-6.5854-15-15 6.5854-15 15-15z" color="#000000" fill="#fff" style="-inkscape-stroke:none"/></svg>
|
||||
|
After Width: | Height: | Size: 814 B |
|
Before Width: | Height: | Size: 11 KiB |
@@ -1,171 +1,17 @@
|
||||
[variables]
|
||||
domain_name = "${domain}"
|
||||
db_password = "${password:32}"
|
||||
db_root_password = "${password:32}"
|
||||
region = "DE"
|
||||
main_domain = "${domain}"
|
||||
db_password = "${password}"
|
||||
db_root_password = "${password}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"MYSQL_PASSWORD=${db_password}",
|
||||
"MYSQL_ROOT_PASSWORD=${db_root_password}",
|
||||
"DEFAULT_PHONE_REGION=${region}",
|
||||
"NEXTCLOUD_DOMAIN=${domain_name}",
|
||||
"OVERWRITEPROTOCOL=https",
|
||||
"TRUSTED_PROXIES=10.0.0.0/8 172.16.0.0/12",
|
||||
"REDIS_HOST=nextcloud_redis",
|
||||
"MYSQL_DATABASE=nextcloud",
|
||||
"MYSQL_USER=nextcloud"
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "nextcloud"
|
||||
port = 80
|
||||
host = "${domain_name}"
|
||||
[[config.domains]]
|
||||
serviceName = "nextcloud"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "fix-nextcloud.sh"
|
||||
content = """#!/bin/sh
|
||||
#
|
||||
# Nextcloud Optimization Script
|
||||
# ==============================
|
||||
# This script applies production-ready optimizations to Nextcloud.
|
||||
#
|
||||
# MANUAL EXECUTION REQUIRED
|
||||
# -------------------------
|
||||
# After Nextcloud completes its initial setup (create admin account, etc.),
|
||||
# run this script manually:
|
||||
#
|
||||
# Option 1 (From Dokploy UI):
|
||||
# 1. Go to your Nextcloud service in Dokploy
|
||||
# 2. Open the Terminal tab
|
||||
# 3. Run: su -s /bin/sh www-data -c "/bin/sh /usr/local/bin/fix-nextcloud.sh"
|
||||
#
|
||||
# Option 2 (From command line):
|
||||
# docker exec -u www-data <container-name> /bin/sh /usr/local/bin/fix-nextcloud.sh
|
||||
#
|
||||
# Optimizations include:
|
||||
# - Trusted proxy configuration for reverse proxy support
|
||||
# - HTTPS protocol override
|
||||
# - Regional settings (phone region, maintenance window)
|
||||
# - Performance optimizations (database repair, missing indices)
|
||||
# - Redis caching configuration (APCu, distributed, locking)
|
||||
#
|
||||
# The script is idempotent - it creates a marker file to prevent re-running.
|
||||
# To re-run manually: delete /var/www/html/data/.nextcloud-optimized and restart container
|
||||
#
|
||||
|
||||
MARKER_FILE="/var/www/html/data/.nextcloud-optimized"
|
||||
OCC="php /var/www/html/occ"
|
||||
|
||||
# Check if already run
|
||||
if [ -f "$MARKER_FILE" ]; then
|
||||
echo "Optimizations already applied (marker file exists)."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "=========================================="
|
||||
echo " Nextcloud Optimization Script"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Check if running as www-data
|
||||
CURRENT_USER=$(whoami)
|
||||
if [ "$CURRENT_USER" = "www-data" ]; then
|
||||
RUN_AS_WWWDATA=""
|
||||
else
|
||||
RUN_AS_WWWDATA="su -s /bin/sh www-data -c"
|
||||
fi
|
||||
|
||||
# Function to run occ command with error handling
|
||||
run_occ() {
|
||||
description="$1"
|
||||
shift
|
||||
printf " - %s... " "$description"
|
||||
if [ -z "$RUN_AS_WWWDATA" ]; then
|
||||
# Already running as www-data
|
||||
if $OCC "$@" >/dev/null 2>&1; then
|
||||
echo "✓"
|
||||
return 0
|
||||
else
|
||||
echo "✗ (failed, but continuing)"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
# Need to switch to www-data
|
||||
if $RUN_AS_WWWDATA "$OCC $*" >/dev/null 2>&1; then
|
||||
echo "✓"
|
||||
return 0
|
||||
else
|
||||
echo "✗ (failed, but continuing)"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# Test database connectivity
|
||||
echo "[1/5] Testing database connectivity..."
|
||||
if [ -z "$RUN_AS_WWWDATA" ]; then
|
||||
if $OCC status >/dev/null 2>&1; then
|
||||
echo " ✓ Database is accessible"
|
||||
else
|
||||
echo " ✗ Database not accessible"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
if $RUN_AS_WWWDATA "$OCC status" >/dev/null 2>&1; then
|
||||
echo " ✓ Database is accessible"
|
||||
else
|
||||
echo " ✗ Database not accessible"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Configure trusted proxies
|
||||
echo "[2/5] Configuring trusted proxies..."
|
||||
run_occ "Set trusted proxy 10.0.0.0/8" config:system:set trusted_proxies 0 --value='10.0.0.0/8'
|
||||
run_occ "Set trusted proxy 172.16.0.0/12" config:system:set trusted_proxies 1 --value='172.16.0.0/12'
|
||||
run_occ "Set trusted proxy 192.168.0.0/16" config:system:set trusted_proxies 2 --value='192.168.0.0/16'
|
||||
run_occ "Set HTTPS protocol override" config:system:set overwriteprotocol --value='https'
|
||||
|
||||
# Configure regional settings
|
||||
echo "[3/5] Configuring regional settings..."
|
||||
run_occ "Set phone region to DE" config:system:set default_phone_region --value='DE'
|
||||
run_occ "Set maintenance window start" config:system:set maintenance_window_start --value=1 --type=integer
|
||||
|
||||
# Run performance optimizations
|
||||
echo "[4/5] Running performance optimizations..."
|
||||
echo " - Running maintenance repair (this may take a while)..."
|
||||
if [ -z "$RUN_AS_WWWDATA" ]; then
|
||||
if $OCC maintenance:repair --include-expensive 2>&1 | grep -q "No repair steps available"; then
|
||||
echo " ✓ No repairs needed"
|
||||
else
|
||||
echo " ✓ Repair completed"
|
||||
fi
|
||||
else
|
||||
if $RUN_AS_WWWDATA "$OCC maintenance:repair --include-expensive" 2>&1 | grep -q "No repair steps available"; then
|
||||
echo " ✓ No repairs needed"
|
||||
else
|
||||
echo " ✓ Repair completed"
|
||||
fi
|
||||
fi
|
||||
run_occ "Add missing database indices" db:add-missing-indices
|
||||
|
||||
# Configure Redis caching
|
||||
echo "[5/5] Configuring Redis caching..."
|
||||
run_occ "Set APCu for local cache" config:system:set memcache.local --value='\\OC\\Memcache\\APCu'
|
||||
run_occ "Set Redis for distributed cache" config:system:set memcache.distributed --value='\\OC\\Memcache\\Redis'
|
||||
run_occ "Set Redis for locking" config:system:set memcache.locking --value='\\OC\\Memcache\\Redis'
|
||||
run_occ "Set Redis host" config:system:set redis host --value='nextcloud_redis'
|
||||
run_occ "Set Redis port" config:system:set redis port --value=6379 --type=integer
|
||||
|
||||
# Create marker file
|
||||
touch "$MARKER_FILE"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " Optimization Complete!"
|
||||
echo "=========================================="
|
||||
echo "All optimizations have been applied."
|
||||
echo "Marker file created at: $MARKER_FILE"
|
||||
echo ""
|
||||
"""
|
||||
[config.env]
|
||||
NEXTCLOUD_DOMAIN = "${main_domain}"
|
||||
MYSQL_SECRET_PASSWORD = "${db_password}"
|
||||
MYSQL_SECRET_PASSWORD_ROOT = "${db_root_password}"
|
||||
|
||||
@@ -3,11 +3,11 @@ services:
|
||||
image: postgres:17-alpine
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- db_data:/var/lib/postgresql/data
|
||||
- db-data:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_DB: postgres
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
- POSTGRES_DB=postgres
|
||||
- POSTGRES_USER=postgres
|
||||
- POSTGRES_PASSWORD=postgres
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
||||
interval: 5s
|
||||
@@ -21,36 +21,38 @@ services:
|
||||
- db
|
||||
environment:
|
||||
# Root user configuration
|
||||
ROOT_EMAIL: ${ROOT_EMAIL}
|
||||
- ROOT_EMAIL=${ROOT_EMAIL}
|
||||
|
||||
# API configuration
|
||||
API_ENDPOINT: ${API_ENDPOINT}
|
||||
- API_ENDPOINT=${API_ENDPOINT}
|
||||
|
||||
# Database configuration
|
||||
DB_HOST: db
|
||||
DB_PORT: 5432
|
||||
DB_USER: postgres
|
||||
DB_PASSWORD: postgres
|
||||
DB_PREFIX: notifuse
|
||||
DB_NAME: postgres
|
||||
DB_SSLMODE: disable
|
||||
- DB_HOST=db
|
||||
- DB_PORT=5432
|
||||
- DB_USER=postgres
|
||||
- DB_PASSWORD=postgres
|
||||
- DB_PREFIX=notifuse
|
||||
- DB_NAME=notifuse_system
|
||||
- DB_SSLMODE=disable
|
||||
|
||||
# Secret key for authentication (auto-generated)
|
||||
SECRET_KEY: ${SECRET_KEY}
|
||||
# PASETO keys for authentication
|
||||
# Default keys for testing - GENERATE YOUR OWN for production at https://paseto.notifuse.com/
|
||||
- PASETO_PRIVATE_KEY=${PASETO_PRIVATE_KEY}
|
||||
- PASETO_PUBLIC_KEY=${PASETO_PUBLIC_KEY}
|
||||
|
||||
# SMTP configuration
|
||||
- SMTP_HOST=${SMTP_HOST}
|
||||
- SMTP_PORT=${SMTP_PORT}
|
||||
- SMTP_USERNAME=${SMTP_USERNAME}
|
||||
- SMTP_PASSWORD=${SMTP_PASSWORD}
|
||||
- SMTP_FROM_EMAIL=${SMTP_FROM_EMAIL}
|
||||
- SMTP_FROM_NAME=${SMTP_FROM_NAME}
|
||||
|
||||
# Server configuration
|
||||
SERVER_PORT: 8080
|
||||
SERVER_HOST: 0.0.0.0
|
||||
ENVIRONMENT: production
|
||||
volumes:
|
||||
- notifuse_data:/app/data
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/healthz"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 10s
|
||||
- SERVER_PORT=8080
|
||||
- SERVER_HOST=0.0.0.0
|
||||
- ENVIRONMENT=production
|
||||
|
||||
volumes:
|
||||
db_data: {}
|
||||
notifuse_data: {}
|
||||
db-data:
|
||||
driver: local
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
secret_key = "${base64:64}"
|
||||
paseto_private_key = "d04zCk3Fa45oOjDWHpAvc1AZxnLdGffOnNWK+Jt2yXf37+FTfuMMHb8flcfPMqLluRR3rvhbr555r6j1DEigrA=="
|
||||
paseto_public_key = "9+/hU37jDB2/H5XHzzKi5bkUd674W6+eea+o9QxIoKw="
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
@@ -11,4 +12,18 @@ host = "${main_domain}"
|
||||
[config.env]
|
||||
ROOT_EMAIL = "${email}"
|
||||
API_ENDPOINT = "https://${main_domain}"
|
||||
SECRET_KEY = "${secret_key}"
|
||||
|
||||
# PASETO keys for authentication
|
||||
# Default keys for testing - GENERATE YOUR OWN for production at https://paseto.notifuse.com/
|
||||
PASETO_PRIVATE_KEY = "${paseto_private_key}"
|
||||
PASETO_PUBLIC_KEY = "${paseto_public_key}"
|
||||
|
||||
# SMTP Configuration (users need to configure these)
|
||||
SMTP_HOST = "smtp.gmail.com"
|
||||
SMTP_PORT = "587"
|
||||
SMTP_USERNAME = "your-email@gmail.com"
|
||||
SMTP_PASSWORD = "your-smtp-password"
|
||||
SMTP_FROM_EMAIL = "noreply@yourdomain.com"
|
||||
SMTP_FROM_NAME = "Notifuse"
|
||||
|
||||
[[config.mounts]]
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
services:
|
||||
openclaw:
|
||||
image: "coollabsio/openclaw:2026.2.6"
|
||||
environment:
|
||||
- AUTH_USERNAME=${AUTH_USERNAME}
|
||||
- AUTH_PASSWORD=${AUTH_PASSWORD}
|
||||
- OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
|
||||
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
|
||||
- OPENAI_API_KEY=${OPENAI_API_KEY}
|
||||
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
|
||||
- GEMINI_API_KEY=${GEMINI_API_KEY}
|
||||
- XAI_API_KEY=${XAI_API_KEY}
|
||||
- GROQ_API_KEY=${GROQ_API_KEY}
|
||||
- MISTRAL_API_KEY=${MISTRAL_API_KEY}
|
||||
- CEREBRAS_API_KEY=${CEREBRAS_API_KEY}
|
||||
- VENICE_API_KEY=${VENICE_API_KEY}
|
||||
- MOONSHOT_API_KEY=${MOONSHOT_API_KEY}
|
||||
- KIMI_API_KEY=${KIMI_API_KEY}
|
||||
- MINIMAX_API_KEY=${MINIMAX_API_KEY}
|
||||
- ZAI_API_KEY=${ZAI_API_KEY}
|
||||
- AI_GATEWAY_API_KEY=${AI_GATEWAY_API_KEY}
|
||||
- OPENCODE_API_KEY=${OPENCODE_API_KEY}
|
||||
- SYNTHETIC_API_KEY=${SYNTHETIC_API_KEY}
|
||||
- COPILOT_GITHUB_TOKEN=${COPILOT_GITHUB_TOKEN}
|
||||
- XIAOMI_API_KEY=${XIAOMI_API_KEY}
|
||||
- OPENCLAW_PRIMARY_MODEL=${OPENCLAW_PRIMARY_MODEL}
|
||||
- DEEPGRAM_API_KEY=${DEEPGRAM_API_KEY}
|
||||
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
|
||||
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
|
||||
- AWS_REGION=${AWS_REGION:-us-east-1}
|
||||
- AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}
|
||||
- BEDROCK_PROVIDER_FILTER=${BEDROCK_PROVIDER_FILTER:-anthropic}
|
||||
- OLLAMA_BASE_URL=${OLLAMA_BASE_URL}
|
||||
- PORT=8080
|
||||
- OPENCLAW_GATEWAY_PORT=18789
|
||||
- OPENCLAW_GATEWAY_BIND=${OPENCLAW_GATEWAY_BIND:-loopback}
|
||||
- OPENCLAW_STATE_DIR=/data/.openclaw
|
||||
- OPENCLAW_WORKSPACE_DIR=/data/workspace
|
||||
- BROWSER_CDP_URL=http://browser:9223
|
||||
- BROWSER_DEFAULT_PROFILE=${BROWSER_DEFAULT_PROFILE:-openclaw}
|
||||
- BROWSER_EVALUATE_ENABLED=${BROWSER_EVALUATE_ENABLED:-true}
|
||||
- BROWSER_SNAPSHOT_MODE=${BROWSER_SNAPSHOT_MODE:-efficient}
|
||||
- BROWSER_REMOTE_TIMEOUT_MS=${BROWSER_REMOTE_TIMEOUT_MS:-1500}
|
||||
- BROWSER_REMOTE_HANDSHAKE_TIMEOUT_MS=${BROWSER_REMOTE_HANDSHAKE_TIMEOUT_MS:-3000}
|
||||
- HOOKS_ENABLED=${HOOKS_ENABLED:-false}
|
||||
- HOOKS_PATH=${HOOKS_PATH:-/hooks}
|
||||
- MOONSHOT_BASE_URL=${MOONSHOT_BASE_URL:-https://api.moonshot.ai/v1}
|
||||
- KIMI_BASE_URL=${KIMI_BASE_URL:-https://api.moonshot.ai/anthropic}
|
||||
- TELEGRAM_BOT_TOKEN=$TELEGRAM_BOT_TOKEN
|
||||
- DISCORD_BOT_TOKEN=$DISCORD_BOT_TOKEN
|
||||
- SLACK_BOT_TOKEN=$SLACK_BOT_TOKEN
|
||||
- SLACK_APP_TOKEN=$SLACK_APP_TOKEN
|
||||
- WHATSAPP_ENABLED=$WHATSAPP_ENABLED
|
||||
- OPENCLAW_DOCKER_APT_PACKAGES=$OPENCLAW_DOCKER_APT_PACKAGES
|
||||
volumes:
|
||||
- "openclaw-data:/data"
|
||||
depends_on:
|
||||
browser:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-sf", "http://127.0.0.1:8080/healthz"]
|
||||
interval: 10s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
|
||||
browser:
|
||||
image: "coollabsio/openclaw-browser:latest"
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=Etc/UTC
|
||||
- CHROME_CLI=--remote-debugging-port=9222
|
||||
volumes:
|
||||
- "browser-data:/config"
|
||||
shm_size: 2g
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "bash -c ':> /dev/tcp/127.0.0.1/9222' || exit 1"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
|
||||
|
||||
volumes:
|
||||
openclaw-data:
|
||||
browser-data:
|
||||
@@ -1,60 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 16 16" role="img" aria-label="Pixel lobster">
|
||||
<rect width="16" height="16" fill="none"/>
|
||||
|
||||
<g fill="#3a0a0d">
|
||||
<rect x="1" y="5" width="1" height="3"/>
|
||||
<rect x="2" y="4" width="1" height="1"/>
|
||||
<rect x="2" y="8" width="1" height="1"/>
|
||||
<rect x="3" y="3" width="1" height="1"/>
|
||||
<rect x="3" y="9" width="1" height="1"/>
|
||||
<rect x="4" y="2" width="1" height="1"/>
|
||||
<rect x="4" y="10" width="1" height="1"/>
|
||||
<rect x="5" y="2" width="6" height="1"/>
|
||||
<rect x="11" y="2" width="1" height="1"/>
|
||||
<rect x="12" y="3" width="1" height="1"/>
|
||||
<rect x="12" y="9" width="1" height="1"/>
|
||||
<rect x="13" y="4" width="1" height="1"/>
|
||||
<rect x="13" y="8" width="1" height="1"/>
|
||||
<rect x="14" y="5" width="1" height="3"/>
|
||||
<rect x="5" y="11" width="6" height="1"/>
|
||||
<rect x="4" y="12" width="1" height="1"/>
|
||||
<rect x="11" y="12" width="1" height="1"/>
|
||||
<rect x="3" y="13" width="1" height="1"/>
|
||||
<rect x="12" y="13" width="1" height="1"/>
|
||||
<rect x="5" y="14" width="6" height="1"/>
|
||||
</g>
|
||||
|
||||
|
||||
<g fill="#ff4f40">
|
||||
<rect x="5" y="3" width="6" height="1"/>
|
||||
<rect x="4" y="4" width="8" height="1"/>
|
||||
<rect x="3" y="5" width="10" height="1"/>
|
||||
<rect x="3" y="6" width="10" height="1"/>
|
||||
<rect x="3" y="7" width="10" height="1"/>
|
||||
<rect x="4" y="8" width="8" height="1"/>
|
||||
<rect x="5" y="9" width="6" height="1"/>
|
||||
<rect x="5" y="12" width="6" height="1"/>
|
||||
<rect x="6" y="13" width="4" height="1"/>
|
||||
</g>
|
||||
|
||||
|
||||
<g fill="#ff775f">
|
||||
<rect x="1" y="6" width="2" height="1"/>
|
||||
<rect x="2" y="5" width="1" height="1"/>
|
||||
<rect x="2" y="7" width="1" height="1"/>
|
||||
<rect x="13" y="6" width="2" height="1"/>
|
||||
<rect x="13" y="5" width="1" height="1"/>
|
||||
<rect x="13" y="7" width="1" height="1"/>
|
||||
</g>
|
||||
|
||||
|
||||
<g fill="#081016">
|
||||
<rect x="6" y="5" width="1" height="1"/>
|
||||
<rect x="9" y="5" width="1" height="1"/>
|
||||
</g>
|
||||
<g fill="#f5fbff">
|
||||
<rect x="6" y="4" width="1" height="1"/>
|
||||
<rect x="9" y="4" width="1" height="1"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1,21 +0,0 @@
|
||||
[variables]
|
||||
gateway_token = "${password:32}"
|
||||
auth_username = "dokploy"
|
||||
auth_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "openclaw"
|
||||
port = 8080
|
||||
host = "${domain}"
|
||||
|
||||
[config.env]
|
||||
OPENCLAW_GATEWAY_TOKEN = "${gateway_token}"
|
||||
OPENCLAW_GATEWAY_PORT = 18789
|
||||
AUTH_USERNAME="${auth_username}"
|
||||
AUTH_PASSWORD="${auth_password}"
|
||||
OPENCLAW_BRIDGE_PORT = 18790
|
||||
OPENCLAW_GATEWAY_BIND="lan"
|
||||
OPENCLAW_PLUGINS="discord,memory-core"
|
||||
# Get here https://openrouter.ai/
|
||||
OPENROUTER_API_KEY="YOUR-API-KEY"
|
||||
@@ -54,7 +54,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
op-api:
|
||||
image: lindesvard/openpanel-api:2
|
||||
image: lindesvard/openpanel-api:2.0.0
|
||||
restart: always
|
||||
command: >
|
||||
sh -c "
|
||||
@@ -97,7 +97,7 @@ services:
|
||||
condition: service_healthy
|
||||
|
||||
op-dashboard:
|
||||
image: lindesvard/openpanel-dashboard:2
|
||||
image: lindesvard/openpanel-dashboard:2.0.0
|
||||
restart: always
|
||||
depends_on:
|
||||
op-api:
|
||||
@@ -111,7 +111,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
op-worker:
|
||||
image: lindesvard/openpanel-worker:2
|
||||
image: lindesvard/openpanel-worker:2.0.0
|
||||
restart: always
|
||||
depends_on:
|
||||
op-api:
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
services:
|
||||
postgres-pgdog:
|
||||
image: ${PGDOG_IMAGE}
|
||||
restart: unless-stopped
|
||||
# Uncomment 'ports' settings below to enable external access
|
||||
# ports:
|
||||
# - "6432:6432"
|
||||
volumes:
|
||||
- ../files/pgdog.toml:/pgdog/pgdog.toml
|
||||
- ../files/users.toml:/pgdog/users.toml
|
||||
environment:
|
||||
- RUST_LOG=${RUST_LOG}
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
|
||||
postgres:
|
||||
image: ${POSTGRES_IMAGE}
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- POSTGRES_USER=${POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
- POSTGRES_DB=${POSTGRES_DB}
|
||||
volumes:
|
||||
- postgres-data:/var/lib/postgresql
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
postgres-data:
|
||||
|
Before Width: | Height: | Size: 23 KiB |
@@ -1,36 +0,0 @@
|
||||
[variables]
|
||||
postgres_user = "${username}"
|
||||
postgres_password = "${password:32}"
|
||||
postgres_db = "postgres"
|
||||
pgdog_image = "ghcr.io/pgdogdev/pgdog:v0.1.26"
|
||||
postgres_image = "postgres:18-alpine"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "pgdog.toml"
|
||||
content = """
|
||||
[general]
|
||||
host = "0.0.0.0"
|
||||
port = 6432
|
||||
|
||||
[[databases]]
|
||||
name = "${postgres_db}"
|
||||
host = "postgres"
|
||||
port = 5432
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "users.toml"
|
||||
content = """
|
||||
[[users]]
|
||||
name = "${postgres_user}"
|
||||
database = "${postgres_db}"
|
||||
password = "${postgres_password}"
|
||||
"""
|
||||
|
||||
[config.env]
|
||||
POSTGRES_USER = "${postgres_user}"
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
POSTGRES_DB = "${postgres_db}"
|
||||
PGDOG_IMAGE = "${pgdog_image}"
|
||||
POSTGRES_IMAGE = "${postgres_image}"
|
||||
RUST_LOG = "info"
|
||||
@@ -9,7 +9,6 @@ services:
|
||||
- "--web.console.templates=/usr/share/prometheus/consoles"
|
||||
- "--web.enable-lifecycle"
|
||||
volumes:
|
||||
- ../files/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
volumes:
|
||||
prometheus-data: {}
|
||||
|
||||
@@ -10,10 +10,7 @@ port = 9_090
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.mounts]]
|
||||
# Note: this relative path is resolved by Dokploy to the file mounted from
|
||||
# ../files/prometheus.yml in docker-compose, and mapped inside the container
|
||||
# to /etc/prometheus/prometheus.yml.
|
||||
filePath = "prometheus.yml"
|
||||
filePath = "/etc/prometheus/prometheus.yml"
|
||||
serviceName = "prometheus"
|
||||
content = """
|
||||
# Prometheus Configuration
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
pulse:
|
||||
image: rcourtman/pulse:5.1
|
||||
restart: always
|
||||
expose:
|
||||
- 7655
|
||||
volumes:
|
||||
- pulse_data:/data
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- PULSE_AUTH_USER=${PULSE_AUTH_USER}
|
||||
- PULSE_AUTH_PASS=${PULSE_AUTH_PASS}
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:7655/api/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
volumes:
|
||||
pulse_data:
|
||||
@@ -1,4 +0,0 @@
|
||||
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="128" height="128" rx="20" fill="#3B82F6"/>
|
||||
<path d="M20 64H35L45 44L55 84L65 24L75 74L85 54L100 64H108" stroke="white" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 304 B |
@@ -1,13 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
pulse_auth_user = "${username}"
|
||||
pulse_auth_pass = "${password:32}"
|
||||
|
||||
[config]
|
||||
env = ["PULSE_AUTH_USER=${pulse_auth_user}", "PULSE_AUTH_PASS=${pulse_auth_pass}"]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "pulse"
|
||||
port = 7_655
|
||||
host = "${main_domain}"
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
database:
|
||||
image: mariadb:11
|
||||
image: mariadb:10.5
|
||||
restart: always
|
||||
command: --default-authentication-plugin=mysql_native_password
|
||||
volumes:
|
||||
@@ -14,7 +14,7 @@ services:
|
||||
image: redis:alpine
|
||||
restart: always
|
||||
panel:
|
||||
image: ghcr.io/pyrodactyl-oss/pyrodactyl:latest
|
||||
image: ghcr.io/pyrohost/pyrodactyl:main
|
||||
restart: always
|
||||
links:
|
||||
- database
|
||||
@@ -35,8 +35,15 @@ services:
|
||||
DB_HOST:
|
||||
DB_PORT:
|
||||
DB_PASSWORD: ${MYSQL_PASSWORD}
|
||||
RECAPTCHA_ENABLED:
|
||||
DB_CONNECTION: "mariadb"
|
||||
|
||||
networks:
|
||||
default:
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 172.20.0.0/16
|
||||
|
||||
volumes:
|
||||
pterodb:
|
||||
pterovar:
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
qbitwebui:
|
||||
image: ghcr.io/maciejonos/qbitwebui:latest
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
# Required: Encryption key for storing credentials (min 32 chars)
|
||||
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
||||
# Optional: Server port (default: 3000)
|
||||
- PORT=${PORT:-3000}
|
||||
# Optional: Database location (default: ./data/qbitwebui.db)
|
||||
- DATABASE_PATH=${DATABASE_PATH:-/data/qbitwebui.db}
|
||||
# Optional: Salt file location (default: ./data/.salt)
|
||||
- SALT_PATH=${SALT_PATH:-/data/.salt}
|
||||
# Optional: Allow self-signed certificates for qBittorrent instances (default: false)
|
||||
# - ALLOW_SELF_SIGNED_CERTS=${ALLOW_SELF_SIGNED_CERTS:-false}
|
||||
# Optional: Disable authentication/login (single-user mode) (default: false)
|
||||
# - DISABLE_AUTH=${DISABLE_AUTH:-false}
|
||||
# Optional: Disable new registrations, creates default admin account (default: false)
|
||||
# - DISABLE_REGISTRATION=${DISABLE_REGISTRATION:-false}
|
||||
# Optional: Enable file browser by setting downloads path
|
||||
# - DOWNLOADS_PATH=/downloads
|
||||
volumes:
|
||||
- qbitwebui_data:/data
|
||||
# Optional: Mount downloads directory for file browser feature
|
||||
# Read-only mount (browse & download only):
|
||||
# - /path/to/your/downloads:/downloads:ro
|
||||
# Or read-write mount (enables delete/move/copy/rename):
|
||||
# - /path/to/your/downloads:/downloads
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 10s
|
||||
|
||||
volumes:
|
||||
qbitwebui_data:
|
||||
|
Before Width: | Height: | Size: 430 KiB |
@@ -1,16 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
encryption_key = "${password:32}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "qbitwebui"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
path = "/"
|
||||
|
||||
[config.env]
|
||||
ENCRYPTION_KEY = "${encryption_key}"
|
||||
PORT = "3000"
|
||||
DATABASE_PATH = "/data/qbitwebui.db"
|
||||
SALT_PATH = "/data/.salt"
|
||||
@@ -1,67 +0,0 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:16-alpine
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_DB: postgres
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
minio:
|
||||
image: minio/minio:latest
|
||||
command: server /data
|
||||
volumes:
|
||||
- minio_data:/data
|
||||
environment:
|
||||
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
|
||||
|
||||
chrome:
|
||||
image: ghcr.io/browserless/chromium:v2.18.0
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
environment:
|
||||
TIMEOUT: 10000
|
||||
CONCURRENT: 10
|
||||
TOKEN: ${CHROME_TOKEN}
|
||||
EXIT_ON_HEALTH_FAILURE: "true"
|
||||
PRE_REQUEST_HEALTH_CHECK: "true"
|
||||
|
||||
app:
|
||||
image: amruthpillai/reactive-resume:latest
|
||||
depends_on:
|
||||
- postgres
|
||||
- minio
|
||||
- chrome
|
||||
environment:
|
||||
PORT: 3000
|
||||
NODE_ENV: production
|
||||
PUBLIC_URL: https://${APP_DOMAIN}
|
||||
STORAGE_URL: https://${APP_DOMAIN}/default
|
||||
CHROME_TOKEN: ${CHROME_TOKEN}
|
||||
CHROME_URL: ws://chrome:3000
|
||||
DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
|
||||
ACCESS_TOKEN_SECRET: ${ACCESS_TOKEN_SECRET}
|
||||
REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
|
||||
MAIL_FROM: ${MAIL_FROM}
|
||||
STORAGE_ENDPOINT: minio
|
||||
STORAGE_PORT: 9000
|
||||
STORAGE_REGION: us-east-1
|
||||
STORAGE_BUCKET: default
|
||||
STORAGE_ACCESS_KEY: ${MINIO_ROOT_USER}
|
||||
STORAGE_SECRET_KEY: ${MINIO_ROOT_PASSWORD}
|
||||
STORAGE_USE_SSL: "false"
|
||||
STORAGE_SKIP_BUCKET_CHECK: "false"
|
||||
|
||||
|
||||
volumes:
|
||||
minio_data:
|
||||
postgres_data:
|
||||
@@ -1,20 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200">
|
||||
<defs>
|
||||
<linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#3b82f6;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#8b5cf6;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background circle -->
|
||||
<circle cx="100" cy="100" r="95" fill="url(#grad)"/>
|
||||
|
||||
<!-- Document icon -->
|
||||
<rect x="60" y="45" width="80" height="110" rx="5" fill="white"/>
|
||||
<rect x="70" y="60" width="60" height="6" rx="3" fill="#3b82f6"/>
|
||||
<rect x="70" y="75" width="60" height="6" rx="3" fill="#3b82f6"/>
|
||||
<rect x="70" y="90" width="45" height="6" rx="3" fill="#8b5cf6"/>
|
||||
<rect x="70" y="105" width="60" height="6" rx="3" fill="#8b5cf6"/>
|
||||
<rect x="70" y="120" width="50" height="6" rx="3" fill="#8b5cf6"/>
|
||||
<rect x="70" y="135" width="40" height="6" rx="3" fill="#8b5cf6"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 937 B |
@@ -1,33 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
postgres_password = "${password:32}"
|
||||
minio_user = "minioadmin"
|
||||
minio_password = "${password:32}"
|
||||
chrome_token = "${password:32}"
|
||||
access_token_secret = "${password:64}"
|
||||
refresh_token_secret = "${password:64}"
|
||||
mail_from = "noreply@${main_domain}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"APP_DOMAIN=${main_domain}",
|
||||
"POSTGRES_PASSWORD=${postgres_password}",
|
||||
"MINIO_ROOT_USER=${minio_user}",
|
||||
"MINIO_ROOT_PASSWORD=${minio_password}",
|
||||
"CHROME_TOKEN=${chrome_token}",
|
||||
"ACCESS_TOKEN_SECRET=${access_token_secret}",
|
||||
"REFRESH_TOKEN_SECRET=${refresh_token_secret}",
|
||||
"MAIL_FROM=${mail_from}",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "app"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "minio"
|
||||
port = 9000
|
||||
host = "${main_domain}"
|
||||
path = "/default"
|
||||
@@ -1,55 +0,0 @@
|
||||
services:
|
||||
scrutiny:
|
||||
restart: unless-stopped
|
||||
container_name: scrutiny
|
||||
image: ghcr.io/analogj/scrutiny:master-omnibus
|
||||
cap_add:
|
||||
- SYS_RAWIO
|
||||
ports:
|
||||
- 8080 # webapp
|
||||
- 8086 # influxDB admin
|
||||
volumes:
|
||||
- /run/udev:/run/udev:ro
|
||||
- ./config:/opt/scrutiny/config
|
||||
- ./influxdb:/opt/scrutiny/influxdb
|
||||
devices:
|
||||
- "/dev/sda"
|
||||
- "/dev/sdb"
|
||||
|
||||
# PROXMOX USERS: Proxmox LXCs don't have access to S.M.A.R.T data, while this may be possible on VMs using PCI passthrough,
|
||||
# there's another way which is to run the scrutiny collector on proxmox host and have it send data to the scrutiny webapp running in an LXC or VM
|
||||
# so basically you can use the following commented docker-compose (web+db) and run the collector directly on the proxmox host (guide: https://github.com/AnalogJ/scrutiny/blob/master/docs/INSTALL_HUB_SPOKE.md#setting-up-a-spoke-without-docker)
|
||||
|
||||
# services:
|
||||
# influxdb:
|
||||
# restart: unless-stopped
|
||||
# image: influxdb:2.2
|
||||
# ports:
|
||||
# - '8086:8086'
|
||||
# volumes:
|
||||
# - './influxdb:/var/lib/influxdb2'
|
||||
# healthcheck:
|
||||
# test: ["CMD", "curl", "-f", "http://localhost:8086/health"]
|
||||
# interval: 5s
|
||||
# timeout: 10s
|
||||
# retries: 20
|
||||
#
|
||||
#
|
||||
# web:
|
||||
# restart: unless-stopped
|
||||
# image: 'ghcr.io/analogj/scrutiny:master-web'
|
||||
# ports:
|
||||
# - '8080:8080'
|
||||
# volumes:
|
||||
# - './config:/opt/scrutiny/config'
|
||||
# environment:
|
||||
# SCRUTINY_WEB_INFLUXDB_HOST: 'influxdb'
|
||||
# depends_on:
|
||||
# influxdb:
|
||||
# condition: service_healthy
|
||||
# healthcheck:
|
||||
# test: ["CMD", "curl", "-f", "http://localhost:8080/api/health"]
|
||||
# interval: 5s
|
||||
# timeout: 10s
|
||||
# retries: 20
|
||||
# start_period: 10s
|
||||
|
Before Width: | Height: | Size: 42 KiB |
@@ -1 +0,0 @@
|
||||
[config]
|
||||