Files
Qortal-Nextcloud-Integration/docker-compose.devprod.yml
2026-07-11 10:59:18 -07:00

269 lines
10 KiB
YAML

services:
db:
image: mariadb:11
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- db_data:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 10
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
- redis_data:/data
broker_db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${BROKER_DB_NAME:-qortal_broker}
POSTGRES_USER: ${BROKER_DB_USER:-qortal_broker}
POSTGRES_PASSWORD: ${BROKER_DB_PASSWORD:-qortal_brokerpass}
volumes:
- broker_db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${BROKER_DB_USER:-qortal_broker} -d ${BROKER_DB_NAME:-qortal_broker}"]
interval: 10s
timeout: 5s
retries: 10
qortal_node:
build:
context: ${QORTAL_NODE_CONTEXT:-../qortal}
dockerfile: ${QORTAL_NODE_DOCKERFILE:-Dockerfile}
restart: unless-stopped
environment:
QORTAL_JVM_MEMORY_ARGS: ${QORTAL_JVM_MEMORY_ARGS:-}
ports:
- "${QORTAL_NODE_GATEWAY_BIND_HOST:-127.0.0.1}:${QORTAL_NODE_GATEWAY_HOST_PORT:-12390}:8080"
- "${QORTAL_NODE_API_BIND_HOST:-127.0.0.1}:${QORTAL_NODE_API_HOST_PORT:-12391}:12391"
- "${QORTAL_NODE_P2P_BIND_HOST:-0.0.0.0}:${QORTAL_NODE_P2P_HOST_PORT:-12392}:12392"
- "${QORTAL_NODE_QDN_BIND_HOST:-0.0.0.0}:${QORTAL_NODE_QDN_HOST_PORT:-12394}:12394"
volumes:
- ./qortal/data:/qortal
app:
image: ${NEXTCLOUD_IMAGE:-nextcloud:34-apache}
restart: unless-stopped
entrypoint: ["/usr/local/bin/qni-nextcloud-entrypoint.sh"]
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
environment:
MYSQL_HOST: db
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
REDIS_HOST: redis
NEXTCLOUD_ADMIN_USER: ${NEXTCLOUD_ADMIN_USER}
NEXTCLOUD_ADMIN_PASSWORD: ${NEXTCLOUD_ADMIN_PASSWORD}
NEXTCLOUD_SERVICE_USER: ${NEXTCLOUD_SERVICE_USER}
NEXTCLOUD_SERVICE_PASSWORD: ${NEXTCLOUD_SERVICE_PASSWORD}
NEXTCLOUD_TRUSTED_DOMAINS: ${NEXTCLOUD_TRUSTED_DOMAINS}
NEXTCLOUD_UPDATE: 1
OVERWRITEPROTOCOL: https
QORTAL_BROKER_INTERNAL_API_TOKEN: ${BROKER_INTERNAL_API_TOKEN}
QORTAL_AUTH_NODE_API_KEY: ${QORTAL_AUTH_NODE_API_KEY:-}
QORTAL_NODE_API_KEY: ${QORTAL_NODE_API_KEY:-}
BROKER_REQUEST_BODY_LIMIT: ${BROKER_REQUEST_BODY_LIMIT:-64mb}
QORTAL_FILES_PUBLISH_MAX_SIZE: ${QORTAL_FILES_PUBLISH_MAX_SIZE:-}
NEXTCLOUD_PHP_UPLOAD_MAX_FILESIZE: ${NEXTCLOUD_PHP_UPLOAD_MAX_FILESIZE:-}
NEXTCLOUD_PHP_POST_MAX_SIZE: ${NEXTCLOUD_PHP_POST_MAX_SIZE:-}
NEXTCLOUD_PHP_MEMORY_LIMIT: ${NEXTCLOUD_PHP_MEMORY_LIMIT:-}
volumes:
- ./nextcloud/html:/var/www/html
- ./nextcloud/data:/var/www/html/data
- ${NEXTCLOUD_CUSTOM_APPS_PATH:-./nextcloud/custom_apps}:/var/www/html/custom_apps
- ./deploy/apache/nextcloud-remoteip.conf:/etc/apache2/conf-enabled/remoteip.conf:ro
- ./deploy/nextcloud/qni-nextcloud-entrypoint.sh:/usr/local/bin/qni-nextcloud-entrypoint.sh:ro
cron:
image: ${NEXTCLOUD_IMAGE:-nextcloud:34-apache}
restart: unless-stopped
user: "33:33"
depends_on:
app:
condition: service_started
entrypoint: /bin/sh
command: -c "while true; do echo \"[cron] $(date -Iseconds) running cron.php + talk/files relay fallback\"; php -f /var/www/html/cron.php; php -f /var/www/html/custom_apps/qortal_talk_bridge/cron-relay.php || true; php -f /var/www/html/custom_apps/qortal_files_bridge/cron-relay.php || true; sleep 30; done"
environment:
NEXTCLOUD_ADMIN_USER: ${NEXTCLOUD_ADMIN_USER}
NEXTCLOUD_ADMIN_PASSWORD: ${NEXTCLOUD_ADMIN_PASSWORD}
NEXTCLOUD_SERVICE_USER: ${NEXTCLOUD_SERVICE_USER}
NEXTCLOUD_SERVICE_PASSWORD: ${NEXTCLOUD_SERVICE_PASSWORD}
QORTAL_AUTH_NODE_API_KEY: ${QORTAL_AUTH_NODE_API_KEY:-}
QORTAL_NODE_API_KEY: ${QORTAL_NODE_API_KEY:-}
volumes:
- ./nextcloud/html:/var/www/html
- ./nextcloud/data:/var/www/html/data
- ${NEXTCLOUD_CUSTOM_APPS_PATH:-./nextcloud/custom_apps}:/var/www/html/custom_apps
broker:
build:
context: ./services/qortal-oidc-broker
dockerfile: Dockerfile
restart: unless-stopped
depends_on:
app:
condition: service_started
broker_db:
condition: service_healthy
environment:
PORT: 3000
NEXTCLOUD_BASE_URL: ${NEXTCLOUD_BASE_URL}
NEXTCLOUD_PUBLIC_URL: ${NEXTCLOUD_PUBLIC_URL}
NEXTCLOUD_SERVICE_USER: ${NEXTCLOUD_SERVICE_USER}
NEXTCLOUD_SERVICE_PASSWORD: ${NEXTCLOUD_SERVICE_PASSWORD}
BROKER_DATABASE_URL: ${BROKER_DATABASE_URL:-postgresql://qortal_broker:qortal_brokerpass@broker_db:5432/qortal_broker}
QORTAL_EXTERNAL_AUTH_BASE_URL: ${QORTAL_EXTERNAL_AUTH_BASE_URL:-http://external_auth:3191}
QORTAL_EXTERNAL_AUTH_APP_ID: ${QORTAL_EXTERNAL_AUTH_APP_ID}
QORTAL_EXTERNAL_AUTH_APP_SECRET: ${QORTAL_EXTERNAL_AUTH_APP_SECRET}
BROKER_INTERNAL_API_TOKEN: ${BROKER_INTERNAL_API_TOKEN}
BROKER_CORS_ALLOWED_ORIGINS: ${BROKER_CORS_ALLOWED_ORIGINS}
BROKER_REQUEST_BODY_LIMIT: ${BROKER_REQUEST_BODY_LIMIT:-64mb}
OIDC_ISSUER: ${OIDC_ISSUER}
OIDC_CLIENT_ID: ${OIDC_CLIENT_ID}
OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET}
OIDC_REDIRECT_URI_ALLOWLIST: ${OIDC_REDIRECT_URI_ALLOWLIST}
OIDC_POLICY_MODE: ${OIDC_POLICY_MODE}
OIDC_AUTO_PROVISION_GUARD: ${OIDC_AUTO_PROVISION_GUARD}
OIDC_INVITE_TTL_SECONDS: ${OIDC_INVITE_TTL_SECONDS}
OIDC_REQUIRE_EMAIL_FOR_NEW_ACCOUNT: ${OIDC_REQUIRE_EMAIL_FOR_NEW_ACCOUNT:-true}
OIDC_BRANDING_MODE: ${OIDC_BRANDING_MODE:-powered}
OIDC_AUTH_REQUEST_TTL_SECONDS: ${OIDC_AUTH_REQUEST_TTL_SECONDS}
OIDC_AUTH_CODE_TTL_SECONDS: ${OIDC_AUTH_CODE_TTL_SECONDS}
OIDC_ACCESS_TOKEN_TTL_SECONDS: ${OIDC_ACCESS_TOKEN_TTL_SECONDS}
OIDC_ID_TOKEN_TTL_SECONDS: ${OIDC_ID_TOKEN_TTL_SECONDS}
OIDC_LOGIN_LOGO_URL: ${OIDC_LOGIN_LOGO_URL}
OIDC_PRIVATE_KEY_PEM: ${OIDC_PRIVATE_KEY_PEM}
OIDC_PRIVATE_KEY_PEM_B64: ${OIDC_PRIVATE_KEY_PEM_B64:-}
OIDC_KEY_ID: ${OIDC_KEY_ID}
volumes:
- ./services/qortal-oidc-broker/src:/app/src
- ./services/qortal-oidc-broker/tsconfig.json:/app/tsconfig.json
collabora:
profiles: ["office"]
image: collabora/code:latest
restart: unless-stopped
environment:
aliasgroup1: https://${NEXTCLOUD_DOMAIN}:443
username: ${COLLABORA_ADMIN_USER:-admin}
password: ${COLLABORA_ADMIN_PASSWORD:-}
extra_params: --o:ssl.enable=false --o:ssl.termination=true
ports:
- "127.0.0.1:${COLLABORA_PORT:-9980}:9980"
talk_hpb:
profiles: ["talk", "turn", "janus"]
build:
context: ./services/talk-hpb-patched
dockerfile: Dockerfile
args:
TALK_HPB_BASE_IMAGE: ${TALK_HPB_BASE_IMAGE:-ghcr.io/nextcloud-releases/aio-talk:latest}
image: ${TALK_HPB_IMAGE:-nuqloud-talk-hpb:local}
restart: unless-stopped
depends_on:
app:
condition: service_started
environment:
NC_DOMAIN: ${NEXTCLOUD_DOMAIN}
SIGNALING_SECRET: ${TALK_SIGNALING_SECRET}
INTERNAL_SECRET: ${TALK_INTERNAL_SECRET}
TALK_ETURNAL_EPMD_PORT: ${TALK_ETURNAL_EPMD_PORT:-3470}
TALK_HOST: ${TALK_TURN_HOST}
TALK_SIGNALING_BIND_HOST: ${TALK_SIGNALING_BIND_HOST:-0.0.0.0}
TALK_SIGNALING_PORT: ${TALK_SIGNALING_CONTAINER_PORT:-8081}
TALK_PORT: ${TALK_TURN_PORT:-3478}
TURN_SECRET: ${TALK_TURN_SECRET}
TALK_JANUS_STUN_SERVER: ${TALK_JANUS_STUN_SERVER}
TALK_JANUS_STUN_PORT: ${TALK_JANUS_STUN_PORT:-3478}
ports:
- "${TALK_SIGNALING_BIND_HOST:-0.0.0.0}:${TALK_SIGNALING_PORT:-8081}:${TALK_SIGNALING_CONTAINER_PORT:-8081}/tcp"
- "${TALK_TURN_BIND_HOST:-0.0.0.0}:${TALK_TURN_PORT:-3478}:${TALK_TURN_PORT:-3478}/tcp"
- "${TALK_TURN_BIND_HOST:-0.0.0.0}:${TALK_TURN_PORT:-3478}:${TALK_TURN_PORT:-3478}/udp"
talk_recording:
profiles: ["recording"]
image: ${TALK_RECORDING_IMAGE:-nextcloud/aio-talk-recording:latest}
restart: unless-stopped
depends_on:
talk_hpb:
condition: service_started
environment:
NC_DOMAIN: ${NEXTCLOUD_DOMAIN}
HPB_DOMAIN: ${SIGNALING_DOMAIN}
INTERNAL_SECRET: ${TALK_INTERNAL_SECRET}
RECORDING_SECRET: ${TALK_RECORDING_SHARED_SECRET}
ports:
- "127.0.0.1:${TALK_RECORDING_PORT:-1234}:1234"
external_auth:
profiles: ["external-auth"]
build:
context: ${EXTERNAL_AUTH_CONTEXT:-../Qortal-External-Auth}
dockerfile: ${EXTERNAL_AUTH_DOCKERFILE:-Dockerfile}
restart: unless-stopped
depends_on:
qortal_node:
condition: service_started
environment:
QORTAL_AUTH_PORT: 3191
QORTAL_AUTH_HOST: 0.0.0.0
QORTAL_AUTH_NODE_URL: ${QORTAL_AUTH_NODE_URL:-http://qortal_node:12391}
QORTAL_AUTH_NODE_API_KEY: ${QORTAL_AUTH_NODE_API_KEY:-}
QORTAL_AUTH_NODE_API_KEY_MODE: ${QORTAL_AUTH_NODE_API_KEY_MODE:-paths}
QORTAL_AUTH_NODE_API_KEY_PATHS: ${QORTAL_AUTH_NODE_API_KEY_PATHS:-/}
QORTAL_AUTH_DATA_DIR: /data
ports:
- "127.0.0.1:${EXTERNAL_AUTH_PORT:-3191}:3191"
volumes:
- ./external-auth/data:/data
caddy:
image: caddy:2-alpine
restart: unless-stopped
depends_on:
app:
condition: service_started
broker:
condition: service_started
ports:
- "${CADDY_HTTP_PORT:-80}:${CADDY_HTTP_PORT:-80}"
- "${CADDY_HTTPS_PORT:-443}:${CADDY_HTTPS_PORT:-443}"
environment:
NEXTCLOUD_DOMAIN: ${NEXTCLOUD_DOMAIN}
BROKER_DOMAIN: ${BROKER_DOMAIN}
COLLABORA_DOMAIN: ${COLLABORA_DOMAIN}
SIGNALING_DOMAIN: ${SIGNALING_DOMAIN}
TALK_SIGNALING_UPSTREAM_HOST: ${TALK_SIGNALING_UPSTREAM_HOST:-host.docker.internal}
TALK_SIGNALING_UPSTREAM_PORT: ${TALK_SIGNALING_UPSTREAM_PORT:-${TALK_SIGNALING_PORT:-8081}}
CADDY_EMAIL: ${CADDY_EMAIL}
CADDY_TLS: ${CADDY_TLS}
CADDY_HTTP_PORT: ${CADDY_HTTP_PORT:-80}
CADDY_HTTPS_PORT: ${CADDY_HTTPS_PORT:-443}
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- ./deploy/Caddyfile.devprod:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
volumes:
db_data:
redis_data:
broker_db_data:
caddy_data:
caddy_config: