diff --git a/.gitignore b/.gitignore index d36977d..76a553b 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .tmp +*.tar diff --git a/Dockerfile b/Dockerfile index 5b3dae6..b55773b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,10 +2,12 @@ FROM dockerproxy.com/library/ubuntu:22.04 ADD dotnet-runtime-3.1.32-linux-x64.tar.gz /root/dotnet COPY libssl1.0.0_1.0.2g-1ubuntu4.20_amd64.deb /tmp -RUN apt update;dpkg --add-architecture i386;apt update;apt install -y --no-install-recommends libstdc++6 lib32stdc++6 libc6:i386 libc6 libgcc-s1 libicu70 liblttng-ust1 zlib1g vim zip unzip wget openssh-server inetutils-ping inetutils-telnet;\ +RUN apt update;dpkg --add-architecture i386;apt update;apt install -y --no-install-recommends libstdc++6 lib32stdc++6 libc6:i386 libc6 libgcc-s1 libicu70 liblttng-ust1 zlib1g vim zip unzip wget openssh-server inetutils-ping inetutils-telnet jq;\ dpkg -i /tmp/libssl1.0.0_1.0.2g-1ubuntu4.20_amd64.deb;\ echo "PermitRootLogin yes\nPasswordAuthentication yes\n" >> /etc/ssh/sshd_config;\ - echo root:123456 |chpasswd + echo root:123456 |chpasswd;\ + echo "check_certificate = off\n" >> /etc/wgetrc + COPY localtime /etc COPY nats-server /usr/bin/ diff --git a/README.md b/README.md index 194f373..1d5a346 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ # 软采基础镜像 + 包含dotnet 3.1 运行时,i386 架构支持,nats-server,运行管理,可上线UIOT平台,支持部署,远程访问 ### 编译 -`docker build -t gitiot.mgm-iot.com/iot_images/yuzhen_base:vx.x.x .` +`docker build -t gitiot.mgm-iot.com/iot_images/yuzhen_base:vx.x.x .` +`docker build -t swr.cn-north-4.myhuaweicloud.com/cloud-yuzhen/yuzhen_base:vx.x.x ./` ### docker 运行命令 + `docker run -d --name yzcol --restart always -v /etc/localtime:/etc/localtime gitiot.mgm-iot.com/iot_images/yuzhen_base:v1.0.4` * -p 51001:51001/udp ,透传UDP端口 @@ -17,13 +20,22 @@ * -v /etc/localtime:/etc/localtime ,保持和主机相同时区 ### 设置自动重启 + `docker update --restart=always ${CONTAINER}` ### 批量部署 -使用docker-compose -将需要创建的网关ID 按照示例文件批量添加,同时在 yz_project.csv 中添加所有网关的配置信息 -如上两个配置修改完成后,执行 `docker-compose up -d` 即可 -更新日志 +使用 generate_files.py 脚本,修改脚本中内容: + +1. csv_line 内容中的平台信息 +2. START_SN  其实虚拟网关序列号 +3. COUNT 要生成的虚拟网关个数 + +执行Python脚本 python3 generate_files.py + +同时启动过多容器,可能会导致注册异常,可使用如下Python脚本,按顺序延时启动,python3 deploy.py + +### 更新日志 + 2024-12-10 09:52:45 factory升级v1.1.9 -2024-12-20 17:46:40 支持批量部署。 \ No newline at end of file +2024-12-20 17:46:40 支持批量部署。 diff --git a/deploy.py b/deploy.py new file mode 100644 index 0000000..6fa131a --- /dev/null +++ b/deploy.py @@ -0,0 +1,41 @@ +import yaml +import time +import subprocess + +# 配置:延时秒数 +DELAY_SECONDS = 10 + +def start_containers(): + try: + # 1. 读取 compose 文件获取服务列表 + with open('docker-compose.yml', 'r') as f: + compose_data = yaml.safe_load(f) + + services = list(compose_data.get('services', {}).keys()) + + if not services: + print("错误: 未在 docker-compose.yml 中找到任何服务。") + return + + print(f"检测到 {len(services)} 个服务,将按顺序启动并延时 {DELAY_SECONDS}s...") + + # 2. 逐个启动服务 + for service in services: + print(f"正在启动容器: {service} ...") + # 使用 docker-compose up -d [服务名] 启动特定容器 + subprocess.run(["docker-compose", "up", "-d", service], check=True) + + # 最后一个容器启动后不需要等待 + if service != services[-1]: + time.sleep(DELAY_SECONDS) + print(f"等待 {DELAY_SECONDS}s...") + + print("\n所有容器已按序启动完成!") + + except FileNotFoundError: + print("错误: 当前目录下找不到 docker-compose.yml") + except Exception as e: + print(f"运行出错: {e}") + +if __name__ == "__main__": + start_containers() diff --git a/docker-compose.yml b/docker-compose.yml index f630c51..97faf14 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,12 +1,23 @@ version: '3' - x-service-common: &service-common - image: gitiot.mgm-iot.com/iot_images/yuzhen_base:v1.0.9 + image: swr.cn-north-4.myhuaweicloud.com/cloud-yuzhen/yuzhen_base:v1.0.11 restart: always volumes: - ./yz_project.csv:/home/yz_project.csv services: - YZXHRC0125H070001: + YZXHRAX86NN2511250011: <<: *service-common - command: [ "/home/start.sh", "YZXHRC0125H070001" ] + command: [ "/home/start.sh", "YZXHRAX86NN2511250011" ] + YZXHRAX86NN2511250012: + <<: *service-common + command: [ "/home/start.sh", "YZXHRAX86NN2511250012" ] + YZXHRAX86NN2511250013: + <<: *service-common + command: [ "/home/start.sh", "YZXHRAX86NN2511250013" ] + YZXHRAX86NN2511250014: + <<: *service-common + command: [ "/home/start.sh", "YZXHRAX86NN2511250014" ] + YZXHRAX86NN2511250015: + <<: *service-common + command: [ "/home/start.sh", "YZXHRAX86NN2511250015" ] \ No newline at end of file diff --git a/generate_files.py b/generate_files.py new file mode 100644 index 0000000..c30030c --- /dev/null +++ b/generate_files.py @@ -0,0 +1,71 @@ +import os + +def generate_files(start_sn, count): + # 1. 解析起始序列号 (分离前缀和最后4位数字) + # 假设格式固定,最后4位为数字 + prefix = start_sn[:-4] + try: + start_num = int(start_sn[-4:]) + except ValueError: + print("错误: 序列号最后4位必须是数字。") + return + + csv_filename = "yz_project.csv" + docker_filename = "docker-compose.yml" + + csv_content = [] + docker_services = [] + + # docker-compose 头部定义 + docker_header = """version: '3' +x-service-common: &service-common + image: swr.cn-north-4.myhuaweicloud.com/cloud-yuzhen/yuzhen_base:v1.0.11 + restart: always + volumes: + - ./yz_project.csv:/home/yz_project.csv + +services:""" + + print(f"正在生成 {count} 个序列号,起始于: {start_sn}...") + + for i in range(count): + # 计算当前数字并补零至4位 (例如: 1 -> 0001) + current_num = start_num + i + current_sn = f"{prefix}{current_num:04d}" + + # --- 生成 CSV 行 --- + # 格式: ${device_SN},Horseman-A21,H21.0.0.1,192.168.1.244,1883,mxpoty5rco1jhwde|${device_SN}|2,pykqg5qpzspfce3w,0,192.168.1.244,http://192.168.1.244/dlp/v1/device/backupAndRestore?sn=${device_SN},, + + csv_line = ( + f"{current_sn},Horseman-A21,H21.0.0.1,192.168.1.244,1883,mxpoty5rco1jhwde|{current_sn}|2,pykqg5qpzspfce3w,0,192.168.1.244,http://192.168.1.244/dlp/v1/device/backupAndRestore?sn={current_sn}" + ) + csv_content.append(csv_line) + + # --- 生成 Docker Compose 服务块 --- + # 注意 YAML 缩进 + service_block = f""" + {current_sn}: + <<: *service-common + command: [ "/home/start.sh", "{current_sn}" ]""" + docker_services.append(service_block) + + # 2. 写入 CSV 文件 + with open(csv_filename, 'w', encoding='utf-8') as f: + f.write("\n".join(csv_content)) + # 如果文件末尾需要换行符,取消下面注释 + # f.write("\n") + print(f"已创建: {csv_filename}") + + # 3. 写入 Docker Compose 文件 + with open(docker_filename, 'w', encoding='utf-8') as f: + f.write(docker_header) + f.write("".join(docker_services)) + print(f"已创建: {docker_filename}") + +if __name__ == "__main__": + # --- 配置区域 --- + START_SN = "YZXHRAX86NN2511250001" # 起始序列号 + COUNT = 166 # 需要生成的个数 + # ---------------- + + generate_files(START_SN, COUNT) diff --git a/start.sh b/start.sh index 89e9e48..6cfdf55 100755 --- a/start.sh +++ b/start.sh @@ -2,9 +2,14 @@ echo "start ssh" service ssh start -echo "start set project" -/yuzhen_iot/prod_manage/app/plumber -project /home/yz_project.csv -S $1 +# 检查 Prod_connect.json 文件中 user 字段是否包含 $1 参数 +if jq --arg param "$1" '(.product.user | split("|") | contains([$param]))' /yuzhen_iot/prod_manage/cfg/Prod_connect.json; then + echo "Parameter $1 found in Prod_connect.json user field. Skipping plumber execution." +else + echo "Parameter $1 not found in Prod_connect.json user field. Starting plumber..." + /yuzhen_iot/prod_manage/app/plumber -project /home/yz_project.csv -S $1 +fi echo "start scheduler" /yuzhen_iot/service_manage/manage/app/scheduler -echo "yuzhen exit!" \ No newline at end of file +echo "yuzhen exit!" diff --git a/yuzhen_iot/service_manage/manage/app/Version-1.0.19 b/yuzhen_iot/service_manage/manage/app/Version-1.0.19 new file mode 100644 index 0000000..e69de29 diff --git a/yuzhen_iot/service_manage/manage/app/manager b/yuzhen_iot/service_manage/manage/app/manager index c2d8776..373ce1b 100755 Binary files a/yuzhen_iot/service_manage/manage/app/manager and b/yuzhen_iot/service_manage/manage/app/manager differ diff --git a/yuzhen_iot/service_manage/manage/app/scheduler b/yuzhen_iot/service_manage/manage/app/scheduler index 39ecc5f..eac01c5 100755 Binary files a/yuzhen_iot/service_manage/manage/app/scheduler and b/yuzhen_iot/service_manage/manage/app/scheduler differ diff --git a/yz_project.csv b/yz_project.csv index 80e7ca3..79f4750 100644 --- a/yz_project.csv +++ b/yz_project.csv @@ -1,3 +1,5 @@ -hardware_sn,hardware_mode,hardware_ver,uiot_addr,uiot_port,uiot_name,uiot_key,uiot_authmode,ntp_host,register_url ,frp_server_addr,frp_server_port -YZXHRC0125H070001,Horseman-A21,H21.0.0.1,106.75.75.68,1883,mxpoty5rco1jhwde|YZXHRC0125H070001|2,"pykqg5qpzspfce3w -",0,106.75.75.68,,, +YZXHRAX86NN2511250011,Horseman-A21,H21.0.0.1,106.75.75.68,1883,mxpoty5rco1jhwde|YZXHRAX86NN2511250011|2,pykqg5qpzspfce3w,0,106.75.75.68,http://106.75.75.68/dlp/v1/device/backupAndRestore +YZXHRAX86NN2511250012,Horseman-A21,H21.0.0.1,106.75.75.68,1883,mxpoty5rco1jhwde|YZXHRAX86NN2511250012|2,pykqg5qpzspfce3w,0,106.75.75.68,http://106.75.75.68/dlp/v1/device/backupAndRestore +YZXHRAX86NN2511250013,Horseman-A21,H21.0.0.1,106.75.75.68,1883,mxpoty5rco1jhwde|YZXHRAX86NN2511250013|2,pykqg5qpzspfce3w,0,106.75.75.68,http://106.75.75.68/dlp/v1/device/backupAndRestore +YZXHRAX86NN2511250014,Horseman-A21,H21.0.0.1,106.75.75.68,1883,mxpoty5rco1jhwde|YZXHRAX86NN2511250014|2,pykqg5qpzspfce3w,0,106.75.75.68,http://106.75.75.68/dlp/v1/device/backupAndRestore +YZXHRAX86NN2511250015,Horseman-A21,H21.0.0.1,106.75.75.68,1883,mxpoty5rco1jhwde|YZXHRAX86NN2511250015|2,pykqg5qpzspfce3w,0,106.75.75.68,http://106.75.75.68/dlp/v1/device/backupAndRestore \ No newline at end of file