From 09764e0874e4772036ba628e3b58f033e3a6200b Mon Sep 17 00:00:00 2001 From: hotwa Date: Sun, 28 Sep 2025 20:38:01 +0800 Subject: [PATCH] add new env to manage rustfs --- docker/.env | 23 ++++++++++- docker/docker-compose.yml | 76 ++++++++++++++++++++++------------ docker/registrar.sh | 87 +++++++++++++++++++++++++-------------- 3 files changed, 126 insertions(+), 60 deletions(-) diff --git a/docker/.env b/docker/.env index 6a12b95..a9f2490 100644 --- a/docker/.env +++ b/docker/.env @@ -1,2 +1,21 @@ -BIND_IP=100.64.0.5 -SERVICE_ADDR=100.64.0.5 \ No newline at end of file + +# 这台业务节点在 Tailscale 上的 IP +SERVICE_IP=100.64.0.42 + +# 端口 +PORT_RUSTFS=9000 +PORT_MCP=9009 + +# Consul(主集群)信息 +CONSUL_SERVER_IP=100.64.0.1 +CONSUL_DC=dc1 + +# 服务名(建议分开,避免混入) +SVC_RUSTFS=rustfs +SVC_MCP=rustfs-toolkit + +# 域名(Caddy 用) +DOMAIN_RUSTFS=rfs.jmsu.top +DOMAIN_MCP=mcp.jmsu.top + +NODE_NAME=rustfs-100-64-0-42 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index d67bf73..920935f 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,21 +1,23 @@ +version: "3.9" + services: rustfs: image: rustfs/rustfs:1.0.0-alpha.59 container_name: rustfs_container restart: always ports: - - 100.64.0.42:9000:9000 + - "${SERVICE_IP}:${PORT_RUSTFS}:${PORT_RUSTFS}" volumes: - /vol2/1000/rustfs_vol2:/data - - ./data:/app/data:rw # 新增,共用 ./data + - ./data:/app/data:rw environment: RUSTFS_VOLUMES: /data/rustfs0 - RUSTFS_ADDRESS: :9000 - RUSTFS_SERVER_DOMAINS: rfs.jmsu.top + RUSTFS_ADDRESS: ":${PORT_RUSTFS}" + RUSTFS_SERVER_DOMAINS: ${DOMAIN_RUSTFS} RUSTFS_ACCESS_KEY: lingyuzeng RUSTFS_SECRET_KEY: rust@Hotwa2020 RUSTFS_CONSOLE_ENABLE: "true" - + rustfs-s3-toolkit: image: hotwa/rustfs-s3-toolkit:latest build: @@ -26,30 +28,30 @@ services: volumes: - ./data:/app/data:rw ports: - - "100.64.0.42:9009:9009" + - "${SERVICE_IP}:${PORT_MCP}:${PORT_MCP}" consul-agent: - stop_signal: SIGTERM - stop_grace_period: 30s image: hashicorp/consul:1.21 + stop_signal: SIGTERM + stop_grace_period: 60s command: - agent - -server=false - - -node=rustfs-100-64-0-42 + - -node=${NODE_NAME} - -client=0.0.0.0 - -bind=0.0.0.0 - - -advertise=100.64.0.42 - - -retry-join=100.64.0.1 - - -datacenter=dc1 + - -advertise=${SERVICE_IP} + - -retry-join=${CONSUL_SERVER_IP} + - -datacenter=${CONSUL_DC} - -data-dir=/consul/data environment: CONSUL_LOCAL_CONFIG: '{"leave_on_terminate": true}' ports: - - "100.64.0.42:8500:8500/tcp" - - "100.64.0.42:8600:8600/tcp" - - "100.64.0.42:8600:8600/udp" - - "100.64.0.42:8301:8301/tcp" - - "100.64.0.42:8301:8301/udp" + - "${SERVICE_IP}:8500:8500/tcp" + - "${SERVICE_IP}:8600:8600/tcp" + - "${SERVICE_IP}:8600:8600/udp" + - "${SERVICE_IP}:8301:8301/tcp" + - "${SERVICE_IP}:8301:8301/udp" healthcheck: test: ["CMD", "consul", "info"] interval: 5s @@ -58,7 +60,8 @@ services: start_period: 10s restart: unless-stopped - registrar: + # 注册 rustfs(9000) + registrar_rustfs: image: hashicorp/consul:1.21 depends_on: consul-agent: @@ -67,21 +70,40 @@ services: condition: service_started environment: CONSUL_HTTP_ADDR: "http://consul-agent:8500" - SERVICE_NAME: "rustfs" - SERVICE_ADDR: "100.64.0.42" - SERVICE_PORT: "9000" - # 可选:打标签,方便 SRV 过滤 + SERVICE_NAME: "${SVC_RUSTFS}" + SERVICE_ADDR: "${SERVICE_IP}" + SERVICE_PORT: "${PORT_RUSTFS}" SERVICE_TAGS: "console" - # 健康检查参数(可按需改) - CHECK_TYPE: "tcp" # 可选: "http" 或 "tcp" - CHECK_PATH: "/healthz" # 仅 http 模式用 + CHECK_TYPE: "tcp" CHECK_INTERVAL: "10s" CHECK_TIMEOUT: "2s" - DEREG_AFTER: "1m" # 持续失败 1 分钟后自动从 Catalog 摘除 + DEREG_AFTER: "1m" volumes: - ./registrar.sh:/registrar.sh:ro entrypoint: ["/bin/sh","-lc","/registrar.sh"] restart: unless-stopped + # 注册 MCP(9009) + registrar_mcp: + image: hashicorp/consul:1.21 + depends_on: + consul-agent: + condition: service_healthy + rustfs-s3-toolkit: + condition: service_started + environment: + CONSUL_HTTP_ADDR: "http://consul-agent:8500" + SERVICE_NAME: "${SVC_MCP}" + SERVICE_ADDR: "${SERVICE_IP}" + SERVICE_PORT: "${PORT_MCP}" + SERVICE_TAGS: "toolkit" + CHECK_TYPE: "tcp" + CHECK_INTERVAL: "10s" + CHECK_TIMEOUT: "2s" + DEREG_AFTER: "1m" + volumes: + - ./registrar.sh:/registrar.sh:ro + entrypoint: ["/bin/sh","-lc","/registrar.sh"] + restart: unless-stopped -networks: {} \ No newline at end of file +networks: {} diff --git a/docker/registrar.sh b/docker/registrar.sh index 6d94298..6469820 100755 --- a/docker/registrar.sh +++ b/docker/registrar.sh @@ -1,46 +1,71 @@ #!/bin/sh set -eu +: "${CONSUL_HTTP_ADDR:?need CONSUL_HTTP_ADDR}" : "${SERVICE_NAME:?need SERVICE_NAME}" : "${SERVICE_ADDR:?need SERVICE_ADDR}" : "${SERVICE_PORT:?need SERVICE_PORT}" -CONSUL="${CONSUL_HTTP_ADDR:-http://127.0.0.1:8500}" -echo "[registrar] waiting consul agent at $CONSUL ..." -for i in $(seq 1 60); do - if wget -qO- "$CONSUL/v1/status/leader" >/dev/null 2>&1; then - break - fi - sleep 1 -done +SERVICE_ID="${SERVICE_ID:-${SERVICE_NAME}-${SERVICE_ADDR}-${SERVICE_PORT}}" +SERVICE_TAGS="${SERVICE_TAGS:-}" +CHECK_TYPE="${CHECK_TYPE:-tcp}" # tcp|http +CHECK_PATH="${CHECK_PATH:-/healthz}" # http 模式才用 +CHECK_INTERVAL="${CHECK_INTERVAL:-10s}" +CHECK_TIMEOUT="${CHECK_TIMEOUT:-2s}" +DEREG_AFTER="${DEREG_AFTER:-1m}" -ID="${SERVICE_NAME}-${SERVICE_ADDR}-${SERVICE_PORT}" +# 组装 Tags 的 JSON 数组 +if [ -n "$SERVICE_TAGS" ]; then + # 逗号分隔转 JSON 数组 + TAGS_JSON=$(printf '%s' "$SERVICE_TAGS" | awk -F, ' + BEGIN{printf "["} + {for(i=1;i<=NF;i++){gsub(/^ *| *$/, "", $i); printf "%s\"%s\"", (i>1?",":""), $i}} + END{printf "]"} + ') +else + TAGS_JSON="[]" +fi -cat > /tmp/svc.json < /tmp/service.json < ${SERVICE_ADDR}:${SERVICE_PORT} ..." +curl -fsS -X PUT -d @/tmp/service.json "${CONSUL_HTTP_ADDR}/v1/agent/service/register" +echo "[registrar] done." +# 阻塞防退出(可选) tail -f /dev/null -