chore: remove local service runners
This commit is contained in:
@@ -1,119 +0,0 @@
|
||||
# macOS launchctl 本机部署模板
|
||||
|
||||
本目录用于把本机生产验证服务的启动方式仓库化。模板面向当前生产验证链路:
|
||||
|
||||
- `gb32960-ingest-app`: TCP `32960`,HTTP `20100`
|
||||
- `jt808-ingest-app`: TCP `808`,HTTP `20400`
|
||||
- `yutong-mqtt-app`: HTTP `20500`
|
||||
- `vehicle-history-app`: HTTP `20200`
|
||||
- `vehicle-analytics-app`: HTTP `20300`
|
||||
|
||||
`vehicle-history-app` 的热历史查询只依赖 Kafka 与 TDengine:RAW 帧的 `parsedJson`、`metadataJson`、`rawUri` 已进入 TDengine `raw_frames`。GB32960/JT808 接入服务可以继续保留 `SINK_ARCHIVE_PATH` 作为原始 `.bin` 冷备,history 本机模板不再要求共享 archive root。
|
||||
|
||||
`vehicle-history-app` 的生产高吞吐模板是 TDengine-only:
|
||||
|
||||
- 不暴露 DuckDB 或文件型明细库启动变量,避免本地文件索引进入实时消费热路径。
|
||||
- 只写 `raw_frames` 和协议位置表,避免逐字段写放大。
|
||||
- 通用 RAW 查询直接返回 TDengine `raw_frames` 中的 `parsedJson`/`parsedFields`;字段趋势宽表由独立字段解析服务消费 Kafka RAW/事件后维护。
|
||||
|
||||
## 生成 plist
|
||||
|
||||
在仓库根目录执行:
|
||||
|
||||
```bash
|
||||
export PROJECT_ROOT="$(pwd)"
|
||||
export JAVA_BIN="$(/usr/libexec/java_home 2>/dev/null)/bin/java"
|
||||
export INGEST_ARCHIVE_PATH="$PROJECT_ROOT/data/archive-live"
|
||||
export TDENGINE_JDBC_URL='jdbc:TAOS-WS://<tdengine-host>:6041/vehicle_ts'
|
||||
export TDENGINE_USERNAME='root'
|
||||
export TDENGINE_PASSWORD='<tdengine-password>'
|
||||
export VEHICLE_IDENTITY_MYSQL_JDBC_URL='jdbc:mysql://<mysql-host>:3306/vehicle_ingest'
|
||||
export VEHICLE_IDENTITY_MYSQL_USERNAME='<mysql-user>'
|
||||
export VEHICLE_IDENTITY_MYSQL_PASSWORD='<mysql-password>'
|
||||
export VEHICLE_IDENTITY_MYSQL_REFRESH_INTERVAL='60s'
|
||||
export MYSQL_JDBC_URL="$VEHICLE_IDENTITY_MYSQL_JDBC_URL"
|
||||
export MYSQL_USERNAME="$VEHICLE_IDENTITY_MYSQL_USERNAME"
|
||||
export MYSQL_PASSWORD="$VEHICLE_IDENTITY_MYSQL_PASSWORD"
|
||||
export KAFKA_TOPIC_HISTORY_DLQ='vehicle.dlq.history.v1'
|
||||
export YUTONG_MQTT_ENABLED='false'
|
||||
export YUTONG_MQTT_URI=''
|
||||
export YUTONG_MQTT_TOPIC='#'
|
||||
export YUTONG_MQTT_USERNAME=''
|
||||
export YUTONG_MQTT_PASSWORD=''
|
||||
export YUTONG_MQTT_KEEP_ALIVE_SECONDS='20'
|
||||
export YUTONG_MQTT_CONNECTION_TIMEOUT_SECONDS='10'
|
||||
export YUTONG_MQTT_TLS_CA_PEM=''
|
||||
export YUTONG_MQTT_TLS_CLIENT_PEM=''
|
||||
export YUTONG_MQTT_TLS_CLIENT_KEY=''
|
||||
export YUTONG_MQTT_TLS_HOSTNAME_VERIFICATION_ENABLED='true'
|
||||
|
||||
mkdir -p "$HOME/Library/LaunchAgents" "$PROJECT_ROOT/data"
|
||||
mkdir -p /tmp/lingniu-gb32960-live /tmp/lingniu-jt808-live /tmp/lingniu-yutong-mqtt-live /tmp/lingniu-vehicle-history-live /tmp/lingniu-vehicle-analytics-live
|
||||
|
||||
python3 deploy/local/launchctl/render.py
|
||||
```
|
||||
|
||||
渲染脚本固定生成 `gb32960 jt808 yutong-mqtt vehicle-history vehicle-analytics` 五个 plist,并会对密码、JDBC URL、MQTT topic、keepAlive、连接超时和 TLS PEM 参数中的 XML 特殊字符做转义,避免 `#`、`&` 等字符破坏 plist。
|
||||
|
||||
如果生产配置由 Nacos 下发,可以把模板里的 `NACOS_CONFIG_ENABLED` 改成 `true`,并补充 `NACOS_SERVER_ADDR`、`NACOS_NAMESPACE`、`NACOS_GROUP`、`NACOS_USERNAME`、`NACOS_PASSWORD`。端口、Kafka topic、接入服务冷备 archive 路径、TDengine 连接建议仍保留为启动环境变量,便于 Portainer、launchctl 和临时压测保持一致。
|
||||
|
||||
history 消费者会按协议和 raw/event 自动拆分 consumer group。设置 `KAFKA_GROUP_HISTORY=vehicle-history-live` 后,实际 group 为:
|
||||
|
||||
- `vehicle-history-live-gb32960-event`
|
||||
- `vehicle-history-live-gb32960-raw`
|
||||
- `vehicle-history-live-jt808-event`
|
||||
- `vehicle-history-live-jt808-raw`
|
||||
- `vehicle-history-live-yutong-mqtt-event`
|
||||
- `vehicle-history-live-yutong-mqtt-raw`
|
||||
|
||||
本地模板与 ECS 生产口径一致,身份绑定只使用 MySQL。启动前必须提供 `VEHICLE_IDENTITY_MYSQL_*` 连接参数;服务会自动创建 `vehicle_identity_binding` 和 `vehicle_identity_binding_registration` 两张表:前者只保存 `plate`、`vin`,后者保存注册字段;服务按刷新周期用注册表里的车牌关联 VIN,后续 raw/event 会带真实 VIN。
|
||||
|
||||
## 启停
|
||||
|
||||
```bash
|
||||
launchctl bootstrap "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.lingniu.gb32960.plist"
|
||||
launchctl bootstrap "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.lingniu.jt808.plist"
|
||||
launchctl bootstrap "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.lingniu.yutong-mqtt.plist"
|
||||
launchctl bootstrap "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.lingniu.vehicle-history.plist"
|
||||
launchctl bootstrap "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.lingniu.vehicle-analytics.plist"
|
||||
|
||||
launchctl list | rg 'com.lingniu.(gb32960|jt808|yutong-mqtt|vehicle-history|vehicle-analytics)'
|
||||
```
|
||||
|
||||
替换 jar 前先停止服务,避免 KeepAlive 在 jar 拷贝中途拉起半包:
|
||||
|
||||
```bash
|
||||
launchctl bootout "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.lingniu.gb32960.plist" || true
|
||||
launchctl bootout "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.lingniu.jt808.plist" || true
|
||||
launchctl bootout "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.lingniu.yutong-mqtt.plist" || true
|
||||
launchctl bootout "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.lingniu.vehicle-history.plist" || true
|
||||
launchctl bootout "gui/$(id -u)" "$HOME/Library/LaunchAgents/com.lingniu.vehicle-analytics.plist" || true
|
||||
```
|
||||
|
||||
## 验证地址
|
||||
|
||||
```bash
|
||||
curl -sS http://127.0.0.1:20100/actuator/health
|
||||
curl -sS http://127.0.0.1:20100/actuator/health/liveness
|
||||
curl -sS http://127.0.0.1:20100/actuator/health/readiness
|
||||
curl -sS http://127.0.0.1:20400/actuator/health
|
||||
curl -sS http://127.0.0.1:20400/actuator/health/liveness
|
||||
curl -sS http://127.0.0.1:20400/actuator/health/readiness
|
||||
curl -sS http://127.0.0.1:20500/actuator/health
|
||||
curl -sS http://127.0.0.1:20500/actuator/health/liveness
|
||||
curl -sS http://127.0.0.1:20500/actuator/health/readiness
|
||||
curl -sS http://127.0.0.1:20200/actuator/health
|
||||
curl -sS http://127.0.0.1:20200/actuator/health/liveness
|
||||
curl -sS http://127.0.0.1:20200/actuator/health/readiness
|
||||
curl -sS http://127.0.0.1:20300/actuator/health
|
||||
curl -sS http://127.0.0.1:20300/actuator/health/liveness
|
||||
curl -sS http://127.0.0.1:20300/actuator/health/readiness
|
||||
```
|
||||
|
||||
API / Swagger:
|
||||
|
||||
- GB32960 ingest health: `http://127.0.0.1:20100/actuator/health`
|
||||
- JT808 ingest health: `http://127.0.0.1:20400/actuator/health`
|
||||
- Yutong MQTT ingest health: `http://127.0.0.1:20500/actuator/health`
|
||||
- History query: `http://127.0.0.1:20200/swagger-ui/index.html`
|
||||
- Analytics metrics: `http://127.0.0.1:20300/swagger-ui/index.html`
|
||||
@@ -1,61 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.lingniu.gb32960</string>
|
||||
<key>WorkingDirectory</key>
|
||||
<string>__PROJECT_ROOT__</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>__JAVA_BIN__</string>
|
||||
<string>-jar</string>
|
||||
<string>__PROJECT_ROOT__/modules/apps/gb32960-ingest-app/target/gb32960-ingest-app.jar</string>
|
||||
</array>
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>HTTP_PORT</key>
|
||||
<string>20100</string>
|
||||
<key>GB32960_PORT</key>
|
||||
<string>32960</string>
|
||||
<key>GB32960_AUTH_ENABLED</key>
|
||||
<string>false</string>
|
||||
<key>GB32960_PLATFORM_IP_HYUNDAI</key>
|
||||
<string>115.29.187.205</string>
|
||||
<key>KAFKA_BROKERS</key>
|
||||
<string>114.55.58.251:9092</string>
|
||||
<key>KAFKA_NODE_ID</key>
|
||||
<string>gb32960-live-32960</string>
|
||||
<key>KAFKA_TOPIC_GB32960_EVENT</key>
|
||||
<string>vehicle.event.gb32960.v1</string>
|
||||
<key>KAFKA_TOPIC_GB32960_RAW</key>
|
||||
<string>vehicle.raw.gb32960.v1</string>
|
||||
<key>KAFKA_TOPIC_GB32960_DLQ</key>
|
||||
<string>vehicle.dlq.gb32960.v1</string>
|
||||
<key>SINK_ARCHIVE_PATH</key>
|
||||
<string>__SHARED_ARCHIVE_PATH__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_TABLE</key>
|
||||
<string>vehicle_identity_binding</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_JDBC_URL</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_JDBC_URL__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_USERNAME</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_USERNAME__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_PASSWORD</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_PASSWORD__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_REFRESH_INTERVAL</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_REFRESH_INTERVAL__</string>
|
||||
<key>NACOS_CONFIG_ENABLED</key>
|
||||
<string>false</string>
|
||||
<key>MANAGEMENT_HEALTH_REDIS_ENABLED</key>
|
||||
<string>false</string>
|
||||
</dict>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/lingniu-gb32960-live/launchctl-gb32960.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/lingniu-gb32960-live/launchctl-gb32960.err.log</string>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,57 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.lingniu.jt808</string>
|
||||
<key>WorkingDirectory</key>
|
||||
<string>__PROJECT_ROOT__</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>__JAVA_BIN__</string>
|
||||
<string>-jar</string>
|
||||
<string>__PROJECT_ROOT__/modules/apps/jt808-ingest-app/target/jt808-ingest-app.jar</string>
|
||||
</array>
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>HTTP_PORT</key>
|
||||
<string>20400</string>
|
||||
<key>JT808_PORT</key>
|
||||
<string>808</string>
|
||||
<key>KAFKA_BROKERS</key>
|
||||
<string>114.55.58.251:9092</string>
|
||||
<key>KAFKA_NODE_ID</key>
|
||||
<string>jt808-live-808</string>
|
||||
<key>KAFKA_TOPIC_JT808_EVENT</key>
|
||||
<string>vehicle.event.jt808.v1</string>
|
||||
<key>KAFKA_TOPIC_JT808_RAW</key>
|
||||
<string>vehicle.raw.jt808.v1</string>
|
||||
<key>KAFKA_TOPIC_JT808_DLQ</key>
|
||||
<string>vehicle.dlq.jt808.v1</string>
|
||||
<key>SINK_ARCHIVE_PATH</key>
|
||||
<string>__SHARED_ARCHIVE_PATH__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_TABLE</key>
|
||||
<string>vehicle_identity_binding</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_JDBC_URL</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_JDBC_URL__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_USERNAME</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_USERNAME__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_PASSWORD</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_PASSWORD__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_REFRESH_INTERVAL</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_REFRESH_INTERVAL__</string>
|
||||
<key>NACOS_CONFIG_ENABLED</key>
|
||||
<string>false</string>
|
||||
<key>MANAGEMENT_HEALTH_REDIS_ENABLED</key>
|
||||
<string>false</string>
|
||||
</dict>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/lingniu-jt808-live/launchctl-jt808.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/lingniu-jt808-live/launchctl-jt808.err.log</string>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,55 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.lingniu.vehicle-analytics</string>
|
||||
<key>WorkingDirectory</key>
|
||||
<string>__PROJECT_ROOT__</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>__JAVA_BIN__</string>
|
||||
<string>-jar</string>
|
||||
<string>__PROJECT_ROOT__/modules/apps/vehicle-analytics-app/target/vehicle-analytics-app.jar</string>
|
||||
</array>
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>HTTP_PORT</key>
|
||||
<string>20300</string>
|
||||
<key>KAFKA_CONSUMER_ENABLED</key>
|
||||
<string>true</string>
|
||||
<key>KAFKA_CONSUMER_AUTO_OFFSET_RESET</key>
|
||||
<string>latest</string>
|
||||
<key>KAFKA_CONSUMER_CLIENT_ID_PREFIX</key>
|
||||
<string>vehicle-analytics-live</string>
|
||||
<key>KAFKA_BROKERS</key>
|
||||
<string>114.55.58.251:9092</string>
|
||||
<key>KAFKA_GROUP_STAT</key>
|
||||
<string>vehicle-stat-live</string>
|
||||
<key>VEHICLE_STAT_ENABLED</key>
|
||||
<string>true</string>
|
||||
<key>VEHICLE_STAT_ZONE_ID</key>
|
||||
<string>Asia/Shanghai</string>
|
||||
<key>VEHICLE_STAT_JT808_MILEAGE_ENABLED</key>
|
||||
<string>true</string>
|
||||
<key>MYSQL_JDBC_URL</key>
|
||||
<string>__MYSQL_JDBC_URL__</string>
|
||||
<key>MYSQL_USERNAME</key>
|
||||
<string>__MYSQL_USERNAME__</string>
|
||||
<key>MYSQL_PASSWORD</key>
|
||||
<string>__MYSQL_PASSWORD__</string>
|
||||
<key>NACOS_CONFIG_ENABLED</key>
|
||||
<string>false</string>
|
||||
<key>MANAGEMENT_HEALTH_REDIS_ENABLED</key>
|
||||
<string>false</string>
|
||||
</dict>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/lingniu-vehicle-analytics-live/vehicle-analytics.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/lingniu-vehicle-analytics-live/vehicle-analytics.err.log</string>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,75 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.lingniu.vehicle-history</string>
|
||||
<key>WorkingDirectory</key>
|
||||
<string>__PROJECT_ROOT__</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>__JAVA_BIN__</string>
|
||||
<string>-jar</string>
|
||||
<string>__PROJECT_ROOT__/modules/apps/vehicle-history-app/target/vehicle-history-app.jar</string>
|
||||
</array>
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>HTTP_PORT</key>
|
||||
<string>20200</string>
|
||||
<key>KAFKA_CONSUMER_ENABLED</key>
|
||||
<string>true</string>
|
||||
<key>KAFKA_CONSUMER_AUTO_OFFSET_RESET</key>
|
||||
<string>latest</string>
|
||||
<key>KAFKA_CONSUMER_CLIENT_ID_PREFIX</key>
|
||||
<string>vehicle-history-live</string>
|
||||
<key>KAFKA_GROUP_HISTORY</key>
|
||||
<string>vehicle-history-live</string>
|
||||
<key>KAFKA_CONSUMER_CONCURRENCY</key>
|
||||
<string>3</string>
|
||||
<key>KAFKA_BROKERS</key>
|
||||
<string>114.55.58.251:9092</string>
|
||||
<key>KAFKA_TOPIC_GB32960_EVENT</key>
|
||||
<string>vehicle.event.gb32960.v1</string>
|
||||
<key>KAFKA_TOPIC_GB32960_RAW</key>
|
||||
<string>vehicle.raw.gb32960.v1</string>
|
||||
<key>KAFKA_TOPIC_JT808_EVENT</key>
|
||||
<string>vehicle.event.jt808.v1</string>
|
||||
<key>KAFKA_TOPIC_JT808_RAW</key>
|
||||
<string>vehicle.raw.jt808.v1</string>
|
||||
<key>KAFKA_TOPIC_YUTONG_MQTT_EVENT</key>
|
||||
<string>vehicle.event.mqtt-yutong.v1</string>
|
||||
<key>KAFKA_TOPIC_YUTONG_MQTT_RAW</key>
|
||||
<string>vehicle.raw.mqtt-yutong.v1</string>
|
||||
<key>KAFKA_TOPIC_HISTORY_DLQ</key>
|
||||
<string>__KAFKA_TOPIC_HISTORY_DLQ__</string>
|
||||
<key>TDENGINE_HISTORY_ENABLED</key>
|
||||
<string>true</string>
|
||||
<key>TDENGINE_HISTORY_DATABASE</key>
|
||||
<string>vehicle_ts</string>
|
||||
<key>TDENGINE_JDBC_URL</key>
|
||||
<string>__TDENGINE_JDBC_URL__</string>
|
||||
<key>TDENGINE_DRIVER_CLASS_NAME</key>
|
||||
<string>com.taosdata.jdbc.ws.WebSocketDriver</string>
|
||||
<key>TDENGINE_USERNAME</key>
|
||||
<string>__TDENGINE_USERNAME__</string>
|
||||
<key>TDENGINE_PASSWORD</key>
|
||||
<string>__TDENGINE_PASSWORD__</string>
|
||||
<key>TDENGINE_MIN_IDLE</key>
|
||||
<string>0</string>
|
||||
<key>TDENGINE_MAX_POOL_SIZE</key>
|
||||
<string>16</string>
|
||||
<key>NACOS_CONFIG_ENABLED</key>
|
||||
<string>false</string>
|
||||
<key>MANAGEMENT_HEALTH_REDIS_ENABLED</key>
|
||||
<string>false</string>
|
||||
</dict>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/lingniu-vehicle-history-live/vehicle-history.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/lingniu-vehicle-history-live/vehicle-history.err.log</string>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,87 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.lingniu.yutong-mqtt</string>
|
||||
<key>WorkingDirectory</key>
|
||||
<string>__PROJECT_ROOT__</string>
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>__JAVA_BIN__</string>
|
||||
<string>-jar</string>
|
||||
<string>__PROJECT_ROOT__/modules/apps/yutong-mqtt-app/target/yutong-mqtt-app.jar</string>
|
||||
</array>
|
||||
<key>EnvironmentVariables</key>
|
||||
<dict>
|
||||
<key>HTTP_PORT</key>
|
||||
<string>20500</string>
|
||||
<key>YUTONG_MQTT_ENABLED</key>
|
||||
<string>__YUTONG_MQTT_ENABLED__</string>
|
||||
<key>YUTONG_MQTT_AUTO_STARTUP</key>
|
||||
<string>true</string>
|
||||
<key>YUTONG_MQTT_ENDPOINT_NAME</key>
|
||||
<string>yutong</string>
|
||||
<key>YUTONG_MQTT_URI</key>
|
||||
<string>__YUTONG_MQTT_URI__</string>
|
||||
<key>YUTONG_MQTT_TOPIC</key>
|
||||
<string>__YUTONG_MQTT_TOPIC__</string>
|
||||
<key>YUTONG_MQTT_QOS</key>
|
||||
<string>1</string>
|
||||
<key>YUTONG_MQTT_CLIENT_ID</key>
|
||||
<string>lingniu-yutong-mqtt-live</string>
|
||||
<key>YUTONG_MQTT_USERNAME</key>
|
||||
<string>__YUTONG_MQTT_USERNAME__</string>
|
||||
<key>YUTONG_MQTT_PASSWORD</key>
|
||||
<string>__YUTONG_MQTT_PASSWORD__</string>
|
||||
<key>YUTONG_MQTT_CLEAN_SESSION</key>
|
||||
<string>false</string>
|
||||
<key>YUTONG_MQTT_KEEP_ALIVE_SECONDS</key>
|
||||
<string>__YUTONG_MQTT_KEEP_ALIVE_SECONDS__</string>
|
||||
<key>YUTONG_MQTT_CONNECTION_TIMEOUT_SECONDS</key>
|
||||
<string>__YUTONG_MQTT_CONNECTION_TIMEOUT_SECONDS__</string>
|
||||
<key>YUTONG_MQTT_TLS_CA_PEM</key>
|
||||
<string>__YUTONG_MQTT_TLS_CA_PEM__</string>
|
||||
<key>YUTONG_MQTT_TLS_CLIENT_PEM</key>
|
||||
<string>__YUTONG_MQTT_TLS_CLIENT_PEM__</string>
|
||||
<key>YUTONG_MQTT_TLS_CLIENT_KEY</key>
|
||||
<string>__YUTONG_MQTT_TLS_CLIENT_KEY__</string>
|
||||
<key>YUTONG_MQTT_TLS_HOSTNAME_VERIFICATION_ENABLED</key>
|
||||
<string>__YUTONG_MQTT_TLS_HOSTNAME_VERIFICATION_ENABLED__</string>
|
||||
<key>KAFKA_BROKERS</key>
|
||||
<string>114.55.58.251:9092</string>
|
||||
<key>KAFKA_NODE_ID</key>
|
||||
<string>yutong-mqtt-live</string>
|
||||
<key>KAFKA_TOPIC_YUTONG_MQTT_EVENT</key>
|
||||
<string>vehicle.event.mqtt-yutong.v1</string>
|
||||
<key>KAFKA_TOPIC_YUTONG_MQTT_RAW</key>
|
||||
<string>vehicle.raw.mqtt-yutong.v1</string>
|
||||
<key>KAFKA_TOPIC_YUTONG_MQTT_DLQ</key>
|
||||
<string>vehicle.dlq.mqtt-yutong.v1</string>
|
||||
<key>SINK_ARCHIVE_PATH</key>
|
||||
<string>__SHARED_ARCHIVE_PATH__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_TABLE</key>
|
||||
<string>vehicle_identity_binding</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_JDBC_URL</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_JDBC_URL__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_USERNAME</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_USERNAME__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_PASSWORD</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_PASSWORD__</string>
|
||||
<key>VEHICLE_IDENTITY_MYSQL_REFRESH_INTERVAL</key>
|
||||
<string>__VEHICLE_IDENTITY_MYSQL_REFRESH_INTERVAL__</string>
|
||||
<key>NACOS_CONFIG_ENABLED</key>
|
||||
<string>false</string>
|
||||
<key>MANAGEMENT_HEALTH_REDIS_ENABLED</key>
|
||||
<string>false</string>
|
||||
</dict>
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/lingniu-yutong-mqtt-live/launchctl-yutong-mqtt.log</string>
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/lingniu-yutong-mqtt-live/launchctl-yutong-mqtt.err.log</string>
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,95 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
import html
|
||||
import os
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
SERVICES = (
|
||||
"gb32960",
|
||||
"jt808",
|
||||
"yutong-mqtt",
|
||||
"vehicle-history",
|
||||
"vehicle-analytics",
|
||||
)
|
||||
|
||||
LOG_DIRS = (
|
||||
"lingniu-gb32960-live",
|
||||
"lingniu-jt808-live",
|
||||
"lingniu-yutong-mqtt-live",
|
||||
"lingniu-vehicle-history-live",
|
||||
"lingniu-vehicle-analytics-live",
|
||||
)
|
||||
|
||||
|
||||
def env(name: str, default: str = "") -> str:
|
||||
return os.environ.get(name, default)
|
||||
|
||||
|
||||
def xml_value(value: str) -> str:
|
||||
return html.escape(value, quote=False)
|
||||
|
||||
|
||||
def replacements() -> dict[str, str]:
|
||||
identity_jdbc = env("VEHICLE_IDENTITY_MYSQL_JDBC_URL", "jdbc:mysql://127.0.0.1:3306/vehicle_ingest")
|
||||
identity_username = env("VEHICLE_IDENTITY_MYSQL_USERNAME", "")
|
||||
identity_password = env("VEHICLE_IDENTITY_MYSQL_PASSWORD", "")
|
||||
return {
|
||||
"__PROJECT_ROOT__": env("PROJECT_ROOT", str(Path.cwd())),
|
||||
"__JAVA_BIN__": env("JAVA_BIN", "/usr/bin/java"),
|
||||
"__SHARED_ARCHIVE_PATH__": env("INGEST_ARCHIVE_PATH", str(Path.cwd() / "data/archive-live")),
|
||||
"__TDENGINE_JDBC_URL__": env("TDENGINE_JDBC_URL", "jdbc:TAOS-WS://127.0.0.1:6041/vehicle_ts"),
|
||||
"__TDENGINE_USERNAME__": env("TDENGINE_USERNAME", "root"),
|
||||
"__TDENGINE_PASSWORD__": env("TDENGINE_PASSWORD", ""),
|
||||
"__VEHICLE_IDENTITY_MYSQL_JDBC_URL__": identity_jdbc,
|
||||
"__VEHICLE_IDENTITY_MYSQL_USERNAME__": identity_username,
|
||||
"__VEHICLE_IDENTITY_MYSQL_PASSWORD__": identity_password,
|
||||
"__VEHICLE_IDENTITY_MYSQL_REFRESH_INTERVAL__": env("VEHICLE_IDENTITY_MYSQL_REFRESH_INTERVAL", "60s"),
|
||||
"__MYSQL_JDBC_URL__": env("MYSQL_JDBC_URL", identity_jdbc),
|
||||
"__MYSQL_USERNAME__": env("MYSQL_USERNAME", identity_username),
|
||||
"__MYSQL_PASSWORD__": env("MYSQL_PASSWORD", identity_password),
|
||||
"__KAFKA_TOPIC_HISTORY_DLQ__": env("KAFKA_TOPIC_HISTORY_DLQ", "vehicle.dlq.history.v1"),
|
||||
"__YUTONG_MQTT_ENABLED__": env("YUTONG_MQTT_ENABLED", "false"),
|
||||
"__YUTONG_MQTT_URI__": env("YUTONG_MQTT_URI", ""),
|
||||
"__YUTONG_MQTT_TOPIC__": env("YUTONG_MQTT_TOPIC", "#"),
|
||||
"__YUTONG_MQTT_USERNAME__": env("YUTONG_MQTT_USERNAME", ""),
|
||||
"__YUTONG_MQTT_PASSWORD__": env("YUTONG_MQTT_PASSWORD", ""),
|
||||
"__YUTONG_MQTT_KEEP_ALIVE_SECONDS__": env("YUTONG_MQTT_KEEP_ALIVE_SECONDS", "20"),
|
||||
"__YUTONG_MQTT_CONNECTION_TIMEOUT_SECONDS__": env("YUTONG_MQTT_CONNECTION_TIMEOUT_SECONDS", "10"),
|
||||
"__YUTONG_MQTT_TLS_CA_PEM__": env("YUTONG_MQTT_TLS_CA_PEM", ""),
|
||||
"__YUTONG_MQTT_TLS_CLIENT_PEM__": env("YUTONG_MQTT_TLS_CLIENT_PEM", ""),
|
||||
"__YUTONG_MQTT_TLS_CLIENT_KEY__": env("YUTONG_MQTT_TLS_CLIENT_KEY", ""),
|
||||
"__YUTONG_MQTT_TLS_HOSTNAME_VERIFICATION_ENABLED__": env(
|
||||
"YUTONG_MQTT_TLS_HOSTNAME_VERIFICATION_ENABLED", "true"),
|
||||
}
|
||||
|
||||
|
||||
def render_template(template: str, values: dict[str, str]) -> str:
|
||||
rendered = template
|
||||
for placeholder, value in values.items():
|
||||
rendered = rendered.replace(placeholder, xml_value(value))
|
||||
unresolved = sorted(set(re.findall(r"__[A-Z0-9_]+__", rendered)))
|
||||
if unresolved:
|
||||
raise RuntimeError("unresolved launchctl placeholder(s): " + ", ".join(unresolved))
|
||||
return rendered
|
||||
|
||||
|
||||
def main() -> None:
|
||||
root = Path(env("PROJECT_ROOT", str(Path.cwd()))).resolve()
|
||||
template_dir = Path(__file__).resolve().parent
|
||||
launch_agents = Path.home() / "Library/LaunchAgents"
|
||||
launch_agents.mkdir(parents=True, exist_ok=True)
|
||||
(root / "data").mkdir(parents=True, exist_ok=True)
|
||||
for log_dir in LOG_DIRS:
|
||||
(Path("/tmp") / log_dir).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
values = replacements()
|
||||
for service in SERVICES:
|
||||
template_path = template_dir / f"com.lingniu.{service}.plist.template"
|
||||
output_path = launch_agents / f"com.lingniu.{service}.plist"
|
||||
output_path.write_text(render_template(template_path.read_text(), values), encoding="utf-8")
|
||||
print(output_path)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user