mirror of
https://github.com/Dokploy/templates.git
synced 2026-11-10 01:33:12 -06:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
af8b535d34 | ||
|
|
c60bfa8c72 | ||
|
|
dd986039a7 | ||
|
|
0633b987d5 | ||
|
|
5d6afe20a6 | ||
|
|
618cda2366 | ||
|
|
74cec8f74f | ||
|
|
64fb0f6573 | ||
|
|
9e02e96e3a | ||
|
|
33c3fcdadb | ||
|
|
493e824f70 | ||
|
|
6f27a9427c | ||
|
|
f76c31ef89 | ||
|
|
478c5197b2 | ||
|
|
a837539398 | ||
|
|
c33f72b32a | ||
|
|
1c2921417d | ||
|
|
6f1b083c57 | ||
|
|
bd457e0310 | ||
|
|
311faa1ea9 | ||
|
|
ee35ed1a42 | ||
|
|
3ddbdde081 | ||
|
|
0bfb50d62f | ||
|
|
f946051a6c | ||
|
|
9bdbe266e5 | ||
|
|
25563213f2 | ||
|
|
fb64197738 | ||
|
|
cd16441901 | ||
|
|
29a7970397 | ||
|
|
1e486813b4 | ||
|
|
3c416eaba3 | ||
|
|
31158e2340 | ||
|
|
6786237720 | ||
|
|
8f84a52855 | ||
|
|
7ed8450cf8 | ||
|
|
c6a0b1b1b5 | ||
|
|
744ff52770 | ||
|
|
55aa82489d | ||
|
|
59770d4ae8 |
@@ -1,7 +1,7 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
affinepro:
|
||||
image: ghcr.io/toeverything/affine-graphql:stable-780dd83
|
||||
image: ghcr.io/toeverything/affine:stable
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3010
|
||||
@@ -12,6 +12,7 @@ services:
|
||||
- REDIS_SERVER_HOST=redis
|
||||
- REDIS_SERVER_PASSWORD=${REDIS_PASSWORD}
|
||||
- DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/affinepro
|
||||
- AFFINE_INDEXER_ENABLED=false
|
||||
- AFFINE_SERVER_HOST=${DOMAIN}
|
||||
- MAILER_HOST=${MAILER_HOST}
|
||||
- MAILER_PORT=${MAILER_PORT}
|
||||
@@ -19,16 +20,21 @@ services:
|
||||
- MAILER_PASSWORD=${MAILER_PASSWORD}
|
||||
- MAILER_SENDER=${MAILER_SENDER}
|
||||
depends_on:
|
||||
- db
|
||||
- redis
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
migration:
|
||||
condition: service_completed_successfully
|
||||
|
||||
migration:
|
||||
image: ghcr.io/toeverything/affine-graphql:stable-780dd83
|
||||
command: node ./scripts/self-host-predeploy.js
|
||||
image: ghcr.io/toeverything/affine:stable
|
||||
command: ["sh", "-c", "node ./scripts/self-host-predeploy.js"]
|
||||
environment:
|
||||
- REDIS_SERVER_HOST=redis
|
||||
- REDIS_SERVER_PASSWORD=${REDIS_PASSWORD}
|
||||
- DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/affinepro
|
||||
- AFFINE_INDEXER_ENABLED=false
|
||||
- AFFINE_SERVER_HOST=${DOMAIN}
|
||||
- MAILER_HOST=${MAILER_HOST}
|
||||
- MAILER_PORT=${MAILER_PORT}
|
||||
@@ -39,17 +45,25 @@ services:
|
||||
- affine-storage:/root/.affine/storage
|
||||
- affine-config:/root/.affine/config
|
||||
depends_on:
|
||||
- db
|
||||
- redis
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
|
||||
db:
|
||||
image: postgres:15-alpine
|
||||
image: pgvector/pgvector:pg16
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
- POSTGRES_DB=affinepro
|
||||
- POSTGRES_INITDB_ARGS=--data-checksums
|
||||
volumes:
|
||||
- postgres-data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready", "-U", "postgres", "-d", "affinepro"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
@@ -57,9 +71,14 @@ services:
|
||||
command: redis-server --requirepass ${REDIS_PASSWORD}
|
||||
volumes:
|
||||
- redis-data:/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "redis-cli -a '${REDIS_PASSWORD}' ping | grep PONG"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
affine-storage: {}
|
||||
affine-config: {}
|
||||
postgres-data: {}
|
||||
redis-data: {}
|
||||
redis-data: {}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "affinepro",
|
||||
"name": "Affine Pro",
|
||||
"version": "stable-780dd83",
|
||||
"version": "stable",
|
||||
"description": "Affine Pro is a modern, self-hosted platform designed for collaborative content creation and project management. It offers an intuitive interface, seamless real-time collaboration, and powerful tools for organizing tasks, notes, and ideas.",
|
||||
"logo": "logo.png",
|
||||
"links": {
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
automatisch:
|
||||
image: dockeriddonuts/automatisch:2.0
|
||||
image: automatischio/automatisch:0.15.0
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3000
|
||||
environment:
|
||||
- HOST=${DOMAIN}
|
||||
- PROTOCOL=http
|
||||
- PORT=3000
|
||||
- API_URL=http://${DOMAIN}
|
||||
- WEB_APP_URL=http://${DOMAIN}
|
||||
- APP_ENV=production
|
||||
- REDIS_HOST=automatisch-redis
|
||||
- REDIS_USERNAME=default
|
||||
- REDIS_PASSWORD=${REDIS_PASSWORD}
|
||||
- POSTGRES_HOST=automatisch-postgres
|
||||
- POSTGRES_DATABASE=automatisch
|
||||
@@ -23,11 +21,13 @@ services:
|
||||
volumes:
|
||||
- storage:/automatisch/storage
|
||||
depends_on:
|
||||
- automatisch-postgres
|
||||
- automatisch-redis
|
||||
automatisch-postgres:
|
||||
condition: service_healthy
|
||||
automatisch-redis:
|
||||
condition: service_started
|
||||
|
||||
automatisch-worker:
|
||||
image: dockeriddonuts/automatisch:2.0
|
||||
image: automatischio/automatisch:0.15.0
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- APP_ENV=production
|
||||
@@ -44,8 +44,7 @@ services:
|
||||
volumes:
|
||||
- storage:/automatisch/storage
|
||||
depends_on:
|
||||
- automatisch-postgres
|
||||
- automatisch-redis
|
||||
- automatisch
|
||||
|
||||
automatisch-postgres:
|
||||
image: postgres:15-alpine
|
||||
@@ -56,18 +55,20 @@ services:
|
||||
- POSTGRES_DB=automatisch
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres -d automatisch"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
automatisch-redis:
|
||||
image: redis:7-alpine
|
||||
restart: unless-stopped
|
||||
command: redis-server --requirepass ${REDIS_PASSWORD}
|
||||
environment:
|
||||
- REDIS_USERNAME=default
|
||||
- REDIS_PASSWORD=${REDIS_PASSWORD}
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
|
||||
volumes:
|
||||
storage: {}
|
||||
postgres_data: {}
|
||||
redis_data: {}
|
||||
redis_data: {}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "automatisch",
|
||||
"name": "Automatisch",
|
||||
"version": "2.0",
|
||||
"version": "0.15.0",
|
||||
"description": "Automatisch is a powerful, self-hosted workflow automation tool designed for connecting your apps and automating repetitive tasks. With Automatisch, you can create workflows to sync data, send notifications, and perform various actions seamlessly across different services.",
|
||||
"logo": "logo.png",
|
||||
"links": {
|
||||
|
||||
@@ -13,6 +13,7 @@ port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
DOMAIN = "${main_domain}"
|
||||
DB_PASSWORD = "${db_password}"
|
||||
REDIS_PASSWORD = "${redis_password}"
|
||||
ENCRYPTION_KEY = "${encryption_key}"
|
||||
|
||||
@@ -11,8 +11,8 @@ services:
|
||||
- COCKPIT_DATABASE_SERVER=mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@mongo:27017
|
||||
- COCKPIT_DATABASE_NAME=cockpit
|
||||
volumes:
|
||||
- html:/var/www/html
|
||||
- data:/var/www/html/storage/data
|
||||
- config:/var/www/html/config
|
||||
- storage:/var/www/html/storage
|
||||
depends_on:
|
||||
- mongo
|
||||
|
||||
@@ -25,6 +25,6 @@ services:
|
||||
- mongo-data:/data/db
|
||||
|
||||
volumes:
|
||||
html:
|
||||
data:
|
||||
config:
|
||||
storage:
|
||||
mongo-data:
|
||||
@@ -0,0 +1,12 @@
|
||||
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_287_1020)">
|
||||
<path d="M50.1522 115.189C50.1522 121.189 57.1564 121.193 59 118C60.1547 116 61 114 61 108C61 102 58.1044 96.9536 55.3194 91.5175C54.6026 90.1184 53.8323 88.6149 53.0128 86.9234C51.6073 84.0225 49.8868 81.3469 47.3885 79.2139C47.0053 78.8867 46.8935 78.0093 46.9624 77.422C47.2351 75.1036 47.5317 72.7876 47.8283 70.4718C48.3186 66.6436 48.8088 62.8156 49.1909 58.9766C49.459 56.2872 49.4542 53.5119 49.1156 50.8329C48.3833 45.0344 45.1292 40.7783 40.1351 37.9114C38.6818 37.0771 38.2533 36.1455 38.4347 34.5853C38.9402 30.2473 40.6551 26.3306 42.8342 22.6642C44.8356 19.297 47.1037 16.0858 49.3676 12.8804C49.6576 12.4699 49.9475 12.0594 50.2367 11.6488C50.6069 11.1231 51.5231 10.7245 52.1971 10.7075C60.4129 10.5017 68.6303 10.3648 76.8477 10.2636C77.4123 10.2563 78.1584 10.5196 78.5221 10.9246C83.6483 16.634 88.2284 22.712 90.9778 29.9784C91.1658 30.4758 91.3221 30.9869 91.4655 31.4997C92.4976 35.1683 92.4804 35.1803 89.5401 37.2499L89.4071 37.3436C83.8702 41.2433 81.8458 46.8198 82.0921 53.349C82.374 60.8552 84.0622 68.1313 85.9869 75.3539C86.3782 76.8218 86.6318 77.9073 85.2206 79.2609C82.3951 81.9698 81.2196 85.6872 80.6575 89.4687C80.0724 93.4081 79.599 97.3637 79.1254 101.32C78.8627 103.515 78.8497 105.368 78.318 107.904C76.2819 117.611 71 128 63 128H50.1522C45 128 41 123.189 41 115.189H50.1522Z" fill="#155DFC"/>
|
||||
<path d="M46.2429 6.56033C43.3387 11.1 40.3642 15.4031 37.7614 19.9209C35.413 23.9964 33.8487 28.4226 33.0913 33.1211C32.0998 39.2728 33.694 44.7189 38.0765 48.9775C41.6846 52.4835 42.6153 56.4472 42.152 61.1675C41.1426 71.4587 39.1174 81.5401 36.2052 91.4522C36.1769 91.5477 36.0886 91.6255 35.8974 91.8977C34.1517 91.3525 32.3161 90.8446 30.5266 90.2095C5.53011 81.3376 -12.7225 64.953 -24.1842 41.0298C-25.175 38.9625 -26.079 36.8498 -26.9263 34.7202C-27.0875 34.3151 -26.9749 33.5294 -26.6785 33.2531C-17.1479 24.3723 -7.64007 15.4647 2.00468 6.70938C8.64568 0.681612 16.5812 -1.21558 25.2457 0.739942C31.9378 2.24992 38.5131 4.27834 45.1363 6.09048C45.5843 6.2128 45.9998 6.45502 46.2429 6.56033Z" fill="#155DFC"/>
|
||||
<path d="M96.9586 89.3257C95.5888 84.7456 94.0796 80.4011 93.0111 75.9514C91.6065 70.0978 90.4683 64.1753 89.3739 58.2529C88.755 54.9056 89.3998 51.8176 91.89 49.2108C98.2669 42.5358 98.3933 34.7971 95.3312 26.7037C92.7471 19.8739 88.593 13.9904 83.7026 8.60904C83.1298 7.9788 82.5693 7.33641 81.918 6.60491C82.2874 6.40239 82.5709 6.18773 82.8909 6.07999C90.1281 3.64085 97.4495 1.54842 105.041 0.488845C112.781 -0.591795 119.379 1.81818 125.045 6.97592C130.017 11.5018 134.805 16.2327 139.812 20.7188C143.822 24.3115 148.013 27.7066 152.19 31.1073C152.945 31.7205 153.137 32.2154 152.913 33.1041C149.059 48.4591 141.312 61.4883 129.457 71.9877C120.113 80.2626 109.35 85.9785 96.9586 89.3265V89.3257Z" fill="#155DFC"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_287_1020">
|
||||
<rect width="128" height="128" rx="6" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.0 KiB |
@@ -0,0 +1,22 @@
|
||||
services:
|
||||
databasus:
|
||||
image: databasus/databasus:latest
|
||||
ports:
|
||||
- "4005"
|
||||
volumes:
|
||||
# Persistent data storage
|
||||
- databasus-data:/databasus-data
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
# Optional: Set timezone
|
||||
- TZ=UTC
|
||||
healthcheck:
|
||||
test: [ "CMD", "databasus", "healthcheck" ]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
|
||||
volumes:
|
||||
databasus-data:
|
||||
driver: local
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"id": "databasus",
|
||||
"name": "Databasus",
|
||||
"version": "latest",
|
||||
"description": "Free, open source and self-hosted tool to backup PostgreSQL, MySQL, MariaDB and MongoDB. Multiple storages (S3, Google Drive, FTP, etc.), notifications and Point-in-Time Recovery. Successor of Postgresus",
|
||||
"logo": "databasus.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/databasus/databasus",
|
||||
"website": "https://databasus.com",
|
||||
"docs": "https://databasus.com/installation"
|
||||
},
|
||||
"tags": [
|
||||
"postgres",
|
||||
"backup",
|
||||
"s3"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = []
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "databasus"
|
||||
port = 4005
|
||||
host = "${main_domain}"
|
||||
@@ -1,256 +0,0 @@
|
||||
# Dify - open-source LLM app development platform
|
||||
# Adapted from the official docker/docker-compose.yaml (tag 1.15.0).
|
||||
# Minimal functional stack: api + worker + worker_beat + web + postgres
|
||||
# (pgvector, reused as the vector store) + redis + sandbox + ssrf_proxy
|
||||
# + plugin_daemon, fronted by a lightweight internal nginx gateway that
|
||||
# mirrors the upstream path routing (TLS terminates at Traefik).
|
||||
|
||||
x-shared-api-env: &shared-api-env
|
||||
LOG_LEVEL: INFO
|
||||
DEPLOY_ENV: PRODUCTION
|
||||
SECRET_KEY: ${SECRET_KEY}
|
||||
MIGRATION_ENABLED: "true"
|
||||
# Public URLs - a single domain, path-routed like the upstream nginx
|
||||
CONSOLE_API_URL: https://${DIFY_DOMAIN}
|
||||
CONSOLE_WEB_URL: https://${DIFY_DOMAIN}
|
||||
SERVICE_API_URL: https://${DIFY_DOMAIN}
|
||||
APP_API_URL: https://${DIFY_DOMAIN}
|
||||
APP_WEB_URL: https://${DIFY_DOMAIN}
|
||||
FILES_URL: https://${DIFY_DOMAIN}
|
||||
INTERNAL_FILES_URL: http://api:5001
|
||||
TRIGGER_URL: https://${DIFY_DOMAIN}
|
||||
ENDPOINT_URL_TEMPLATE: https://${DIFY_DOMAIN}/e/{hook_id}
|
||||
# The dedicated api_websocket collaboration service is not deployed
|
||||
ENABLE_COLLABORATION_MODE: "false"
|
||||
WEB_API_CORS_ALLOW_ORIGINS: "*"
|
||||
CONSOLE_CORS_ALLOW_ORIGINS: "*"
|
||||
# PostgreSQL
|
||||
DB_USERNAME: postgres
|
||||
DB_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
DB_HOST: db
|
||||
DB_PORT: "5432"
|
||||
DB_DATABASE: dify
|
||||
# Redis / Celery
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: "6379"
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
||||
REDIS_DB: "0"
|
||||
CELERY_BROKER_URL: redis://:${REDIS_PASSWORD}@redis:6379/1
|
||||
# File storage on a local volume
|
||||
STORAGE_TYPE: opendal
|
||||
OPENDAL_SCHEME: fs
|
||||
OPENDAL_FS_ROOT: storage
|
||||
# Vector store: pgvector, reusing the same PostgreSQL instance
|
||||
VECTOR_STORE: pgvector
|
||||
PGVECTOR_HOST: db
|
||||
PGVECTOR_PORT: "5432"
|
||||
PGVECTOR_USER: postgres
|
||||
PGVECTOR_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
PGVECTOR_DATABASE: dify
|
||||
PGVECTOR_MIN_CONNECTION: "1"
|
||||
PGVECTOR_MAX_CONNECTION: "5"
|
||||
# Code execution sandbox
|
||||
CODE_EXECUTION_ENDPOINT: http://sandbox:8194
|
||||
CODE_EXECUTION_API_KEY: ${SANDBOX_API_KEY}
|
||||
# SSRF proxy (squid) for user-triggered outbound requests
|
||||
SSRF_PROXY_HTTP_URL: http://ssrf_proxy:3128
|
||||
SSRF_PROXY_HTTPS_URL: http://ssrf_proxy:3128
|
||||
# Plugin daemon (model providers / tools are plugins since Dify 1.0)
|
||||
PLUGIN_DAEMON_URL: http://plugin_daemon:5002
|
||||
PLUGIN_DAEMON_KEY: ${PLUGIN_DAEMON_KEY}
|
||||
INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_INNER_API_KEY}
|
||||
PLUGIN_MAX_PACKAGE_SIZE: "52428800"
|
||||
PLUGIN_REMOTE_INSTALL_HOST: localhost
|
||||
PLUGIN_REMOTE_INSTALL_PORT: "5003"
|
||||
MARKETPLACE_ENABLED: "true"
|
||||
MARKETPLACE_API_URL: https://marketplace.dify.ai
|
||||
|
||||
services:
|
||||
nginx:
|
||||
image: nginx:1.27-alpine
|
||||
restart: always
|
||||
volumes:
|
||||
- ../files/dify-nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
||||
depends_on:
|
||||
api:
|
||||
condition: service_healthy
|
||||
web:
|
||||
condition: service_started
|
||||
plugin_daemon:
|
||||
condition: service_started
|
||||
|
||||
# The dify-api image runs as the non-root user 1001, so the shared
|
||||
# storage volume has to be handed over to it once (same trick as the
|
||||
# upstream init_permissions container).
|
||||
init_permissions:
|
||||
image: busybox:1.36
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
FLAG_FILE="/app/api/storage/.init_permissions"
|
||||
if [ -f "$$FLAG_FILE" ]; then
|
||||
echo "Permissions already initialized."
|
||||
exit 0
|
||||
fi
|
||||
echo "Initializing permissions for /app/api/storage"
|
||||
chown -R 1001:1001 /app/api/storage && touch "$$FLAG_FILE"
|
||||
volumes:
|
||||
- dify-app-storage:/app/api/storage
|
||||
restart: "no"
|
||||
|
||||
api:
|
||||
image: langgenius/dify-api:1.15.0
|
||||
restart: always
|
||||
environment:
|
||||
<<: *shared-api-env
|
||||
MODE: api
|
||||
depends_on:
|
||||
init_permissions:
|
||||
condition: service_completed_successfully
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
volumes:
|
||||
- dify-app-storage:/app/api/storage
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:5001/health"]
|
||||
interval: 15s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
start_period: 120s
|
||||
|
||||
worker:
|
||||
image: langgenius/dify-api:1.15.0
|
||||
restart: always
|
||||
environment:
|
||||
<<: *shared-api-env
|
||||
MODE: worker
|
||||
depends_on:
|
||||
init_permissions:
|
||||
condition: service_completed_successfully
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
volumes:
|
||||
- dify-app-storage:/app/api/storage
|
||||
|
||||
worker_beat:
|
||||
image: langgenius/dify-api:1.15.0
|
||||
restart: always
|
||||
environment:
|
||||
<<: *shared-api-env
|
||||
MODE: beat
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
|
||||
web:
|
||||
image: langgenius/dify-web:1.15.0
|
||||
restart: always
|
||||
environment:
|
||||
CONSOLE_API_URL: https://${DIFY_DOMAIN}
|
||||
APP_API_URL: https://${DIFY_DOMAIN}
|
||||
SERVER_CONSOLE_API_URL: http://api:5001
|
||||
ENABLE_COLLABORATION_MODE: "false"
|
||||
MARKETPLACE_API_URL: https://marketplace.dify.ai
|
||||
MARKETPLACE_URL: https://marketplace.dify.ai
|
||||
NEXT_TELEMETRY_DISABLED: "1"
|
||||
|
||||
db:
|
||||
image: pgvector/pgvector:pg16
|
||||
restart: always
|
||||
environment:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
POSTGRES_DB: dify
|
||||
PGDATA: /var/lib/postgresql/data/pgdata
|
||||
volumes:
|
||||
- dify-db-data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres -d dify"]
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 30
|
||||
|
||||
redis:
|
||||
image: redis:6-alpine
|
||||
restart: always
|
||||
environment:
|
||||
REDISCLI_AUTH: ${REDIS_PASSWORD}
|
||||
command: redis-server --requirepass ${REDIS_PASSWORD}
|
||||
volumes:
|
||||
- dify-redis-data:/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "redis-cli ping | grep -q PONG"]
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 30
|
||||
|
||||
sandbox:
|
||||
image: langgenius/dify-sandbox:0.2.15
|
||||
restart: always
|
||||
environment:
|
||||
API_KEY: ${SANDBOX_API_KEY}
|
||||
GIN_MODE: release
|
||||
WORKER_TIMEOUT: "15"
|
||||
ENABLE_NETWORK: "true"
|
||||
HTTP_PROXY: http://ssrf_proxy:3128
|
||||
HTTPS_PROXY: http://ssrf_proxy:3128
|
||||
SANDBOX_PORT: "8194"
|
||||
volumes:
|
||||
- dify-sandbox-deps:/dependencies
|
||||
|
||||
ssrf_proxy:
|
||||
image: ubuntu/squid:latest
|
||||
restart: always
|
||||
volumes:
|
||||
- ../files/dify-squid.conf:/etc/squid/squid.conf:ro
|
||||
|
||||
plugin_daemon:
|
||||
image: langgenius/dify-plugin-daemon:0.6.3-local
|
||||
restart: always
|
||||
environment:
|
||||
DB_HOST: db
|
||||
DB_PORT: "5432"
|
||||
DB_USERNAME: postgres
|
||||
DB_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
DB_DATABASE: dify_plugin
|
||||
DB_SSL_MODE: disable
|
||||
REDIS_HOST: redis
|
||||
REDIS_PORT: "6379"
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
||||
SERVER_PORT: "5002"
|
||||
SERVER_KEY: ${PLUGIN_DAEMON_KEY}
|
||||
MAX_PLUGIN_PACKAGE_SIZE: "52428800"
|
||||
DIFY_INNER_API_URL: http://api:5001
|
||||
DIFY_INNER_API_KEY: ${PLUGIN_INNER_API_KEY}
|
||||
PLUGIN_REMOTE_INSTALLING_HOST: 0.0.0.0
|
||||
PLUGIN_REMOTE_INSTALLING_PORT: "5003"
|
||||
PLUGIN_WORKING_PATH: /app/storage/cwd
|
||||
FORCE_VERIFYING_SIGNATURE: "true"
|
||||
PYTHON_ENV_INIT_TIMEOUT: "120"
|
||||
PLUGIN_MAX_EXECUTION_TIMEOUT: "600"
|
||||
PLUGIN_STORAGE_TYPE: local
|
||||
PLUGIN_STORAGE_LOCAL_ROOT: /app/storage
|
||||
PLUGIN_INSTALLED_PATH: plugin
|
||||
PLUGIN_PACKAGE_CACHE_PATH: plugin_packages
|
||||
PLUGIN_MEDIA_CACHE_PATH: assets
|
||||
volumes:
|
||||
- dify-plugin-storage:/app/storage
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
|
||||
volumes:
|
||||
dify-app-storage:
|
||||
dify-db-data:
|
||||
dify-redis-data:
|
||||
dify-sandbox-deps:
|
||||
dify-plugin-storage:
|
||||
@@ -1,15 +0,0 @@
|
||||
## Instructions
|
||||
|
||||
### First setup
|
||||
|
||||
- The first boot runs the database migrations, so it can take **2-4 minutes** before the application responds.
|
||||
- Open your domain: you will be redirected to `/install`, where you create the admin (workspace owner) account.
|
||||
- After signing in, go to **Settings -> Model Provider** and install a model provider plugin (OpenAI, Anthropic, Ollama, etc.) from the marketplace, then configure your API keys.
|
||||
|
||||
### Notes
|
||||
|
||||
- **HTTPS is required for the console login**: Dify issues `__Host-`/`Secure` session cookies, so make sure the domain has a certificate (e.g. Let's Encrypt in the domain settings). Over plain HTTP the browser will drop the session cookies and login will not persist.
|
||||
|
||||
- The vector store is **pgvector**, running inside the bundled PostgreSQL instance (no separate Weaviate/Qdrant container needed).
|
||||
- All routing (`/console/api`, `/api`, `/v1`, `/files`, `/e/`, ...) is handled by the bundled internal nginx gateway, mirroring the upstream deployment, so the Dify service API is available at `https://<your-domain>/v1`.
|
||||
- Code execution runs in the isolated `sandbox` service, and user-triggered outbound HTTP requests go through the `ssrf_proxy` (squid) service, like in the official deployment.
|
||||
@@ -1,12 +0,0 @@
|
||||
<svg width="48" height="22" viewBox="0 0 48 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="White=False">
|
||||
<g id="if">
|
||||
<path d="M21.2002 3.73454C22.5633 3.73454 23.0666 2.89917 23.0666 1.86812C23.0666 0.837081 22.5623 0.00170898 21.2002 0.00170898C19.838 0.00170898 19.3337 0.837081 19.3337 1.86812C19.3337 2.89917 19.838 3.73454 21.2002 3.73454Z" fill="#0033FF"/>
|
||||
<path d="M27.7336 4.13435V5.33473H24.6668V8.00171H27.7336V14.6687H22.6668V5.33567H15.9998V8.00265H19.7336V14.6696H15.3337V17.3366H35.3337V14.6696H30.6668V8.00265H35.3337V5.33567H30.6668V2.66869H35.3337V0.00170898H31.8671C29.5877 0.00170898 27.7336 1.8559 27.7336 4.13529V4.13435Z" fill="#0033FF"/>
|
||||
</g>
|
||||
<g id="Dy">
|
||||
<path d="M5.66698 0.000940576H0V17.334H5.66698C12.667 17.334 14.667 13.334 14.667 8.66698C14.667 4 12.667 0 5.66698 0V0.000940576ZM5.73377 14.6679H3.20038V2.66792H5.73377C9.75823 2.66792 11.4666 4.64346 11.4666 8.66792C11.4666 12.6924 9.75823 14.6679 5.73377 14.6679Z" fill="black"/>
|
||||
<path d="M44.8335 5.3349L42.1665 14.0019L39.4995 5.3349H36.333L40.2013 16.5466C40.604 17.714 39.9229 18.6679 38.6886 18.6679H37.333V21.3349H39.3255C41.063 21.3349 42.6265 20.2361 43.2145 18.6011L48 5.3349H44.8335Z" fill="black"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"id": "dify",
|
||||
"name": "Dify",
|
||||
"version": "1.15.0",
|
||||
"description": "Dify is an open-source LLM app development platform. Build AI workflows, RAG pipelines, agents and chatbots with a visual interface and publish them as APIs or web apps.",
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/langgenius/dify",
|
||||
"website": "https://dify.ai/",
|
||||
"docs": "https://docs.dify.ai/"
|
||||
},
|
||||
"tags": [
|
||||
"ai",
|
||||
"llm",
|
||||
"rag"
|
||||
]
|
||||
}
|
||||
@@ -1,168 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
secret_key = "${base64:42}"
|
||||
postgres_password = "${password:32}"
|
||||
redis_password = "${password:32}"
|
||||
sandbox_api_key = "${password:32}"
|
||||
plugin_daemon_key = "${base64:42}"
|
||||
plugin_inner_api_key = "${base64:42}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"DIFY_DOMAIN=${main_domain}",
|
||||
"SECRET_KEY=${secret_key}",
|
||||
"POSTGRES_PASSWORD=${postgres_password}",
|
||||
"REDIS_PASSWORD=${redis_password}",
|
||||
"SANDBOX_API_KEY=${sandbox_api_key}",
|
||||
"PLUGIN_DAEMON_KEY=${plugin_daemon_key}",
|
||||
"PLUGIN_INNER_API_KEY=${plugin_inner_api_key}",
|
||||
]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "nginx"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
|
||||
# Internal nginx gateway replicating the upstream Dify nginx routing
|
||||
# (TLS terminates at Traefik, which forwards everything to this nginx).
|
||||
[[config.mounts]]
|
||||
filePath = "dify-nginx.conf"
|
||||
content = '''
|
||||
map $http_x_forwarded_proto $dify_forwarded_proto {
|
||||
default $http_x_forwarded_proto;
|
||||
"" $scheme;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
|
||||
client_max_body_size 100M;
|
||||
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $dify_forwarded_proto;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Connection "";
|
||||
proxy_buffering off;
|
||||
proxy_read_timeout 3600s;
|
||||
proxy_send_timeout 3600s;
|
||||
|
||||
location /console/api { proxy_pass http://api:5001; }
|
||||
location /api { proxy_pass http://api:5001; }
|
||||
location /v1 { proxy_pass http://api:5001; }
|
||||
location /openapi { proxy_pass http://api:5001; }
|
||||
location /files { proxy_pass http://api:5001; }
|
||||
location /mcp { proxy_pass http://api:5001; }
|
||||
location /triggers { proxy_pass http://api:5001; }
|
||||
location /explore { proxy_pass http://web:3000; }
|
||||
|
||||
location /e/ {
|
||||
proxy_pass http://plugin_daemon:5002;
|
||||
# nginx drops inherited proxy_set_header directives as soon as a
|
||||
# location defines its own, so the shared ones are repeated here.
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $dify_forwarded_proto;
|
||||
proxy_set_header Connection "";
|
||||
proxy_set_header Dify-Hook-Url $dify_forwarded_proto://$host$request_uri;
|
||||
}
|
||||
|
||||
location / { proxy_pass http://web:3000; }
|
||||
}
|
||||
'''
|
||||
|
||||
# Squid SSRF proxy configuration, rendered from the upstream
|
||||
# docker/ssrf_proxy/squid.conf.template with its default values.
|
||||
[[config.mounts]]
|
||||
filePath = "dify-squid.conf"
|
||||
content = '''
|
||||
acl client_localnet src 0.0.0.1-0.255.255.255
|
||||
acl client_localnet src 10.0.0.0/8
|
||||
acl client_localnet src 100.64.0.0/10
|
||||
acl client_localnet src 169.254.0.0/16
|
||||
acl client_localnet src 172.16.0.0/12
|
||||
acl client_localnet src 192.168.0.0/16
|
||||
acl client_localnet src fc00::/7
|
||||
acl client_localnet src fe80::/10
|
||||
acl to_private_networks dst 0.0.0.0/8
|
||||
acl to_private_networks dst 10.0.0.0/8
|
||||
acl to_private_networks dst 100.64.0.0/10
|
||||
acl to_private_networks dst 127.0.0.0/8
|
||||
acl to_private_networks dst 169.254.0.0/16
|
||||
acl to_private_networks dst 172.16.0.0/12
|
||||
acl to_private_networks dst 192.168.0.0/16
|
||||
acl to_private_networks dst 224.0.0.0/4
|
||||
acl to_private_networks dst 240.0.0.0/4
|
||||
acl to_private_networks dst ::/128
|
||||
acl to_private_networks dst ::1/128
|
||||
acl to_private_networks dst ::ffff:0:0/96
|
||||
acl to_private_networks dst ::/96
|
||||
acl to_private_networks dst fc00::/7
|
||||
acl to_private_networks dst fe80::/10
|
||||
acl SSL_ports port 443
|
||||
acl Safe_ports port 80
|
||||
acl Safe_ports port 21
|
||||
acl Safe_ports port 443
|
||||
acl Safe_ports port 70
|
||||
acl Safe_ports port 210
|
||||
acl Safe_ports port 1025-65535
|
||||
acl Safe_ports port 280
|
||||
acl Safe_ports port 488
|
||||
acl Safe_ports port 591
|
||||
acl Safe_ports port 777
|
||||
acl CONNECT method CONNECT
|
||||
acl allowed_domains dstdomain .marketplace.dify.ai
|
||||
|
||||
http_port 3128
|
||||
|
||||
http_access deny !Safe_ports
|
||||
http_access deny CONNECT !SSL_ports
|
||||
http_access allow localhost manager
|
||||
http_access deny manager
|
||||
http_access deny to_private_networks
|
||||
http_access allow allowed_domains
|
||||
http_access allow client_localnet
|
||||
http_access allow localhost
|
||||
http_access deny all
|
||||
tcp_outgoing_address 0.0.0.0
|
||||
|
||||
coredump_dir /var/spool/squid
|
||||
refresh_pattern ^ftp: 1440 20% 10080
|
||||
refresh_pattern ^gopher: 1440 0% 1440
|
||||
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
|
||||
refresh_pattern . 0 20% 4320
|
||||
|
||||
client_request_buffer_max_size 100 MB
|
||||
max_filedescriptors 65536
|
||||
|
||||
connect_timeout 30 seconds
|
||||
request_timeout 2 minutes
|
||||
read_timeout 2 minutes
|
||||
client_lifetime 5 minutes
|
||||
shutdown_lifetime 30 seconds
|
||||
|
||||
server_persistent_connections on
|
||||
client_persistent_connections on
|
||||
persistent_request_timeout 30 seconds
|
||||
pconn_timeout 1 minute
|
||||
|
||||
client_db on
|
||||
server_idle_pconn_timeout 2 minutes
|
||||
client_idle_pconn_timeout 2 minutes
|
||||
|
||||
quick_abort_min 16 KB
|
||||
quick_abort_max 16 MB
|
||||
quick_abort_pct 95
|
||||
|
||||
memory_cache_mode disk
|
||||
cache_mem 256 MB
|
||||
maximum_object_size_in_memory 512 KB
|
||||
|
||||
dns_timeout 30 seconds
|
||||
dns_retransmit_interval 5 seconds
|
||||
|
||||
logformat dify_log %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
|
||||
access_log daemon:/var/log/squid/access.log dify_log
|
||||
logfile_rotate 10
|
||||
'''
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
evolution-api:
|
||||
image: evoapicloud/evolution-api:latest
|
||||
image: evoapicloud/evolution-api:v2.3.7
|
||||
restart: always
|
||||
volumes:
|
||||
- evolution-instances:/evolution/instances
|
||||
@@ -29,6 +29,13 @@ services:
|
||||
- CACHE_REDIS_URI=${CACHE_REDIS_URI}
|
||||
- CACHE_REDIS_PREFIX_KEY=${CACHE_REDIS_PREFIX_KEY}
|
||||
- CACHE_REDIS_SAVE_INSTANCES=${CACHE_REDIS_SAVE_INSTANCES}
|
||||
- TYPEBOT_ENABLED=${TYPEBOT_ENABLED}
|
||||
- TYPEBOT_API_VERSION=${TYPEBOT_API_VERSION}
|
||||
- CHATWOOT_ENABLED=${CHATWOOT_ENABLED}
|
||||
- OPENAI_ENABLED=${OPENAI_ENABLED}
|
||||
- DIFY_ENABLED=${DIFY_ENABLED}
|
||||
- N8N_ENABLED=${N8N_ENABLED}
|
||||
- EVOAI_ENABLED=${EVOAI_ENABLED}
|
||||
|
||||
evolution-postgres:
|
||||
image: postgres:16-alpine
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "evolutionapi",
|
||||
"name": "Evolution API",
|
||||
"version": "v2.1.2",
|
||||
"version": "v2.3.7",
|
||||
"description": "Evolution API is a robust platform dedicated to empowering small businesses with limited resources, going beyond a simple messaging solution via WhatsApp.",
|
||||
"logo": "evolutionapi.png",
|
||||
"links": {
|
||||
|
||||
@@ -31,6 +31,13 @@ env = [
|
||||
"CACHE_REDIS_URI=redis://evolution-redis:6379",
|
||||
"CACHE_REDIS_PREFIX_KEY=evolution",
|
||||
"CACHE_REDIS_SAVE_INSTANCES=true",
|
||||
"TYPEBOT_ENABLED=true",
|
||||
"TYPEBOT_API_VERSION=latest",
|
||||
"CHATWOOT_ENABLED=true",
|
||||
"OPENAI_ENABLED=true",
|
||||
"DIFY_ENABLED=true",
|
||||
"N8N_ENABLED=true",
|
||||
"EVOAI_ENABLED=true",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
|
||||
@@ -1,65 +1,24 @@
|
||||
services:
|
||||
gitlab:
|
||||
image: gitlab/gitlab-ce:latest
|
||||
image: gitlab/gitlab-ce:19.1.2-ce.0
|
||||
restart: unless-stopped
|
||||
hostname: gitlab.example.com
|
||||
shm_size: "256m"
|
||||
environment:
|
||||
GITLAB_OMNIBUS_CONFIG: |
|
||||
external_url 'http://${GITLAB_HOST}'
|
||||
gitlab_rails['gitlab_ssh_host'] = '${GITLAB_HOST}'
|
||||
gitlab_rails['gitlab_shell_ssh_port'] = 2224
|
||||
gitlab_rails['db_adapter'] = 'postgresql'
|
||||
gitlab_rails['db_host'] = 'postgresql'
|
||||
gitlab_rails['db_port'] = '5432'
|
||||
gitlab_rails['db_database'] = '${POSTGRES_DB}'
|
||||
gitlab_rails['db_username'] = '${POSTGRES_USER}'
|
||||
gitlab_rails['db_password'] = '${POSTGRES_PASSWORD}'
|
||||
# Redis config for external TCP connection
|
||||
gitlab_rails['redis_url'] = 'redis://redis:6379/0'
|
||||
gitlab_rails['redis_host'] = 'redis'
|
||||
gitlab_rails['redis_port'] = 6379
|
||||
gitlab_rails['redis_socket'] = nil
|
||||
gitlab_rails['gitlab_email_enabled'] = false
|
||||
gitlab_rails['gitlab_default_can_create_group'] = true
|
||||
gitlab_rails['gitlab_username_changing_enabled'] = false
|
||||
unicorn['worker_processes'] = 2
|
||||
unicorn['worker_timeout'] = 60
|
||||
postgresql['enable'] = false
|
||||
redis['enable'] = false
|
||||
nginx['enable'] = true
|
||||
nginx['listen_port'] = 80
|
||||
nginx['listen_https'] = false
|
||||
gitlab_rails['initial_root_password'] = '${GITLAB_ROOT_PASSWORD}'
|
||||
gitlab_rails['gitlab_email_enabled'] = false
|
||||
puma['worker_processes'] = 0
|
||||
sidekiq['concurrency'] = 10
|
||||
prometheus_monitoring['enable'] = false
|
||||
ports:
|
||||
- "80"
|
||||
- "2224"
|
||||
volumes:
|
||||
- gitlab_config:/etc/gitlab
|
||||
- gitlab_logs:/var/log/gitlab
|
||||
- gitlab_data:/var/opt/gitlab
|
||||
depends_on:
|
||||
- postgresql
|
||||
- redis
|
||||
|
||||
postgresql:
|
||||
image: postgres:16-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_DB: ${POSTGRES_DB}
|
||||
POSTGRES_USER: ${POSTGRES_USER}
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
volumes:
|
||||
- postgresql_data:/var/lib/postgresql/data
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
|
||||
volumes:
|
||||
gitlab_config:
|
||||
gitlab_logs:
|
||||
gitlab_data:
|
||||
postgresql_data:
|
||||
redis_data:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "gitlab-ce",
|
||||
"name": "GitLab CE",
|
||||
"version": "latest",
|
||||
"version": "19.1.2",
|
||||
"description": "GitLab Community Edition is a free and open source platform for managing Git repositories, CI/CD pipelines, and project management.",
|
||||
"logo": "gitlab-ce.svg",
|
||||
"links": {
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
postgres_db = "gitlab"
|
||||
postgres_user = "gitlab"
|
||||
postgres_password = "${password:32}"
|
||||
gitlab_root_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"GITLAB_HOST=${main_domain}",
|
||||
"POSTGRES_DB=${postgres_db}",
|
||||
"POSTGRES_USER=${postgres_user}",
|
||||
"POSTGRES_PASSWORD=${postgres_password}",
|
||||
"GITLAB_ROOT_PASSWORD=${gitlab_root_password}",
|
||||
]
|
||||
|
||||
[[config.domains]]
|
||||
|
||||
@@ -4,8 +4,11 @@ services:
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
# - /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration
|
||||
- ../homarr/appdata:/appdata
|
||||
- homarr_appdata:/appdata
|
||||
environment:
|
||||
- SECRET_ENCRYPTION_KEY=${SECRET_ENCRYPTION_KEY}
|
||||
ports:
|
||||
- 7575
|
||||
|
||||
volumes:
|
||||
homarr_appdata:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
secret_key = "${password:64}"
|
||||
secret_key = "${hash:64}"
|
||||
|
||||
[config]
|
||||
env = ["SECRET_ENCRYPTION_KEY=${secret_key}"]
|
||||
|
||||
@@ -2,10 +2,10 @@ version: "3.9"
|
||||
|
||||
services:
|
||||
immich-server:
|
||||
image: ghcr.io/immich-app/immich-server:v2.1.0
|
||||
image: ghcr.io/immich-app/immich-server:v3.0.2
|
||||
|
||||
volumes:
|
||||
- immich-library:/usr/src/app/upload
|
||||
- immich-library:/data
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
depends_on:
|
||||
immich-redis:
|
||||
@@ -13,9 +13,6 @@ services:
|
||||
immich-database:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
PORT: 2283
|
||||
SERVER_URL: ${SERVER_URL}
|
||||
FRONT_BASE_URL: ${FRONT_BASE_URL}
|
||||
# Database Configuration
|
||||
DB_HOSTNAME: ${DB_HOSTNAME}
|
||||
DB_PORT: ${DB_PORT}
|
||||
@@ -30,70 +27,45 @@ services:
|
||||
TZ: ${TZ}
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:2283/server-info/ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
disable: false
|
||||
|
||||
immich-machine-learning:
|
||||
image: ghcr.io/immich-app/immich-machine-learning:v2.1.0
|
||||
image: ghcr.io/immich-app/immich-machine-learning:v3.0.2
|
||||
|
||||
volumes:
|
||||
- immich-model-cache:/cache
|
||||
environment:
|
||||
REDIS_HOSTNAME: ${REDIS_HOSTNAME}
|
||||
REDIS_PORT: ${REDIS_PORT}
|
||||
REDIS_DBINDEX: ${REDIS_DBINDEX}
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3003/ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
disable: false
|
||||
|
||||
immich-redis:
|
||||
image: redis:6.2-alpine
|
||||
image: valkey/valkey:9
|
||||
|
||||
volumes:
|
||||
- immich-redis-data:/data
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
test: redis-cli ping || exit 1
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
restart: unless-stopped
|
||||
|
||||
immich-database:
|
||||
image: tensorchord/pgvecto-rs:pg14-v0.3.0
|
||||
image: ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0
|
||||
|
||||
volumes:
|
||||
- immich-postgres:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||
POSTGRES_USER: ${DB_USERNAME}
|
||||
POSTGRES_DB: immich
|
||||
POSTGRES_DB: ${DB_DATABASE_NAME}
|
||||
POSTGRES_INITDB_ARGS: '--data-checksums'
|
||||
shm_size: 128mb
|
||||
healthcheck:
|
||||
test: pg_isready -U ${DB_USERNAME} -d immich || exit 1
|
||||
test: pg_isready -U ${DB_USERNAME} -d ${DB_DATABASE_NAME} || exit 1
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
command:
|
||||
[
|
||||
'postgres',
|
||||
'-c',
|
||||
'shared_preload_libraries=vectors.so',
|
||||
'-c',
|
||||
'search_path="$$user", public, vectors',
|
||||
'-c',
|
||||
'logging_collector=on',
|
||||
'-c',
|
||||
'max_wal_size=2GB',
|
||||
'-c',
|
||||
'shared_buffers=512MB',
|
||||
'-c',
|
||||
'wal_compression=on',
|
||||
]
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "immich",
|
||||
"name": "Immich",
|
||||
"version": "v1.121.0",
|
||||
"version": "v3.0.2",
|
||||
"description": "High performance self-hosted photo and video backup solution directly from your mobile phone.",
|
||||
"logo": "immich.svg",
|
||||
"links": {
|
||||
|
||||
@@ -5,9 +5,6 @@ db_user = "immich"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"IMMICH_HOST=${main_domain}",
|
||||
"SERVER_URL=https://${main_domain}",
|
||||
"FRONT_BASE_URL=https://${main_domain}",
|
||||
"DB_HOSTNAME=immich-database",
|
||||
"DB_PORT=5432",
|
||||
"DB_USERNAME=${db_user}",
|
||||
|
||||
@@ -1,58 +1,29 @@
|
||||
services:
|
||||
db-migration:
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
image: infisical/infisical:v0.135.0-postgres
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- ENCRYPTION_KEY
|
||||
- AUTH_SECRET
|
||||
- SITE_URL
|
||||
- DB_CONNECTION_URI=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
|
||||
- REDIS_URL=redis://redis:6379
|
||||
- SMTP_HOST
|
||||
- SMTP_PORT
|
||||
- SMTP_FROM_NAME
|
||||
- SMTP_USERNAME
|
||||
- SMTP_PASSWORD
|
||||
- SMTP_SECURE=true
|
||||
command: npm run migration:latest
|
||||
pull_policy: always
|
||||
|
||||
backend:
|
||||
image: infisical/infisical:v0.162.6
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_started
|
||||
db-migration:
|
||||
condition: service_completed_successfully
|
||||
image: infisical/infisical:v0.135.0-postgres
|
||||
pull_policy: always
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- ENCRYPTION_KEY
|
||||
- AUTH_SECRET
|
||||
- SITE_URL
|
||||
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
||||
- AUTH_SECRET=${AUTH_SECRET}
|
||||
- SITE_URL=${SITE_URL}
|
||||
- DB_CONNECTION_URI=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
|
||||
- REDIS_URL=redis://redis:6379
|
||||
- SMTP_HOST
|
||||
- SMTP_PORT
|
||||
- SMTP_FROM_NAME
|
||||
- SMTP_USERNAME
|
||||
- SMTP_PASSWORD
|
||||
- SMTP_SECURE=true
|
||||
|
||||
- SMTP_HOST=${SMTP_HOST}
|
||||
- SMTP_PORT=${SMTP_PORT}
|
||||
- SMTP_FROM_ADDRESS=${SMTP_FROM_ADDRESS}
|
||||
- SMTP_FROM_NAME=${SMTP_FROM_NAME}
|
||||
- SMTP_USERNAME=${SMTP_USERNAME}
|
||||
- SMTP_PASSWORD=${SMTP_PASSWORD}
|
||||
|
||||
redis:
|
||||
image: redis:7.4.1
|
||||
env_file: .env
|
||||
restart: always
|
||||
environment:
|
||||
- ALLOW_EMPTY_PASSWORD=yes
|
||||
|
||||
volumes:
|
||||
- redis_infisical_data:/data
|
||||
|
||||
@@ -60,12 +31,11 @@ services:
|
||||
image: postgres:14-alpine
|
||||
restart: always
|
||||
environment:
|
||||
- POSTGRES_PASSWORD
|
||||
- POSTGRES_USER
|
||||
- POSTGRES_DB
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
- POSTGRES_USER=${POSTGRES_USER}
|
||||
- POSTGRES_DB=${POSTGRES_DB}
|
||||
volumes:
|
||||
- pg_infisical_data:/var/lib/postgresql/data
|
||||
|
||||
healthcheck:
|
||||
test: "pg_isready --username=${POSTGRES_USER} && psql --username=${POSTGRES_USER} --list"
|
||||
interval: 5s
|
||||
@@ -75,6 +45,3 @@ services:
|
||||
volumes:
|
||||
pg_infisical_data:
|
||||
redis_infisical_data:
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "infisical",
|
||||
"name": "Infisical",
|
||||
"version": "0.135.0",
|
||||
"version": "0.162.6",
|
||||
"description": "All-in-one platform to securely manage application configuration and secrets across your team and infrastructure.",
|
||||
"logo": "infisical.jpg",
|
||||
"links": {
|
||||
|
||||
@@ -3,56 +3,27 @@ main_domain = "${domain}"
|
||||
postgres_password = "${password}"
|
||||
postgres_user = "infisical"
|
||||
postgres_db = "infisical"
|
||||
encryption_key = "${hash:32}"
|
||||
auth_secret = "${base64:32}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"ENCRYPTION_KEY=6c1fe4e407b8911c104518103505b218",
|
||||
"AUTH_SECRET=5lrMXKKWCVocS/uerPsl7V+TX/aaUaI7iDkgl3tSmLE=",
|
||||
"ENCRYPTION_KEY=${encryption_key}",
|
||||
"AUTH_SECRET=${auth_secret}",
|
||||
"POSTGRES_PASSWORD=${postgres_password}",
|
||||
"POSTGRES_USER=${postgres_user}",
|
||||
"POSTGRES_DB=${postgres_db}",
|
||||
"SITE_URL=http://${main_domain}:8080",
|
||||
"SITE_URL=http://${main_domain}",
|
||||
"SMTP_HOST=",
|
||||
"SMTP_PORT=",
|
||||
"SMTP_NAME=",
|
||||
"SMTP_PORT=587",
|
||||
"SMTP_FROM_ADDRESS=",
|
||||
"SMTP_FROM_NAME=Infisical",
|
||||
"SMTP_USERNAME=",
|
||||
"SMTP_PASSWORD=",
|
||||
"CLIENT_ID_HEROKU=",
|
||||
"CLIENT_ID_VERCEL=",
|
||||
"CLIENT_ID_NETLIFY=",
|
||||
"CLIENT_ID_GITHUB=",
|
||||
"CLIENT_ID_GITHUB_APP=",
|
||||
"CLIENT_SLUG_GITHUB_APP=",
|
||||
"CLIENT_ID_GITLAB=",
|
||||
"CLIENT_ID_BITBUCKET=",
|
||||
"CLIENT_SECRET_HEROKU=",
|
||||
"CLIENT_SECRET_VERCEL=",
|
||||
"CLIENT_SECRET_NETLIFY=",
|
||||
"CLIENT_SECRET_GITHUB=",
|
||||
"CLIENT_SECRET_GITHUB_APP=",
|
||||
"CLIENT_SECRET_GITLAB=",
|
||||
"CLIENT_SECRET_BITBUCKET=",
|
||||
"CLIENT_SLUG_VERCEL=",
|
||||
"CLIENT_PRIVATE_KEY_GITHUB_APP=",
|
||||
"CLIENT_APP_ID_GITHUB_APP=",
|
||||
"SENTRY_DSN=",
|
||||
"POSTHOG_HOST=",
|
||||
"POSTHOG_PROJECT_API_KEY=",
|
||||
"CLIENT_ID_GOOGLE_LOGIN=",
|
||||
"CLIENT_SECRET_GOOGLE_LOGIN=",
|
||||
"CLIENT_ID_GITHUB_LOGIN=",
|
||||
"CLIENT_SECRET_GITHUB_LOGIN=",
|
||||
"CLIENT_ID_GITLAB_LOGIN=",
|
||||
"CLIENT_SECRET_GITLAB_LOGIN=",
|
||||
"CAPTCHA_SECRET=",
|
||||
"NEXT_PUBLIC_CAPTCHA_SITE_KEY=",
|
||||
"PLAIN_API_KEY=",
|
||||
"PLAIN_WISH_LABEL_IDS=",
|
||||
"SSL_CLIENT_CERTIFICATE_HEADER_KEY=",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "backend"
|
||||
port = 8_080
|
||||
port = 8080
|
||||
host = "${main_domain}"
|
||||
|
||||
@@ -1,39 +1,35 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
kener:
|
||||
image: rajnandan1/kener:latest
|
||||
environment:
|
||||
- TZ=${TZ}
|
||||
- KENER_SECRET_KEY=${KENER_SECRET_KEY} # 🔐 API key / secret
|
||||
- ORIGIN=${ORIGIN}
|
||||
- REDIS_URL=${REDIS_URL}
|
||||
- DATABASE_URL=${DATABASE_URL}
|
||||
- KENER_BASE_PATH=${KENER_BASE_PATH}
|
||||
- ORIGIN=${ORIGIN}
|
||||
- RESEND_API_KEY=${RESEND_API_KEY} # 🔐 API key
|
||||
- RESEND_SENDER_EMAIL=${RESEND_SENDER_EMAIL}
|
||||
ports:
|
||||
- 3000
|
||||
volumes:
|
||||
- kener_db:/app/database
|
||||
- ../files/uploads:/app/uploads
|
||||
depends_on:
|
||||
redis:
|
||||
condition: service_healthy
|
||||
restart: unless-stopped
|
||||
|
||||
postgres:
|
||||
image: postgres:alpine
|
||||
environment:
|
||||
- POSTGRES_USER=${POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD} # 🔐 DB password
|
||||
- POSTGRES_DB=${POSTGRES_DB}
|
||||
restart: unless-stopped
|
||||
|
||||
mysql:
|
||||
image: mariadb:11
|
||||
environment:
|
||||
- MYSQL_USER=${MYSQL_USER}
|
||||
- MYSQL_PASSWORD=${MYSQL_PASSWORD} # 🔐 DB password
|
||||
- MYSQL_DATABASE=${MYSQL_DATABASE}
|
||||
- MYSQL_RANDOM_ROOT_PASSWORD=true
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
volumes:
|
||||
- kener_redis:/data
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
kener_db: {}
|
||||
kener_redis: {}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
KENER_SECRET_KEY = "${password:64}"
|
||||
POSTGRES_PASSWORD = "${password:32}"
|
||||
MYSQL_PASSWORD = "${password:32}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
@@ -13,25 +11,9 @@ host = "${main_domain}"
|
||||
[config.env]
|
||||
TZ = "Etc/UTC"
|
||||
KENER_SECRET_KEY = "${KENER_SECRET_KEY}" # 🔐 API key / secret
|
||||
ORIGIN = "https://${main_domain}"
|
||||
REDIS_URL = "redis://redis:6379"
|
||||
DATABASE_URL = "sqlite://./database/kener.sqlite.db"
|
||||
KENER_BASE_PATH = ""
|
||||
ORIGIN = "http://localhost:3000"
|
||||
RESEND_API_KEY = ""
|
||||
RESEND_SENDER_EMAIL = "Accounts <accounts@resend.dev>"
|
||||
POSTGRES_USER = "user"
|
||||
POSTGRES_DB = "kener_db"
|
||||
MYSQL_USER = "user"
|
||||
MYSQL_DATABASE = "kener_db"
|
||||
MYSQL_RANDOM_ROOT_PASSWORD = "true"
|
||||
MYSQL_PASSWORD = "${MYSQL_PASSWORD}" # 🔐 DB password
|
||||
POSTGRES_PASSWORD = "${POSTGRES_PASSWORD}" # 🔐 DB password
|
||||
|
||||
[[config.mounts]]
|
||||
type = "volume"
|
||||
source = "kener_db"
|
||||
target = "/app/database"
|
||||
|
||||
[[config.mounts]]
|
||||
type = "bind"
|
||||
source = "../files/uploads"
|
||||
target = "/app/uploads"
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
services:
|
||||
app:
|
||||
image: ghcr.io/logto-io/logto:1.41.0
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
image: ghcr.io/logto-io/logto:1.27.0
|
||||
entrypoint: ["sh", "-c", "npm run cli db seed -- --swe && npm start"]
|
||||
ports:
|
||||
- 3001
|
||||
- 3002
|
||||
|
||||
environment:
|
||||
TRUST_PROXY_HEADER: 1
|
||||
DB_URL: postgres://logto:${LOGTO_POSTGRES_PASSWORD}@postgres:5432/logto
|
||||
@@ -18,20 +15,19 @@ services:
|
||||
- logto-connectors:/etc/logto/packages/core/connectors
|
||||
postgres:
|
||||
image: postgres:17-alpine
|
||||
user: postgres
|
||||
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: logto
|
||||
POSTGRES_PASSWORD: ${LOGTO_POSTGRES_PASSWORD}
|
||||
POSTGRES_DB: logto
|
||||
volumes:
|
||||
- postgres-data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready"]
|
||||
test: ["CMD-SHELL", "pg_isready -U logto -d logto"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
|
||||
volumes:
|
||||
logto-connectors:
|
||||
postgres-data:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "logto",
|
||||
"name": "Logto",
|
||||
"version": "1.27.0",
|
||||
"version": "1.41.0",
|
||||
"description": "Logto is an open-source Identity and Access Management (IAM) platform designed to streamline Customer Identity and Access Management (CIAM) and Workforce Identity Management.",
|
||||
"logo": "logto.png",
|
||||
"links": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
admin_domain = "${domain}"
|
||||
postgres_password = "${password}"
|
||||
postgres_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
@@ -17,6 +17,6 @@ port = 3_002
|
||||
host = "${admin_domain}"
|
||||
|
||||
[config.env]
|
||||
LOGTO_ENDPOINT = "http://${admin_domain}"
|
||||
LOGTO_ENDPOINT = "http://${main_domain}"
|
||||
LOGTO_ADMIN_ENDPOINT = "http://${admin_domain}"
|
||||
LOGTO_POSTGRES_PASSWORD = "${postgres_password}"
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
db:
|
||||
image: postgres:16-alpine
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- markup-postgres-data:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_USER: markup
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
POSTGRES_DB: markup
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U markup -d markup"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
markup:
|
||||
image: ghcr.io/pphilfre/markup:main
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
DATABASE_URL: ${DATABASE_URL}
|
||||
NEXT_PUBLIC_DB_PROVIDER: postgres
|
||||
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL}
|
||||
# WorkOS AuthKit (optional): required only for user accounts and cloud sync.
|
||||
# Placeholders keep the app running; replace them with real credentials
|
||||
# from https://dashboard.workos.com to enable sign-in.
|
||||
WORKOS_CLIENT_ID: ${WORKOS_CLIENT_ID}
|
||||
WORKOS_API_KEY: ${WORKOS_API_KEY}
|
||||
WORKOS_COOKIE_PASSWORD: ${WORKOS_COOKIE_PASSWORD}
|
||||
NEXT_PUBLIC_WORKOS_REDIRECT_URI: ${NEXT_PUBLIC_WORKOS_REDIRECT_URI}
|
||||
NODE_ENV: production
|
||||
|
||||
volumes:
|
||||
markup-postgres-data:
|
||||
@@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none">
|
||||
<rect width="100" height="100" rx="20" fill="#0a0a0a"/>
|
||||
<text x="50" y="68" text-anchor="middle" font-family="system-ui, -apple-system, sans-serif" font-weight="700" font-size="48" fill="#7c3aed">M</text>
|
||||
<rect x="22" y="76" width="56" height="3" rx="1.5" fill="#7c3aed" opacity="0.5"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 375 B |
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"id": "markup",
|
||||
"name": "Markup",
|
||||
"version": "main",
|
||||
"description": "Markup is a fast, keyboard-first markdown workspace with live preview, graph view, whiteboards, mind maps, and PostgreSQL-powered cloud sync.",
|
||||
"logo": "markup.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/pphilfre/markup",
|
||||
"website": "https://home.markup.freddiephilpot.dev/",
|
||||
"docs": "https://docs.markup.freddiephilpot.dev/"
|
||||
},
|
||||
"tags": [
|
||||
"markdown",
|
||||
"notes",
|
||||
"editor",
|
||||
"self-hosted"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
postgres_password = "${password:32}"
|
||||
cookie_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"POSTGRES_PASSWORD=${postgres_password}",
|
||||
"DATABASE_URL=postgresql://markup:${postgres_password}@db:5432/markup",
|
||||
"NEXT_PUBLIC_SITE_URL=https://${main_domain}",
|
||||
"# WorkOS AuthKit is optional: it powers user accounts and cloud sync.",
|
||||
"# The app works without it (local, in-browser storage). To enable sign-in,",
|
||||
"# create an app at https://dashboard.workos.com, set the redirect URI below",
|
||||
"# in the WorkOS dashboard, and replace the placeholder credentials.",
|
||||
"WORKOS_CLIENT_ID=client_id_change_me",
|
||||
"WORKOS_API_KEY=sk_change_me",
|
||||
"WORKOS_COOKIE_PASSWORD=${cookie_password}",
|
||||
"NEXT_PUBLIC_WORKOS_REDIRECT_URI=https://${main_domain}/callback",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "markup"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
@@ -54,7 +54,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
op-api:
|
||||
image: lindesvard/openpanel-api:2
|
||||
image: lindesvard/openpanel-api:2.2.1
|
||||
restart: always
|
||||
command: >
|
||||
sh -c "
|
||||
@@ -97,7 +97,7 @@ services:
|
||||
condition: service_healthy
|
||||
|
||||
op-dashboard:
|
||||
image: lindesvard/openpanel-dashboard:2
|
||||
image: lindesvard/openpanel-dashboard:2.2.1
|
||||
restart: always
|
||||
depends_on:
|
||||
op-api:
|
||||
@@ -111,7 +111,7 @@ services:
|
||||
retries: 5
|
||||
|
||||
op-worker:
|
||||
image: lindesvard/openpanel-worker:2
|
||||
image: lindesvard/openpanel-worker:2.2.1
|
||||
restart: always
|
||||
depends_on:
|
||||
op-api:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "openpanel",
|
||||
"name": "OpenPanel",
|
||||
"version": "latest",
|
||||
"version": "2.2.1",
|
||||
"description": "An open-source web and product analytics platform that combines the power of Mixpanel with the ease of Plausible and one of the best Google Analytics replacements.",
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
|
||||
@@ -26,7 +26,7 @@ content = """
|
||||
<part_log remove="remove"/>
|
||||
<listen_host>0.0.0.0</listen_host>
|
||||
<interserver_listen_host>0.0.0.0</interserver_listen_host>
|
||||
<interserver_http_host>opch</interserver_http_host>
|
||||
<interserver_http_host>op-ch</interserver_http_host>
|
||||
<!-- Disable cgroup memory observer -->
|
||||
<cgroups_memory_usage_observer_wait_time>0</cgroups_memory_usage_observer_wait_time>
|
||||
<!-- Not used anymore, but kept for backwards compatibility -->
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
oryx:
|
||||
image: ossrs/oryx:5.15.20
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
# RTMP, WebRTC and SRT are not HTTP protocols, so Traefik cannot route
|
||||
# them through the domain. They must be published directly on the host
|
||||
# (same approach as the poste.io template with its mail ports). Use the
|
||||
# server IP (not the domain) for these protocols.
|
||||
- "1935:1935" # RTMP ingest/playback (TCP)
|
||||
- "8000:8000/udp" # WebRTC media transport (UDP)
|
||||
- "10080:10080/udp" # SRT ingest/playback (UDP)
|
||||
volumes:
|
||||
- oryx-data:/data
|
||||
|
||||
volumes:
|
||||
oryx-data: {}
|
||||
@@ -0,0 +1,29 @@
|
||||
# Oryx (SRS Stack)
|
||||
|
||||
Oryx is an all-in-one video streaming server built on [SRS](https://github.com/ossrs/srs), with a web console for managing streams, recording, forwarding, transcoding and virtual live streaming.
|
||||
|
||||
## First login
|
||||
|
||||
Open the domain assigned to this service. On the first visit Oryx asks you to **create the admin password** — set it right away, since anyone who reaches the page first can claim the instance. The password (and all other state) is stored in the `oryx-data` volume, so it survives restarts and upgrades.
|
||||
|
||||
## Publishing streams
|
||||
|
||||
The web console (Scenarios > Streaming) shows ready-to-copy URLs that include your stream secret. The streaming protocols are **not HTTP**, so Traefik cannot route them through your domain — they are published directly on the server's host ports instead. Use the **server IP address** (not the domain) for these:
|
||||
|
||||
| Protocol | URL format | Host port |
|
||||
| --- | --- | --- |
|
||||
| RTMP (OBS, ffmpeg) | `rtmp://SERVER_IP/live/livestream?secret=xxx` | `1935/tcp` |
|
||||
| SRT | `srt://SERVER_IP:10080?streamid=#!::r=live/livestream,secret=xxx,m=publish` | `10080/udp` |
|
||||
| WebRTC (WHIP) | `https://your-domain/rtc/v1/whip/?app=live&stream=livestream&secret=xxx` | signaling via domain, media via `8000/udp` |
|
||||
|
||||
Make sure your server firewall / cloud security group allows `1935/tcp`, `8000/udp` and `10080/udp`. Because these are fixed host ports, only one Oryx instance can run per server.
|
||||
|
||||
## Playback
|
||||
|
||||
HTTP-based playback goes through your domain (HTTPS via Traefik):
|
||||
|
||||
- HLS: `https://your-domain/live/livestream.m3u8`
|
||||
- HTTP-FLV: `https://your-domain/live/livestream.flv`
|
||||
- WebRTC (WHEP): available from the console's preview page; media flows over `8000/udp`.
|
||||
|
||||
If WebRTC playback or publishing connects but produces no media, verify that UDP port `8000` is reachable from the client — WebRTC media bypasses the reverse proxy entirely.
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg viewBox="0 0 64 32" height="32px" width="64px" id="svg2" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs id="defs6">
|
||||
<linearGradient id="linearGradient28" spreadMethod="pad" gradientTransform="matrix(148.91527,0,0,-148.91527,151.81076,224.17897)" gradientUnits="userSpaceOnUse" y2="0" x2="1" y1="0" x1="0">
|
||||
<stop id="stop24" offset="0" style="stop-opacity:1;stop-color:#3caae1"/>
|
||||
<stop id="stop26" offset="1" style="stop-opacity:1;stop-color:#b65c9e"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient48" spreadMethod="pad" gradientTransform="matrix(155.05911,0,0,-155.05911,49.431911,216.24139)" gradientUnits="userSpaceOnUse" y2="0" x2="1" y1="0" x1="0">
|
||||
<stop id="stop44" offset="0" style="stop-opacity:1;stop-color:#2ca0d4"/>
|
||||
<stop id="stop46" offset="1" style="stop-opacity:1;stop-color:#305ba7"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clipPath58" clipPathUnits="userSpaceOnUse">
|
||||
<path id="path56" d="M 0,350.158 H 350.158 V 0 H 0 Z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g transform="matrix(0.172146, 0, 0, -0.188192, -9.741413, 53.288761)" id="g10" style="">
|
||||
<g id="g12" style="" transform="matrix(0.654687, 0, 0, 0.654687, 47.49966, 55.96529)">
|
||||
<g id="g14">
|
||||
<g id="g20">
|
||||
<g id="g22">
|
||||
<path id="path30" style="fill:url(#linearGradient28);stroke:none" d="m 151.811,280.659 54.062,-54.064 14.238,14.586 c 13.253,11.772 33.681,8.665 42.764,-6.48 v 0 c 6.949,-11.585 4.152,-27.659 -6.248,-35.919 v 0 c -11.647,-9.249 -27.453,-8.66 -37.707,1.501 v 0 c -8.318,8.241 -16.529,16.588 -24.814,24.861 v 0 c -13.578,13.558 -26.814,27.483 -40.842,40.56 v 0 c -0.155,0.144 -0.318,0.269 -0.474,0.412 v 0 c 1.246,-1.658 40.823,-54.57 51.701,-97.422 v 0 c 14.746,-10.175 31.762,-12.852 50.25,-8.006 v 0 c 35.557,9.319 55.709,47.52 41.276,82.815 v 0 c -9.385,22.952 -27.32,35.949 -52.141,38.356 v 0 c -15.155,1.471 -27.697,-2.422 -38.597,-9.506 v 0 l -8.305,8.306 c -6.236,6.235 -14.409,9.353 -22.581,9.353 v 0 c -8.173,0 -16.346,-3.118 -22.582,-9.353"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="g32" style="" transform="matrix(0.653075, 0, 0, 0.653075, 48.56073, 55.406696)">
|
||||
<g id="g34">
|
||||
<g id="g40">
|
||||
<g id="g42">
|
||||
<path id="path50" style="fill:url(#linearGradient48);stroke:none" d="m 50.99,234 c -1.85,-8.185 -1.733,-14.379 -1.264,-20.194 v 0 c 2.822,-30.213 29.126,-54.494 59.465,-55.353 v 0 c 13.788,-0.391 25.237,3.439 35.23,9.815 v 0 l 8.671,-8.669 c 12.471,-12.471 32.691,-12.471 45.163,0 v 0 l -52.152,52.151 c -0.639,0.65 -1.262,1.284 -1.904,1.935 v 0 c -4.061,-4.127 -8.071,-8.229 -12.109,-12.304 v 0 c -7.927,-8.003 -17.355,-11.004 -28.326,-8.029 v 0 C 92.462,196.418 84.207,206.453 83.4,217.68 v 0 c -0.881,12.257 5.312,23.099 16.04,28.075 v 0 c 10.826,5.024 23.504,2.646 32.091,-5.942 v 0 c 21.291,-21.289 42.367,-42.8 63.987,-63.751 v 0 c 2.884,-2.793 5.882,-5.235 8.973,-7.368 v 0 c -16.324,63.52 -50.455,95.764 -51.701,97.422 v 0 c -12.077,11.041 -26.76,16.121 -41.224,16.121 v 0 C 84.3,282.238 57.808,264.189 50.99,234"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g id="g52" style="" transform="matrix(0.797304, 0, 0, 0.797304, 194.474228, 136.918259)">
|
||||
<g clip-path="url(#clipPath58)" id="g54">
|
||||
<g transform="translate(126.2779,90.4397)" id="g60">
|
||||
<path id="path62" style="fill:#494545;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 h -19.449 c -3.396,0.381 -5.093,2.049 -5.093,5.005 l 0.132,0.879 c 0.731,2.487 2.385,3.731 4.961,3.731 H 5.357 c 1.2,0 2.327,0.16 3.381,0.484 4.479,1.843 6.717,5.005 6.717,9.483 0,0.233 -0.073,0.351 -0.219,0.351 h -35.783 c -2.458,0 -5.034,-0.776 -7.727,-2.328 -4.419,-3.453 -6.629,-7.361 -6.629,-11.721 0,-2.167 0.337,-4.289 1.009,-6.366 2.752,-6.586 8.109,-9.879 16.069,-9.879 h 18.09 c 3.395,-0.352 5.092,-2.005 5.092,-4.961 L 5.226,-16.2 c -0.732,-2.488 -2.387,-3.732 -4.961,-3.732 h -24.807 c -1.199,0 -2.326,-0.175 -3.381,-0.527 -4.477,-1.815 -6.717,-4.962 -6.717,-9.439 0,-0.264 0.074,-0.396 0.22,-0.396 H 1.362 c 2.458,0 5.034,0.79 7.728,2.371 4.419,3.453 6.629,7.361 6.629,11.723 0,2.371 -0.337,4.404 -1.011,6.102 C 12.075,-3.365 7.172,0 0,0"/>
|
||||
</g>
|
||||
<g transform="translate(257.773,80.342)" id="g64">
|
||||
<path id="path66" style="fill:#494545;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -2.633,6.732 -7.536,10.098 -14.708,10.098 h -19.449 c -3.396,0.381 -5.093,2.048 -5.093,5.005 l 0.131,0.878 c 0.732,2.488 2.386,3.732 4.962,3.732 h 24.805 c 1.201,0 2.328,0.16 3.381,0.483 4.48,1.844 6.717,5.005 6.717,9.484 0,0.233 -0.072,0.35 -0.218,0.35 h -35.783 c -2.458,0 -5.035,-0.775 -7.727,-2.327 -4.419,-3.453 -6.63,-7.361 -6.63,-11.722 0,-2.167 0.337,-4.289 1.01,-6.366 2.751,-6.586 8.108,-9.879 16.069,-9.879 h 18.089 c 3.395,-0.351 5.092,-2.005 5.092,-4.961 l -0.13,-0.878 c -0.733,-2.488 -2.387,-3.731 -4.962,-3.731 H -39.25 c -1.2,0 -2.327,-0.176 -3.381,-0.527 -4.477,-1.816 -6.717,-4.962 -6.717,-9.44 0,-0.263 0.073,-0.395 0.22,-0.395 h 35.781 c 2.459,0 5.035,0.79 7.728,2.371 4.419,3.453 6.63,7.361 6.63,11.722 C 1.011,-3.731 0.674,-1.698 0,0"/>
|
||||
</g>
|
||||
<g transform="translate(160.6578,100.5822)" id="g68">
|
||||
<path id="path70" style="fill:#494545;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 h 7.033 v 5.847 c 0,1.153 0.634,2.204 1.654,2.741 1.021,0.537 2.245,0.467 3.195,-0.185 L 20.445,2.54 C 21.284,1.965 21.787,1.017 21.791,0 h 2.004 c 2.986,0 4.77,-1.713 5.356,-5.138 L 29.02,-5.839 c -0.674,-3.015 -2.416,-4.523 -5.225,-4.523 H 0 Z m 23.531,-20.108 c 2.518,0 5.182,0.834 7.991,2.503 4.594,3.306 6.894,7.507 6.894,12.6 0,4.126 -1.626,7.815 -4.874,11.064 -3.103,2.545 -5.956,3.82 -8.562,3.82 H -9.528 l -0.22,-0.265 v -49.217 l 0.133,-0.13 c 2.048,0 3.832,0.482 5.356,1.448 2.838,2.107 4.259,4.317 4.259,6.63 v 20.722 l 26.648,-26.518 c 1.288,-1.99 3.66,-2.986 7.114,-2.986 3.891,0.235 5.84,0.908 5.84,2.02 v 0.22 c 0,0.146 -5.944,6.176 -17.826,18.089 z"/>
|
||||
</g>
|
||||
<g transform="translate(180.5738,101.9846)" id="g72">
|
||||
<path id="path74" style="fill:#494545;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -8.563,5.863 c -0.323,0.222 -0.688,0.333 -1.055,0.333 -0.299,0 -0.598,-0.072 -0.878,-0.22 -0.627,-0.33 -1,-0.95 -1,-1.659 V -7.41 c 0,-0.708 0.373,-1.327 1,-1.657 0.627,-0.332 1.349,-0.289 1.933,0.111 L 0,-3.092 c 0.518,0.354 0.815,0.918 0.815,1.545 C 0.815,-0.918 0.518,-0.354 0,0"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.7 KiB |
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"id": "oryx",
|
||||
"name": "Oryx",
|
||||
"version": "5.15.20",
|
||||
"description": "Oryx (formerly SRS Stack) is an all-in-one, open-source video streaming server with a web console. It ingests RTMP, WebRTC (WHIP) and SRT streams and plays them back over HLS, HTTP-FLV and WebRTC (WHEP), with built-in recording, forwarding, transcoding and virtual live streaming.",
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/ossrs/oryx",
|
||||
"website": "https://ossrs.io/",
|
||||
"docs": "https://ossrs.io/lts/en-us/docs/v6/doc/getting-started-oryx",
|
||||
"docker": "https://hub.docker.com/r/ossrs/oryx"
|
||||
},
|
||||
"tags": [
|
||||
"streaming",
|
||||
"video",
|
||||
"rtmp",
|
||||
"webrtc",
|
||||
"srt",
|
||||
"hls",
|
||||
"media-server"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "oryx"
|
||||
port = 2022
|
||||
host = "${main_domain}"
|
||||
@@ -5,7 +5,7 @@ services:
|
||||
image: mysql:5.7
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||
MYSQL_DATABASE: tu_base_de_datos
|
||||
MYSQL_DATABASE: ${MYSQL_DATABASE}
|
||||
MYSQL_USER: ${MYSQL_USER}
|
||||
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
|
||||
volumes:
|
||||
@@ -19,6 +19,8 @@ services:
|
||||
PMA_USER: ${MYSQL_USER}
|
||||
PMA_PASSWORD: ${MYSQL_PASSWORD}
|
||||
PMA_ARBITRARY: 1
|
||||
UPLOAD_LIMIT: ${UPLOAD_LIMIT}
|
||||
MAX_EXECUTION_TIME: ${MAX_EXECUTION_TIME}
|
||||
depends_on:
|
||||
- db
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@ host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
MYSQL_ROOT_PASSWORD = "${root_password}"
|
||||
MYSQL_DATABASE = "mysql"
|
||||
MYSQL_DATABASE = "phpmyadmin"
|
||||
MYSQL_USER = "phpmyadmin"
|
||||
MYSQL_PASSWORD = "${user_password}"
|
||||
UPLOAD_LIMIT = "512M"
|
||||
MAX_EXECUTION_TIME = "600"
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
services:
|
||||
postgresus:
|
||||
image: rostislavdugin/postgresus:latest
|
||||
# Postgresus was renamed upstream to Databasus (https://github.com/databasus/databasus).
|
||||
# This image is frozen at its final release; use the "databasus" template for new deployments.
|
||||
image: rostislavdugin/postgresus:v2.15.3
|
||||
ports:
|
||||
- "4005"
|
||||
volumes:
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"id": "postgresus",
|
||||
"name": "Postgresus",
|
||||
"version": "latest",
|
||||
"description": "Free, open source and self-hosted solution for automated PostgreSQL backups. With multiple storage options and notifications",
|
||||
"version": "v2.15.3",
|
||||
"description": "Deprecated: the project was renamed to Databasus, use the Databasus template instead. Free, open source and self-hosted solution for automated PostgreSQL backups, frozen at its final release",
|
||||
"logo": "postgresus.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/RostislavDugin/postgresus",
|
||||
"website": "https://postgresus.com",
|
||||
"docs": "https://postgresus.com"
|
||||
"website": "https://databasus.com",
|
||||
"docs": "https://databasus.com"
|
||||
},
|
||||
"tags": [
|
||||
"postgres",
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
# https://www.rybbit.io/docs/self-hosting-advanced
|
||||
|
||||
# NOTE: there are two sample HTTP traefik domain entries created:
|
||||
# - rybbit_backend (port 3001, path /api),
|
||||
# - rybbit_backend (port 3001, path /api),
|
||||
# - rybbit_client (port 3002, path /)
|
||||
#
|
||||
# You should treat these as placeholders - Rybbit only supports HTTPS.
|
||||
#
|
||||
# You should also update the `BASE_URL`, and `DOMAIN_NAME` environment
|
||||
# variable when updating the domain entries with your custom domain.
|
||||
# You should also update the `BASE_URL` environment variable when
|
||||
# updating the domain entries with your custom domain.
|
||||
|
||||
services:
|
||||
rybbit_clickhouse:
|
||||
@@ -50,8 +50,41 @@ services:
|
||||
retries: 3
|
||||
restart: unless-stopped
|
||||
|
||||
rybbit_redis:
|
||||
image: redis:7-alpine
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
# Backs session tracking and the BullMQ queues. noeviction is required by
|
||||
# BullMQ (evicting job keys corrupts queues); AOF (everysec) keeps queues
|
||||
# durable across restarts.
|
||||
command:
|
||||
- redis-server
|
||||
- --requirepass
|
||||
- ${REDIS_PASSWORD}
|
||||
- --appendonly
|
||||
- "yes"
|
||||
- --appendfsync
|
||||
- everysec
|
||||
- --maxmemory-policy
|
||||
- noeviction
|
||||
healthcheck:
|
||||
test:
|
||||
[
|
||||
"CMD",
|
||||
"redis-cli",
|
||||
"-a",
|
||||
"${REDIS_PASSWORD}",
|
||||
"--no-auth-warning",
|
||||
"ping",
|
||||
]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 5s
|
||||
restart: unless-stopped
|
||||
|
||||
rybbit_backend:
|
||||
image: ghcr.io/rybbit-io/rybbit-backend:v1.5.1
|
||||
image: ghcr.io/rybbit-io/rybbit-backend:v2.7.0
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- CLICKHOUSE_HOST=http://rybbit_clickhouse:8123
|
||||
@@ -63,15 +96,20 @@ services:
|
||||
- POSTGRES_DB=${POSTGRES_DB}
|
||||
- POSTGRES_USER=${POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
- REDIS_HOST=rybbit_redis
|
||||
- REDIS_PORT=6379
|
||||
- REDIS_PASSWORD=${REDIS_PASSWORD}
|
||||
- BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
|
||||
- BASE_URL=${BASE_URL}
|
||||
- DOMAIN_NAME=${DOMAIN_NAME}
|
||||
- DISABLE_SIGNUP=${DISABLE_SIGNUP}
|
||||
- DISABLE_TELEMETRY=${DISABLE_TELEMETRY}
|
||||
depends_on:
|
||||
rybbit_clickhouse:
|
||||
condition: service_healthy
|
||||
rybbit_postgres:
|
||||
condition: service_started
|
||||
rybbit_redis:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3001/api/health"]
|
||||
interval: 30s
|
||||
@@ -81,11 +119,10 @@ services:
|
||||
restart: unless-stopped
|
||||
|
||||
rybbit_client:
|
||||
image: ghcr.io/rybbit-io/rybbit-client:v1.5.1
|
||||
image: ghcr.io/rybbit-io/rybbit-client:v2.7.0
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- NEXT_PUBLIC_BACKEND_URL=${BASE_URL}
|
||||
- DOMAIN_NAME=${DOMAIN_NAME}
|
||||
- NEXT_PUBLIC_DISABLE_SIGNUP=${DISABLE_SIGNUP}
|
||||
depends_on:
|
||||
- rybbit_backend
|
||||
@@ -94,3 +131,4 @@ services:
|
||||
volumes:
|
||||
clickhouse_data:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "rybbit",
|
||||
"name": "Rybbit",
|
||||
"version": "v1.5.1",
|
||||
"version": "v2.7.0",
|
||||
"description": "Open-source and privacy-friendly alternative to Google Analytics that is 10x more intuitive",
|
||||
"logo": "rybbit.png",
|
||||
"links": {
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
better_auth_secret = "${password:32}"
|
||||
better_auth_secret = "${base64:32}"
|
||||
clickhouse_password = "${password:32}"
|
||||
postgres_password = "${password:32}"
|
||||
redis_password = "${password:32}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "rybbit_backend"
|
||||
@@ -17,15 +18,16 @@ host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
BASE_URL = "http://${main_domain}"
|
||||
DOMAIN_NAME= "${main_domain}"
|
||||
BETTER_AUTH_SECRET = "${better_auth_secret}"
|
||||
DISABLE_SIGNUP = "false"
|
||||
DISABLE_TELEMETRY = "false"
|
||||
CLICKHOUSE_DB = "analytics"
|
||||
CLICKHOUSE_USER = "default"
|
||||
CLICKHOUSE_PASSWORD = "${clickhouse_password}"
|
||||
POSTGRES_DB = "analytics"
|
||||
POSTGRES_USER = "frog"
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
REDIS_PASSWORD = "${redis_password}"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "./clickhouse_config/enable_json.xml"
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
x-common: &common
|
||||
networks:
|
||||
- signoz-net
|
||||
restart: unless-stopped
|
||||
logging:
|
||||
options:
|
||||
@@ -89,11 +87,12 @@ services:
|
||||
- ZOO_PROMETHEUS_METRICS_PORT_NUMBER=9141
|
||||
clickhouse:
|
||||
!!merge <<: *clickhouse-defaults
|
||||
container_name: signoz-clickhouse
|
||||
hostname: clickhouse
|
||||
volumes:
|
||||
- ../files/clickhouse/config.xml:/etc/clickhouse-server/config.xml
|
||||
- ../files/clickhouse/user_scripts:/var/lib/clickhouse/user_scripts/
|
||||
- ../files/clickhouse/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
|
||||
- ../files/clickhouse/docker_related_config.xml:/etc/clickhouse-server/config.d/docker_related_config.xml
|
||||
- clickhouse:/var/lib/clickhouse/
|
||||
signoz:
|
||||
!!merge <<: *db-depend
|
||||
@@ -156,9 +155,6 @@ services:
|
||||
- --dsn=tcp://clickhouse:9000
|
||||
- --up=
|
||||
restart: on-failure
|
||||
networks:
|
||||
signoz-net:
|
||||
name: signoz-net
|
||||
volumes:
|
||||
clickhouse:
|
||||
name: signoz-clickhouse
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
otel_domain = "${domain}"
|
||||
jwt_secret = "${password:64}"
|
||||
|
||||
[config]
|
||||
@@ -12,7 +13,7 @@ path = "/"
|
||||
[[config.domains]]
|
||||
serviceName = "otel-collector"
|
||||
port = 4318
|
||||
host = "${main_domain}"
|
||||
host = "${otel_domain}"
|
||||
path = "/"
|
||||
|
||||
[config.env]
|
||||
@@ -1246,7 +1247,23 @@ content = """
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "/signoz/prometheus.xml"
|
||||
filePath = "/clickhouse/docker_related_config.xml"
|
||||
content = """
|
||||
<?xml version="1.0"?>
|
||||
<clickhouse>
|
||||
<!-- Overrides the docker image's default config.d/docker_related_config.xml,
|
||||
which listens on the IPv6 wildcard address ([::]) first. On hosts without
|
||||
IPv6 support the bind fails, so listen on IPv4 only. -->
|
||||
<listen_host>0.0.0.0</listen_host>
|
||||
<listen_try>1</listen_try>
|
||||
<!-- Container IPs can change and DNS records (zookeeper-1, clickhouse) may not
|
||||
be ready the moment ClickHouse starts. Do not cache DNS lookup failures. -->
|
||||
<disable_internal_dns_cache>1</disable_internal_dns_cache>
|
||||
</clickhouse>
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "/signoz/prometheus.yml"
|
||||
content = """
|
||||
# my global config
|
||||
global:
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
services:
|
||||
silex:
|
||||
image: silexlabs/silex:3.7.0
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 6805
|
||||
environment:
|
||||
- SILEX_URL=${SILEX_URL}
|
||||
- SILEX_SESSION_SECRET=${SILEX_SESSION_SECRET}
|
||||
- STORAGE_CONNECTORS=fs
|
||||
- HOSTING_CONNECTORS=fs,download
|
||||
- SILEX_FS_ROOT=/silex/silex/storage
|
||||
- SILEX_FS_HOSTING_ROOT=/silex/silex/hosting
|
||||
volumes:
|
||||
- silex-storage:/silex/silex/storage
|
||||
- silex-hosting:/silex/silex/hosting
|
||||
|
||||
volumes:
|
||||
silex-storage:
|
||||
silex-hosting:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"id": "silex",
|
||||
"name": "Silex",
|
||||
"version": "3.7.0",
|
||||
"description": "Silex is a free and open-source website builder for professional designers. It lets you create static websites visually with a drag-and-drop editor, custom CSS and JavaScript, and publish them anywhere.",
|
||||
"logo": "logo.png",
|
||||
"links": {
|
||||
"github": "https://github.com/silexlabs/Silex",
|
||||
"website": "https://www.silex.me",
|
||||
"docs": "https://docs.silex.me"
|
||||
},
|
||||
"tags": [
|
||||
"website-builder",
|
||||
"no-code",
|
||||
"static-site"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
session_secret = "${password:32}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "silex"
|
||||
port = 6805
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
SILEX_URL = "http://${main_domain}"
|
||||
SILEX_SESSION_SECRET = "${session_secret}"
|
||||
@@ -0,0 +1,13 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
spacetimedb:
|
||||
image: clockworklabs/spacetime:v2.6.1
|
||||
restart: unless-stopped
|
||||
command: start
|
||||
ports:
|
||||
- 3000
|
||||
volumes:
|
||||
- spacetimedb-data:/home/spacetime
|
||||
|
||||
volumes:
|
||||
spacetimedb-data: {}
|
||||
@@ -0,0 +1,45 @@
|
||||
# SpacetimeDB
|
||||
|
||||
SpacetimeDB is a database and server runtime in one: your clients connect directly to the database and your application logic runs inside it as WebAssembly modules. There is no web UI — the domain assigned to this service exposes the SpacetimeDB HTTP/WebSocket API (so opening `/` in a browser returns a plain 404; that is expected).
|
||||
|
||||
## Verify the server is running
|
||||
|
||||
```bash
|
||||
curl -i https://your-domain.com/v1/ping
|
||||
```
|
||||
|
||||
A `200 OK` response means the server is up.
|
||||
|
||||
## Connect with the SpacetimeDB CLI
|
||||
|
||||
1. Install the CLI on your local machine:
|
||||
|
||||
```bash
|
||||
curl -sSf https://install.spacetimedb.com | sh
|
||||
```
|
||||
|
||||
2. Register your Dokploy instance as a server and make it the default:
|
||||
|
||||
```bash
|
||||
spacetime server add --url https://your-domain.com dokploy --default
|
||||
```
|
||||
|
||||
3. Log in (or create an anonymous local identity) and publish a module:
|
||||
|
||||
```bash
|
||||
spacetime login
|
||||
spacetime publish --server dokploy my-database
|
||||
```
|
||||
|
||||
4. Check connectivity at any time:
|
||||
|
||||
```bash
|
||||
spacetime server ping dokploy
|
||||
```
|
||||
|
||||
From your game or app, connect with any SpacetimeDB client SDK (Rust, C#, TypeScript) using `https://your-domain.com` as the host URI. See the [getting started guide](https://spacetimedb.com/docs/getting-started) for a full walkthrough.
|
||||
|
||||
## Notes
|
||||
|
||||
- All server state (databases, logs and the JWT signing keys used for identities) is persisted in the `spacetimedb-data` volume, so identities survive restarts and upgrades.
|
||||
- Client connections use WebSockets over the same domain; no extra configuration is needed.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 3.6 KiB |
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"id": "spacetimedb",
|
||||
"name": "SpacetimeDB",
|
||||
"version": "v2.6.1",
|
||||
"description": "SpacetimeDB is a relational database with a built-in server runtime. Clients connect directly to the database and run server-side logic (modules) inside it, making it ideal for real-time multiplayer games, chat and collaborative applications without a separate backend.",
|
||||
"logo": "logo.png",
|
||||
"links": {
|
||||
"github": "https://github.com/clockworklabs/SpacetimeDB",
|
||||
"website": "https://spacetimedb.com/",
|
||||
"docs": "https://spacetimedb.com/docs"
|
||||
},
|
||||
"tags": [
|
||||
"database",
|
||||
"realtime",
|
||||
"backend"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "spacetimedb"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
@@ -1,9 +1,7 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
zitadel:
|
||||
restart: 'always'
|
||||
image: 'ghcr.io/zitadel/zitadel:latest'
|
||||
image: 'ghcr.io/zitadel/zitadel:v4.16.0'
|
||||
command: 'start-from-init --masterkey "${ZITADEL_MASTERKEY}" --tlsMode disabled'
|
||||
environment:
|
||||
# Database Configuration
|
||||
@@ -17,33 +15,37 @@ services:
|
||||
ZITADEL_DATABASE_POSTGRES_ADMIN_PASSWORD: "${POSTGRES_PASSWORD}"
|
||||
ZITADEL_DATABASE_POSTGRES_ADMIN_SSL_MODE: disable
|
||||
|
||||
# External Configuration for HTTP only - TLS mode disabled
|
||||
ZITADEL_EXTERNALSECURE: false
|
||||
ZITADEL_EXTERNALPORT: 8080
|
||||
ZITADEL_EXTERNALDOMAIN: "${EXTERNAL_DOMAIN}"
|
||||
# External access configuration. These MUST match the domain configured
|
||||
# in the Domains tab and the scheme/port it is served on, otherwise
|
||||
# Zitadel answers {"code":5,"message":"Not Found"}.
|
||||
# HTTP -> ZITADEL_EXTERNALPORT=80, ZITADEL_EXTERNALSECURE=false
|
||||
# HTTPS -> ZITADEL_EXTERNALPORT=443, ZITADEL_EXTERNALSECURE=true
|
||||
ZITADEL_EXTERNALDOMAIN: "${ZITADEL_EXTERNALDOMAIN}"
|
||||
ZITADEL_EXTERNALPORT: "${ZITADEL_EXTERNALPORT}"
|
||||
ZITADEL_EXTERNALSECURE: "${ZITADEL_EXTERNALSECURE}"
|
||||
ZITADEL_TLS_ENABLED: false
|
||||
|
||||
# Disable Email Notifications
|
||||
ZITADEL_NOTIFICATIONS_SMTP_HOST: ""
|
||||
ZITADEL_NOTIFICATIONS_SMTP_PORT: ""
|
||||
|
||||
# Custom Admin User Configuration
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_USERNAME: "${ZITADEL_FIRSTINSTANCE_ORG_HUMAN_USERNAME}"
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORD: "${ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORD}"
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_EMAIL_ADDRESS: "${ZITADEL_FIRSTINSTANCE_ORG_HUMAN_EMAIL_ADDRESS}"
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_FIRSTNAME: "${ZITADEL_FIRSTINSTANCE_ORG_HUMAN_FIRSTNAME}"
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_LASTNAME: "${ZITADEL_FIRSTINSTANCE_ORG_HUMAN_LASTNAME}"
|
||||
|
||||
# Default Instance Features
|
||||
|
||||
# Use the login UI built into the API container (no extra login-v2 service needed)
|
||||
ZITADEL_DEFAULTINSTANCE_FEATURES_LOGINV2_REQUIRED: false
|
||||
|
||||
healthcheck:
|
||||
test: ["CMD", "/app/zitadel", "ready"]
|
||||
interval: '10s'
|
||||
timeout: '30s'
|
||||
retries: 12
|
||||
start_period: '30s'
|
||||
depends_on:
|
||||
db:
|
||||
condition: 'service_healthy'
|
||||
ports:
|
||||
- '8080'
|
||||
volumes:
|
||||
- zitadel_data:/app/data
|
||||
expose:
|
||||
- 8080
|
||||
|
||||
db:
|
||||
restart: 'always'
|
||||
@@ -63,4 +65,3 @@ services:
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
zitadel_data:
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "zitadel",
|
||||
"name": "Zitadel",
|
||||
"version": "latest",
|
||||
"version": "4.16.0",
|
||||
"description": "Open-source identity and access management platform with multi-tenancy, OpenID Connect, SAML, and OAuth 2.0 support.",
|
||||
"logo": "zitadel.png",
|
||||
"links": {
|
||||
|
||||
@@ -7,6 +7,8 @@ admin_email = "${email}"
|
||||
admin_password = "AdminPassword123!"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "zitadel"
|
||||
port = 8080
|
||||
@@ -16,7 +18,15 @@ path = "/"
|
||||
[config.env]
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
ZITADEL_MASTERKEY = "${zitadel_masterkey}"
|
||||
EXTERNAL_DOMAIN = "${main_domain}"
|
||||
|
||||
# ZITADEL_EXTERNALDOMAIN must always match the domain configured in the
|
||||
# Domains tab. If you change the domain, update this variable too (and do it
|
||||
# BEFORE the first deploy — Zitadel binds its instance to this domain on
|
||||
# first start). For a domain served over HTTPS set ZITADEL_EXTERNALPORT=443
|
||||
# and ZITADEL_EXTERNALSECURE=true.
|
||||
ZITADEL_EXTERNALDOMAIN = "${main_domain}"
|
||||
ZITADEL_EXTERNALPORT = "80"
|
||||
ZITADEL_EXTERNALSECURE = "false"
|
||||
|
||||
# Custom Admin User Configuration
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_USERNAME = "${admin_username}"
|
||||
@@ -24,5 +34,3 @@ ZITADEL_FIRSTINSTANCE_ORG_HUMAN_PASSWORD = "${admin_password}"
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_EMAIL_ADDRESS = "${admin_email}"
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_FIRSTNAME = "Admin"
|
||||
ZITADEL_FIRSTINSTANCE_ORG_HUMAN_LASTNAME = "User"
|
||||
|
||||
[[config.mounts]]
|
||||
|
||||
Reference in New Issue
Block a user