# 独立联调依赖栈;应用在宿主机运行,固定测试凭据,禁止用于生产。 name: msgx-integration services: mysql: image: mysql:8.4 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: root_dev_pass MYSQL_DATABASE: cdairport MYSQL_USER: msgx_dev MYSQL_PASSWORD: msgx_dev_pass ports: - "0.0.0.0:13306:3306" volumes: # 与开发栈共用目录,使用共享 SELinux 标签。 - ./deploy/dev/mysql-init:/docker-entrypoint-initdb.d:ro,z - mysql_data:/var/lib/mysql healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD --silent || exit 1"] interval: 5s timeout: 5s retries: 10 start_period: 15s postgres: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_DB: msgx POSTGRES_USER: msgx_dev POSTGRES_PASSWORD: msgx_dev_pass ports: - "0.0.0.0:15432:5432" volumes: - pg_data:/var/lib/postgresql/data - ./deploy/integration/postgres-init:/docker-entrypoint-initdb.d:ro,Z healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB -h 127.0.0.1 || exit 1"] interval: 5s timeout: 5s retries: 10 start_period: 5s redis: image: valkey/valkey:8-alpine restart: unless-stopped command: ["valkey-server", "--appendonly", "yes"] ports: - "0.0.0.0:16379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD-SHELL", "valkey-cli ping | grep PONG || exit 1"] interval: 5s timeout: 5s retries: 10 start_period: 5s kafka: image: apache/kafka:3.8.0 restart: unless-stopped ports: - "0.0.0.0:19092:9092" environment: KAFKA_NODE_ID: 1 KAFKA_PROCESS_ROLES: broker,controller KAFKA_CLUSTER_ID: "4L622nShTUiT8tCdRvgqgA" KAFKA_LISTENERS: EXTERNAL://:9092,INTERNAL://:29092,CONTROLLER://:9093 KAFKA_ADVERTISED_LISTENERS: EXTERNAL://${TEST_SERVER_HOST:?Set TEST_SERVER_HOST to the server IP or DNS}:19092,INTERNAL://kafka:29092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: EXTERNAL:PLAINTEXT,INTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093 KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 KAFKA_DEFAULT_REPLICATION_FACTOR: 1 KAFKA_NUM_PARTITIONS: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" KAFKA_LOG_DIRS: /tmp/kraft-combined-logs healthcheck: test: ["CMD-SHELL", "/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:29092 --list || exit 1"] interval: 5s timeout: 5s retries: 10 start_period: 10s # 独立于共享信箱;兼容 admin-api 旧 MySQL JDBC 的认证方式。 admin-mysql: image: mysql:8.4 restart: unless-stopped command: ["--mysql-native-password=ON"] environment: MYSQL_ROOT_PASSWORD: admin_root_dev_pass MYSQL_DATABASE: adminapi MYSQL_USER: admin_dev MYSQL_PASSWORD: admin_dev_pass ports: - "0.0.0.0:13307:3306" volumes: - admin_mysql_data:/var/lib/mysql - ./deploy/integration/admin-mysql-init:/docker-entrypoint-initdb.d:ro,Z healthcheck: test: ["CMD-SHELL", "MYSQL_PWD=$$MYSQL_PASSWORD mysql -h 127.0.0.1 -u$$MYSQL_USER -D adminapi -e 'SELECT 1' || exit 1"] interval: 5s timeout: 5s retries: 20 start_period: 30s # admin-api 使用 TransportClient 6.4.2,不可直接改成现代 ES 的 REST 端口。 # 旧版仅供受控测试网络,Apple Silicon 需要 amd64 模拟运行支持。 elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2 platform: linux/amd64 restart: unless-stopped environment: discovery.type: single-node cluster.name: docker-cluster xpack.security.enabled: "false" ES_JAVA_OPTS: "-Xms512m -Xmx512m" ports: - "0.0.0.0:19200:9200" - "0.0.0.0:19300:9300" volumes: - es_data:/usr/share/elasticsearch/data healthcheck: test: ["CMD-SHELL", "curl -fsS 'http://localhost:9200/_cluster/health?wait_for_status=yellow&timeout=3s' | grep -q '\"timed_out\":false'"] interval: 10s timeout: 5s retries: 30 start_period: 30s volumes: admin_mysql_data: es_data: mysql_data: pg_data: redis_data: