Merge branch 'Dokploy:canary' into canary

This commit is contained in:
kadma
2026-02-17 13:35:38 -05:00
committed by GitHub
95 changed files with 2883 additions and 325 deletions

1
.gitignore vendored
View File

@@ -1,4 +1,3 @@
node_modules
package-lock.json
meta.json.backup.*

View File

@@ -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:**

View File

@@ -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:

View File

@@ -0,0 +1,4 @@
## Instructions
We don't have nothing to show here....

View File

@@ -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

View File

@@ -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

View File

@@ -1,6 +1,6 @@
services:
autobase-console:
image: autobase/console:2.3.0
image: autobase/console:2.5.2
restart: unless-stopped
ports:
- "80"

View 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

View 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

View 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"

View File

@@ -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",

View File

@@ -2,5 +2,7 @@ variables = {}
[config]
domains = []
env = ["CLOUDFLARE_TUNNEL_TOKEN=\"<INSERT TOKEN>\""]
mounts = []
[config.env]
CLOUDFLARE_TUNNEL_TOKEN = ""

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View 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:

View 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}"

View 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
View 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

View 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"

View File

@@ -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

View File

@@ -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"

View 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:

View 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

View 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}"

View File

@@ -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:

View 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
View 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

View 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"]'
"""

View 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: {}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,12 @@
[variables]
main_domain = "${domain}"
[config]
env = {}
mounts = []
[[config.domains]]
serviceName = "jenkins"
port = 8080
host = "${main_domain}"

View 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: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

View 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}"

View 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'

View 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

View 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}"

View 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:

View 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

View 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"

View 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:

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View 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"

View 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: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View 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"

View File

@@ -1,6 +1,6 @@
services:
nextcloud:
image: nextcloud:30.0.2
image: nextcloud:32.0.5
restart: always
ports:

View 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:

View 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

View 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"

View File

@@ -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:

View 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:

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View 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"

View 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:

View 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

View 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}"

View File

@@ -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:

View 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:

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

View 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"

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@@ -0,0 +1 @@
[config]

View File

@@ -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: {}

View File

@@ -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
"""

View 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:

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 39 KiB

View 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}"

View 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:

View 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

View 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}"

View 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: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

View 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]]

View File

@@ -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'

View File

@@ -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"'

View File

@@ -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:

View File

@@ -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}"

View 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:

View 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

View File

@@ -0,0 +1,9 @@
[variables]
main_domain = "${domain}"
timezone = "America/Sao_Paulo"
[config]
[[config.domains]]
serviceName = "syncthing"
port = 8384
host = "${main_domain}"

View File

@@ -1,4 +1,4 @@
[config.env]
TAILSCALE_HOSTNAME = ""
TAILSCALE_APIKEY = ""
TAILSCALE_AUTHKEY = ""

View 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

View 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}"

View 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

View File

@@ -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}

View File

@@ -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"]

View File

@@ -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

View File

@@ -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: {}

View File

@@ -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"

View File

@@ -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

View 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:

View 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}"

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

421
meta.json
View File

@@ -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",