version: '3.8'
networks:
default_network:
driver: bridge
services:
frontend:
image: eco-registry.supos.com/sup9bnlh/supos-frontend-platform:1.0.4-R4
container_name: frontend
ports:
- "3010:3000"
- "4000:4000"
- "3001:3001"
- "3002:3002"
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- OPENAI_API_MODEL=${OPENAI_API_MODEL}
- REACT_APP_OS_LANG=${LANGUAGE}
volumes:
- plugin_front:/app/plugins-build
- /etc/docker/certs:/certs
networks:
- default_network
restart: always
extra_hosts:
- "host.docker.internal:host-gateway"
backend:
image: eco-registry.supos.com/sup9bnlh/backend:1.0.4-R2
container_name: backend
environment:
- TZ=UTC
- GRPC_POOL_CORE_SIZE=4
- GRPC_POOL_MAX_SIZE=8
- ENV_DB_HOST=postgresql
- ENV_DB_PORT=5432
- NODE_RED_HOST=nodered
- NODE_RED_PORT=1880
- SYS_OS_MULTIPLE_TOPIC=false
- SYS_OS_VERSION=${OS_VERSION}
- SYS_OS_LANG=${LANGUAGE}
- SYS_OS_AUTH_ENABLE=${OS_AUTH_ENABLE}
- SYS_OS_LLM_TYPE=${OS_LLM_TYPE}
- SYS_OS_MQTT_TCP_PORT=${OS_MQTT_TCP_PORT}
- SYS_OS_MQTT_WEBSOCKET_TSL_PORT=${OS_MQTT_WEBSOCKET_TSL_PORT}
- SYS_OS_LOGIN_PATH=${OS_LOGIN_PATH}
- SYS_OS_APP_TITLE=Open supOS
- SYS_OS_PLATFORM_TYPE=${OS_PLATFORM_TYPE}
- SYS_OS_ENTRANCE_URL=${BASE_URL}
- SYS_OS_USE_ALIAS_PATH_AS_TOPIC=${USE_ALIAS_PATH_AS_TOPIC}
- SYS_OS_QUALITY_NAME=quality
- SYS_OS_TIMESTAMP_NAME=timeStamp
- SYS_OS_LAZY_TREE=${LAZY_TREE}
- SYS_OS_ENABLE_AUTO_CATEGORIZATION=${ENABLE_AUTO_CATEGORIZATION}
- MQTT_PLUGIN=${MQTT_PLUG:-emqx}
- UNS_ADD_BATCH_SIZE=500
- ENABLE_CHAT2DB=true
- HASP_SERVER=${HASP_SERVER}
- OAUTH_REDIRECT_URI=${BASE_URL}/inter-api/supos/auth/token
- OAUTH_SUPOS_HOME=${BASE_URL}/home
- OAUTH_REALM=${OAUTH_REALM}
- OAUTH_CLIENT_NAME=${OAUTH_CLIENT_NAME}
- OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID}
- OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET}
- OAUTH_GRANT_TYPE=${OAUTH_GRANT_TYPE}
- OAUTH_ISSUER_URI=${OAUTH_ISSUER_URI}
- OAUTH_REFRESH_TOKEN_TIME=${OAUTH_REFRESH_TOKEN_TIME}
- ELASTICSEARCH_VERSION=${ELASTICSEARCH_VERSION}
- ELASTICSEARCH_TIMEHORIZON=${ELASTICSEARCH_TIMEHORIZON}
- SYS_OS_LDAP_ENABLE=${LDAP_ENABLE}
- SYS_OS_LDAP_URL=${LDAP_URL}
- SYNC_USER_ENABLE=${SYNC_USER_ENABLE}
- SUPOS_EE_ADDRESS=${SUPOS_EE_ADDRESS}
ports:
- "19099:19099"
- "17000:8000"
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 3G
volumes:
- ${VOLUMES_PATH}/backend/entrypoint.sh:/entrypoint.sh
- ${VOLUMES_PATH}/backend/apps:/data/apps
- ${VOLUMES_PATH}/backend/third-apps:/data/third-apps
- ${VOLUMES_PATH}/plugins/package:/data/plugins
- plugin_front:/data/plugins-frontend
- ${VOLUMES_PATH}/backend/uns:/data/uns
- ${VOLUMES_PATH}/backend/system:/data/system
- ${VOLUMES_PATH}/backend/log:/logs
- ${VOLUMES_PATH}/backend/global-export:/data/global-export
- ${VOLUMES_PATH}/i18n:/data/i18n
- ${VOLUMES_PATH}/backend/excel:/data/excel
- /etc/docker/certs:/certs
cap_add:
- SYS_PTRACE
depends_on:
- postgresql
- emqx
- nodered
- keycloak
- chat2db
restart: always
networks:
- default_network
extra_hosts:
- "host.docker.internal:host-gateway"
nodered:
image: eco-registry.supos.com/sup9bnlh/node-red:4.0.8-22
container_name: nodered
user: root
ports:
- "1880:1880"
environment:
- service_logo=nodered-original.svg
- service_description=aboutus.nodeRedDescription
- FLOWS=/data/flows.json
- TZ=UTC
- TIMESTAMP_NAME=timeStamp
- QUALITY_NAME=quality
- OS_LANG=${LANGUAGE}
- USE_ALIAS_AS_TOPIC=${USE_ALIAS_PATH_AS_TOPIC}
- NODE_OPTIONS=--openssl-legacy-provider
- NODE_HTTP_API_PREFIX=/nodered-api
volumes:
- /etc/localtime:/etc/localtime:ro
- ${VOLUMES_PATH}/node-red:/data
restart: always
networks:
- default_network
marimo:
image: eco-registry.supos.com/sup9bnlh/marimo:latest
container_name: marimo
environment:
- TSDB_URL=postgresql+psycopg2://postgres:postgres@tsdb:5432/postgres
- PG_URL=postgresql+psycopg2://postgres:postgres@postgresql:5432/postgres
volumes:
- ${VOLUMES_PATH}/marimo/data:/app
restart: always
networks:
- default_network
emqx:
image: eco-registry.supos.com/sup9bnlh/emqx:5.8
container_name: emqx
ports:
- "1883:1883"
- "8883:8883"
- "8083:8083"
- "8084:8084"
- "18083:18083"
environment:
- EMQX_NAME=emqx
- EMQX_NODE__COOKIE=secretcookie
- service_logo=emqx-original.svg
- service_description=aboutus.emqxDescription
- service_redirect_url=/emqx/home/
- service_account=admin
- service_password=public
volumes:
- /etc/localtime:/etc/localtime:ro
- ${VOLUMES_PATH}/emqx/data:/opt/emqx/data
- ${VOLUMES_PATH}/emqx/log:/opt/emqx/log
- ${VOLUMES_PATH}/emqx/config/emqx.conf:/opt/emqx/etc/emqx.conf
- ${VOLUMES_PATH}/emqx/config/default_api_key.conf:/opt/emqx/etc/default_api_key.conf
- ${VOLUMES_PATH}/emqx/config/acl.conf:/opt/emqx/etc/acl.conf
restart: always
networks:
- default_network
grafana:
image: eco-registry.supos.com/sup9bnlh/grafana:11.5.6
profiles:
- grafana
container_name: grafana
user: root
ports:
- "3000:3000"
volumes:
- ${VOLUMES_PATH}/grafana/data:/var/lib/grafana
environment:
service_logo: grafana-original.svg
service_description: aboutus.grafanaDescription
service_redirect_url: /grafana/home/dashboards/
GF_SECURITY_ADMIN_PASSWORD: "supos"
GF_EXPLORE_ENABLED: "true"
GF_VIEWER_LANGUAGE: "${GRAFANA_LANG:-en-US}"
GF_AUTH_ANONYMOUS_ENABLED: "true"
GF_AUTH_ANONYMOUS_ORG_ROLE: "Admin"
GF_SECURITY_ALLOW_EMBEDDING: "true"
GF_SERVER_ROOT_URL: "http://${ENTRANCE_DOMAIN}/grafana/home/"
GF_USERS_DEFAULT_THEME: "light"
GF_DATABASE_TYPE: postgres
GF_DATABASE_HOST: postgresql:5432
GF_DATABASE_NAME: grafana
GF_DATABASE_USER: postgres
GF_DATABASE_PASSWORD: postgres
depends_on:
postgresql:
condition: service_healthy
restart: always
networks:
- default_network
postgresql:
image: eco-registry.supos.com/sup9bnlh/timescaledb:2.20.0-pg17
container_name: postgresql
environment:
TZ: UTC
service_logo: postgresql-original.svg
service_description: aboutus.postgresqlDescription
POSTGRES_PASSWORD: postgres
shm_size: '2g'
ports:
- "5432:5432"
volumes:
- ${VOLUMES_PATH}/postgresql/conf/postgresql.conf:/etc/postgresql/custom.conf
- ${VOLUMES_PATH}/postgresql/pgdata:/var/lib/postgresql/data
- ${VOLUMES_PATH}/postgresql/init-scripts:/docker-entrypoint-initdb.d
command:
- postgres
- -c
- config_file=/etc/postgresql/custom.conf
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 60
start_period: 60s
start_interval: 60s
restart: always
networks:
- default_network
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 3G
tsdb:
image: eco-registry.supos.com/sup9bnlh/timescaledb:2.20.0-pg17
container_name: tsdb
environment:
TZ: UTC
service_logo: postgresql-original.svg
service_description: aboutus.postgresqlDescription
POSTGRES_PASSWORD: postgres
shm_size: '2g'
ports:
- "2345:5432"
volumes:
- ${VOLUMES_PATH}/tsdb/conf/postgresql.conf:/etc/postgresql/custom.conf
- ${VOLUMES_PATH}/tsdb/data:/var/lib/postgresql/data
- ${VOLUMES_PATH}/tsdb/init-scripts:/docker-entrypoint-initdb.d
command:
- postgres
- -c
- config_file=/etc/postgresql/custom.conf
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 60
start_period: 60s
start_interval: 60s
restart: always
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 3G
networks:
- default_network
keycloak:
image: eco-registry.supos.com/sup9bnlh/keycloak:26.0
container_name: keycloak
ports:
- "8081:8080"
user: root
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
environment:
service_logo: keycloak-original.svg
service_description: aboutus.keycloakDescription
service_redirect_url: /keycloak/home/
service_account: admin
service_password: supos
KC_SSL_REQUIRED: none
KC_PROXY: passthrough
KC_HOSTNAME: "${ENTRANCE_DOMAIN}"
KC_FRONTEND_URL: "${BASE_URL}"
KC_BOOTSTRAP_ADMIN_USERNAME: admin
KC_BOOTSTRAP_ADMIN_PASSWORD: supos
KC_COOKIE_SECURE: false
KC_DB: postgres
KC_DB_URL: "jdbc:postgresql://postgresql:5432/keycloak"
KC_DB_USERNAME: postgres
KC_DB_PASSWORD: postgres
KC_DB_POOL_INITIAL_SIZE: 2
KC_DB_POOL_MIN_SIZE: 2
KC_DB_POOL_MAX_SIZE: 4
KC_DB_POOL_MAX_LIFETIME: 1800
KC_HEALTH_ENABLED: true
KC_FEATURES: token-exchange
JAVA_OPTS_APPEND: -Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true
volumes:
- /etc/localtime:/etc/localtime:ro
- ${VOLUMES_PATH}/keycloak/data:/opt/keycloak/data
- ${VOLUMES_PATH}/keycloak/theme/keycloak.v2:/opt/keycloak/themes/wenhao
- ${VOLUMES_PATH}/keycloak/ca/ca.crt:/opt/keycloak/ca.crt
- ${VOLUMES_PATH}/keycloak/ca/init-ldaps-cert.sh:/opt/keycloak/init-ldaps-cert.sh
depends_on:
postgresql:
condition: service_healthy
entrypoint:
- /bin/bash
- -c
- |
chmod +x /opt/keycloak/init-ldaps-cert.sh && \
bash /opt/keycloak/init-ldaps-cert.sh && \
exec /opt/keycloak/bin/kc.sh start-dev --hostname ${BASE_URL}/keycloak/home/auth --proxy-headers forwarded
healthcheck:
test: >
/bin/bash -c "
exec 3<>/dev/tcp/localhost/8080"
interval: 10s
timeout: 5s
retries: 120
restart: always
networks:
- default_network
kong:
image: eco-registry.supos.com/sup9bnlh/kong:3.9.0
container_name: kong
environment:
KONG_WORKER_STATE_UPDATE_FREQUENCY: 30
KONG_DB_CACHE_TTL: 600
KONG_NGINX_WORKER_PROCESSES: 4
KONG_LUA_GC_PAUSE: 100
KONG_LUA_GC_STEPMUL: 200
service_logo: konga-original.svg
service_description: aboutus.kongaDescription
service_redirect_url: /konga/home/
KONG_DATABASE: postgres
KONG_PG_HOST: postgresql
KONG_PG_PASSWORD: postgres
KONG_PG_USER: postgres
KONG_ADMIN_LISTEN: 0.0.0.0:8001
KONG_SSL_CERT: /etc/kong/ssl/fullchain.cer
KONG_SSL_CERT_KEY: /etc/kong/ssl/private.key
KONG_PROXY_LISTEN: 0.0.0.0:8000, 0.0.0.0:8443 ssl
KONG_PLUGINS: bundled,supos-auth-checker,supos-url-transformer
KONG_LOG_LEVEL: error
KONG_PROXY_CONNECT_TIMEOUT: 600000
KONG_PROXY_SEND_TIMEOUT: 600000
KONG_PROXY_READ_TIMEOUT: 600000
volumes:
- ${VOLUMES_PATH}/kong/certificationfile:/etc/kong/ssl:ro
- ${VOLUMES_PATH}/kong/kong_config.yml:/etc/kong/kong_config.yml
- ${VOLUMES_PATH}/kong/start.sh:/usr/local/bin/start.sh
- ${VOLUMES_PATH}/kong/kong-plugin-auth-checker:/usr/local/share/lua/5.1/kong/plugins/supos-auth-checker
- ${VOLUMES_PATH}/kong/kong-plugin-url-transformer:/usr/local/share/lua/5.1/kong/plugins/supos-url-transformer
ports:
- "${ENTRANCE_PORT:-8088}:8000"
- "${ENTRANCE_SSL_PORT:-8443}:8443"
- "8001:8001"
- "8444:8444"
depends_on:
- emqx
- backend
- frontend
- keycloak
- postgresql
command: ["sh", "/usr/local/bin/start.sh"]
restart: always
networks:
- default_network
portainer:
image: eco-registry.supos.com/sup9bnlh/portainer-ce:2.23.0
container_name: portainer
environment:
service_logo: portainer.svg
command: --admin-password="$$2y$$05$$ZTAqF7Tn.hil8X.ifVmQTuKiJQoZDiKDW3t1lRR2/VPR06QoHv4AC"
ports:
- "8000:8000"
- "9443:9443"
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ${VOLUMES_PATH}/portainer:/data
networks:
- default_network
konga:
image: eco-registry.supos.com/sup9bnlh/konga:0.14.9
container_name: konga
environment:
NO_AUTH: "true"
KONGA_SEED_KONG_NODE_DATA_SOURCE_FILE: /node.data
ports:
- "1337:1337"
volumes:
- ${VOLUMES_PATH}/konga/db/:/app/kongadata/
- ${VOLUMES_PATH}/konga/node.data:/node.data
restart: always
networks:
- default_network
minio:
image: eco-registry.supos.com/sup9bnlh/minio:RELEASE.2024-12-18T13-15-44Z
profiles:
- minio
container_name: minio
environment:
- service_logo=minio-original.svg
- service_description=aboutus.minioDescription
- service_redirect_url=/minio/home/
- MINIO_ACCESS_KEY=admin
- MINIO_SECRET_KEY=adminpassword
- MINIO_BROWSER_REDIRECT_URL=${BASE_URL}/minio/home
- MINIO_IDENTITY_OPENID_CONFIG_URL=${OAUTH_ISSUER_URI}/realms/supos/.well-known/openid-configuration
- MINIO_IDENTITY_OPENID_CLIENT_ID=${OAUTH_CLIENT_ID}
- MINIO_IDENTITY_OPENID_CLIENT_SECRET=${OAUTH_CLIENT_SECRET}
- MINIO_IDENTITY_OPENID_SCOPES=openid
- MINIO_IDENTITY_OPENID_ROLE_POLICY=public-delete-policy
- MINIO_IDENTITY_OPENID_REDIRECT_URI=${BASE_URL}/minio/home/oauth_callback
ports:
- "9000:9000"
- "9001:9001"
volumes:
- ${VOLUMES_PATH}/minio/data:/data
command: server /data --console-address ":9001"
depends_on:
keycloak:
condition: service_healthy
restart: always
networks:
- default_network
fuxa:
container_name: fuxa
profiles:
- fuxa
image: eco-registry.supos.com/sup9bnlh/fuxa:1.0.8-T1
environment:
- LANG=${FUXA_LANG:-en}
- service_logo=fuxa.svg
volumes:
- ${VOLUMES_PATH}/fuxa/appdata:/usr/src/app/FUXA/server/_appdata
- ${VOLUMES_PATH}/fuxa/db:/usr/src/app/FUXA/server/_db
- ${VOLUMES_PATH}/fuxa/logs:/usr/src/app/FUXA/server/_logs
- ${VOLUMES_PATH}/fuxa/images:/usr/src/app/FUXA/server/_images
ports:
- '1881:1881'
restart: always
networks:
- default_network
chat2db:
container_name: chat2db
image: eco-registry.supos.com/sup9bnlh/chat2db:latest
volumes:
- ${VOLUMES_PATH}/chat2db/data:/root/.chat2db/
ports:
- '10824:10824'
command: java -Dloader.path=lib -Dspring.profiles.active=release -Dchatgpt.apiKey=${OPENAI_API_KEY} -jar chat2db-server-web-start.jar
environment:
- service_logo=chat2db.svg
- OPENAI_API_KEY=${OPENAI_API_KEY}
restart: always
networks:
- default_network
openclaw-gateway:
image: eco-registry.supos.com/sup9bnlh/openclaw:260324
container_name: openclaw-gateway
profiles:
- openclaw
environment:
HOME: /home/node
TERM: xterm-256color
service_logo: openclaw-original.svg
service_description: menu.desc.OpenClaw
service_redirect_url: /openclaw/home/
OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN:-}
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS: ${OPENCLAW_ALLOW_INSECURE_PRIVATE_WS:-}
CLAUDE_AI_SESSION_KEY: ${CLAUDE_AI_SESSION_KEY:-}
CLAUDE_WEB_SESSION_KEY: ${CLAUDE_WEB_SESSION_KEY:-}
CLAUDE_WEB_COOKIE: ${CLAUDE_WEB_COOKIE:-}
SUPOS_BASE_URL: ${BASE_URL}
volumes:
- ${VOLUMES_PATH}/openclaw:/home/node/.openclaw
init: true
restart: unless-stopped
command:
[
"node",
"dist/index.js",
"gateway",
"--bind",
"${OPENCLAW_GATEWAY_BIND:-lan}",
"--port",
"18789",
"--allow-unconfigured",
]
healthcheck:
test:
[
"CMD",
"node",
"-e",
"fetch('http://127.0.0.1:18789/healthz').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))",
]
interval: 30s
timeout: 5s
retries: 5
start_period: 20s
networks:
- default_network
gitea:
image: eco-registry.supos.com/sup9bnlh/gitea:latest
container_name: gitea
ports:
- "3030:3000"
- "2222:22"
environment:
- service_logo=gitea.svg
- GITEA__server__ROOT_URL=${BASE_URL}/gitea/home/
- GITEA__oauth2__ENABLED=true
- GITEA__oauth2__ENABLE_OAUTH2_REGISTER=true
- GITEA__service__ALLOW_USER_REGISTRATION=true
- GITEA__oauth2__ALLOW_USER_REGISTRATION=true
- GITEA__oauth2__ENABLE_OAUTH2_LOGIN=true
- GITEA__service__ENABLE_CAPTCHA=false
- GITEA__service__REQUIRE_EMAIL_CONFIRMATION=false
- GITEA__service__ALLOW_ONLY_EXTERNAL_REGISTRATION=true
- GITEA__server__SSH_DOMAIN=${ENTRANCE_PROTOCOL}
- GITEA__server__SSH_PORT=2222
- GITEA__security__INSTALL_LOCK=true
- GITEA__oauth2_client__ACCOUNT_LINKING=auto
- GITEA__oauth2_client__ENABLE_AUTO_REGISTRATION=true
volumes:
- ${VOLUMES_PATH}/gitea:/data
restart: always
networks:
- default_network
runner:
image: eco-registry.supos.com/sup9bnlh/act_runner:nightly
container_name: gitea_runner
environment:
CONFIG_FILE: /config.yaml
GITEA_INSTANCE_URL: "http://gitea:3000"
GITEA_RUNNER_REGISTRATION_TOKEN: "RD6FfsRrcbfU2BsOrR0h27EqGHze2SQAc9TMmmgY"
GITEA_RUNNER_NAME: "my-runner"
GITEA_RUNNER_LABELS: "my-runner"
volumes:
- ${VOLUMES_PATH}/gitearunner/data:/data
- ${VOLUMES_PATH}/gitearunner/config.yaml:/config.yaml
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- gitea
restart: always
networks:
- default_network
volumes:
plugin_front: