# deploy-services **Repository Path**: kolonse_zhjsh/deploy-services ## Basic Information - **Project Name**: deploy-services - **Description**: No description available - **Primary Language**: Go - **License**: MPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-07-24 - **Last Updated**: 2025-12-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目介绍 本项目是一个一键部署项目,在一个局域网内,如果项目服务较多,节点较多,只需要在一台机器上就可以部署所有节点。 可以通过此项目进行配置统一管理,节点统一管理,节省项目部署复杂度。 # 配置文件介绍 启动时默认加载的配置文件时 service.kcfg,但如果有多个配置文件,可以使用 deploy-cli use --file 指定使用哪个配置文件,后续启动时就会加载该配置 ## package 关键字 ```aiignore package { fpbx.tar.gz freeswitch.tar.gz rtpe.tar.gz opensips-release.tar.gz sipt.tar.gz } ``` 用来定义依赖的压缩包,在commit时会检查压缩包大小和日期是否发生变化,有变化才会进行解压缩处理 ## public 关键字 ```aiignore public { name fpbx nodes [ acdserver acdnode cdr cti log mq scada ] # source 解压缩后的依赖文件,也就是进行对比的目录 depends [ fpbx/lib fpbx/conf fpbx/db ] # persist 表示持久化的列表,只会同步一次,即使新的包发生更新,也不会更新以下列表的目录,必须在 depends 中存在 persist [ fpbx/db ] after_active { # 命令 1 cmd ls -la # 命令 2 cmd pwd } } ``` 用于定义公共资源 * name : 公共资源名称 * nodes : 指定公共资源要部署的节点列表 * depends :依赖的列表,可以是目录或者文件 * persist : 定义永久不变化的列表,例如DB文件,只更新一次,下次不再更新 * after_active :指定在资源active后要执行的linux shell命令 ## environment 关键字 定义环境变量 ```aiignore environment { name fpbx # 环境变量类型 # system 路径需要格式化,例如 export LD_LIBRARY_PATH=XXX:$LD_LIBRARY_PATH # normal 直接复制方式,格式为 export TEST="xxx" # path 需要根据节点路径格式化,例如 export TEST=xxx # env { # 要设置的环境变量名称 # 依赖配置服务名 值类型 值 LD_LIBRARY_PATH { type system value fpbx/lib } PATH { type system value fpbx/bin } NAME { type normal value Test } NAME2 { type path value fpbx/bin } } } ``` 如果 service 指定了依赖的环境变量,那么在每次执行启动,停止等命令前,都会先执行一次环境变量赋值 * name 指定环境变量配置名 * env 指定要执行的环境变量 * * type 表示环境变量类型,有system,normal,path几种类型 * * * system 赋值方式是 XXX=value:$XXX,会连接系统环境变量 * * * normal 赋值方式是 XXX=value,单纯的值类型赋值 * * * path 表示是一个路径,内部会转化成绝对路径 ## configure 关键字 ```aiignore configure { name fpbx config { fpbx/conf/scadaserver.ini { type ini key http-post-server.post_switch true key http-post-server.need_token false key http-post-server.base_url https://10.0.0.4:55000/nicc-gateway key http-get-url.get_status_uas /scada/status/uas } fpbx/conf/common_conf.json { type json body ``` { "nacos": { "addrs": ["10.0.0.9:28080"], "name_space": "ddfcba3f-0fed-450c-9697-f35b0d49ec49", "username": "nacos", "password": "Ep5gV6tr1bQ" }, "redis": { "server_addrs": ["10.0.0.9:6379"], "password": "Tx.q7jZ8$cMf", "db_index": 1, "pool_size": 5, "cluster_addrs": [] } } ``` } rtpe/conf/rtpengine.conf { type text template rtpe/rtpengine_ua.conf } } } ``` 在服务激活时会进行配置文件替换操作,用于定义配置替换的行为 * name 定义配置名 * config 定义需要替换的配置文件列表 * * type 配置文件类型 * * * json 表示内容是 json格式,需要定义 body 部分是 json 格式字符串 * * * ini 表示内容是ini 方式,后续每一行key关键字,value 部分的格式为 区块名.关键字 值 * * * text 表示内容是文本文件,需要定义 template 指定配置文件路径 * * * * template : 模板内容替换 * * * * file : 直接内容替换 替换的内容可以使用动态变量 {{node.变量名}} {{service.变量名}} node 和 service 必须是固定的,表示 node 和 service 关键字。 后面的变量名在node 和 service 中可以任意指定,在服务激活时,会自动替换成对应的变量值。 ## node 关键字 服务节点 ```aiignore node { # name 可以相同,如果 name 相同, # 那么 service nodes 中的配置,指定一个name 就可以控制一组机器 name os_ims name os_ua record_dir $RECORD_DIR system linux # 数据部署目录 base /home/lmode/package host 10.0.0.4 # 内网网卡 local 10.0.0.4 # 外网网卡 external 10.0.0.4 # 外网映射IP external_dcn 203.83.234.186 # 坐席对外端口 external_ua_port 15080 # 坐席对内端口 internal_ua_port 15081 # 核心网 video 对外端口 external_ims_video_port 6060 # 核心网 video 对内端口 internal_ims_video_port 6061 external_ims_port 5060 internal_ims_port 5061 driver { name ssh args "$SSH_USER $SSH_PASS" } } ``` * name 服务节点名称,可以定义多个 * system 系统类型 * host 节点 IP * driver 连接节点的方式 * * name 指定连接的协议 ssh * * args 指定连接参数, ssh 为:用户名 密码 可以给节点定义自定义变量,例如以上的 local,external等。 在configure 中可以通过 {{node.local}} 替换成对应的值。因为一个服务可能部署在不同的两个节点上, 配置文件可能需要明确知道当前节点的IP,通过这种方式就可以自动替换成对应节点的IP。 ## service 关键字 定义服务信息 ```aiignore service { name freeswitch start_command { bind_env true cmd ``` export LD_LIBRARY_PATH if [[ `pgrep -fc "$(pwd)/$name -ncwait -nonat -base $(pwd)/.."` -gt 0 ]]; then echo "$name Running" exit 0 fi $(pwd)/$name -ncwait -nonat -base $(pwd)/.. echo "$name Started" ``` } stop_command { bind_env true cmd ``` export LD_LIBRARY_PATH if [[ `pgrep -fc "$(pwd)/$name -ncwait -nonat -base $(pwd)/.."` -gt 0 ]]; then pkill -9 -f "$(pwd)/$name -ncwait -nonat -base $(pwd)/.." echo "$name exit" exit 0 fi echo "$name Not Running" ``` } health_command { bind_env true cmd ``` export LD_LIBRARY_PATH if [[ `pgrep -fc "$(pwd)/$name -ncwait -nonat -base $(pwd)/.."` -gt 0 ]]; then echo 1 exit 0 fi echo 0 ``` } nodes [ fs ] # 如果依赖的是目录,需要判断目录下的文件是否发生变化,如果发生变化那么全部上传 # 否则不进行上传 depends [ freeswitch/bin/freeswitch freeswitch/bin/fs_cli freeswitch/bin/cjson.so ] execute [ freeswitch/bin/freeswitch freeswitch/bin/fs_cli ] # 依赖项必须在 publib.depends 中存在 public [ # fpbx 依赖 public.name,依赖public.depends 配置 fs freeswitch/conf fs freeswitch/db fs freeswitch/grammar fs freeswitch/lib fs freeswitch/mod fs freeswitch/resources fs freeswitch/scripts fs_sounds sounds ] # 工作目录,命令启动时需要保证工作路径在指定路径下 # bind_env true 时会设置 workdir freeswitch/bin # 环境变量依赖 environment fs # 配置依赖, 在 active 时需要执行, 进行修改配置内容 configure fs after_active { cmd ``` cd {{node.base}}/$name/ abs_path=`readlink -f freeswitch` abs_path=`dirname ${abs_path}` cd {{node.base}}/$name/freeswitch rm -fr sounds ln -fs ${abs_path}/sounds sounds rm -fr conf/sip_profiles/internal* ``` } } ``` * name 服务名称 * start_command 启动命令定义 * stop_command 停止命令定义 * health_command 健康检查命令定义 * nodes 要部署的node 列表 * depends 依赖文件,会检查每个文件的MD5值是否发生变化 * execute 依赖的可执行文件,激活后会自动添加可执行权限 * public 依赖的公共资源列表,必须在 public中有定义,格式为: 资源名 资源文件 * workdir 工作路径 * environment 依赖的环境变量 * configure 依赖的配置 * after_active 激活后要执行的命令 可以像node 一样定义自定义变量,在configure中通过 {{service.name}}就可以获取到 name值, 配置替换时会自动替换 ## include 关键字 如果一个配置文件太大,可以将配置文件进行分类,然后使用include 配置文件, 就可以将另一个配置文件的内容包含进来 # 启动方式 ```aiignore # 后台启动方式 ./deploy-services -D # 指定使用的服务端口 ./deploy-services -p 10802 -D ``` # Command 列表 可以使用 ./deploy-cli -h 查看一级命令列表 ## ./deploy-cli config -H [host=127.0.0.1] -p [port=10802] 配置 deploy-cli 命令链接的 deploy-services IP和端口,配置一次后, 以后使用使用命令时不需要特意增加 -H, -p 参数 ## deploy-cli daemon start/status/stop --name [service name] * --name : 可以指定要控制那个服务类型 * start : 开启守护进程功能,检测到服务退出时自动启动服务 * stop : 关闭守护进程功能 * status : 查看是否开启守护进程 ## deploy-cli diff 查看当前文件变化列表,只会对 service 依赖文件进行检查。 ## deploy-cli node 节点相关操作命令 ### deploy-cli node cmd --node [node name] --cmd [执行命令] 在指定node上执行shell命令 ### deploy-cli node enable --node [node name] --enable [true/false] 启用或停止使用 node ### deploy-cli node show 显示所有 node 信息 ## deploy-cli package 发布包的操作命令,包名的列表在以下配置中指定 ```aiignore package { a.tar.gz b.tar.gz } ``` ### deploy-cli package commit 如果 package 列表时间或者大小发生变化,会自动解压缩,并放到 data 目录 执行后通过 deploy-cli diff 可以看到变化的内容 如果是 public 的文件内容,不会进行显示 ### deploy-cli package push --file [file path] 上传文件到 package 目录 ## deploy-cli public 公共资源相关命令,例如公共依赖库,音频文件等,这些文件不需要获取每个文件详细信息 一般是不变配置,依赖库,资源文件等,更新不会太频繁的内容 ### deploy-cli public commit --name [public name] --force 如果 public 定义的资源发生变化,对public 资源进行提交 * --name 可以指定提交的public 名,如果不指定,那么默认会提交所有public有变化的资源 * --force 强制提交资源,无论是否有变化 ### deploy-cli public active --name [public name] --force 如果有新的 commit,激活使用新的资源,激活后会将文件传递到对应的node * --name 指定要激活的 public 资源,不指定,则激活所有 public 资源 * --force 强制激活资源,无论是否有变化 ### deploy-cli public show 显示所有public处于激活的资源,对应时间和大小 ## deploy-cli reload 如果配置文件,依赖文件等发生变化,需要调用命令重新加载配置并重新刷新service文件的MD5值 ## deploy-cli service 服务操作相关命令 * --node 指定节点名,不填是服务涉及的所有节点 * --name 指定服务名,不填是操作所有服务 * --force 强制操作,无论是否发生变化 ### deploy-cli service commit --name [service name] --force 提交变化的文件到远程节点 ### deploy-cli service active --name [service name] --force 提交后激活远程服务 ### deploy-cli service cmd --name [service name] --cmd [linux shell] 执行linux shell命令 ### deploy-cli service health --name [service name] --node [node name] 显示健康状态,是否运行等 ### deploy-cli service history --name [service name] 查看commit历史 ### deploy-cli service start --name [service name] --node [node name] 启动服务 ### deploy-cli service stop --name [service name] --node [node name] 停止服务 ### deploy-cli service restart --name [service name] --node [node name] 重启服务 ### deploy-cli service push --name [service name] --node [node name] --file [file path] 上传文件,文件最终会上传到服务指定的工作目录 ### deploy-cli service show --name [service name] 显示服务信息:依赖文件,启动命令,停止命令等 ### deploy-cli service sync --name [service name] 相当于一次执行以下命令: ```aiignore ./deploy-cli service stop --name [service name] ./deploy-cli public commit --name [public name] --force ./deploy-cli public active --name [public name] --force ./deploy-cli service commit --name [service name] --force ./deploy-cli service active --name [service name] --force ./deploy-cli service start --name [service name] ``` ## deploy-cli sync 相当于一次执行以下命令: ```aiignore ./deploy-cli package commit ./deploy-cli public commit --force ./deploy-cli public active --force ./deploy-cli service commit --force ./deploy-cli service active --force ``` ## deploy-cli use 远端有多个配置文件时,可以指定要使用的配置文件 # 使用场景 ## 场景1: public 资源发生需要更新某个文件 ```aiignore public { name fs nodes [ fs ] # source 解压缩后的依赖文件,也就是进行对比的目录 depends [ freeswitch/scripts ] } service { name freeswitch # 依赖项必须在 publib.depends 中存在 public [ fs freeswitch/scripts ] } ``` 如果我想只修改 scripts 部分文件,将更新的文件替换到目录 local/data/freeswitch/scripts中,然后执行以下命令 ```aiignore ./deploy-cli public commit --name fs --force ./deploy-cli public active --name fs --force ./deploy-cli service active --name freeswitch --force ./deploy-cli service restart --name freeswitch ``` 也可以执行以下命令: ```aiignore ./deploy-cli service sync --name freeswitch ```