Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd7b6227ac | ||
|
|
9a934f751d | ||
|
|
a02cd9a477 | ||
|
|
59bd702e5a |
@@ -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,3 @@
|
||||
node_modules
|
||||
package-lock.json
|
||||
meta.json.backup.*
|
||||
|
||||
|
||||
@@ -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:
|
||||
@@ -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",
|
||||
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
variables = {}
|
||||
|
||||
[config]
|
||||
isolated = false
|
||||
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]
|
||||
@@ -1,18 +1,20 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
valkey:
|
||||
redis:
|
||||
image: valkey/valkey:8-alpine
|
||||
command: valkey-server --save 30 1 --loglevel warning
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- valkey-data:/data
|
||||
- redis-data:/data
|
||||
|
||||
searxng:
|
||||
image: searxng/searxng:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ../files/searxng:/etc/searxng
|
||||
- searxng-config:/etc/searxng
|
||||
- searxng-data:/var/cache/searxng
|
||||
|
||||
volumes:
|
||||
valkey-data: {}
|
||||
redis-data: {}
|
||||
searxng-config: {}
|
||||
searxng-data: {}
|
||||
|
||||
@@ -12,15 +12,11 @@ env = [
|
||||
]
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "/searxng/settings.yml"
|
||||
filePath = "/etc/searxng/settings.yml"
|
||||
content = """
|
||||
use_default_settings: true
|
||||
|
||||
server:
|
||||
secret_key: \"${secret_key}\"
|
||||
limiter: false
|
||||
image_proxy: false
|
||||
|
||||
valkey:
|
||||
url: valkey://valkey:6379/0
|
||||
"""
|
||||