Merge branch 'Dokploy:canary' into obscreen
@@ -30,6 +30,8 @@ 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]`.
|
||||
@@ -45,17 +47,19 @@ 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), `restart: unless-stopped`, 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), 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`.
|
||||
- **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.
|
||||
- **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,9 +5,6 @@ on:
|
||||
workflows: [Build Preview Deployment]
|
||||
types:
|
||||
- completed
|
||||
pull_request:
|
||||
branches:
|
||||
- canary
|
||||
permissions:
|
||||
actions: read
|
||||
deployments: write
|
||||
|
||||
@@ -17,13 +17,10 @@ jobs:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0 # Necesitamos el historial completo para comparar con base
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Docker Compose
|
||||
run: |
|
||||
echo "🐳 Setting up Docker Compose..."
|
||||
# Docker Compose V2 viene preinstalado en ubuntu-latest
|
||||
docker compose version
|
||||
run: docker compose version
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
@@ -36,282 +33,89 @@ jobs:
|
||||
version: 8
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
echo "📦 Installing Node.js dependencies..."
|
||||
cd build-scripts && pnpm install
|
||||
run: cd build-scripts && pnpm install
|
||||
|
||||
- name: Get changed files
|
||||
id: changed-files
|
||||
- name: Detect changed blueprints
|
||||
id: changed
|
||||
run: |
|
||||
echo "🔍 Detecting changed files..."
|
||||
|
||||
# Obtener la rama base
|
||||
BASE_SHA=$(git merge-base HEAD origin/${{ github.base_ref }})
|
||||
|
||||
# Encontrar todos los archivos docker-compose.yml y template.toml modificados/agregados
|
||||
CHANGED_COMPOSE=$(git diff --name-only --diff-filter=ACMRT $BASE_SHA HEAD | grep -E 'blueprints/.*/docker-compose\.yml$' || true)
|
||||
CHANGED_TOML=$(git diff --name-only --diff-filter=ACMRT $BASE_SHA HEAD | grep -E 'blueprints/.*/template\.toml$' || true)
|
||||
# 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)
|
||||
|
||||
# Crear lista de directorios únicos que tienen cambios
|
||||
CHANGED_DIRS=$(echo -e "$CHANGED_COMPOSE\n$CHANGED_TOML" | sed 's|blueprints/\([^/]*\)/.*|\1|' | sort -u)
|
||||
|
||||
echo "Changed compose files:"
|
||||
echo "$CHANGED_COMPOSE" | while read file; do [ -n "$file" ] && echo " - $file"; done
|
||||
|
||||
echo "Changed TOML files:"
|
||||
echo "$CHANGED_TOML" | while read file; do [ -n "$file" ] && echo " - $file"; done
|
||||
|
||||
echo "Changed directories:"
|
||||
echo "$CHANGED_DIRS" | while read dir; do [ -n "$dir" ] && echo " - $dir"; done
|
||||
|
||||
# Guardar para usar en siguientes pasos
|
||||
echo "compose_files<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$CHANGED_COMPOSE" >> $GITHUB_OUTPUT
|
||||
echo "EOF" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "toml_files<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$CHANGED_TOML" >> $GITHUB_OUTPUT
|
||||
echo "EOF" >> $GITHUB_OUTPUT
|
||||
|
||||
echo "directories<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$CHANGED_DIRS" >> $GITHUB_OUTPUT
|
||||
echo "EOF" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Validate Docker Compose files syntax
|
||||
id: validate-compose-syntax
|
||||
run: |
|
||||
echo "🔍 Validating Docker Compose files syntax..."
|
||||
|
||||
ERROR=0
|
||||
COMPOSE_FILES="${{ steps.changed-files.outputs.compose_files }}"
|
||||
|
||||
if [ -z "$COMPOSE_FILES" ]; then
|
||||
echo "ℹ️ No docker-compose.yml files changed, skipping validation"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "$COMPOSE_FILES" | while read -r compose_file; do
|
||||
if [ -z "$compose_file" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
TEMPLATE_DIR=$(dirname "$compose_file")
|
||||
TEMPLATE_NAME=$(basename "$TEMPLATE_DIR")
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📦 Validating syntax: $TEMPLATE_NAME"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
||||
# Validar sintaxis de docker-compose.yml usando docker compose
|
||||
echo "🔍 Validating docker-compose.yml syntax..."
|
||||
if ! docker compose -f "$compose_file" config > /dev/null 2>&1; then
|
||||
echo "❌ ERROR: docker-compose.yml syntax is invalid in $TEMPLATE_NAME"
|
||||
echo "Running docker compose config to show errors:"
|
||||
docker compose -f "$compose_file" config 2>&1 || true
|
||||
ERROR=1
|
||||
else
|
||||
echo "✅ docker-compose.yml syntax is valid"
|
||||
fi
|
||||
|
||||
# Obtener lista de servicios del compose
|
||||
SERVICES=$(docker compose -f "$compose_file" config --services 2>/dev/null || echo "")
|
||||
echo "📋 Services found in docker-compose.yml:"
|
||||
echo "$SERVICES" | while read service; do
|
||||
[ -n "$service" ] && echo " - $service"
|
||||
done
|
||||
|
||||
# Guardar servicios para validación posterior
|
||||
echo "$SERVICES" > "/tmp/${TEMPLATE_NAME}_services.txt"
|
||||
echo "Changed blueprints:"
|
||||
echo "$CHANGED_BLUEPRINTS" | while read blueprint; do
|
||||
[ -n "$blueprint" ] && echo " - $blueprint"
|
||||
done
|
||||
|
||||
if [ $ERROR -eq 1 ]; then
|
||||
echo ""
|
||||
echo "❌ Docker Compose syntax validation failed"
|
||||
exit 1
|
||||
else
|
||||
echo ""
|
||||
echo "✅ All Docker Compose files have valid syntax"
|
||||
fi
|
||||
# Guardar lista de blueprints (una por línea)
|
||||
echo "blueprints<<EOF" >> $GITHUB_OUTPUT
|
||||
echo "$CHANGED_BLUEPRINTS" >> $GITHUB_OUTPUT
|
||||
echo "EOF" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Validate Docker Compose best practices
|
||||
id: validate-compose-practices
|
||||
- name: Validate blueprints
|
||||
run: |
|
||||
echo "🔍 Validating Docker Compose best practices..."
|
||||
BLUEPRINTS="${{ steps.changed.outputs.blueprints }}"
|
||||
|
||||
ERROR=0
|
||||
COMPOSE_FILES="${{ steps.changed-files.outputs.compose_files }}"
|
||||
|
||||
if [ -z "$COMPOSE_FILES" ]; then
|
||||
echo "ℹ️ No docker-compose.yml files changed, skipping validation"
|
||||
if [ -z "$BLUEPRINTS" ] || [ "$BLUEPRINTS" = "" ]; then
|
||||
echo "ℹ️ No blueprints 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
|
||||
# Convertir a array para evitar problemas con subshells
|
||||
mapfile -t BLUEPRINT_ARRAY <<< "$BLUEPRINTS"
|
||||
|
||||
# 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
|
||||
# Iterar sobre cada blueprint
|
||||
for blueprint in "${BLUEPRINT_ARRAY[@]}"; do
|
||||
[ -z "$blueprint" ] && continue
|
||||
|
||||
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
|
||||
BLUEPRINT_PATH="blueprints/$blueprint"
|
||||
COMPOSE_FILE="$BLUEPRINT_PATH/docker-compose.yml"
|
||||
TOML_FILE="$BLUEPRINT_PATH/template.toml"
|
||||
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "📝 Validating: $template_dir/template.toml"
|
||||
echo "📦 Validating: $blueprint"
|
||||
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"
|
||||
|
||||
# 1. Validar best practices de docker-compose.yml
|
||||
if [ ! -f "$COMPOSE_FILE" ]; then
|
||||
echo "⚠️ WARNING: docker-compose.yml not found"
|
||||
ERROR=1
|
||||
continue
|
||||
fi
|
||||
echo "🔍 Validating docker-compose.yml best practices..."
|
||||
if ! (cd build-scripts && pnpm exec tsx validate-docker-compose.ts --file "../$COMPOSE_FILE" --verbose); then
|
||||
ERROR=1
|
||||
continue
|
||||
fi
|
||||
|
||||
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
|
||||
# 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 "❌ ERROR: Docker Compose file failed full validation"
|
||||
docker compose config 2>&1 || true
|
||||
echo "⚠️ WARNING: template.toml not found"
|
||||
ERROR=1
|
||||
continue
|
||||
fi
|
||||
|
||||
cd - > /dev/null
|
||||
echo "✅ All validations passed for $blueprint"
|
||||
done
|
||||
|
||||
if [ $ERROR -eq 1 ]; then
|
||||
echo ""
|
||||
echo "❌ Docker Compose dry-run test failed"
|
||||
echo "❌ Validation failed for one or more blueprints"
|
||||
exit 1
|
||||
else
|
||||
echo ""
|
||||
echo "✅ All Docker Compose files passed dry-run test"
|
||||
echo "✅ All blueprints validated successfully"
|
||||
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 +1,3 @@
|
||||
node_modules
|
||||
node_modules
|
||||
package-lock.json
|
||||
meta.json.backup.*
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
## Instructions
|
||||
|
||||
We don't have nothing to show here....
|
||||
@@ -6,31 +6,32 @@ x-logging: &x-logging
|
||||
options:
|
||||
max-file: "5"
|
||||
max-size: "10m"
|
||||
|
||||
services:
|
||||
appwrite:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
container_name: appwrite
|
||||
image: appwrite/appwrite:1.8.0
|
||||
<<: *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
|
||||
@@ -43,10 +44,14 @@ services:
|
||||
- _APP_OPTIONS_ABUSE
|
||||
- _APP_OPTIONS_ROUTER_PROTECTION
|
||||
- _APP_OPTIONS_FORCE_HTTPS
|
||||
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS
|
||||
- _APP_OPTIONS_ROUTER_FORCE_HTTPS
|
||||
- _APP_OPENSSL_KEY_V1
|
||||
- _APP_DOMAIN
|
||||
- _APP_DOMAIN_TARGET
|
||||
- _APP_DOMAIN_TARGET_CNAME
|
||||
- _APP_DOMAIN_TARGET_AAAA
|
||||
- _APP_DOMAIN_TARGET_A
|
||||
- _APP_DOMAIN_TARGET_CAA
|
||||
- _APP_DNS
|
||||
- _APP_DOMAIN_FUNCTIONS
|
||||
- _APP_REDIS_HOST
|
||||
- _APP_REDIS_PORT
|
||||
@@ -73,6 +78,7 @@ 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
|
||||
@@ -89,21 +95,26 @@ services:
|
||||
- _APP_STORAGE_WASABI_SECRET
|
||||
- _APP_STORAGE_WASABI_REGION
|
||||
- _APP_STORAGE_WASABI_BUCKET
|
||||
- _APP_FUNCTIONS_SIZE_LIMIT
|
||||
- _APP_COMPUTE_SIZE_LIMIT
|
||||
- _APP_FUNCTIONS_TIMEOUT
|
||||
- _APP_FUNCTIONS_BUILD_TIMEOUT
|
||||
- _APP_FUNCTIONS_CPUS
|
||||
- _APP_FUNCTIONS_MEMORY
|
||||
- _APP_SITES_TIMEOUT
|
||||
- _APP_COMPUTE_BUILD_TIMEOUT
|
||||
- _APP_COMPUTE_CPUS
|
||||
- _APP_COMPUTE_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
|
||||
@@ -120,94 +131,25 @@ 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.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: realtime
|
||||
container_name: appwrite-realtime
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.constraint-label-stack=appwrite"
|
||||
depends_on:
|
||||
- mariadb
|
||||
- redis
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.constraint-label-stack=appwrite"
|
||||
environment:
|
||||
- _APP_ENV
|
||||
- _APP_WORKER_PER_CORE
|
||||
@@ -227,13 +169,10 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-audits:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-audits
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-audits
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -253,13 +192,10 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-webhooks:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-webhooks
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-webhooks
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -281,13 +217,10 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-deletes:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-deletes
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-deletes
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -295,6 +228,7 @@ 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:
|
||||
@@ -315,6 +249,7 @@ 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
|
||||
@@ -336,16 +271,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.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-databases
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-databases
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -365,19 +300,18 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-builds:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
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
|
||||
@@ -398,18 +332,20 @@ services:
|
||||
- _APP_VCS_GITHUB_PRIVATE_KEY
|
||||
- _APP_VCS_GITHUB_APP_ID
|
||||
- _APP_FUNCTIONS_TIMEOUT
|
||||
- _APP_FUNCTIONS_BUILD_TIMEOUT
|
||||
- _APP_FUNCTIONS_CPUS
|
||||
- _APP_FUNCTIONS_MEMORY
|
||||
- _APP_FUNCTIONS_SIZE_LIMIT
|
||||
- _APP_SITES_TIMEOUT
|
||||
- _APP_COMPUTE_BUILD_TIMEOUT
|
||||
- _APP_COMPUTE_CPUS
|
||||
- _APP_COMPUTE_MEMORY
|
||||
- _APP_COMPUTE_SIZE_LIMIT
|
||||
- _APP_OPTIONS_FORCE_HTTPS
|
||||
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS
|
||||
- _APP_OPTIONS_ROUTER_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
|
||||
@@ -426,15 +362,13 @@ services:
|
||||
- _APP_STORAGE_WASABI_SECRET
|
||||
- _APP_STORAGE_WASABI_REGION
|
||||
- _APP_STORAGE_WASABI_BUCKET
|
||||
- _APP_DOMAIN_SITES
|
||||
|
||||
appwrite-worker-certificates:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-certificates
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-certificates
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -446,7 +380,11 @@ services:
|
||||
- _APP_WORKER_PER_CORE
|
||||
- _APP_OPENSSL_KEY_V1
|
||||
- _APP_DOMAIN
|
||||
- _APP_DOMAIN_TARGET
|
||||
- _APP_DOMAIN_TARGET_CNAME
|
||||
- _APP_DOMAIN_TARGET_AAAA
|
||||
- _APP_DOMAIN_TARGET_A
|
||||
- _APP_DOMAIN_TARGET_CAA
|
||||
- _APP_DNS
|
||||
- _APP_DOMAIN_FUNCTIONS
|
||||
- _APP_EMAIL_CERTIFICATES
|
||||
- _APP_REDIS_HOST
|
||||
@@ -461,13 +399,10 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-functions:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-functions
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-functions
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -488,9 +423,10 @@ services:
|
||||
- _APP_DB_USER
|
||||
- _APP_DB_PASS
|
||||
- _APP_FUNCTIONS_TIMEOUT
|
||||
- _APP_FUNCTIONS_BUILD_TIMEOUT
|
||||
- _APP_FUNCTIONS_CPUS
|
||||
- _APP_FUNCTIONS_MEMORY
|
||||
- _APP_SITES_TIMEOUT
|
||||
- _APP_COMPUTE_BUILD_TIMEOUT
|
||||
- _APP_COMPUTE_CPUS
|
||||
- _APP_COMPUTE_MEMORY
|
||||
- _APP_EXECUTOR_SECRET
|
||||
- _APP_EXECUTOR_HOST
|
||||
- _APP_USAGE_STATS
|
||||
@@ -499,13 +435,10 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
|
||||
appwrite-worker-mails:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-mails
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-mails
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
environment:
|
||||
@@ -529,15 +462,14 @@ services:
|
||||
- _APP_SMTP_USERNAME
|
||||
- _APP_SMTP_PASSWORD
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_DOMAIN
|
||||
- _APP_OPTIONS_FORCE_HTTPS
|
||||
|
||||
appwrite-worker-messaging:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-messaging
|
||||
container_name: appwrite-worker-messaging
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
volumes:
|
||||
- appwrite-uploads:/storage/uploads:rw
|
||||
depends_on:
|
||||
@@ -563,6 +495,7 @@ 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
|
||||
@@ -581,13 +514,12 @@ services:
|
||||
- _APP_STORAGE_WASABI_BUCKET
|
||||
|
||||
appwrite-worker-migrations:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-migrations
|
||||
<<: *x-logging
|
||||
container_name: appwrite-worker-migrations
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
volumes:
|
||||
- appwrite-imports:/storage/imports:rw
|
||||
depends_on:
|
||||
- mariadb
|
||||
environment:
|
||||
@@ -595,7 +527,11 @@ services:
|
||||
- _APP_WORKER_PER_CORE
|
||||
- _APP_OPENSSL_KEY_V1
|
||||
- _APP_DOMAIN
|
||||
- _APP_DOMAIN_TARGET
|
||||
- _APP_DOMAIN_TARGET_CNAME
|
||||
- _APP_DOMAIN_TARGET_AAAA
|
||||
- _APP_DOMAIN_TARGET_A
|
||||
- _APP_DOMAIN_TARGET_CAA
|
||||
- _APP_DNS
|
||||
- _APP_EMAIL_SECURITY
|
||||
- _APP_REDIS_HOST
|
||||
- _APP_REDIS_PORT
|
||||
@@ -611,20 +547,21 @@ services:
|
||||
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
|
||||
|
||||
appwrite-task-maintenance:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
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
|
||||
- _APP_DOMAIN_TARGET_CNAME
|
||||
- _APP_DOMAIN_TARGET_AAAA
|
||||
- _APP_DOMAIN_TARGET_A
|
||||
- _APP_DOMAIN_TARGET_CAA
|
||||
- _APP_DNS
|
||||
- _APP_DOMAIN_FUNCTIONS
|
||||
- _APP_OPENSSL_KEY_V1
|
||||
- _APP_REDIS_HOST
|
||||
@@ -641,17 +578,15 @@ 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-worker-usage:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-usage
|
||||
container_name: appwrite-worker-usage
|
||||
appwrite-task-stats-resources:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: stats-resources
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -670,15 +605,39 @@ services:
|
||||
- _APP_REDIS_PASS
|
||||
- _APP_USAGE_STATS
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_USAGE_AGGREGATION_INTERVAL
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_STATS_RESOURCES_INTERVAL
|
||||
|
||||
appwrite-worker-usage-dump:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
entrypoint: worker-usage-dump
|
||||
container_name: appwrite-worker-usage-dump
|
||||
appwrite-worker-stats-resources:
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: worker-stats-resources
|
||||
<<: *x-logging
|
||||
networks:
|
||||
- dokploy-network
|
||||
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
|
||||
depends_on:
|
||||
- redis
|
||||
- mariadb
|
||||
@@ -700,13 +659,10 @@ services:
|
||||
- _APP_USAGE_AGGREGATION_INTERVAL
|
||||
|
||||
appwrite-task-scheduler-functions:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: schedule-functions
|
||||
container_name: appwrite-task-scheduler-functions
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- mariadb
|
||||
- redis
|
||||
@@ -725,13 +681,10 @@ services:
|
||||
- _APP_DB_PASS
|
||||
|
||||
appwrite-task-scheduler-executions:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: schedule-executions
|
||||
container_name: appwrite-task-scheduler-executions
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- mariadb
|
||||
- redis
|
||||
@@ -750,13 +703,10 @@ services:
|
||||
- _APP_DB_PASS
|
||||
|
||||
appwrite-task-scheduler-messages:
|
||||
image: appwrite/appwrite:1.6.1
|
||||
image: appwrite/appwrite:1.8.0
|
||||
entrypoint: schedule-messages
|
||||
container_name: appwrite-task-scheduler-messages
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
depends_on:
|
||||
- mariadb
|
||||
- redis
|
||||
@@ -775,44 +725,48 @@ services:
|
||||
- _APP_DB_PASS
|
||||
|
||||
appwrite-assistant:
|
||||
image: appwrite/assistant:0.4.0
|
||||
container_name: appwrite-assistant
|
||||
image: appwrite/assistant:0.8.3
|
||||
<<: *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.6.11
|
||||
networks:
|
||||
- dokploy-network
|
||||
image: openruntimes/executor:0.7.22
|
||||
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_FUNCTIONS_INACTIVE_THRESHOLD
|
||||
- OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_FUNCTIONS_MAINTENANCE_INTERVAL
|
||||
- OPR_EXECUTOR_NETWORK=$_APP_FUNCTIONS_RUNTIMES_NETWORK
|
||||
- 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_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
|
||||
- OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES,$_APP_SITES_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
|
||||
@@ -831,12 +785,9 @@ services:
|
||||
- OPR_EXECUTOR_STORAGE_WASABI_BUCKET=$_APP_STORAGE_WASABI_BUCKET
|
||||
|
||||
mariadb:
|
||||
image: mariadb:10.11
|
||||
container_name: appwrite-mariadb
|
||||
image: mariadb:10.11 # fix issues when upgrading using: mysql_upgrade -u root -p
|
||||
<<: *x-logging
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- dokploy-network
|
||||
volumes:
|
||||
- appwrite-mariadb:/var/lib/mysql:rw
|
||||
environment:
|
||||
@@ -849,39 +800,30 @@ 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
|
||||
networks:
|
||||
- dokploy-network
|
||||
--maxmemory 512mb
|
||||
--maxmemory-policy allkeys-lru
|
||||
--maxmemory-samples 5
|
||||
volumes:
|
||||
- appwrite-redis:/data:rw
|
||||
|
||||
# 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
|
||||
# clamav:
|
||||
# image: appwrite/clamav:1.2.0
|
||||
# restart: unless-stopped
|
||||
# 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,5 +1,11 @@
|
||||
[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 = [
|
||||
@@ -8,11 +14,19 @@ 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=your-secret-key",
|
||||
"_APP_OPENSSL_KEY_V1=${openssl_key}",
|
||||
"_APP_DOMAIN=${main_domain}",
|
||||
"_APP_DOMAIN_FUNCTIONS=${main_domain}",
|
||||
"_APP_DOMAIN_TARGET=${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_CONSOLE_WHITELIST_ROOT=enabled",
|
||||
"_APP_CONSOLE_WHITELIST_EMAILS=",
|
||||
"_APP_CONSOLE_WHITELIST_IPS=",
|
||||
@@ -32,6 +46,8 @@ 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=",
|
||||
@@ -40,8 +56,8 @@ env = [
|
||||
"_APP_DB_PORT=3306",
|
||||
"_APP_DB_SCHEMA=appwrite",
|
||||
"_APP_DB_USER=user",
|
||||
"_APP_DB_PASS=password",
|
||||
"_APP_DB_ROOT_PASS=rootsecretpassword",
|
||||
"_APP_DB_PASS=${db_user_pw}",
|
||||
"_APP_DB_ROOT_PASS=${db_root_pw}",
|
||||
"_APP_INFLUXDB_HOST=influxdb",
|
||||
"_APP_INFLUXDB_PORT=8086",
|
||||
"_APP_STATSD_HOST=telegraf",
|
||||
@@ -63,6 +79,7 @@ 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",
|
||||
@@ -80,27 +97,36 @@ 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=your-secret-key",
|
||||
"_APP_EXECUTOR_SECRET=${executor_secret}",
|
||||
"_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=runtimes",
|
||||
"_APP_FUNCTIONS_RUNTIMES_NETWORK=dokploy-network",
|
||||
"_APP_COMPUTE_RUNTIMES_NETWORK=dokploy-network",
|
||||
"_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=",
|
||||
@@ -109,9 +135,11 @@ 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",
|
||||
@@ -130,6 +158,18 @@ 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.3.0
|
||||
image: autobase/console:2.5.2
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "80"
|
||||
|
||||
@@ -17,6 +17,9 @@ services:
|
||||
S3_INTERNAL_ENDPOINT: "http://minio:3902"
|
||||
expose:
|
||||
- 3000
|
||||
depends_on:
|
||||
- ps-mysql
|
||||
- minio
|
||||
|
||||
ps-mysql:
|
||||
image: mysql:8.0
|
||||
@@ -34,11 +37,10 @@ services:
|
||||
- ps-mysql:/var/lib/mysql
|
||||
|
||||
minio:
|
||||
image: bitnami/minio:latest
|
||||
image: quay.io/minio/minio:RELEASE.2025-05-24T17-08-30Z
|
||||
restart: unless-stopped
|
||||
command: server /bitnami/minio/data --address ":3902" --console-address ":3903"
|
||||
environment:
|
||||
MINIO_API_PORT_NUMBER: 3902
|
||||
MINIO_CONSOLE_PORT_NUMBER: 3903
|
||||
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
|
||||
expose:
|
||||
@@ -47,6 +49,11 @@ services:
|
||||
volumes:
|
||||
- minio-data:/bitnami/minio/data
|
||||
- minio-certs:/certs
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3902/minio/health/ready"]
|
||||
interval: 30s
|
||||
timeout: 20s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
ps-mysql:
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1,16 @@
|
||||
# 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
|
||||
@@ -0,0 +1,9 @@
|
||||
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/connections/connect-networks/configure-tunnels/tunnel-run-parameters/
|
||||
# https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/configure-tunnels/cloudflared-parameters/run-parameters/
|
||||
"--no-autoupdate",
|
||||
#"--protocol", "http2",
|
||||
|
||||
|
||||
@@ -2,5 +2,7 @@ variables = {}
|
||||
|
||||
[config]
|
||||
domains = []
|
||||
env = ["CLOUDFLARE_TUNNEL_TOKEN=\"<INSERT TOKEN>\""]
|
||||
mounts = []
|
||||
|
||||
[config.env]
|
||||
CLOUDFLARE_TUNNEL_TOKEN = ""
|
||||
|
||||
|
After Width: | Height: | Size: 6.8 KiB |
@@ -0,0 +1,48 @@
|
||||
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:
|
||||
@@ -0,0 +1,16 @@
|
||||
[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}"
|
||||
@@ -32,7 +32,7 @@ services:
|
||||
restart: unless-stopped
|
||||
|
||||
discourse-app:
|
||||
image: docker.io/bitnami/discourse:3.3.2
|
||||
image: docker.io/bitnamilegacy/discourse:3.5.0
|
||||
|
||||
volumes:
|
||||
- discourse-data:/bitnami/discourse
|
||||
@@ -59,7 +59,7 @@ services:
|
||||
restart: unless-stopped
|
||||
|
||||
discourse-sidekiq:
|
||||
image: docker.io/bitnami/discourse:3.3.2
|
||||
image: docker.io/bitnamilegacy/discourse:3.5.0
|
||||
|
||||
volumes:
|
||||
- discourse-sidekiq-data:/bitnami/discourse
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
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:
|
||||
@@ -0,0 +1 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 4.6 KiB |
@@ -0,0 +1,23 @@
|
||||
[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}"
|
||||
@@ -0,0 +1,29 @@
|
||||
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:
|
||||
|
After Width: | Height: | Size: 5.4 KiB |
@@ -0,0 +1,13 @@
|
||||
[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}"
|
||||
@@ -0,0 +1,58 @@
|
||||
# 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
|
||||
@@ -0,0 +1,6 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 940 B |
@@ -0,0 +1,11 @@
|
||||
[variables]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "emqx"
|
||||
port = 18083
|
||||
host = "emqx.yourdomain.com"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "emqx"
|
||||
port = 8083
|
||||
host = "broker.yourdomain.com"
|
||||
@@ -0,0 +1,64 @@
|
||||
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:
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 223 B |
@@ -0,0 +1,29 @@
|
||||
[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}"
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
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: {}
|
||||
|
After Width: | Height: | Size: 22 KiB |
@@ -0,0 +1,12 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = {}
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "jenkins"
|
||||
port = 8080
|
||||
host = "${main_domain}"
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
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: {}
|
||||
|
After Width: | Height: | Size: 40 KiB |
@@ -0,0 +1,15 @@
|
||||
[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}"
|
||||
@@ -0,0 +1,41 @@
|
||||
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'
|
||||
@@ -0,0 +1,50 @@
|
||||
<?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>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1,123 @@
|
||||
[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}"
|
||||
@@ -0,0 +1,26 @@
|
||||
# https://docs.mage.ai/getting-started/setup#docker-compose
|
||||
#
|
||||
# The default credentials are:
|
||||
# USERNAME: admin@admin.com
|
||||
# PASSWORD: admin
|
||||
|
||||
services:
|
||||
mage-ai:
|
||||
image: mageai/mageai:0.9.78
|
||||
command: mage start ${PROJECT_NAME}
|
||||
environment:
|
||||
USER_CODE_PATH: /home/src/${PROJECT_NAME}
|
||||
ENV: ${ENV}
|
||||
expose:
|
||||
- 6789
|
||||
volumes:
|
||||
- mageai_data:/home/src/
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-s", "-f", "-o", "/dev/null", "http://localhost:6789"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
mageai_data:
|
||||
@@ -0,0 +1,38 @@
|
||||
<!-- https://github.com/mage-ai/mage-ai/blob/14f0154629b33968535cf3e23bdf5fd1f4fa6957/docs/favicons/logo/m1.svg -->
|
||||
<svg width="1000" height="1000" viewBox="0 0 1000 1000" fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M458.083 24.2003C484.021 9.22512 515.978 9.22511 541.916 24.2003L891.096 225.8C917.034 240.775 933.012 268.45 933.012 298.401V701.599C933.012 731.55 917.034 759.225 891.096 774.2L541.916 975.8C515.978 990.775 484.021 990.775 458.083 975.8L108.903 774.2C82.9652 759.225 66.9868 731.55 66.9868 701.599V298.401C66.9868 268.45 82.9652 240.775 108.903 225.8L458.083 24.2003Z"
|
||||
fill="black" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
|
||||
fill="#313131" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
|
||||
fill="url(#paint0_linear_7285_95)" />
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M503.344 86.6308C498.131 85.8964 492.73 86.8879 488.024 89.6054L150.576 284.431L144.587 274.06L482.036 79.2339C493.152 72.8159 506.847 72.8159 517.964 79.2339L855.412 274.06C866.528 280.478 873.376 292.338 873.376 305.174V694.826C873.376 707.662 866.528 719.523 855.412 725.94L517.964 920.766C506.847 927.184 493.152 927.184 482.036 920.766L144.587 725.94C133.471 719.523 126.623 707.662 126.623 694.826V305.174C126.623 292.338 133.471 280.478 144.587 274.06L150.576 284.431C148.673 285.529 146.959 286.867 145.461 288.392L500 493.086L678.508 390.024L503.344 86.6308ZM522.347 95.5935L849.424 284.431C851.326 285.529 853.041 286.867 854.539 288.392L688.88 384.036L522.347 95.5935ZM138.599 317.15V694.826C138.599 697.022 138.9 699.176 139.473 701.236L305.132 605.593L138.599 317.15ZM145.461 711.607C146.959 713.133 148.673 714.471 150.576 715.569L477.652 904.407L311.12 615.964L145.461 711.607ZM496.655 913.369C501.868 914.104 507.269 913.112 511.976 910.395L849.424 715.569C851.326 714.471 853.041 713.133 854.539 711.607L500 506.914L321.491 609.976L496.655 913.369ZM861.4 682.85V305.174C861.4 302.978 861.099 300.824 860.527 298.764L694.868 394.407L861.4 682.85ZM511.976 500L684.496 400.395L857.016 699.209L511.976 500ZM142.983 300.791L488.024 500L315.503 599.605L142.983 300.791Z"
|
||||
fill="url(#paint1_linear_7285_95)" />
|
||||
<path
|
||||
d="M687.125 317.066L747.006 423.353L699.7 457.186L700.428 543.86V707.764L411.377 712.575H276.062L236.526 617.365L309.05 500.908L395.509 317.066H687.125Z"
|
||||
fill="black" />
|
||||
<path opacity="0.4"
|
||||
d="M578.227 368.959L657.132 368.96L510.123 650.724L431.219 650.724L578.227 368.959Z"
|
||||
fill="white" />
|
||||
<path
|
||||
d="M510.124 368.96L431.66 368.959L284.652 650.724H363.556L431.22 521.037V650.724H510.123V368.961L510.124 368.96Z"
|
||||
fill="white" />
|
||||
<path d="M578.228 368.96H657.131V650.724H578.228V368.96Z" fill="white" />
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_7285_95" x1="500" y1="74.4204" x2="272.155" y2="925.748"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#00FB82" stop-opacity="0" />
|
||||
<stop offset="1" stop-color="#00FB82" />
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_7285_95" x1="431.137" y1="500" x2="626.946" y2="191.018"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#1DE4FF" stop-opacity="0.1" />
|
||||
<stop offset="1" stop-color="#0A7BFF" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
@@ -0,0 +1,11 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "mage-ai"
|
||||
port = 6789
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
PROJECT_NAME = "mage-ai"
|
||||
ENV = "production"
|
||||
@@ -0,0 +1,131 @@
|
||||
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:
|
||||
@@ -0,0 +1,76 @@
|
||||
<?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>
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
@@ -0,0 +1,52 @@
|
||||
[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"
|
||||
@@ -0,0 +1,29 @@
|
||||
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:
|
||||
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,28 @@
|
||||
[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"
|
||||
@@ -0,0 +1,43 @@
|
||||
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: {}
|
||||
|
After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,30 @@
|
||||
[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"
|
||||
@@ -0,0 +1,86 @@
|
||||
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:
|
||||
@@ -0,0 +1,60 @@
|
||||
<?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>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
@@ -0,0 +1,21 @@
|
||||
[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.0.0
|
||||
image: lindesvard/openpanel-api:2
|
||||
restart: always
|
||||
command: >
|
||||
sh -c "
|
||||
@@ -97,7 +97,7 @@ services:
|
||||
condition: service_healthy
|
||||
|
||||
op-dashboard:
|
||||
image: lindesvard/openpanel-dashboard:2.0.0
|
||||
image: lindesvard/openpanel-dashboard:2
|
||||
restart: always
|
||||
depends_on:
|
||||
op-api:
|
||||
@@ -111,7 +111,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
op-worker:
|
||||
image: lindesvard/openpanel-worker:2.0.0
|
||||
image: lindesvard/openpanel-worker:2
|
||||
restart: always
|
||||
depends_on:
|
||||
op-api:
|
||||
|
||||
@@ -9,6 +9,7 @@ services:
|
||||
- "--web.console.templates=/usr/share/prometheus/consoles"
|
||||
- "--web.enable-lifecycle"
|
||||
volumes:
|
||||
- ../files/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
volumes:
|
||||
prometheus-data: {}
|
||||
|
||||
@@ -10,7 +10,10 @@ port = 9_090
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "/etc/prometheus/prometheus.yml"
|
||||
# Note: this relative path is resolved by Dokploy to the file mounted from
|
||||
# ../files/prometheus.yml in docker-compose, and mapped inside the container
|
||||
# to /etc/prometheus/prometheus.yml.
|
||||
filePath = "prometheus.yml"
|
||||
serviceName = "prometheus"
|
||||
content = """
|
||||
# Prometheus Configuration
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
database:
|
||||
image: mariadb:10.5
|
||||
image: mariadb:11
|
||||
restart: always
|
||||
command: --default-authentication-plugin=mysql_native_password
|
||||
volumes:
|
||||
@@ -14,7 +14,7 @@ services:
|
||||
image: redis:alpine
|
||||
restart: always
|
||||
panel:
|
||||
image: ghcr.io/pyrohost/pyrodactyl:main
|
||||
image: ghcr.io/pyrodactyl-oss/pyrodactyl:latest
|
||||
restart: always
|
||||
links:
|
||||
- database
|
||||
@@ -35,15 +35,8 @@ 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:
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
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:
|
||||
|
After Width: | Height: | Size: 430 KiB |
@@ -0,0 +1,16 @@
|
||||
[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"
|
||||
@@ -0,0 +1,67 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:16-alpine
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_DB: postgres
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
minio:
|
||||
image: minio/minio:latest
|
||||
command: server /data
|
||||
volumes:
|
||||
- minio_data:/data
|
||||
environment:
|
||||
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
|
||||
|
||||
chrome:
|
||||
image: ghcr.io/browserless/chromium:v2.18.0
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
environment:
|
||||
TIMEOUT: 10000
|
||||
CONCURRENT: 10
|
||||
TOKEN: ${CHROME_TOKEN}
|
||||
EXIT_ON_HEALTH_FAILURE: "true"
|
||||
PRE_REQUEST_HEALTH_CHECK: "true"
|
||||
|
||||
app:
|
||||
image: amruthpillai/reactive-resume:latest
|
||||
depends_on:
|
||||
- postgres
|
||||
- minio
|
||||
- chrome
|
||||
environment:
|
||||
PORT: 3000
|
||||
NODE_ENV: production
|
||||
PUBLIC_URL: https://${APP_DOMAIN}
|
||||
STORAGE_URL: https://${APP_DOMAIN}/default
|
||||
CHROME_TOKEN: ${CHROME_TOKEN}
|
||||
CHROME_URL: ws://chrome:3000
|
||||
DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/postgres
|
||||
ACCESS_TOKEN_SECRET: ${ACCESS_TOKEN_SECRET}
|
||||
REFRESH_TOKEN_SECRET: ${REFRESH_TOKEN_SECRET}
|
||||
MAIL_FROM: ${MAIL_FROM}
|
||||
STORAGE_ENDPOINT: minio
|
||||
STORAGE_PORT: 9000
|
||||
STORAGE_REGION: us-east-1
|
||||
STORAGE_BUCKET: default
|
||||
STORAGE_ACCESS_KEY: ${MINIO_ROOT_USER}
|
||||
STORAGE_SECRET_KEY: ${MINIO_ROOT_PASSWORD}
|
||||
STORAGE_USE_SSL: "false"
|
||||
STORAGE_SKIP_BUCKET_CHECK: "false"
|
||||
|
||||
|
||||
volumes:
|
||||
minio_data:
|
||||
postgres_data:
|
||||
@@ -0,0 +1,20 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" width="200" height="200">
|
||||
<defs>
|
||||
<linearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||
<stop offset="0%" style="stop-color:#3b82f6;stop-opacity:1" />
|
||||
<stop offset="100%" style="stop-color:#8b5cf6;stop-opacity:1" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background circle -->
|
||||
<circle cx="100" cy="100" r="95" fill="url(#grad)"/>
|
||||
|
||||
<!-- Document icon -->
|
||||
<rect x="60" y="45" width="80" height="110" rx="5" fill="white"/>
|
||||
<rect x="70" y="60" width="60" height="6" rx="3" fill="#3b82f6"/>
|
||||
<rect x="70" y="75" width="60" height="6" rx="3" fill="#3b82f6"/>
|
||||
<rect x="70" y="90" width="45" height="6" rx="3" fill="#8b5cf6"/>
|
||||
<rect x="70" y="105" width="60" height="6" rx="3" fill="#8b5cf6"/>
|
||||
<rect x="70" y="120" width="50" height="6" rx="3" fill="#8b5cf6"/>
|
||||
<rect x="70" y="135" width="40" height="6" rx="3" fill="#8b5cf6"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 937 B |
@@ -0,0 +1,33 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
postgres_password = "${password:32}"
|
||||
minio_user = "minioadmin"
|
||||
minio_password = "${password:32}"
|
||||
chrome_token = "${password:32}"
|
||||
access_token_secret = "${password:64}"
|
||||
refresh_token_secret = "${password:64}"
|
||||
mail_from = "noreply@${main_domain}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"APP_DOMAIN=${main_domain}",
|
||||
"POSTGRES_PASSWORD=${postgres_password}",
|
||||
"MINIO_ROOT_USER=${minio_user}",
|
||||
"MINIO_ROOT_PASSWORD=${minio_password}",
|
||||
"CHROME_TOKEN=${chrome_token}",
|
||||
"ACCESS_TOKEN_SECRET=${access_token_secret}",
|
||||
"REFRESH_TOKEN_SECRET=${refresh_token_secret}",
|
||||
"MAIL_FROM=${mail_from}",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "app"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "minio"
|
||||
port = 9000
|
||||
host = "${main_domain}"
|
||||
path = "/default"
|
||||
@@ -0,0 +1,55 @@
|
||||
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
|
||||
|
After Width: | Height: | Size: 42 KiB |
@@ -0,0 +1 @@
|
||||
[config]
|
||||
@@ -1,20 +1,18 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
redis:
|
||||
valkey:
|
||||
image: valkey/valkey:8-alpine
|
||||
command: valkey-server --save 30 1 --loglevel warning
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- redis-data:/data
|
||||
- valkey-data:/data
|
||||
|
||||
searxng:
|
||||
image: searxng/searxng:latest
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- searxng-config:/etc/searxng
|
||||
- ../files/searxng:/etc/searxng
|
||||
- searxng-data:/var/cache/searxng
|
||||
|
||||
volumes:
|
||||
redis-data: {}
|
||||
searxng-config: {}
|
||||
valkey-data: {}
|
||||
searxng-data: {}
|
||||
|
||||
@@ -12,11 +12,15 @@ env = [
|
||||
]
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "/etc/searxng/settings.yml"
|
||||
filePath = "/searxng/settings.yml"
|
||||
content = """
|
||||
use_default_settings: true
|
||||
|
||||
server:
|
||||
secret_key: \"${secret_key}\"
|
||||
limiter: false
|
||||
image_proxy: false
|
||||
|
||||
valkey:
|
||||
url: valkey://valkey:6379/0
|
||||
"""
|
||||
@@ -0,0 +1,22 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
streamflow:
|
||||
build:
|
||||
context: https://github.com/bangtutorial/streamflow.git
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- PORT=7575
|
||||
- SESSION_SECRET=${SESSION_SECRET}
|
||||
- NODE_ENV=production
|
||||
- TZ=${TIMEZONE}
|
||||
volumes:
|
||||
- streamflow-db:/app/db
|
||||
- streamflow-logs:/app/logs
|
||||
- streamflow-uploads:/app/public/uploads
|
||||
ports:
|
||||
- 7575
|
||||
|
||||
volumes:
|
||||
streamflow-db: {}
|
||||
streamflow-logs: {}
|
||||
streamflow-uploads: {}
|
||||
|
After Width: | Height: | Size: 399 KiB |
@@ -0,0 +1,15 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
session_secret = "${password:64}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "streamflow"
|
||||
port = 7575
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
SESSION_SECRET = "${session_secret}"
|
||||
TIMEZONE = "Asia/Jakarta"
|
||||
|
||||
[[config.mounts]]
|
||||
@@ -0,0 +1,19 @@
|
||||
services:
|
||||
syncthing:
|
||||
image: lscr.io/linuxserver/syncthing:latest
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 8384
|
||||
- 22000
|
||||
- 21027/udp
|
||||
volumes:
|
||||
- syncthing_config:/config
|
||||
- syncthing_data:/var/syncthing/Sync
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=${timezone}
|
||||
|
||||
volumes:
|
||||
syncthing_config:
|
||||
syncthing_data:
|
||||
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 429 117.3" enable-background="new 0 0 429 117.3" xml:space="preserve">
|
||||
<g>
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="58.666" y1="117.332" x2="58.666" y2="-9.094947e-13">
|
||||
<stop offset="0" style="stop-color:#0882C8"/>
|
||||
<stop offset="1" style="stop-color:#26B6DB"/>
|
||||
</linearGradient>
|
||||
<circle fill="url(#SVGID_1_)" cx="58.7" cy="58.7" r="58.7"/>
|
||||
<g>
|
||||
<circle fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" cx="58.7" cy="58.5" r="43.7"/>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M94.7,47.8c4.7,1.6,9.8-0.9,11.4-5.6c1.6-4.7-0.9-9.8-5.6-11.4c-4.7-1.6-9.8,0.9-11.4,5.6
|
||||
C87.5,41.1,90,46.2,94.7,47.8z"/>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" x1="97.6" y1="39.4" x2="67.5" y2="64.4"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M77.6,91c-0.4,4.9,3.2,9.3,8.2,9.8c5,0.4,9.3-3.2,9.8-8.2c0.4-4.9-3.2-9.3-8.2-9.8
|
||||
C82.4,82.4,78,86,77.6,91z"/>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" x1="86.5" y1="91.8" x2="67.5" y2="64.4"/>
|
||||
</g>
|
||||
<path fill="#FFFFFF" d="M60,69.3c2.7,4.2,8.3,5.4,12.4,2.7c4.2-2.7,5.4-8.3,2.7-12.4c-2.7-4.2-8.3-5.4-12.4-2.7
|
||||
C58.5,59.5,57.3,65.1,60,69.3z"/>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M21.2,61.4c-4.3-2.5-9.8-1.1-12.3,3.1c-2.5,4.3-1.1,9.8,3.1,12.3c4.3,2.5,9.8,1.1,12.3-3.1
|
||||
C26.8,69.5,25.4,64,21.2,61.4z"/>
|
||||
<line fill="none" stroke="#FFFFFF" stroke-width="6" stroke-miterlimit="10" x1="16.6" y1="69.1" x2="67.5" y2="64.4"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#0891D1" d="M163.8,50.2c-0.6-0.7-6.3-4.1-11.4-4.1c-3.4,0-5.2,1.2-5.2,3.5c0,2.9,3.2,3.7,8.9,5.2
|
||||
c8.2,2.2,13.3,5,13.3,12.9c0,9.7-7.8,13-16,13c-6.2,0-13.1-2-18.2-5.3l4.3-8.6c0.8,0.8,7.5,5,14,5c3.5,0,5.2-1.1,5.2-3.2
|
||||
c0-3.2-4.4-4-10.3-5.8c-7.9-2.4-11.5-5.3-11.5-11.8c0-9,7.2-13.9,15.7-13.9c6.1,0,11.6,2.5,15.4,4.7L163.8,50.2z"/>
|
||||
<path fill="#0891D1" d="M175,85.1c1.7,0.5,3.3,0.8,4.4,0.8c2,0,3.3-1.5,4.2-5.5l-11.9-31.5h9.8l7.4,23.3l6.3-23.3h8.9l-12.1,36.6
|
||||
c-1.7,5.3-6.2,8.7-11.8,8.8c-1.7,0-3.5-0.2-5.3-0.9V85.1z"/>
|
||||
<path fill="#0891D1" d="M239.3,80.3h-9.6V62.6c0-4.1-1.7-5.9-4.3-5.9c-2.6,0-5.8,2.3-7,5.6v18.1h-9.6V48.8h8.6v5.3
|
||||
c2.3-3.7,6.8-5.9,12.2-5.9c8.2,0,9.5,6.7,9.5,11.9V80.3z"/>
|
||||
<path fill="#0891D1" d="M261.6,48.2c7.2,0,12.3,3.4,14.8,8.3l-9.4,2.8c-1.2-1.9-3.1-3-5.5-3c-4,0-7,3.2-7,8.2c0,5,3.1,8.3,7,8.3
|
||||
c2.4,0,4.6-1.3,5.5-3.1l9.4,2.9c-2.3,4.9-7.6,8.3-14.8,8.3c-10.6,0-16.9-7.7-16.9-16.4S250.9,48.2,261.6,48.2z"/>
|
||||
<path fill="#0891D1" d="M302.1,78.7c-2.6,1.1-6.2,2.3-9.7,2.3c-4.7,0-8.8-2.3-8.8-8.4V56.1h-4v-7.3h4v-10h9.6v10h6.4v7.3h-6.4v13.1
|
||||
c0,2.1,1.2,2.9,2.8,2.9c1.4,0,3-0.6,4.2-1.1L302.1,78.7z"/>
|
||||
<path fill="#0891D1" d="M337.2,80.3h-9.6V62.6c0-4.1-1.8-5.9-4.6-5.9c-2.3,0-5.5,2.2-6.7,5.6v18.1h-9.6V36.5h9.6v17.6
|
||||
c2.3-3.7,6.3-5.9,10.9-5.9c8.5,0,9.9,6.5,9.9,11.9V80.3z"/>
|
||||
<path fill="#0891D1" d="M343.4,45.2v-8.7h9.6v8.7H343.4z M343.4,80.3V48.8h9.6v31.5H343.4z"/>
|
||||
<path fill="#0891D1" d="M389.9,80.3h-9.6V62.6c0-4.1-1.7-5.9-4.3-5.9c-2.6,0-5.8,2.3-7,5.6v18.1h-9.6V48.8h8.6v5.3
|
||||
c2.3-3.7,6.8-5.9,12.2-5.9c8.2,0,9.5,6.7,9.5,11.9V80.3z"/>
|
||||
<path fill="#0891D1" d="M395.5,64.6c0-9.2,6-16.3,14.6-16.3c4.7,0,8.4,2.2,10.6,5.8v-5.2h8.3v29.3c0,9.6-7.5,15.5-18.2,15.5
|
||||
c-6.8,0-11.5-2.3-15-6.3l5.1-5.2c2.3,2.6,6,4.3,9.9,4.3c4.6,0,8.6-2.4,8.6-8.3v-3.1c-1.9,3.5-5.9,5.3-10,5.3
|
||||
C401.1,80.5,395.5,73.3,395.5,64.6z M419.4,68.5v-6.6c-1.3-3.3-4.2-5.5-7.1-5.5c-4.1,0-7,4-7,8.4c0,4.6,3.2,8,7.5,8
|
||||
C415.7,72.8,418.1,71,419.4,68.5z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
@@ -0,0 +1,9 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
timezone = "America/Sao_Paulo"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "syncthing"
|
||||
port = 8384
|
||||
host = "${main_domain}"
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
[config.env]
|
||||
TAILSCALE_HOSTNAME = ""
|
||||
TAILSCALE_APIKEY = ""
|
||||
TAILSCALE_AUTHKEY = ""
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
umami:
|
||||
image: ghcr.io/umami-software/umami:postgresql-v2.19.0
|
||||
image: ghcr.io/umami-software/umami:3.0.3
|
||||
restart: always
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"]
|
||||
|
||||
@@ -33,6 +33,9 @@ services:
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_EMAIL_ADDRESS: "${ZITADEL_FIRSTINSTANCE_ORG_HUMAN_EMAIL_ADDRESS}"
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_FIRSTNAME: "${ZITADEL_FIRSTINSTANCE_ORG_HUMAN_FIRSTNAME}"
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_LASTNAME: "${ZITADEL_FIRSTINSTANCE_ORG_HUMAN_LASTNAME}"
|
||||
|
||||
# Default Instance Features
|
||||
ZITADEL_DEFAULTINSTANCE_FEATURES_LOGINV2_REQUIRED: false
|
||||
|
||||
depends_on:
|
||||
db:
|
||||
|
||||
@@ -0,0 +1,615 @@
|
||||
{
|
||||
"name": "dokploy-templates-build-scripts",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "dokploy-templates-build-scripts",
|
||||
"version": "1.0.0",
|
||||
"dependencies": {
|
||||
"toml": "^3.0.0",
|
||||
"yaml": "2.7.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.0.0",
|
||||
"tsx": "^4.7.0",
|
||||
"typescript": "^5.3.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/aix-ppc64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
|
||||
"integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"aix"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
|
||||
"integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
|
||||
"integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-x64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
|
||||
"integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"android"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-arm64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
|
||||
"integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-x64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
|
||||
"integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-arm64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
|
||||
"integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-x64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
|
||||
"integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"freebsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
|
||||
"integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
|
||||
"integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ia32": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
|
||||
"integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-loong64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
|
||||
"integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
|
||||
"cpu": [
|
||||
"loong64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-mips64el": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
|
||||
"integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
|
||||
"cpu": [
|
||||
"mips64el"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ppc64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
|
||||
"integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-riscv64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
|
||||
"integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-s390x": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
|
||||
"integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-x64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
|
||||
"integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"linux"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/netbsd-arm64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
|
||||
"integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"netbsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/netbsd-x64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
|
||||
"integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"netbsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/openbsd-arm64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
|
||||
"integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"openbsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/openbsd-x64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
|
||||
"integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"openbsd"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/openharmony-arm64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
|
||||
"integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"openharmony"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/sunos-x64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
|
||||
"integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"sunos"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-arm64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
|
||||
"integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-ia32": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
|
||||
"integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-x64": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
|
||||
"integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"win32"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "20.19.27",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz",
|
||||
"integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"undici-types": "~6.21.0"
|
||||
}
|
||||
},
|
||||
"node_modules/esbuild": {
|
||||
"version": "0.27.2",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
|
||||
"integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"esbuild": "bin/esbuild"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@esbuild/aix-ppc64": "0.27.2",
|
||||
"@esbuild/android-arm": "0.27.2",
|
||||
"@esbuild/android-arm64": "0.27.2",
|
||||
"@esbuild/android-x64": "0.27.2",
|
||||
"@esbuild/darwin-arm64": "0.27.2",
|
||||
"@esbuild/darwin-x64": "0.27.2",
|
||||
"@esbuild/freebsd-arm64": "0.27.2",
|
||||
"@esbuild/freebsd-x64": "0.27.2",
|
||||
"@esbuild/linux-arm": "0.27.2",
|
||||
"@esbuild/linux-arm64": "0.27.2",
|
||||
"@esbuild/linux-ia32": "0.27.2",
|
||||
"@esbuild/linux-loong64": "0.27.2",
|
||||
"@esbuild/linux-mips64el": "0.27.2",
|
||||
"@esbuild/linux-ppc64": "0.27.2",
|
||||
"@esbuild/linux-riscv64": "0.27.2",
|
||||
"@esbuild/linux-s390x": "0.27.2",
|
||||
"@esbuild/linux-x64": "0.27.2",
|
||||
"@esbuild/netbsd-arm64": "0.27.2",
|
||||
"@esbuild/netbsd-x64": "0.27.2",
|
||||
"@esbuild/openbsd-arm64": "0.27.2",
|
||||
"@esbuild/openbsd-x64": "0.27.2",
|
||||
"@esbuild/openharmony-arm64": "0.27.2",
|
||||
"@esbuild/sunos-x64": "0.27.2",
|
||||
"@esbuild/win32-arm64": "0.27.2",
|
||||
"@esbuild/win32-ia32": "0.27.2",
|
||||
"@esbuild/win32-x64": "0.27.2"
|
||||
}
|
||||
},
|
||||
"node_modules/fsevents": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||
"dev": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/get-tsconfig": {
|
||||
"version": "4.13.0",
|
||||
"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz",
|
||||
"integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"resolve-pkg-maps": "^1.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/resolve-pkg-maps": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
|
||||
"integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/toml": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz",
|
||||
"integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/tsx": {
|
||||
"version": "4.21.0",
|
||||
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz",
|
||||
"integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "~0.27.0",
|
||||
"get-tsconfig": "^4.7.5"
|
||||
},
|
||||
"bin": {
|
||||
"tsx": "dist/cli.mjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"fsevents": "~2.3.3"
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "5.9.3",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.17"
|
||||
}
|
||||
},
|
||||
"node_modules/undici-types": {
|
||||
"version": "6.21.0",
|
||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
|
||||
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/yaml": {
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
|
||||
"integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
|
||||
"license": "ISC",
|
||||
"bin": {
|
||||
"yaml": "bin.mjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 14"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -365,8 +365,8 @@
|
||||
{
|
||||
"id": "appwrite",
|
||||
"name": "Appwrite",
|
||||
"version": "1.6.1",
|
||||
"description": "Appwrite is an end-to-end backend server for Web, Mobile, Native, or Backend apps. Appwrite abstracts the complexity and repetitiveness required to build a modern backend API from scratch and allows you to build secure apps faster.\nUsing Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.",
|
||||
"version": "1.8.0",
|
||||
"description": "Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. It includes both a backend server and a fully integrated hosting solution for deploying static and server-side rendered frontends. Appwrite abstracts the complexity and repetitiveness required to build modern apps from scratch and allows you to build secure, full-stack applications faster.\nUsing Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.",
|
||||
"links": {
|
||||
"github": "https://github.com/appwrite/appwrite",
|
||||
"website": "https://appwrite.io/",
|
||||
@@ -376,7 +376,9 @@
|
||||
"tags": [
|
||||
"database",
|
||||
"firebase",
|
||||
"postgres"
|
||||
"mariadb",
|
||||
"hosting",
|
||||
"self-hosted"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -508,8 +510,8 @@
|
||||
{
|
||||
"id": "autobase",
|
||||
"name": "Autobase",
|
||||
"version": "2.3.0",
|
||||
"description": "Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (DBaaS) such as Amazon RDS, Google Cloud SQL, Azure Database, and more.",
|
||||
"version": "2.5.2",
|
||||
"description": "Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (self-hosted DBaaS).",
|
||||
"links": {
|
||||
"github": "https://github.com/vitabaks/autobase",
|
||||
"website": "https://autobase.tech/",
|
||||
@@ -1297,6 +1299,23 @@
|
||||
"console"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cloudflare-ddns",
|
||||
"name": "Cloudflare DDNS",
|
||||
"version": "1.15.1",
|
||||
"description": "A small, feature-rich, and robust Cloudflare DDNS updater.",
|
||||
"logo": "cloudflare-ddns.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/favonia/cloudflare-ddns",
|
||||
"website": "https://github.com/favonia/cloudflare-ddns",
|
||||
"docs": "https://github.com/favonia/cloudflare-ddns"
|
||||
},
|
||||
"tags": [
|
||||
"cloud",
|
||||
"networking",
|
||||
"ddns"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cloudflared",
|
||||
"name": "Cloudflared",
|
||||
@@ -1305,8 +1324,8 @@
|
||||
"logo": "cloudflared.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/cloudflare/cloudflared",
|
||||
"website": "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/",
|
||||
"docs": "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/"
|
||||
"website": "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/",
|
||||
"docs": "https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/"
|
||||
},
|
||||
"tags": [
|
||||
"cloud",
|
||||
@@ -1315,6 +1334,24 @@
|
||||
"tunnel"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cloudreve",
|
||||
"name": "Cloudreve",
|
||||
"version": "4.10.1",
|
||||
"description": "Self-hosted file management and sharing system with multi-cloud storage support. Compatible with local, OneDrive, S3, and various cloud providers.",
|
||||
"logo": "cloudreve.png",
|
||||
"links": {
|
||||
"github": "https://github.com/cloudreve/Cloudreve",
|
||||
"website": "https://cloudreve.org",
|
||||
"docs": "https://docs.cloudreve.org"
|
||||
},
|
||||
"tags": [
|
||||
"storage",
|
||||
"file-sharing",
|
||||
"cloud",
|
||||
"self-hosted"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cockpit",
|
||||
"name": "Cockpit",
|
||||
@@ -1748,7 +1785,7 @@
|
||||
{
|
||||
"id": "discourse",
|
||||
"name": "Discourse",
|
||||
"version": "3.3.2",
|
||||
"version": "3.5.0",
|
||||
"description": "Discourse is a modern forum software for your community. Use it as a mailing list, discussion forum, or long-form chat room.",
|
||||
"logo": "discourse.svg",
|
||||
"links": {
|
||||
@@ -1850,6 +1887,25 @@
|
||||
"grafana"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "dolibarr",
|
||||
"name": "Dolibarr",
|
||||
"version": "21.0.0",
|
||||
"description": "Dolibarr ERP & CRM is a modern software package that helps manage your organization's activities (contacts, quotes, invoices, orders, stocks, agenda, human resources, ecm, manufacturing).",
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/Dolibarr/dolibarr",
|
||||
"website": "https://www.dolibarr.org/",
|
||||
"docs": "https://wiki.dolibarr.org/"
|
||||
},
|
||||
"tags": [
|
||||
"erp",
|
||||
"crm",
|
||||
"business",
|
||||
"management",
|
||||
"invoicing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "domain-locker",
|
||||
"name": "Domain Locker",
|
||||
@@ -2033,6 +2089,23 @@
|
||||
"simple"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "easyappointments",
|
||||
"name": "Easy!Appointments",
|
||||
"version": "1.5.0",
|
||||
"description": "Easy!Appointments is a highly customizable web application that allows customers to book appointments with you via a sophisticated web interface.",
|
||||
"logo": "logo.png",
|
||||
"links": {
|
||||
"github": "https://github.com/alextselegidis/easyappointments",
|
||||
"website": "https://easyappointments.org",
|
||||
"docs": "https://easyappointments.org/docs"
|
||||
},
|
||||
"tags": [
|
||||
"scheduling",
|
||||
"appointments",
|
||||
"booking"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "elastic-search",
|
||||
"name": "Elasticsearch",
|
||||
@@ -2065,6 +2138,23 @@
|
||||
"media system"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "emqx",
|
||||
"name": "EMQX",
|
||||
"version": "6.0.1",
|
||||
"description": "A scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles",
|
||||
"logo": "emqx.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/emqx/emqx",
|
||||
"website": "https://www.emqx.com",
|
||||
"docs": "https://docs.emqx.com"
|
||||
},
|
||||
"tags": [
|
||||
"broker",
|
||||
"iot",
|
||||
"mqtt"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "enshrouded",
|
||||
"name": "Enshrouded",
|
||||
@@ -3080,6 +3170,23 @@
|
||||
"events"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "instantdb",
|
||||
"name": "InstantDB",
|
||||
"version": "latest",
|
||||
"description": "InstantDB is a real-time database server that provides instant data synchronization and real-time updates for applications.",
|
||||
"logo": "instant.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/instantdb/instant/tree/main/server",
|
||||
"website": "https://github.com/instantdb/instant",
|
||||
"docs": "https://github.com/instantdb/instant"
|
||||
},
|
||||
"tags": [
|
||||
"database",
|
||||
"real-time",
|
||||
"self-hosted"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "invoiceshelf",
|
||||
"name": "InvoiceShelf",
|
||||
@@ -3146,6 +3253,25 @@
|
||||
"media system"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "jenkins",
|
||||
"name": "jenkins",
|
||||
"version": "latest",
|
||||
"description": "Jenkins is a free, open-source automation server that helps developers build, test, and deploy software by automating repetitive tasks in the software delivery pipeline.",
|
||||
"logo": "jenkins.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/jenkinsci/jenkins",
|
||||
"website": "https://www.jenkins.io/",
|
||||
"docs": "https://www.jenkins.io/doc/"
|
||||
},
|
||||
"tags": [
|
||||
"ci-cd",
|
||||
"devops",
|
||||
"automation",
|
||||
"pipelines",
|
||||
"open-source"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "kaneo",
|
||||
"name": "Kaneo",
|
||||
@@ -3306,6 +3432,22 @@
|
||||
"web"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "komari-monitor",
|
||||
"name": "Komari Monitor",
|
||||
"version": "latest",
|
||||
"description": "A lightweight, self-hosted server monitoring tool for tracking server performance.",
|
||||
"logo": "komari-monitor.ico",
|
||||
"links": {
|
||||
"github": "https://github.com/komari-monitor/komari",
|
||||
"website": "https://github.com/komari-monitor/komari",
|
||||
"docs": "https://github.com/komari-monitor/komari#readme"
|
||||
},
|
||||
"tags": [
|
||||
"monitoring",
|
||||
"self-hosted"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "kutt",
|
||||
"name": "Kutt",
|
||||
@@ -3337,6 +3479,22 @@
|
||||
"ai"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "lavalink",
|
||||
"name": "Lavalink",
|
||||
"version": "4.1.1",
|
||||
"description": "Lavalink is an open source standalone audio sending node based on Lavaplayer.",
|
||||
"logo": "lavalink.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/lavalink-devs/Lavalink",
|
||||
"website": "https://lavalink.dev/",
|
||||
"docs": "https://lavalink.dev/getting-started/index.html"
|
||||
},
|
||||
"tags": [
|
||||
"voice",
|
||||
"discord"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "letterfeed",
|
||||
"name": "Letterfeed",
|
||||
@@ -3596,6 +3754,24 @@
|
||||
"os"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "mage-ai",
|
||||
"name": "Mage AI",
|
||||
"version": "0.9.78",
|
||||
"description": "Build, run, and manage data pipelines for integrating and transforming data.",
|
||||
"logo": "mage-ai.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/mage-ai/mage-ai",
|
||||
"website": "https://mage.ai",
|
||||
"docs": "https://docs.mage.ai"
|
||||
},
|
||||
"tags": [
|
||||
"data",
|
||||
"dbt",
|
||||
"etl",
|
||||
"pipelines"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "mailpit",
|
||||
"name": "Mailpit",
|
||||
@@ -3628,6 +3804,24 @@
|
||||
"self-hosted"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "mautic",
|
||||
"name": "Mautic",
|
||||
"version": "5.1.1",
|
||||
"description": "Mautic is the world's largest open-source marketing automation project. It allows you to automate the process of finding and nurturing contacts through landing pages and forms, sending email, text messages, web notifications, and tracking your contacts.",
|
||||
"logo": "mautic.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/mautic/mautic",
|
||||
"website": "https://www.mautic.org/",
|
||||
"docs": "https://docs.mautic.org/en"
|
||||
},
|
||||
"tags": [
|
||||
"marketing",
|
||||
"automation",
|
||||
"email",
|
||||
"crm"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "maybe",
|
||||
"name": "Maybe",
|
||||
@@ -3782,6 +3976,24 @@
|
||||
"media"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "minepanel",
|
||||
"name": "Minepanel",
|
||||
"version": "1.7.1",
|
||||
"description": "Web panel for managing Minecraft servers with Docker. Create, configure, start/stop, and monitor multiple instances from a modern UI.",
|
||||
"logo": "minepanel.webp",
|
||||
"links": {
|
||||
"github": "https://github.com/Ketbome/minepanel",
|
||||
"website": "https://minepanel.ketbome.lat",
|
||||
"docs": "https://minepanel.ketbome.lat"
|
||||
},
|
||||
"tags": [
|
||||
"gaming",
|
||||
"minecraft",
|
||||
"server-management",
|
||||
"docker"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "minio",
|
||||
"name": "Minio",
|
||||
@@ -3797,6 +4009,23 @@
|
||||
"storage"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "misaka-danmu-server",
|
||||
"name": "Misaka Danmu Server",
|
||||
"version": "latest",
|
||||
"description": "A self-hosted danmaku (bullet comments) server for live streaming and video platforms.",
|
||||
"logo": "misaka-danmu-server.png",
|
||||
"links": {
|
||||
"github": "https://github.com/l429609201/misaka_danmu_server",
|
||||
"website": "https://github.com/l429609201/misaka_danmu_server",
|
||||
"docs": "https://github.com/l429609201/misaka_danmu_server#readme"
|
||||
},
|
||||
"tags": [
|
||||
"streaming",
|
||||
"danmaku",
|
||||
"live"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "mixpost",
|
||||
"name": "Mixpost",
|
||||
@@ -4330,6 +4559,27 @@
|
||||
"surrealdb"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "openclaw",
|
||||
"name": "Openclaw",
|
||||
"version": "2026.1.29",
|
||||
"description": "WhatsApp gateway CLI with Pi RPC agent - self-hosted AI-powered messaging platform",
|
||||
"logo": "openclaw.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/openclaw/openclaw",
|
||||
"website": "https://openclaw.ai/",
|
||||
"docs": "https://docs.openclaw.ai/"
|
||||
},
|
||||
"tags": [
|
||||
"whatsapp",
|
||||
"ai",
|
||||
"messaging",
|
||||
"chatbot",
|
||||
"gateway",
|
||||
"self-hosted",
|
||||
"automation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "opengist",
|
||||
"name": "OpenGist",
|
||||
@@ -4998,6 +5248,24 @@
|
||||
"file-sharing"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "qbitwebui",
|
||||
"name": "qBittorrent Web UI",
|
||||
"version": "latest",
|
||||
"description": "A modern web interface for managing multiple qBittorrent instances. Built with React, Hono, and Bun.",
|
||||
"logo": "qbitwebui.png",
|
||||
"links": {
|
||||
"github": "https://github.com/Maciejonos/qbitwebui",
|
||||
"website": "https://github.com/Maciejonos/qbitwebui",
|
||||
"docs": "https://github.com/Maciejonos/qbitwebui#readme"
|
||||
},
|
||||
"tags": [
|
||||
"torrent",
|
||||
"download",
|
||||
"media",
|
||||
"qbittorrent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "qdrant",
|
||||
"name": "Qdrant",
|
||||
@@ -5051,6 +5319,24 @@
|
||||
"rabbitmq"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "reactive-resume",
|
||||
"name": "Reactive Resume",
|
||||
"version": "latest",
|
||||
"description": "A free and open-source resume builder that simplifies the process of creating, updating, and sharing your resume.",
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/AmruthPillai/Reactive-Resume",
|
||||
"website": "https://rxresu.me/",
|
||||
"docs": "https://docs.rxresu.me/"
|
||||
},
|
||||
"tags": [
|
||||
"resume",
|
||||
"cv",
|
||||
"productivity",
|
||||
"document"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "registry",
|
||||
"name": "Docker Registry",
|
||||
@@ -5238,6 +5524,22 @@
|
||||
"self-hosted"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "scrutiny",
|
||||
"name": "Scrutiny",
|
||||
"version": "latest",
|
||||
"description": "Hard Drive S.M.A.R.T Monitoring, Historical Trends & Real World Failure Thresholds",
|
||||
"logo": "scrutiny.png",
|
||||
"links": {
|
||||
"github": "https://github.com/AnalogJ/scrutiny/",
|
||||
"website": "",
|
||||
"docs": ""
|
||||
},
|
||||
"tags": [
|
||||
"monitoring",
|
||||
"NAS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "scrypted",
|
||||
"name": "Scrypted",
|
||||
@@ -5504,6 +5806,25 @@
|
||||
"open-source"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "streamflow",
|
||||
"name": "StreamFlow",
|
||||
"version": "2.1",
|
||||
"description": "StreamFlow is a multi-platform live streaming web application that enables simultaneous RTMP streaming to YouTube, Facebook, and other platforms with video gallery, scheduled streaming, and real-time monitoring.",
|
||||
"logo": "streamflow.png",
|
||||
"links": {
|
||||
"github": "https://github.com/bangtutorial/streamflow",
|
||||
"website": "https://github.com/bangtutorial/streamflow",
|
||||
"docs": "https://github.com/bangtutorial/streamflow#readme"
|
||||
},
|
||||
"tags": [
|
||||
"streaming",
|
||||
"rtmp",
|
||||
"video",
|
||||
"live-streaming",
|
||||
"media"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "supabase",
|
||||
"name": "SupaBase",
|
||||
@@ -5558,6 +5879,23 @@
|
||||
"surrealdb"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "syncthing",
|
||||
"name": "Syncthing",
|
||||
"version": "latest",
|
||||
"description": "Syncthing is a continuous file synchronization program that synchronizes files between two or more computers in real time.",
|
||||
"logo": "syncthing.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/syncthing/syncthing",
|
||||
"website": "https://syncthing.net/",
|
||||
"docs": "https://docs.syncthing.net/"
|
||||
},
|
||||
"tags": [
|
||||
"file-sync",
|
||||
"synchronization",
|
||||
"backup"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "tailscale-exitnode",
|
||||
"name": "Tailscale Exit nodes",
|
||||
@@ -5796,7 +6134,7 @@
|
||||
{
|
||||
"id": "umami",
|
||||
"name": "Umami",
|
||||
"version": "v2.19.0",
|
||||
"version": "v3.0.3",
|
||||
"description": "Umami is a simple, fast, privacy-focused alternative to Google Analytics.",
|
||||
"logo": "umami.png",
|
||||
"links": {
|
||||
|
||||