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 ports: - "${DEVPROD_HTTP_BIND_HOST:-127.0.0.1}:${DEVPROD_HTTP_PORT:-8081}:80" 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 ports: - "${DEVPROD_BROKER_BIND_HOST:-127.0.0.1}:${DEVPROD_BROKER_PORT:-3001}:3000" 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: - "${COLLABORA_BIND_HOST:-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: - "${TALK_RECORDING_BIND_HOST:-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 volumes: db_data: redis_data: broker_db_data: