HoraceZhang 1 year ago
parent
commit
c53e1686e3
6 changed files with 232 additions and 0 deletions
  1. 3 0
      .env
  2. 25 0
      Dockerfile
  3. 58 0
      build.sh
  4. 30 0
      docker-compose.yml
  5. 60 0
      entrypoint.sh
  6. 56 0
      fetch.sh

+ 3 - 0
.env

@@ -0,0 +1,3 @@
+IS_CLUSTER=true
+ROLE=worker
+CORE_RANGE=29-58

+ 25 - 0
Dockerfile

@@ -0,0 +1,25 @@
+FROM golang:1.22.4-bullseye as build
+
+WORKDIR /opt/node/
+
+RUN go install github.com/fullstorydev/grpcurl/cmd/grpcurl@v1.9.1
+
+FROM ubuntu:22.04
+
+ENV GOEXPERIMENT=arenas
+
+RUN apt-get update && apt-get install -y curl grep ca-certificates
+
+WORKDIR /opt/node/
+
+COPY ./node_file/ /usr/local/bin
+
+COPY --from=build /go/bin/grpcurl /usr/local/bin
+
+WORKDIR /root
+
+COPY entrypoint.sh /entrypoint.sh
+
+RUN chmod +x /entrypoint.sh
+
+ENTRYPOINT ["/entrypoint.sh"]

+ 58 - 0
build.sh

@@ -0,0 +1,58 @@
+fetch() {
+    files=$(curl https://releases.quilibrium.com/release | grep linux-amd64)
+    new_release=false
+
+    for file in $files; do
+        # 下载文件
+        if ! test -f "./$file"; then
+            curl "https://releases.quilibrium.com/$file" > "$file"
+            new_release=true
+            
+            # 使用正则表达式匹配,替换掉前缀部分为 'node'
+            new_name=$(echo "$file" | sed 's/node-.*-linux-amd64/node/')
+            
+            # 只有当文件名不同的时候才执行重命名
+            if [[ "$file" != "$new_name" ]]; then
+                mv "$file" "$new_name"
+            fi
+        fi
+    done
+}
+
+fetchQclient() {
+    files=$(curl https://releases.quilibrium.com/qclient-release | grep linux-amd64)
+    new_release=false
+
+    for file in $files; do
+        # 下载文件
+        if ! test -f "./$file"; then
+            curl "https://releases.quilibrium.com/$file" > "$file"
+            new_release=true
+            
+            # 使用正则表达式匹配,替换掉前缀部分为 'node'
+            new_name=$(echo "$file" | sed 's/qclient-.*-linux-amd64/qclient/')
+            
+            # 只有当文件名不同的时候才执行重命名
+            if [[ "$file" != "$new_name" ]]; then
+                mv "$file" "$new_name"
+            fi
+        fi
+    done
+}
+
+fetch
+fetchQclient
+
+chmod +x node
+chmod +x qclient
+
+rm -rf node_file
+mkdir -p node_file
+mv ./node node_file/
+mv ./qclient node_file/
+mv ./node.* node_file/
+mv ./qclient.* node_file/
+
+docker build -f Dockerfile -t trancelife/quilibrium:latest .
+
+docker push trancelife/quilibrium:latest

+ 30 - 0
docker-compose.yml

@@ -0,0 +1,30 @@
+name: quilibrium
+
+# See sysctl related warning in DOCKER-README.md.
+# Host configuration changes are required.
+
+services:
+  node:
+    image: trancelife/quilibrium:latest
+    restart: unless-stopped
+    environment:
+      - DEFAULT_LISTEN_GRPC_MULTIADDR=/ip4/0.0.0.0/tcp/8337
+      - DEFAULT_LISTEN_REST_MULTIADDR=/ip4/0.0.0.0/tcp/8338
+      - DEFAULT_STATS_MULTIADDR=/dns/stats.quilibrium.com/tcp/443
+      - IS_CLUSTER=${IS_CLUSTER}
+      - ROLE=${ROLE}
+      - CORE_RANGE=${CORE_RANGE}
+    network_mode: 'host'
+    healthcheck:
+      test: ["CMD", "grpcurl", "-plaintext", "localhost:8337", "list", "quilibrium.node.node.pb.NodeService"]
+      interval: 30s
+      timeout: 5s
+      retries: 3
+      start_period: 1m
+    volumes:
+      - ./.config:/root/.config
+    logging:
+      driver: "json-file"
+      options:
+        max-file: "5"
+        max-size: 2048m

+ 60 - 0
entrypoint.sh

@@ -0,0 +1,60 @@
+#!/bin/bash
+
+# 获取当前脚本的 PID 作为父进程 PID
+PARENT_PROCESS_PID=$$
+
+# 是否为集群模式(默认单机模式)
+IS_CLUSTER=${IS_CLUSTER:-"false"}
+
+# 当前机器角色:主机("master")或从机("worker")
+ROLE=${ROLE:-"worker"}
+
+# 核心范围变量(集群模式使用),例如 "29-58"
+CORE_RANGE=${CORE_RANGE:-"29-58"}
+
+if [[ "$IS_CLUSTER" == "false" ]]; then
+  # 单机模式,仅运行单个节点
+  echo "Running in standalone mode..."
+  node
+elif [[ "$IS_CLUSTER" == "true" ]]; then
+  if [[ "$ROLE" == "master" ]]; then
+    # 主机模式:运行主节点程序并按核心范围运行子进程
+    echo "Running in cluster mode as master..."
+
+    # 提取核心范围的起始和结束值
+    IFS="-" read CORE_START CORE_END <<< "$CORE_RANGE"
+
+    # 循环启动子进程
+    for ((CORE=CORE_START; CORE<=CORE_END; CORE++)); do
+      node --core $CORE --parent-process $PARENT_PROCESS_PID &
+    done
+
+    # 运行主节点程序
+    node
+
+    # 确保脚本不会退出,让容器保持运行
+    wait
+
+  elif [[ "$ROLE" == "worker" ]]; then
+    # 从机模式:按核心范围运行子进程
+    echo "Running in cluster mode as worker..."
+
+    # 提取核心范围的起始和结束值
+    IFS="-" read CORE_START CORE_END <<< "$CORE_RANGE"
+
+    # 循环启动子进程
+    for ((CORE=CORE_START; CORE<=CORE_END; CORE++)); do
+      ./node --core $CORE --parent-process $PARENT_PROCESS_PID &
+    done
+
+    # 确保脚本不会退出,让容器保持运行
+    wait
+
+  else
+    echo "Invalid role specified: $ROLE. Must be 'master' or 'worker'."
+    exit 1
+  fi
+else
+  echo "Invalid IS_CLUSTER value: $IS_CLUSTER. Must be 'true' or 'false'."
+  exit 1
+fi

+ 56 - 0
fetch.sh

@@ -0,0 +1,56 @@
+fetch() {
+    files=$(curl https://releases.quilibrium.com/release | grep linux-amd64)
+    new_release=false
+
+    for file in $files; do
+        # 下载文件
+        if ! test -f "./$file"; then
+            curl "https://releases.quilibrium.com/$file" > "$file"
+            new_release=true
+            
+            # 使用正则表达式匹配,替换掉前缀部分为 'node'
+            new_name=$(echo "$file" | sed 's/node-.*-linux-amd64/node/')
+            
+            # 只有当文件名不同的时候才执行重命名
+            if [[ "$file" != "$new_name" ]]; then
+                mv "$file" "$new_name"
+            fi
+        fi
+    done
+}
+
+fetchQclient() {
+    files=$(curl https://releases.quilibrium.com/qclient-release | grep linux-amd64)
+    new_release=false
+
+    for file in $files; do
+        # 下载文件
+        if ! test -f "./$file"; then
+            curl "https://releases.quilibrium.com/$file" > "$file"
+            new_release=true
+            
+            # 使用正则表达式匹配,替换掉前缀部分为 'node'
+            new_name=$(echo "$file" | sed 's/qclient-.*-linux-amd64/qclient/')
+            
+            # 只有当文件名不同的时候才执行重命名
+            if [[ "$file" != "$new_name" ]]; then
+                mv "$file" "$new_name"
+            fi
+        fi
+    done
+}
+
+rm ./node
+rm ./node.dgst
+rm ./node.dgst.*
+rm ./qclient
+rm ./qclient.dgst
+rm ./qclient.dgst.*
+
+fetch
+
+fetchQclient
+
+chmod +x node
+
+chmod +x qclient