Merge branch 'Dokploy:canary' into canary
1
.gitignore
vendored
@@ -1,4 +1,3 @@
|
||||
node_modules
|
||||
package-lock.json
|
||||
meta.json.backup.*
|
||||
|
||||
|
||||
10
AGENTS.md
@@ -170,6 +170,16 @@ This document provides essential context for AI models interacting with this pro
|
||||
- **Env:** Array of strings: `env = ["KEY=VALUE", "DB_PASSWORD=${db_pass}"]`
|
||||
- **Available helpers:** `${domain}`, `${password:length}`, `${base64:length}`, `${hash:length}`, `${uuid}`, `${randomPort}`, `${email}`, `${username}`, `${timestamp}`, `${timestamps:datetime}`, `${timestampms:datetime}`, `${jwt:secret_var:payload_var}`
|
||||
- **JWT helper example:** `${jwt:mysecret:mypayload}` with payload containing `exp: ${timestamps:2030-01-01T00:00:00Z}`
|
||||
- **Volume bind mounts (in docker-compose.yml):** When mounting host paths, do NOT use absolute paths like `"/folder:/path/in/container"`. Use relative paths instead:
|
||||
```yaml
|
||||
# Invalid
|
||||
volumes:
|
||||
- "/folder:/path/in/container" ❌
|
||||
# Valid
|
||||
volumes:
|
||||
- "../files/my-database:/var/lib/mysql" ✅
|
||||
- "../files/my-configs:/etc/my-app/config" ✅
|
||||
```
|
||||
|
||||
- **meta.json Requirements:**
|
||||
|
||||
|
||||
@@ -20,6 +20,11 @@ This project adheres to the [Contributor Covenant Code of Conduct](https://www.c
|
||||
|
||||
For larger changes or questions, open an issue first to discuss your ideas.
|
||||
|
||||
### Pull Request Guidelines
|
||||
|
||||
- **Keep PRs small and focused.** Avoid very large PRs; prefer several smaller PRs (e.g., one template or one logical change per PR). This speeds up review and keeps the history clear.
|
||||
- **Test before submitting.** Any PR that has not been tested by the contributor will be closed. This keeps the PR queue tidy and ensures that only contributions that have been verified by their authors are considered.
|
||||
|
||||
## Adding a New Template
|
||||
|
||||
To add a new template, follow these steps:
|
||||
|
||||
4
blueprints/ackee/instructions.md
Normal file
@@ -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"
|
||||
|
||||
8
blueprints/cloudflare-ddns/cloudflare-ddns.svg
Normal file
@@ -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 |
16
blueprints/cloudflare-ddns/docker-compose.yml
Normal file
@@ -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
|
||||
9
blueprints/cloudflare-ddns/template.toml
Normal file
@@ -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 = ""
|
||||
|
||||
BIN
blueprints/cloudreve/cloudreve.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
48
blueprints/cloudreve/docker-compose.yml
Normal file
@@ -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:
|
||||
16
blueprints/cloudreve/template.toml
Normal file
@@ -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}"
|
||||
58
blueprints/emqx/docker-compose.yml
Normal file
@@ -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
|
||||
6
blueprints/emqx/emqx.svg
Normal file
@@ -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 |
11
blueprints/emqx/template.toml
Normal file
@@ -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"
|
||||
@@ -1,13 +1,18 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
server:
|
||||
image: docker.io/awinterstein/habitica-server:latest
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- mongo
|
||||
mongo:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
- NODE_DB_URI=mongodb://mongo/habitica
|
||||
NODE_DB_URI: "mongodb://${MONGO_HABITICA_USER}:${MONGO_HABITICA_PASSWORD}@mongo/habitica?authSource=habitica"
|
||||
INVITE_ONLY: "${INVITE_ONLY}"
|
||||
EMAIL_SERVER_URL: "${EMAIL_SERVER_URL}"
|
||||
EMAIL_SERVER_PORT: "${EMAIL_SERVER_PORT}"
|
||||
EMAIL_SERVER_AUTH_USER: "${EMAIL_SERVER_AUTH_USER}"
|
||||
EMAIL_SERVER_AUTH_PASSWORD: "${EMAIL_SERVER_AUTH_PASSWORD}"
|
||||
ADMIN_EMAIL: "${ADMIN_EMAIL}"
|
||||
|
||||
client:
|
||||
image: docker.io/awinterstein/habitica-client:latest
|
||||
@@ -20,12 +25,64 @@ services:
|
||||
mongo:
|
||||
image: docker.io/mongo:latest
|
||||
restart: unless-stopped
|
||||
command: ["--replSet", "rs", "--bind_ip_all", "--port", "27017"]
|
||||
command: >
|
||||
bash -c "
|
||||
echo \"${MONGO_KEYFILE_CONTENT}\" > /etc/mongo-keyfile &&
|
||||
chown 999:999 /etc/mongo-keyfile &&
|
||||
chmod 400 /etc/mongo-keyfile &&
|
||||
exec docker-entrypoint.sh mongod --replSet rs --bind_ip_all --port 27017 --keyFile /etc/mongo-keyfile
|
||||
"
|
||||
environment:
|
||||
MONGO_INITDB_ROOT_USERNAME: ${MONGO_ADMIN_USER}
|
||||
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_ADMIN_PASSWORD}
|
||||
MONGO_KEYFILE_CONTENT: ${MONGO_KEYFILE_CONTENT}
|
||||
MONGO_HABITICA_USER: ${MONGO_HABITICA_USER}
|
||||
MONGO_HABITICA_PASSWORD: ${MONGO_HABITICA_PASSWORD}
|
||||
# ---------------------------------------------------------
|
||||
# SMART HEALTHCHECK: Auto-fixes Hostname Mismatches for replicaSet
|
||||
# ---------------------------------------------------------
|
||||
healthcheck:
|
||||
test: echo "try { rs.status() } catch (err) { rs.initiate() }" | mongosh --port 27017 --quiet
|
||||
interval: 10s
|
||||
timeout: 30s
|
||||
retries: 30
|
||||
test: |
|
||||
mongosh --port 27017 --quiet -u "${MONGO_ADMIN_USER}" -p "${MONGO_ADMIN_PASSWORD}" --authenticationDatabase admin --eval "
|
||||
try {
|
||||
// 1. Hostname Fix
|
||||
const config = rs.conf();
|
||||
const currentHost = require('os').hostname() + ':27017';
|
||||
if (config.members[0].host !== currentHost) {
|
||||
config.members[0].host = currentHost;
|
||||
rs.reconfig(config, { force: true });
|
||||
}
|
||||
|
||||
// 2. User Creation Logic
|
||||
const targetDb = db.getSiblingDB('habitica');
|
||||
const hUser = process.env.MONGO_HABITICA_USER;
|
||||
const hPass = process.env.MONGO_HABITICA_PASSWORD;
|
||||
|
||||
// We can only check/create users if we are Primary
|
||||
if (rs.isMaster().ismaster) {
|
||||
if (!targetDb.getUser(hUser)) {
|
||||
print('Creating missing user ' + hUser + '...');
|
||||
targetDb.createUser({ user: hUser, pwd: hPass, roles: ['readWrite'] });
|
||||
}
|
||||
// SUCCESS: User exists and we are Primary
|
||||
quit(0);
|
||||
} else {
|
||||
// We are not Primary yet (still electing), so we cannot confirm user exists.
|
||||
// Fail the check so the dependent app waits.
|
||||
print('Waiting for Primary state...');
|
||||
quit(1);
|
||||
}
|
||||
} catch (err) {
|
||||
// If not initialized, initiate and FAIL this check so we wait for the next cycle
|
||||
try {
|
||||
rs.initiate({ _id: 'rs', members: [{ _id: 0, host: require('os').hostname() + ':27017' }] });
|
||||
} catch (e) {}
|
||||
quit(1);
|
||||
}
|
||||
"
|
||||
interval: 5s
|
||||
timeout: 10s
|
||||
retries: 20
|
||||
volumes:
|
||||
- habitica-mongo-data:/data/db
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
mail_password = "${password:32}"
|
||||
mongo_key = "${base64:756}"
|
||||
mongo_admin_password = "${password}"
|
||||
mongo_habitica_password = "${password}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
@@ -9,16 +12,21 @@ port = 80
|
||||
host = "habitica.${main_domain}"
|
||||
|
||||
[config.env]
|
||||
|
||||
BASE_URL="https://habitica.${main_domain}"
|
||||
INVITE_ONLY="false"
|
||||
EMAIL_SERVER_URL="mail.example.com"
|
||||
EMAIL_SERVER_PORT="587"
|
||||
EMAIL_SERVER_AUTH_USER="mail_user"
|
||||
EMAIL_SERVER_AUTH_PASSWORD="${mail_password}"
|
||||
BASE_URL = "https://habitica.${main_domain}"
|
||||
INVITE_ONLY = "false"
|
||||
EMAIL_SERVER_URL = "mail.example.com"
|
||||
EMAIL_SERVER_PORT = "587"
|
||||
EMAIL_SERVER_AUTH_USER = "mail_user"
|
||||
EMAIL_SERVER_AUTH_PASSWORD = "${mail_password}"
|
||||
MONGO_KEYFILE_CONTENT = "${mongo_key}"
|
||||
MONGO_ADMIN_USER = "admin"
|
||||
MONGO_ADMIN_PASSWORD = "${mongo_admin_password}"
|
||||
MONGO_HABITICA_USER = "habitica"
|
||||
MONGO_HABITICA_PASSWORD = "${mongo_habitica_password}"
|
||||
ADMIN_EMAIL = "no-reply@${main_domain}"
|
||||
|
||||
[[config.mounts]]
|
||||
serviceName = "mongo"
|
||||
type = "volume"
|
||||
source = "habitica-mongo-data"
|
||||
target = "/data/db"
|
||||
target = "/data/db"
|
||||
|
||||
64
blueprints/instantdb/docker-compose.yml
Normal file
@@ -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:
|
||||
|
||||
4
blueprints/instantdb/instant.svg
Normal file
@@ -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 |
29
blueprints/instantdb/template.toml
Normal file
@@ -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}"
|
||||
|
||||
@@ -20,8 +20,7 @@ services:
|
||||
image: invoiceshelf/invoiceshelf:nightly
|
||||
|
||||
volumes:
|
||||
- invoiceshelf-app-data:/data
|
||||
- invoiceshelf-app-conf:/conf
|
||||
- invoiceshelf-storage:/var/www/html/storage
|
||||
environment:
|
||||
- PHP_TZ=UTC
|
||||
- TIMEZONE=UTC
|
||||
@@ -49,5 +48,4 @@ services:
|
||||
|
||||
volumes:
|
||||
invoiceshelf-postgres-data:
|
||||
invoiceshelf-app-data:
|
||||
invoiceshelf-app-conf:
|
||||
invoiceshelf-storage:
|
||||
|
||||
17
blueprints/ipfs/docker-compose.yml
Normal file
@@ -0,0 +1,17 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
ipfs:
|
||||
image: ipfs/kubo:latest
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- IPFS_PROFILE=server
|
||||
volumes:
|
||||
- ipfs_data:/data/ipfs
|
||||
- ipfs_staging:/export
|
||||
ports:
|
||||
- 4001
|
||||
- 8080
|
||||
- 5001
|
||||
volumes:
|
||||
ipfs_data: {}
|
||||
ipfs_staging: {}
|
||||
1
blueprints/ipfs/ipfs.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="34.3 0 443.4 512"><defs><linearGradient id="a" x1="84.315" x2="527.72" y1="771.51" y2="771.51" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#4a9ea1"/></linearGradient><linearGradient id="b" x1="99.675" x2="512.36" y1="771.48" y2="771.48" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#63d3d7"/></linearGradient></defs><path fill="url(#a)" d="m84.315 899.51 221.7 128 221.7-128v-256l-221.7-127.99-221.7 128z" transform="translate(-50.017 -515.51)"/><path fill="url(#b)" d="m283.13 546.35-160.74 92.806a38.4 38.4 0 0 1 0 8.59l160.75 92.805c13.554-10 32.043-10 45.597 0l160.75-92.807a38.3 38.3 0 0 1-.001-8.588l-160.74-92.806c-13.554 10.001-32.044 10.001-45.599 0zm221.79 127.03L344 767.22c1.884 16.739-7.361 32.751-22.799 39.489l.18 184.58a38.4 38.4 0 0 1 7.439 4.294l160.75-92.805c-1.884-16.739 7.36-32.752 22.799-39.49v-185.61a38.4 38.4 0 0 1-7.44-4.294zm-397.81 1.032a38.4 38.4 0 0 1-7.438 4.295v185.61c15.438 6.738 24.683 22.75 22.799 39.489l160.74 92.806a38.4 38.4 0 0 1 7.44-4.295v-185.61c-15.439-6.738-24.684-22.75-22.8-39.49l-160.74-92.81z" transform="translate(-50.017 -515.51)"/><path fill-opacity=".251" d="m256 512 221.7-128V128L256 256z"/><path fill-opacity=".039" d="M256 512V256L34.3 128v256z"/><path fill-opacity=".13" d="m34.298 128 221.7 128 221.7-128-221.7-128z"/><path fill="#fff" d="M103.09 186h-29.2v141.2h29.2zm50.88 141.2v-51.8c7.2.6 14.4.6 20.4.6 41.6 0 53.6-20.6 53.6-46 0-30.8-22-44-56-44h-47.2v141.2zm15.8-71.8c-5.4 0-13.4 0-15.8-.2v-48h18.2c17.6 0 27.6 8.4 27.6 23.8v.4c0 12-4.4 24-30 24M327.95 186h-88.6v141.2h29.2V265h55.4v-21.2h-55.6v-36.4h57.6zm95.56 27.6 7.6-19.6c-11.4-8.2-26.8-11.2-46.2-11.2-28.2 0-51.4 13.2-51.4 40.2 0 24.2 17.8 33.8 35.6 39.6l17.8 6c12.2 4.2 22.2 8.2 22.2 21.4 0 12-10.4 16.8-26.2 16.8-16 0-33.2-4.8-43-11l-7.6 21.2c12.8 8.2 29 12.2 50.8 12.2 31 0 55-13.6 55-42.6 0-27-20.6-35.6-41.4-42.6l-19.4-6.4c-8.4-2.8-14.8-6.6-14.8-17.4 0-11 9-15.4 22.4-15.4 16.4 0 29.2 3 38.6 8.8"/></svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
25
blueprints/ipfs/template.toml
Normal file
@@ -0,0 +1,25 @@
|
||||
[variables]
|
||||
gateway_domain = "${domain}"
|
||||
api_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "ipfs"
|
||||
port = 8080
|
||||
host = "${gateway_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "ipfs"
|
||||
port = 5001
|
||||
host = "${api_domain}"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "/container-init.d/001-configure-api.sh"
|
||||
content = """
|
||||
#!/bin/sh
|
||||
ipfs config Addresses.API /ip4/0.0.0.0/tcp/5001
|
||||
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
|
||||
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST", "GET"]'
|
||||
"""
|
||||
13
blueprints/jenkins/docker-compose.yml
Normal file
@@ -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: {}
|
||||
1
blueprints/jenkins/jenkins.svg
Normal file
|
After Width: | Height: | Size: 22 KiB |
12
blueprints/jenkins/template.toml
Normal file
@@ -0,0 +1,12 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = {}
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "jenkins"
|
||||
port = 8080
|
||||
host = "${main_domain}"
|
||||
|
||||
13
blueprints/komari-monitor/docker-compose.yml
Normal file
@@ -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: {}
|
||||
BIN
blueprints/komari-monitor/komari-monitor.ico
Normal file
|
After Width: | Height: | Size: 40 KiB |
15
blueprints/komari-monitor/template.toml
Normal file
@@ -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}"
|
||||
41
blueprints/lavalink/docker-compose.yml
Normal file
@@ -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'
|
||||
50
blueprints/lavalink/lavalink.svg
Normal file
@@ -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 |
123
blueprints/lavalink/template.toml
Normal file
@@ -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}"
|
||||
131
blueprints/mautic/docker-compose.yml
Normal file
@@ -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:
|
||||
76
blueprints/mautic/mautic.svg
Normal file
@@ -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 |
52
blueprints/mautic/template.toml
Normal file
@@ -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"
|
||||
29
blueprints/minepanel/docker-compose.yml
Normal file
@@ -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:
|
||||
BIN
blueprints/minepanel/minepanel.webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
28
blueprints/minepanel/template.toml
Normal file
@@ -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"
|
||||
43
blueprints/misaka-danmu-server/docker-compose.yml
Normal file
@@ -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: {}
|
||||
BIN
blueprints/misaka-danmu-server/misaka-danmu-server.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
30
blueprints/misaka-danmu-server/template.toml
Normal file
@@ -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"
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
nextcloud:
|
||||
image: nextcloud:30.0.2
|
||||
image: nextcloud:32.0.5
|
||||
restart: always
|
||||
|
||||
ports:
|
||||
|
||||
86
blueprints/openclaw/docker-compose.yml
Normal file
@@ -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:
|
||||
60
blueprints/openclaw/openclaw.svg
Normal file
@@ -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 |
21
blueprints/openclaw/template.toml
Normal file
@@ -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:
|
||||
|
||||
33
blueprints/postgres-pgdog/docker-compose.yml
Normal file
@@ -0,0 +1,33 @@
|
||||
services:
|
||||
postgres-pgdog:
|
||||
image: ${PGDOG_IMAGE}
|
||||
restart: unless-stopped
|
||||
# Uncomment 'ports' settings below to enable external access
|
||||
# ports:
|
||||
# - "6432:6432"
|
||||
volumes:
|
||||
- ../files/pgdog.toml:/pgdog/pgdog.toml
|
||||
- ../files/users.toml:/pgdog/users.toml
|
||||
environment:
|
||||
- RUST_LOG=${RUST_LOG}
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
|
||||
postgres:
|
||||
image: ${POSTGRES_IMAGE}
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- POSTGRES_USER=${POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
- POSTGRES_DB=${POSTGRES_DB}
|
||||
volumes:
|
||||
- postgres-data:/var/lib/postgresql
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
postgres-data:
|
||||
BIN
blueprints/postgres-pgdog/postgres-pgdog.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
36
blueprints/postgres-pgdog/template.toml
Normal file
@@ -0,0 +1,36 @@
|
||||
[variables]
|
||||
postgres_user = "${username}"
|
||||
postgres_password = "${password:32}"
|
||||
postgres_db = "postgres"
|
||||
pgdog_image = "ghcr.io/pgdogdev/pgdog:v0.1.26"
|
||||
postgres_image = "postgres:18-alpine"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "pgdog.toml"
|
||||
content = """
|
||||
[general]
|
||||
host = "0.0.0.0"
|
||||
port = 6432
|
||||
|
||||
[[databases]]
|
||||
name = "${postgres_db}"
|
||||
host = "postgres"
|
||||
port = 5432
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "users.toml"
|
||||
content = """
|
||||
[[users]]
|
||||
name = "${postgres_user}"
|
||||
database = "${postgres_db}"
|
||||
password = "${postgres_password}"
|
||||
"""
|
||||
|
||||
[config.env]
|
||||
POSTGRES_USER = "${postgres_user}"
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
POSTGRES_DB = "${postgres_db}"
|
||||
PGDOG_IMAGE = "${pgdog_image}"
|
||||
POSTGRES_IMAGE = "${postgres_image}"
|
||||
RUST_LOG = "info"
|
||||
22
blueprints/pulse/docker-compose.yml
Normal file
@@ -0,0 +1,22 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
pulse:
|
||||
image: rcourtman/pulse:5.1
|
||||
restart: always
|
||||
expose:
|
||||
- 7655
|
||||
volumes:
|
||||
- pulse_data:/data
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
environment:
|
||||
- PULSE_AUTH_USER=${PULSE_AUTH_USER}
|
||||
- PULSE_AUTH_PASS=${PULSE_AUTH_PASS}
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:7655/api/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
|
||||
volumes:
|
||||
pulse_data:
|
||||
4
blueprints/pulse/pulse.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="128" height="128" rx="20" fill="#3B82F6"/>
|
||||
<path d="M20 64H35L45 44L55 84L65 24L75 74L85 54L100 64H108" stroke="white" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 304 B |
13
blueprints/pulse/template.toml
Normal file
@@ -0,0 +1,13 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
pulse_auth_user = "${username}"
|
||||
pulse_auth_pass = "${password:32}"
|
||||
|
||||
[config]
|
||||
env = ["PULSE_AUTH_USER=${pulse_auth_user}", "PULSE_AUTH_PASS=${pulse_auth_pass}"]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "pulse"
|
||||
port = 7_655
|
||||
host = "${main_domain}"
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
database:
|
||||
image: mariadb: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:
|
||||
|
||||
39
blueprints/qbitwebui/docker-compose.yml
Normal file
@@ -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:
|
||||
BIN
blueprints/qbitwebui/qbitwebui.png
Normal file
|
After Width: | Height: | Size: 430 KiB |
16
blueprints/qbitwebui/template.toml
Normal file
@@ -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"
|
||||
55
blueprints/scrutiny/docker-compose.yml
Normal file
@@ -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
|
||||
BIN
blueprints/scrutiny/scrutiny.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
1
blueprints/scrutiny/template.toml
Normal file
@@ -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
|
||||
"""
|
||||
114
blueprints/seaweedfs/docker-compose.yml
Normal file
@@ -0,0 +1,114 @@
|
||||
services:
|
||||
master:
|
||||
image: chrislusf/seaweedfs:4.02
|
||||
command: >
|
||||
-v=0
|
||||
master
|
||||
-volumeSizeLimitMB=10240
|
||||
-ip=master
|
||||
-ip.bind=0.0.0.0
|
||||
-port=9333
|
||||
-mdir=/data/master
|
||||
volumes:
|
||||
- seaweedfs-master:/data/master
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "-q", "--spider", "http://localhost:9333"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
expose:
|
||||
- 9333
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
reservations:
|
||||
memory: 256M
|
||||
|
||||
volume:
|
||||
image: chrislusf/seaweedfs:4.02
|
||||
command: >
|
||||
-v=0
|
||||
volume
|
||||
-mserver="master:9333"
|
||||
-port=8080
|
||||
-dir=/data/volume
|
||||
-max=100
|
||||
volumes:
|
||||
- seaweedfs-volume:/data/volume
|
||||
depends_on:
|
||||
master:
|
||||
condition: service_healthy
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 8080
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 1G
|
||||
reservations:
|
||||
memory: 512M
|
||||
|
||||
filer:
|
||||
image: chrislusf/seaweedfs:4.02
|
||||
command: >
|
||||
-v=0
|
||||
filer
|
||||
-defaultReplicaPlacement=000
|
||||
-master="master:9333"
|
||||
-ip=filer
|
||||
-ip.bind=0.0.0.0
|
||||
-port=8888
|
||||
environment:
|
||||
- WEED_MASTER=master:9333
|
||||
volumes:
|
||||
- seaweedfs-filer:/data
|
||||
depends_on:
|
||||
- master
|
||||
- volume
|
||||
restart: unless-stopped
|
||||
# # Secure the GUI with username/password
|
||||
# labels:
|
||||
# # htpasswd -nb admin admin
|
||||
# - "traefik.http.middlewares.basic-auth.basicauth.users=admin:$$apr1$$aLLYxhdC$$ZAW26eJfBRC8qWjCkcZns."
|
||||
# - "traefik.http.routers.service-name.middlewares=basic-auth"
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "-q", "--spider", "http://localhost:8888"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 1G
|
||||
reservations:
|
||||
memory: 512M
|
||||
expose:
|
||||
- 8888
|
||||
|
||||
s3:
|
||||
image: chrislusf/seaweedfs:4.02
|
||||
command: >
|
||||
-v=0
|
||||
s3
|
||||
-filer="filer:8888"
|
||||
-ip.bind=0.0.0.0
|
||||
-port=8333
|
||||
environment:
|
||||
- AWS_ACCESS_KEY_ID=${S3_ACCESS_KEY}
|
||||
- AWS_SECRET_ACCESS_KEY=${S3_SECRET_KEY}
|
||||
restart: unless-stopped
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
reservations:
|
||||
memory: 256M
|
||||
expose:
|
||||
- 8333
|
||||
|
||||
volumes:
|
||||
seaweedfs-master:
|
||||
seaweedfs-volume:
|
||||
seaweedfs-filer:
|
||||
317
blueprints/seaweedfs/seaweedfs.svg
Normal file
|
After Width: | Height: | Size: 39 KiB |
27
blueprints/seaweedfs/template.toml
Normal file
@@ -0,0 +1,27 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
filer_domain = "filer.${domain}"
|
||||
master_domain = "master.${domain}"
|
||||
s3_domain = "s3.${domain}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "filer"
|
||||
port = 8888
|
||||
host = "${filer_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "master"
|
||||
port = 9333
|
||||
host = "${master_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "s3"
|
||||
port = 8333
|
||||
host = "${s3_domain}"
|
||||
|
||||
[config.env]
|
||||
S3_ACCESS_KEY = "admin"
|
||||
S3_SECRET_KEY = "${password:16}"
|
||||
58
blueprints/strapi/docker-compose.yml
Normal file
@@ -0,0 +1,58 @@
|
||||
# Self-host guide:
|
||||
# - https://strapi.io/blog/how-to-self-host-your-headless-cms-using-docker-compose
|
||||
|
||||
services:
|
||||
strapi:
|
||||
image: elestio/strapi-production:v5.33.0
|
||||
environment:
|
||||
# https://docs.strapi.io/cms/configurations/environment
|
||||
NODE_ENV: production
|
||||
STRAPI_TELEMETRY_DISABLED: true
|
||||
STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE: en
|
||||
FAST_REFRESH: true
|
||||
JWT_SECRET: ${JWT_SECRET}
|
||||
ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
|
||||
DATABASE_CLIENT: postgres
|
||||
DATABASE_HOST: strapi_postgres
|
||||
DATABASE_PORT: 5432
|
||||
DATABASE_NAME: strapi
|
||||
DATABASE_USERNAME: strapi
|
||||
DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
volumes:
|
||||
- strapi_data:/srv/app
|
||||
expose:
|
||||
- 1337
|
||||
depends_on:
|
||||
- strapi_postgres
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
- wget
|
||||
- "-q"
|
||||
- "--spider"
|
||||
- "http://127.0.0.1:1337"
|
||||
start_period: 3s
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
strapi_postgres:
|
||||
image: postgres:18
|
||||
environment:
|
||||
POSTGRES_DB: strapi
|
||||
POSTGRES_USER: strapi
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
volumes:
|
||||
- strapi_postgres_data:/var/lib/postgresql
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD-SHELL
|
||||
- "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"
|
||||
start_period: 3s
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
strapi_data:
|
||||
strapi_postgres_data:
|
||||
23
blueprints/strapi/strapi.svg
Normal file
@@ -0,0 +1,23 @@
|
||||
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M0 22.1867C0 11.7278 0 6.49832 3.24916 3.24916C6.49832 0 11.7278 0 22.1867 0H41.8133C52.2722 0 57.5017 0 60.7508 3.24916C64 6.49832 64 11.7278 64 22.1867V41.8133C64 52.2722 64 57.5017 60.7508 60.7508C57.5017 64 52.2722 64 41.8133 64H22.1867C11.7278 64 6.49832 64 3.24916 60.7508C0 57.5017 0 52.2722 0 41.8133V22.1867Z"
|
||||
fill="#4945FF"
|
||||
/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd"
|
||||
d="M44.156 19.4131H22.6094V30.4004H33.596V41.3864H44.5827V19.8398C44.5827 19.6041 44.3917 19.4131 44.156 19.4131Z"
|
||||
fill="white"
|
||||
/>
|
||||
<rect x="33.1719" y="30.4004" width="0.426667" height="0.426667" fill="white" />
|
||||
<path
|
||||
d="M22.6172 30.4004H33.1772C33.4128 30.4004 33.6039 30.5914 33.6039 30.8271V41.3871H23.0439C22.8082 41.3871 22.6172 41.196 22.6172 40.9604V30.4004Z"
|
||||
fill="#9593FF"
|
||||
/>
|
||||
<path
|
||||
d="M33.6016 41.3867H44.5882L33.9657 52.0092C33.8314 52.1436 33.6016 52.0484 33.6016 51.8584V41.3867Z"
|
||||
fill="#9593FF"
|
||||
/>
|
||||
<path
|
||||
d="M22.6151 30.3998H12.1434C11.9534 30.3998 11.8582 30.17 11.9926 30.0356L22.6151 19.4131V30.3998Z"
|
||||
fill="#9593FF"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
15
blueprints/strapi/template.toml
Normal file
@@ -0,0 +1,15 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
postgres_password = "${password:32}"
|
||||
jwt_secret = "${password:32}"
|
||||
admin_jwt_secret = "${password:32}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "strapi"
|
||||
port = 1337
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
JWT_SECRET = "${jwt_secret}"
|
||||
ADMIN_JWT_SECRET = "${admin_jwt_secret}"
|
||||
22
blueprints/streamflow/docker-compose.yml
Normal file
@@ -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: {}
|
||||
BIN
blueprints/streamflow/streamflow.png
Normal file
|
After Width: | Height: | Size: 399 KiB |
15
blueprints/streamflow/template.toml
Normal file
@@ -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]]
|
||||
@@ -77,6 +77,7 @@ services:
|
||||
SUPABASE_SERVICE_KEY: ${SERVICE_ROLE_KEY}
|
||||
DASHBOARD_USERNAME: ${DASHBOARD_USERNAME}
|
||||
DASHBOARD_PASSWORD: ${DASHBOARD_PASSWORD}
|
||||
CONTAINER_PREFIX: ${CONTAINER_PREFIX}
|
||||
# https://unix.stackexchange.com/a/294837
|
||||
entrypoint: bash -c 'eval "echo \"$$(cat ~/temp.yml)\"" > ~/kong.yml && /docker-entrypoint.sh kong docker-start'
|
||||
|
||||
|
||||
@@ -309,7 +309,7 @@ services:
|
||||
## Secure Realtime routes
|
||||
- name: realtime-v1-ws
|
||||
_comment: 'Realtime: /realtime/v1/* -> ws://realtime:4000/socket/*'
|
||||
url: http://realtime-dev.supabase-realtime:4000/socket
|
||||
url: http://realtime-dev.${CONTAINER_PREFIX}-realtime:4000/socket
|
||||
protocol: ws
|
||||
routes:
|
||||
- name: realtime-v1-ws
|
||||
@@ -329,7 +329,7 @@ services:
|
||||
- anon
|
||||
- name: realtime-v1-rest
|
||||
_comment: 'Realtime: /realtime/v1/* -> ws://realtime:4000/socket/*'
|
||||
url: http://realtime-dev.supabase-realtime:4000/api
|
||||
url: http://realtime-dev.${CONTAINER_PREFIX}-realtime:4000/api
|
||||
protocol: http
|
||||
routes:
|
||||
- name: realtime-v1-rest
|
||||
@@ -850,7 +850,7 @@ transforms:
|
||||
kong: '.appname == "supabase-kong"'
|
||||
auth: '.appname == "supabase-auth"'
|
||||
rest: '.appname == "supabase-rest"'
|
||||
realtime: '.appname == "realtime-dev.supabase-realtime"'
|
||||
realtime: '.appname == "realtime-dev.${CONTAINER_PREFIX}-realtime"'
|
||||
storage: '.appname == "supabase-storage"'
|
||||
functions: '.appname == "supabase-edge-functions"'
|
||||
db: '.appname == "supabase-db"'
|
||||
|
||||
@@ -15,23 +15,14 @@
|
||||
# ## NETWORK INSTRUCTIONS
|
||||
#
|
||||
# If you want to connect superset with other internal databases managed by
|
||||
# Dokploy (on dokploy-network) using internal hostnames, you will need to
|
||||
# uncomment the `networks` section, both for the superset container and
|
||||
# at the very bottom of this docker-compose template.
|
||||
# Dokploy using internal hostnames, you will need to connect the `superset`
|
||||
# container to those networks.
|
||||
#
|
||||
# Note that the `superset` service name/hostname will not be unique on the
|
||||
# global `dokploy-network`. If you plan to:
|
||||
#
|
||||
# 1. deploy a second instance of superset on dokploy-network, and
|
||||
# 2. have other containers on dokploy-network utilise the second instance's
|
||||
# Superset API (https://superset.apache.org/docs/api)
|
||||
#
|
||||
# Please change the service name of the second instance.
|
||||
|
||||
services:
|
||||
superset:
|
||||
image: amancevice/superset
|
||||
restart: always
|
||||
image: amancevice/superset:6.0.0
|
||||
restart: unless-stopped
|
||||
#networks:
|
||||
# - dokploy-network
|
||||
depends_on:
|
||||
@@ -52,14 +43,14 @@ services:
|
||||
REDIS_HOST: superset_redis
|
||||
|
||||
superset_postgres:
|
||||
image: postgres
|
||||
restart: always
|
||||
image: postgres:18
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: ${POSTGRES_USER}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
POSTGRES_DB: ${POSTGRES_DB}
|
||||
volumes:
|
||||
- superset_postgres_data:/var/lib/postgresql/data
|
||||
- superset_postgres_data:/var/lib/postgresql
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
|
||||
interval: 30s
|
||||
@@ -67,8 +58,8 @@ services:
|
||||
retries: 3
|
||||
|
||||
superset_redis:
|
||||
image: redis
|
||||
restart: always
|
||||
image: redis:8
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- superset_redis_data:/data
|
||||
command: redis-server --requirepass ${REDIS_PASSWORD}
|
||||
@@ -78,10 +69,6 @@ services:
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
#networks:
|
||||
# dokploy-network:
|
||||
# external: true
|
||||
|
||||
volumes:
|
||||
superset_postgres_data:
|
||||
superset_redis_data:
|
||||
|
||||
@@ -3,7 +3,6 @@ main_domain = "${domain}"
|
||||
secret_key = "${password:30}"
|
||||
postgres_password = "${password:30}"
|
||||
redis_password = "${password:30}"
|
||||
mapbox_api_key = ""
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "superset"
|
||||
@@ -12,7 +11,7 @@ host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
SECRET_KEY = "${secret_key}"
|
||||
MAPBOX_API_KEY = "${mapbox_api_key}"
|
||||
MAPBOX_API_KEY = ""
|
||||
POSTGRES_DB = "superset"
|
||||
POSTGRES_USER = "superset"
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
|
||||
19
blueprints/syncthing/docker-compose.yml
Normal file
@@ -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:
|
||||
54
blueprints/syncthing/syncthing.svg
Normal file
@@ -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 |
9
blueprints/syncthing/template.toml
Normal file
@@ -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 = ""
|
||||
23
blueprints/trilium-next/docker-compose.yml
Executable file
@@ -0,0 +1,23 @@
|
||||
# Running `docker-compose up` will create/use the "trilium-data" directory in the user home
|
||||
services:
|
||||
trilium_next:
|
||||
# Optionally, replace `latest` with a version tag like `v0.110.3`
|
||||
# Using `latest` may cause unintended updates to the container
|
||||
image: triliumnext/trilium:v0.101.3
|
||||
# Restart the container unless it was stopped by the user
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- TRILIUM_DATA_DIR=/home/node/trilium-data
|
||||
ports:
|
||||
# By default, Trilium will be available at http://localhost:8080
|
||||
# It will also be accessible at http://<host-ip>:8080
|
||||
# You might want to limit this with something like Docker Networks, reverse proxies, or firewall rules,
|
||||
# however be aware that using UFW is known to not work with default Docker installations, see:
|
||||
# https://docs.docker.com/engine/network/packet-filtering-firewalls/#docker-and-ufw
|
||||
- "8080"
|
||||
volumes:
|
||||
# Unless TRILIUM_DATA_DIR is set, the data will be stored in the "trilium-data" directory in the home directory.
|
||||
# This can also be changed with by replacing the line below with `- /path/of/your/choice:/home/node/trilium-data
|
||||
- ${TRILIUM_DATA_DIR:-~/trilium-data}:/home/node/trilium-data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
13
blueprints/trilium-next/template.toml
Executable file
@@ -0,0 +1,13 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"TRILIUM_DATA_DIR=/root"
|
||||
]
|
||||
mount = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "trilium_next"
|
||||
port = 8080
|
||||
host = "${main_domain}"
|
||||
2
blueprints/trilium-next/trilium-next-logo.svg
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg enable-background="new 0 0 256 256" version="1.1" viewBox="0 0 256 256" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><title>Trilium Notes</title><style type="text/css"> .st0{fill:#95C980;} .st1{fill:#72B755;} .st2{fill:#4FA52B;} .st3{fill:#EE8C89;} .st4{fill:#E96562;} .st5{fill:#E33F3B;} .st6{fill:#EFB075;} .st7{fill:#E99547;} .st8{fill:#E47B19;} </style><g><path class="st0" d="m202.9 112.7c-22.5 16.1-54.5 12.8-74.9 6.3l14.8-11.8 14.1-11.3 49.1-39.3-51.2 35.9-14.3 10-14.9 10.5c0.7-21.2 7-49.9 28.6-65.4 1.8-1.3 3.9-2.6 6.1-3.8 2.7-1.5 5.7-2.9 8.8-4.1 27.1-11.1 68.5-15.3 85.2-9.5 0.1 16.2-15.9 45.4-33.9 65.9-2.4 2.8-4.9 5.4-7.4 7.8-3.4 3.5-6.8 6.4-10.1 8.8z"/><path class="st1" d="m213.1 104c-22.2 12.6-51.4 9.3-70.3 3.2l14.1-11.3 49.1-39.3-51.2 35.9-14.3 10c0.5-18.1 4.9-42.1 19.7-58.6 2.7-1.5 5.7-2.9 8.8-4.1 27.1-11.1 68.5-15.3 85.2-9.5 0.1 16.2-15.9 45.4-33.9 65.9-2.3 2.8-4.8 5.4-7.2 7.8z"/><path class="st2" d="m220.5 96.2c-21.1 8.6-46.6 5.3-63.7-0.2l49.2-39.4-51.2 35.9c0.3-15.8 3.5-36.6 14.3-52.8 27.1-11.1 68.5-15.3 85.2-9.5 0.1 16.2-15.9 45.4-33.8 66z"/><path class="st3" d="m106.7 179c-5.8-21 5.2-43.8 15.5-57.2l4.8 14.2 4.5 13.4 15.9 47-12.8-47.6-3.6-13.2-3.7-13.9c15.5 6.2 35.1 18.6 40.7 38.8 0.5 1.7 0.9 3.6 1.2 5.5 0.4 2.4 0.6 5 0.7 7.7 0.9 23.1-7.1 54.9-15.9 65.7-12-4.3-29.3-24-39.7-42.8-1.4-2.6-2.7-5.1-3.8-7.6-1.6-3.5-2.9-6.8-3.8-10z"/><path class="st4" d="m110.4 188.9c-3.4-19.8 6.9-40.5 16.6-52.9l4.5 13.4 15.9 47-12.8-47.6-3.6-13.2c13.3 5.2 29.9 15 38.1 30.4 0.4 2.4 0.6 5 0.7 7.7 0.9 23.1-7.1 54.9-15.9 65.7-12-4.3-29.3-24-39.7-42.8-1.4-2.6-2.7-5.2-3.8-7.7z"/><path class="st5" d="m114.2 196.5c-0.7-18 8.6-35.9 17.3-47.1l15.9 47-12.8-47.6c11.6 4.4 26.1 12.4 35.2 24.8 0.9 23.1-7.1 54.9-15.9 65.7-12-4.3-29.3-24-39.7-42.8z"/><path class="st6" d="m86.3 59.1c21.7 10.9 32.4 36.6 35.8 54.9l-15.2-6.6-14.5-6.3-50.6-22 48.8 24.9 13.6 6.9 14.3 7.3c-16.6 7.9-41.3 14.5-62.1 4.1-1.8-0.9-3.6-1.9-5.4-3.2-2.3-1.5-4.5-3.2-6.8-5.1-19.9-16.4-40.3-46.4-42.7-61.5 12.4-6.5 41.5-5.8 64.8-0.3 3.2 0.8 6.2 1.6 9.1 2.5 4 1.3 7.6 2.8 10.9 4.4z"/><path class="st7" d="m75.4 54.8c18.9 12 28.4 35.6 31.6 52.6l-14.5-6.3-50.6-22 48.7 24.9 13.6 6.9c-14.1 6.8-34.5 13-53.3 8.2-2.3-1.5-4.5-3.2-6.8-5.1-19.8-16.4-40.2-46.4-42.6-61.5 12.4-6.5 41.5-5.8 64.8-0.3 3.1 0.8 6.2 1.6 9.1 2.6z"/><path class="st8" d="m66.3 52.2c15.3 12.8 23.3 33.6 26.1 48.9l-50.6-22 48.8 24.9c-12.2 6-29.6 11.8-46.5 10-19.8-16.4-40.2-46.4-42.6-61.5 12.4-6.5 41.5-5.8 64.8-0.3z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
trmnl-byos-laravel:
|
||||
image: ghcr.io/usetrmnl/byos_laravel:0.21.0
|
||||
image: ghcr.io/usetrmnl/byos_laravel:0.27.0
|
||||
environment:
|
||||
- APP_URL=${APP_URL}
|
||||
- PHP_OPCACHE_ENABLE=${PHP_OPCACHE_ENABLE}
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
uptime-kuma:
|
||||
image: louislam/uptime-kuma:1.23.15
|
||||
image: louislam/uptime-kuma:2.1.0
|
||||
restart: always
|
||||
volumes:
|
||||
- uptime-kuma-data:/app/data
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
vikunja:
|
||||
image: vikunja/vikunja
|
||||
user: "0:0"
|
||||
environment:
|
||||
VIKUNJA_SERVICE_PUBLICURL: http://vikunja.local
|
||||
VIKUNJA_DATABASE_HOST: db
|
||||
VIKUNJA_SERVICE_PUBLICURL: ${VIKUNJA_SERVICE_PUBLICURL}
|
||||
VIKUNJA_PUBLIC_PORT: ${VIKUNJA_PUBLIC_PORT}
|
||||
VIKUNJA_DATABASE_HOST: ${VIKUNJA_DATABASE_HOST}
|
||||
VIKUNJA_DATABASE_PASSWORD: ${VIKUNJA_DATABASE_PASSWORD}
|
||||
VIKUNJA_DATABASE_TYPE: postgres
|
||||
VIKUNJA_DATABASE_USER: vikunja
|
||||
VIKUNJA_DATABASE_DATABASE: vikunja
|
||||
VIKUNJA_DATABASE_TYPE: ${VIKUNJA_DATABASE_TYPE}
|
||||
VIKUNJA_DATABASE_USER: ${VIKUNJA_DATABASE_USER}
|
||||
VIKUNJA_DATABASE_DATABASE: ${VIKUNJA_DATABASE_DATABASE}
|
||||
VIKUNJA_SERVICE_JWTSECRET: ${VIKUNJA_SERVICE_JWTSECRET}
|
||||
expose:
|
||||
ports:
|
||||
- 3456
|
||||
volumes:
|
||||
- vikunja-files:/app/vikunja/files
|
||||
@@ -24,15 +24,16 @@ services:
|
||||
image: postgres:17
|
||||
environment:
|
||||
POSTGRES_PASSWORD: ${VIKUNJA_DATABASE_PASSWORD}
|
||||
POSTGRES_USER: vikunja
|
||||
POSTGRES_DB: vikunja
|
||||
POSTGRES_USER: ${VIKUNJA_DATABASE_USER}
|
||||
POSTGRES_DB: ${VIKUNJA_DATABASE_DATABASE}
|
||||
volumes:
|
||||
- vikunja-db:/var/lib/postgresql/data
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -h localhost -U $$POSTGRES_USER"]
|
||||
interval: 2s
|
||||
start_period: 30s
|
||||
test: ["CMD-SHELL", "pg_isready", "-U", "${VIKUNJA_DATABASE_USER}", "-d", "${VIKUNJA_DATABASE_DATABASE}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
vikunja-files: {}
|
||||
|
||||
@@ -18,10 +18,6 @@ VIKUNJA_DATABASE_USER = "vikunja"
|
||||
VIKUNJA_DATABASE_DATABASE = "vikunja"
|
||||
VIKUNJA_SERVICE_JWTSECRET = "${jwt_secret}"
|
||||
|
||||
POSTGRES_PASSWORD = "${db_password}"
|
||||
POSTGRES_USER = "vikunja"
|
||||
POSTGRES_DB = "vikunja"
|
||||
|
||||
[[config.mounts]]
|
||||
serviceName = "vikunja"
|
||||
volumeName = "vikunja-files"
|
||||
|
||||
@@ -3,24 +3,23 @@ volumes:
|
||||
|
||||
services:
|
||||
wg-easy:
|
||||
image: ghcr.io/wg-easy/wg-easy:15
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- WG_HOST=${WIREGUARD_HOST}
|
||||
- PASSWORD=${WIREGUARD_PASSWORD}
|
||||
- WG_PORT=51820
|
||||
- INIT_ENABLED=1
|
||||
- INIT_HOST=${WIREGUARD_HOST}
|
||||
- INIT_PORT=51820
|
||||
- INIT_USERNAME=admin
|
||||
- INIT_PASSWORD=${WIREGUARD_PASSWORD}
|
||||
- INIT_DNS=1.1.1.1,8.8.8.8
|
||||
- PORT=51821
|
||||
- WG_MTU=1280
|
||||
- WG_DEFAULT_DNS=1.1.1.1,8.8.8.8
|
||||
- WG_ALLOWED_IPS=0.0.0.0/0
|
||||
- WG_POST_UP=iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT;
|
||||
- WG_POST_DOWN=iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT;
|
||||
image: ghcr.io/wg-easy/wg-easy:15
|
||||
container_name: wg-easy
|
||||
volumes:
|
||||
- etc_wireguard:/etc/wireguard
|
||||
- /lib/modules:/lib/modules:ro
|
||||
ports:
|
||||
- "51820:51820/udp"
|
||||
- "51821:51821/tcp"
|
||||
restart: unless-stopped
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_MODULE
|
||||
|
||||
36
blueprints/wuzapi/docker-compose.yml
Normal file
@@ -0,0 +1,36 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
wuzapi-server:
|
||||
image: asternic/wuzapi:sha-30c1805
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 8080
|
||||
environment:
|
||||
- WUZAPI_ADMIN_TOKEN=${WUZAPI_ADMIN_TOKEN}
|
||||
- WUZAPI_GLOBAL_ENCRYPTION_KEY=${WUZAPI_GLOBAL_ENCRYPTION_KEY}
|
||||
- DB_USER=${DB_USER:-wuzapi}
|
||||
- DB_PASSWORD=${DB_PASSWORD:-wuzapi}
|
||||
- DB_NAME=${DB_NAME:-wuzapi}
|
||||
- DB_HOST=db
|
||||
- DB_PORT=5432
|
||||
- TZ=${TZ:-UTC}
|
||||
depends_on:
|
||||
- db
|
||||
|
||||
db:
|
||||
image: postgres:16-alpine
|
||||
restart: always
|
||||
environment:
|
||||
POSTGRES_USER: ${DB_USER:-wuzapi}
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD:-wuzapi}
|
||||
POSTGRES_DB: ${DB_NAME:-wuzapi}
|
||||
volumes:
|
||||
- db_data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U $${DB_USER:-wuzapi}"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
db_data:
|
||||
20
blueprints/wuzapi/template.toml
Normal file
@@ -0,0 +1,20 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
admin_token = "${password:32}"
|
||||
encryption_key = "${password:32}"
|
||||
db_user = "wuzapi"
|
||||
db_password = "${password:32}"
|
||||
db_name = "wuzapi"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "wuzapi-server"
|
||||
port = 8080
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
WUZAPI_ADMIN_TOKEN = "${admin_token}"
|
||||
WUZAPI_GLOBAL_ENCRYPTION_KEY = "${encryption_key}"
|
||||
DB_USER = "${db_user}"
|
||||
DB_PASSWORD = "${db_password}"
|
||||
DB_NAME = "${db_name}"
|
||||
BIN
blueprints/wuzapi/wuzapi.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
421
meta.json
@@ -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",
|
||||
@@ -2101,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",
|
||||
@@ -3116,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",
|
||||
@@ -3133,6 +3204,24 @@
|
||||
"finance"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ipfs",
|
||||
"name": "IPFS (Kubo)",
|
||||
"version": "latest",
|
||||
"description": "IPFS (Kubo) is a decentralized peer-to-peer file sharing and storage network node. Host your own IPFS gateway and API.",
|
||||
"logo": "ipfs.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/ipfs/kubo",
|
||||
"website": "https://ipfs.tech/",
|
||||
"docs": "https://docs.ipfs.tech/"
|
||||
},
|
||||
"tags": [
|
||||
"storage",
|
||||
"decentralized",
|
||||
"p2p",
|
||||
"self-hosted"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "it-tools",
|
||||
"name": "IT Tools",
|
||||
@@ -3182,6 +3271,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",
|
||||
@@ -3342,6 +3450,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",
|
||||
@@ -3373,6 +3497,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",
|
||||
@@ -3682,6 +3822,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",
|
||||
@@ -3836,6 +3994,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",
|
||||
@@ -3851,6 +4027,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",
|
||||
@@ -4171,8 +4364,8 @@
|
||||
"description": "Obsidian LiveSync with CouchDB for real-time note synchronization.",
|
||||
"logo": "obsidian.png",
|
||||
"links": {
|
||||
"github": "https://github.com/apache/couchdb",
|
||||
"website": "https://couchdb.apache.org/",
|
||||
"github": "https://github.com/vrtmrz/obsidian-livesync",
|
||||
"website": "https://obsidian.md/sync",
|
||||
"docs": "https://docs.couchdb.apache.org/"
|
||||
},
|
||||
"tags": [
|
||||
@@ -4362,6 +4555,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",
|
||||
@@ -4910,6 +5124,25 @@
|
||||
"webmail"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "postgres-pgdog",
|
||||
"name": "PostgreSQL with PgDog",
|
||||
"version": "0.1.26",
|
||||
"description": "PostgreSQL database with PgDog connection pooler, load balancer, and horizontal scaling proxy. A modern alternative to PgBouncer with multi-threading support.",
|
||||
"logo": "postgres-pgdog.png",
|
||||
"links": {
|
||||
"github": "https://github.com/pgdogdev/pgdog",
|
||||
"website": "https://pgdog.dev",
|
||||
"docs": "https://docs.pgdog.dev"
|
||||
},
|
||||
"tags": [
|
||||
"database",
|
||||
"postgresql",
|
||||
"pooler",
|
||||
"proxy",
|
||||
"load-balancer"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "postgresus",
|
||||
"name": "Postgresus",
|
||||
@@ -4996,6 +5229,24 @@
|
||||
"management"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "pulse",
|
||||
"name": "Pulse",
|
||||
"version": "latest",
|
||||
"description": "A responsive monitoring platform for Proxmox VE, PBS, and Docker with real-time metrics across nodes and containers.",
|
||||
"logo": "pulse.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/rcourtman/Pulse",
|
||||
"website": "https://pulserelay.pro/",
|
||||
"docs": "https://github.com/rcourtman/Pulse/blob/main/docs/README.md"
|
||||
},
|
||||
"tags": [
|
||||
"monitoring",
|
||||
"proxmox",
|
||||
"docker",
|
||||
"metrics"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "pyrodactyl",
|
||||
"name": "Pyrodactyl",
|
||||
@@ -5030,6 +5281,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",
|
||||
@@ -5288,6 +5557,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",
|
||||
@@ -5342,6 +5627,25 @@
|
||||
"aggregator"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "seaweedfs",
|
||||
"name": "SeaweedFS",
|
||||
"version": "latest",
|
||||
"description": "SeaweedFS is a fast distributed storage system for blobs, objects, and files. Features S3-compatible API, POSIX FUSE mount, and WebDAV support.",
|
||||
"logo": "seaweedfs.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/seaweedfs/seaweedfs",
|
||||
"website": "https://seaweedfs.com/",
|
||||
"docs": "https://github.com/seaweedfs/seaweedfs/wiki"
|
||||
},
|
||||
"tags": [
|
||||
"storage",
|
||||
"s3",
|
||||
"distributed",
|
||||
"object-storage",
|
||||
"file-system"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "shlink",
|
||||
"name": "Shlink",
|
||||
@@ -5554,6 +5858,43 @@
|
||||
"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": "strapi",
|
||||
"name": "Strapi",
|
||||
"version": "v5.33.0",
|
||||
"description": "Open-source headless CMS to build powerful APIs with built-in content management.",
|
||||
"logo": "strapi.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/strapi/strapi",
|
||||
"discord": "https://discord.com/invite/strapi",
|
||||
"docs": "https://docs.strapi.io",
|
||||
"website": "https://strapi.io"
|
||||
},
|
||||
"tags": [
|
||||
"headless",
|
||||
"cms",
|
||||
"content-management"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "supabase",
|
||||
"name": "SupaBase",
|
||||
@@ -5575,7 +5916,7 @@
|
||||
{
|
||||
"id": "superset",
|
||||
"name": "Superset (Unofficial)",
|
||||
"version": "latest",
|
||||
"version": "6.0.0",
|
||||
"description": "Data visualization and data exploration platform.",
|
||||
"logo": "superset.svg",
|
||||
"links": {
|
||||
@@ -5608,6 +5949,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",
|
||||
@@ -5762,10 +6120,27 @@
|
||||
"personal-use"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "trilium-next",
|
||||
"name": "TriliumNext",
|
||||
"version": "latest",
|
||||
"description": "Is a free and open-source, cross-platform hierarchical note taking application with focus on building large personal knowledge bases.",
|
||||
"logo": "trilium-next-logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/TriliumNext/Trilium",
|
||||
"website": "https://triliumnotes.org/",
|
||||
"docs": "https://docs.triliumnotes.org/"
|
||||
},
|
||||
"tags": [
|
||||
"self-hosted",
|
||||
"productivity",
|
||||
"personal-use"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "trmnl-byos-laravel",
|
||||
"name": "TRMNL BYOS Laravel",
|
||||
"version": "0.21.0",
|
||||
"version": "0.27.0",
|
||||
"description": "TRMNL BYOS Laravel is a self-hosted application to manage TRMNL e-ink devices.",
|
||||
"logo": "byos-laravel.svg",
|
||||
"links": {
|
||||
@@ -5846,7 +6221,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": {
|
||||
@@ -5895,7 +6270,7 @@
|
||||
{
|
||||
"id": "uptime-kuma",
|
||||
"name": "Uptime Kuma",
|
||||
"version": "1.23.15",
|
||||
"version": "2.1.0",
|
||||
"description": "Uptime Kuma is a free and open source monitoring tool that allows you to monitor your websites and applications.",
|
||||
"logo": "uptime-kuma.png",
|
||||
"links": {
|
||||
@@ -5983,7 +6358,7 @@
|
||||
"description": "Vikunja is a self-hosted, open-source to-do list application to organize tasks, projects, and notes.",
|
||||
"logo": "image.png",
|
||||
"links": {
|
||||
"github": "https://kolaente.dev/vikunja/",
|
||||
"github": "https://github.com/go-vikunja/vikunja",
|
||||
"website": "https://vikunja.io/",
|
||||
"docs": "https://vikunja.io/docs/"
|
||||
},
|
||||
@@ -6132,6 +6507,24 @@
|
||||
"cms"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "wuzapi",
|
||||
"name": "WuzAPI",
|
||||
"version": "v1.0.0",
|
||||
"description": "A RESTful API service for WhatsApp with multiple device support and concurrent sessions.",
|
||||
"logo": "wuzapi.png",
|
||||
"links": {
|
||||
"github": "https://github.com/asternic/wuzapi",
|
||||
"website": "https://www.wuzapi.app/",
|
||||
"docs": "https://github.com/asternic/wuzapi/blob/main/README.md"
|
||||
},
|
||||
"tags": [
|
||||
"api",
|
||||
"whatsapp",
|
||||
"messaging",
|
||||
"automation"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "xsshunter",
|
||||
"name": "XSSHunter",
|
||||
|
||||