diff --git a/admin-svr/.gitattributes b/.gitattributes similarity index 64% rename from admin-svr/.gitattributes rename to .gitattributes index 33f3c22..ffc9828 100644 --- a/admin-svr/.gitattributes +++ b/.gitattributes @@ -4,11 +4,20 @@ # 二进制文件不做行尾转换 *.png binary *.jpg binary +*.jpeg binary *.gif binary *.ico binary +*.webp binary *.woff binary *.woff2 binary *.ttf binary +*.eot binary *.pdf binary +*.zip binary +*.gz binary +*.tar binary *.exe binary -*.xlsx binary +*.so binary +*.dll binary +*.dylib binary +*.jar binary diff --git a/admin-ui/.gitea/workflows/mirror-to-gitee.yml b/.gitea/workflows/mirror-to-gitee.yml similarity index 52% rename from admin-ui/.gitea/workflows/mirror-to-gitee.yml rename to .gitea/workflows/mirror-to-gitee.yml index b8f8b52..a34a677 100644 --- a/admin-ui/.gitea/workflows/mirror-to-gitee.yml +++ b/.gitea/workflows/mirror-to-gitee.yml @@ -1,6 +1,6 @@ name: mirror-to-gitee -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 +# 把本仓镜像到 Gitee 企业仓 /<同名仓库>。 # 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 on: push: @@ -27,21 +27,37 @@ jobs: DST_TOKEN: ${{ secrets.GITEE_TOKEN }} DST_OWNER: ${{ secrets.GITEE_OWNER }} DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} run: | set -u - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 + # 仓库名取当前仓;取不到时回退到单仓名 + REPO_NAME="${GITHUB_REPOSITORY#*/}" + if [ -z "${REPO_NAME:-}" ] || [ "$REPO_NAME" = "${GITHUB_REPOSITORY:-}" ]; then + REPO_NAME="iotlcm" + fi + + SRC="git.5iot.com/iotlcm-public/${REPO_NAME}.git" + DST="gitee.com/${DST_OWNER}/${REPO_NAME}.git" + echo "源:$SRC" + echo "目标:$DST" + + # Gitee 不支持 push 建仓,目标仓不存在时先按企业 API 创建(已存在会报 400,忽略) + if ! git ls-remote "https://${DST_USER}:${DST_TOKEN}@${DST}" >/dev/null 2>&1; then + echo "目标仓不存在,尝试创建 ${DST_OWNER}/${REPO_NAME}" + curl -sS -X POST \ + "https://gitee.com/api/v5/enterprises/${DST_OWNER}/repos?access_token=${DST_TOKEN}" \ + -H 'Content-Type: application/json' \ + -d "{\"name\":\"${REPO_NAME}\",\"auto_init\":false,\"description\":\"iotLCM 物联网卡全生命周期管理平台(开源版)\"}" \ + -o /tmp/repo-create.json -w '建仓 HTTP %{http_code}\n' || true + head -c 300 /tmp/repo-create.json 2>/dev/null; echo + else + echo "目标仓已存在" fi WORK=$(mktemp -d) trap 'rm -rf "$WORK"' EXIT - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" + git clone --mirror "https://jenkins:${SRC_TOKEN}@${SRC%/}" "$WORK/repo.git" cd "$WORK/repo.git" echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" @@ -51,7 +67,7 @@ jobs: while [ "$attempt" -lt 5 ]; do attempt=$((attempt + 1)) echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then + if git push --mirror "https://${DST_USER}:${DST_TOKEN}@${DST}" 2>&1; then echo "✅ 已同步到 Gitee" exit 0 fi diff --git a/app/.gitea/workflows/trigger-jenkins.yml b/.gitea/workflows/trigger-jenkins.yml similarity index 73% rename from app/.gitea/workflows/trigger-jenkins.yml rename to .gitea/workflows/trigger-jenkins.yml index f58a800..3de71d2 100644 --- a/app/.gitea/workflows/trigger-jenkins.yml +++ b/.gitea/workflows/trigger-jenkins.yml @@ -1,12 +1,18 @@ name: trigger-jenkins-oss # 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 +# 单仓多服务:一次 tag 构建全部服务,镜像 tag 形如 iotlcm-<服务>-<版本>。 +# main 分支的日常提交不触发构建。 on: push: tags: - 'v*' workflow_dispatch: + inputs: + services: + description: '要构建的服务(逗号分隔,如 sms,docs;留空 = 全部)' + required: false + default: '' # 同一 ref 连续触发时取消旧任务,只跑最新的 concurrency: @@ -23,12 +29,12 @@ jobs: JT: ${{ secrets.JENKINS_API_TOKEN }} JURL: ${{ secrets.JENKINS_URL }} JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} TAG_NAME: ${{ github.ref_name }} + INPUT_SERVICES: ${{ github.event.inputs.services }} run: | set -eu - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 + # 只有 tag 推送才构建;手动触发时按当前 ref 取 tag 名 case "${GITHUB_REF:-}" in refs/tags/v*) ;; *) @@ -44,12 +50,16 @@ jobs: exit 1 fi + # 单仓:默认整仓构建;手动触发可指定服务子集(目录名或其 iotlcm-* 镜像名) + SERVICES="${INPUT_SERVICES:-}" + if [ -z "$SERVICES" ]; then SERVICES="all"; fi + # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 + # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 workflow。 JP="${JOB_PATH:-job/iotlcm-oss-build}" - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" + echo "仓库:${GITHUB_REPOSITORY:-iotlcm} 版本:$TAG_NAME 服务:$SERVICES job:$JP" WORK=$(mktemp -d) trap 'rm -rf "$WORK"' EXIT @@ -58,10 +68,10 @@ jobs: curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - # 触发参数化任务:SERVICES=仓库名,VERSION=tag + # 触发参数化任务 code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ + --data-urlencode "SERVICES=$SERVICES" \ --data-urlencode "VERSION=$TAG_NAME" \ --data-urlencode "FORCE=true" \ "$JURL/$JP/buildWithParameters") diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5f7551b --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# 编辑器与系统文件 +.DS_Store +Thumbs.db +.idea/ +.vscode/ +*.swp + +# 依赖与构建产物(各子目录另有更细的 .gitignore) +node_modules/ +dist/ +dist-ssr/ +.output/ +.nitro/ +out/ +bin/ + +# 日志与临时文件 +*.log +*.tmp + +# 运行数据(deploy 首次启动自动创建) +data/ diff --git a/admin-svr/LICENSE b/LICENSE similarity index 100% rename from admin-svr/LICENSE rename to LICENSE diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eef85cb --- /dev/null +++ b/Makefile @@ -0,0 +1,70 @@ +# iotLCM 开源版 —— 常用构建入口 +# +# make build 编译全部 Go 服务 +# make test 跑全部 Go 模块的单元测试 +# make images 本地构建全部镜像(默认 tag 用 git describe) +# make docs 本地构建文档站 +# make clean 清理构建产物 +# +# 镜像仓库与版本可覆盖: +# make images REGISTRY=registry.example.com/iotlcm/iotlcm VERSION=v1.0.4 + +REGISTRY ?= iotlcm +VERSION ?= $(shell git describe --tags --abbrev=0 2>/dev/null || git rev-parse --short HEAD) +BASE_REGISTRY ?= docker.io/library + +GO_MODULES := admin-svr/server app/server bot onelink-mock openapi sms upstream-chan upstream-proxy worker-svr + +# 目录|镜像名|构建上下文|Dockerfile +IMAGE_MAP := \ + admin-svr|iotlcm-admin-svr|admin-svr/server|build/Dockerfile \ + admin-ui|iotlcm-admin-ui|admin-ui|vue/build/Dockerfile \ + openapi|iotlcm-openapi|openapi|build/Dockerfile \ + worker-svr|iotlcm-worker-svr|worker-svr|build/Dockerfile \ + upstream-chan|iotlcm-upstream-chan|upstream-chan|build/Dockerfile \ + upstream-proxy|iotlcm-upstream-proxy|upstream-proxy|build/Dockerfile \ + app|iotlcm-app-server|app/server|Dockerfile \ + app|iotlcm-app-web|app/app|Dockerfile \ + sms|iotlcm-sms|sms|build/Dockerfile \ + bot|iotlcm-bot|bot|Dockerfile \ + docs|iotlcm-docs|docs|Dockerfile \ + onelink-mock|iotlcm-onelink-mock|onelink-mock|Dockerfile + +.PHONY: help build test images docs clean + +help: + @sed -n '2,12p' Makefile | sed 's/^# \{0,1\}//' + +build: + @set -e; for m in $(GO_MODULES); do \ + echo "==> go build ./... ($$m)"; \ + ( cd "$$m" && go build ./... ); \ + done + @echo "✅ 全部 Go 服务编译通过" + +test: + @set -e; for m in $(GO_MODULES); do \ + echo "==> go test ./... ($$m)"; \ + ( cd "$$m" && go test ./... ); \ + done + +images: + @set -e; echo "镜像前缀: $(REGISTRY) 版本: $(VERSION)"; \ + echo "$(IMAGE_MAP)" | tr ' ' '\n' | while IFS='|' read -r dir img ctx df; do \ + [ -z "$$dir" ] && continue; \ + echo ""; echo "==> $$img:$$VERSION (context=$$ctx dockerfile=$$df)"; \ + docker build -f "$$ctx/$$df" \ + --build-arg BASE_REGISTRY="$(BASE_REGISTRY)" \ + --build-arg BuildVersion="$(VERSION)" \ + --build-arg CommitID="$$(git rev-parse --short=7 HEAD)" \ + --build-arg BuildTime="$$(date -u +%FT%TZ)" \ + -t "$(REGISTRY):$$img-$(VERSION)" "$$ctx"; \ + done + +docs: + cd docs && npm ci && npm run build + @echo "✅ 文档站产物:docs/.vitepress/dist" + +clean: + @rm -rf docs/.vitepress/dist docs/.vitepress/cache + @echo "✅ 已清理" diff --git a/README.md b/README.md new file mode 100644 index 0000000..4260295 --- /dev/null +++ b/README.md @@ -0,0 +1,88 @@ +# iotLCM —— 物联网卡全生命周期管理平台(开源版) + +一站式物联网 SIM 卡管理平台:卡片从运营商渠道入库 → 划拨给代理商 → 激活 / 续费 / 停机 → 流量与状态同步 → 销户。对接中国移动 OneLink、中国电信 5G CMP、中国联通 10646 等运营商接口,并通过共享 Token 模式接入多家三方渠道商。 + +**单仓多服务**:平台全部后端服务、前端应用、文档站与部署编排都在本仓,一次 clone 即可获得完整源码。 + +## 目录 + +| 目录 | 说明 | 镜像 | +| --- | --- | --- | +| `admin-svr/` | 管理端后端(GoFrame):卡信息、通信管理、资费、告警工单、统计、账号治理 | `iotlcm-admin-svr` | +| `admin-ui/` | 管理端前端(Vue 3 + Vben Admin) | `iotlcm-admin-ui` | +| `openapi/` | 对外 API 网关:V3 接口、旧版兼容、运营商能力代理 | `iotlcm-openapi` | +| `worker-svr/` | 异步执行:RabbitMQ 消费者、全量同步、批量任务 | `iotlcm-worker-svr` | +| `upstream-chan/` | 运营商 / 三方渠道对接层(OneLink、CMP、10646、共享 Token) | `iotlcm-upstream-chan` | +| `upstream-proxy/` | 通道缓存转发层(挡在 chan 前面的本地缓存) | `iotlcm-upstream-proxy` | +| `app/server/` | 用户端服务(GoFrame) | `iotlcm-app-server` | +| `app/app/` | 用户端前端(uni-app,基于 unibest,MIT) | `iotlcm-app-web` | +| `sms/` | 短信 HTTP / gRPC 服务(阿里云、腾讯云) | `iotlcm-sms` | +| `bot/` | 飞书通知机器人(运维自用,可选) | `iotlcm-bot` | +| `docs/` | 文档站(VitePress):使用手册 + OpenAPI 合同 + 部署手册 | `iotlcm-docs` | +| `onelink-mock/` | OneLink 接口挡板(联调 / 演示,可选) | `iotlcm-onelink-mock` | +| `deploy/` | Docker Compose 编排与数据库初始化 | 参考 `deploy/README.md` | + +每个子目录都有自己的 `README.md`,说明该服务的职责、配置项与本地运行方式。 + +## 快速开始(只跑起来) + +不需要编译,直接用预构建镜像拉起整栈: + +```bash +git clone <本仓库地址> iotlcm +cd iotlcm/deploy +docker compose up -d +``` + +首次启动自动完成 MySQL 建库建表(95 张)、种子数据导入、时序库建表,实测 30 秒 ~ 1 分钟。 + +默认账号 `admin`,口令见 `deploy/README.md`(**正式使用前必须修改**)。详细的端口、配置项、可选服务(挡板 / 飞书通知 / 反向代理)、离线部署与排错,见 `deploy/README.md` 与文档站 `docs/deploy/`。 + +> 对外端口默认只监听 `127.0.0.1`,需要局域网或公网访问时,用 `deploy/` 里的 nginx 编排改绑定地址,或并入宿主机已有的反向代理。 + +## 从源码构建 + +每个 Go 服务是独立模块(各自带 `go.mod`),在对应目录内构建: + +```bash +cd worker-svr && go build -o out/ . # 其它 Go 服务同理 +``` + +前端: + +```bash +cd admin-ui/vue && pnpm install && pnpm build +cd app/app && pnpm install && pnpm build +cd docs && npm ci && npm run build +``` + +或一键编译检查全部 Go 模块: + +```bash +make build # 所有 Go 服务编译 +make images # 本地构建全部镜像 +``` + +构建镜像所需的 Dockerfile 位置与构建上下文,见 `docs/docs/deploy/build-image.md`。 + +## 发布与镜像 + +所有镜像发布到**同一个镜像仓库**,用 tag 区分服务与版本: + +```text +<镜像仓库>/iotlcm/iotlcm:iotlcm-worker-svr-v1.0.4 + └─ 仓库 ┘ └─ 服务名 ─┘└版本┘ +``` + +打 `v*` tag 会经由内网 CI 构建全部镜像并推送,见 `.gitea/workflows/`。 + +## 许可 + +本仓整体采用 [Apache License 2.0](LICENSE)。 + +以下子目录基于上游 MIT 项目衍生,保留其原始许可: + +| 目录 | 上游 | 许可 | +| --- | --- | --- | +| `admin-ui/` | [Vben Admin](https://github.com/vbenjs/vue-vben-admin) | MIT,见 `admin-ui/LICENSE` | +| `app/app/` | [unibest](https://github.com/unibest-tech/unibest) | MIT,见 `app/app/LICENSE` | diff --git a/admin-svr/.gitea/workflows/mirror-to-gitee.yml b/admin-svr/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/admin-svr/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/admin-svr/.gitea/workflows/trigger-jenkins.yml b/admin-svr/.gitea/workflows/trigger-jenkins.yml deleted file mode 100644 index f58a800..0000000 --- a/admin-svr/.gitea/workflows/trigger-jenkins.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: trigger-jenkins-oss - -# 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 -on: - push: - tags: - - 'v*' - workflow_dispatch: - -# 同一 ref 连续触发时取消旧任务,只跑最新的 -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - trigger: - runs-on: host - steps: - - name: 触发 Jenkins 镜像构建 - env: - JU: ${{ secrets.JENKINS_USER }} - JT: ${{ secrets.JENKINS_API_TOKEN }} - JURL: ${{ secrets.JENKINS_URL }} - JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} - TAG_NAME: ${{ github.ref_name }} - run: | - set -eu - - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 - case "${GITHUB_REF:-}" in - refs/tags/v*) ;; - *) - if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then - echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" - exit 0 - fi - ;; - esac - - if [ -z "${TAG_NAME:-}" ]; then - echo "未取到 tag 名,退出" - exit 1 - fi - - # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), - # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 - JP="${JOB_PATH:-job/iotlcm-oss-build}" - - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - # 取 CSRF crumb - curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" - CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - - # 触发参数化任务:SERVICES=仓库名,VERSION=tag - code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ - -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ - --data-urlencode "VERSION=$TAG_NAME" \ - --data-urlencode "FORCE=true" \ - "$JURL/$JP/buildWithParameters") - - echo "Jenkins 触发 HTTP $code" - if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then - echo "触发失败:" - cat "$WORK/out" - exit 1 - fi - - LINK="$JURL/$JP/" - echo "==========================================" - echo "Jenkins 构建:$LINK" - echo "==========================================" - echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)" diff --git a/admin-svr/README.md b/admin-svr/README.md index 9069fcc..d209f7d 100644 --- a/admin-svr/README.md +++ b/admin-svr/README.md @@ -2,7 +2,7 @@ iotLCM 物联网卡全生命周期管理平台的**管理后台服务** —— 承载客户门户、卡信息管理、通信管理、资费管理、告警工单、统计分析与系统治理。 -配套前端:[iotlcm-admin-ui](https://git.5iot.com/iotlcm-public/iotlcm-admin-ui)。 +配套前端:同仓 [`admin-ui/`](../admin-ui)。 ## 特性 @@ -11,7 +11,7 @@ iotLCM 物联网卡全生命周期管理平台的**管理后台服务** —— - **资费与交易**:套餐、订单、账单、余额账户与结算批次 - **告警与工单**:报警、待办、故障、工单与规则引擎 - **账号治理**:组织、用户、角色、权限与 API 凭证 -- **异步协作**:耗时操作投递到 RabbitMQ,由 [iotlcm-worker-svr](https://git.5iot.com/iotlcm-public/iotlcm-worker-svr) 执行 +- **异步协作**:耗时操作投递到 RabbitMQ,由同仓 [`worker-svr/`](../worker-svr) 执行 - **定时任务**:`sys_job` 表驱动的调度(流量同步、状态同步、账单等) ## 技术栈 @@ -53,7 +53,7 @@ http://127.0.0.1:8199/swagger # SwaggerUI `server/storage/data/xiu_admin.sql` 是**框架基座初始化数据**(系统菜单、字典、角色、示例管理员),是运行起点的必要输入。 -> **数据库 schema 不随本仓发布** —— 生产库的完整 DDL 已过时(见《项目清单》决策)。请按需自建表结构,或参考 [iotlcm-docs](https://git.5iot.com/iotlcm-public/iotlcm-docs) 中的接口契约。 +> **表结构以部署编排为准** —— 开箱可用的建库建表脚本在同仓 [`deploy/schema/init.sql`](../deploy/schema/init.sql)(95 张表 + 种子数据),接口契约见同仓 [`docs/`](../docs)。 ## 目录结构 @@ -93,9 +93,9 @@ go test ./... ## 相关项目 -- [iotlcm-admin-ui](https://git.5iot.com/iotlcm-public/iotlcm-admin-ui) —— 管理前端 -- [iotlcm-openapi](https://git.5iot.com/iotlcm-public/iotlcm-openapi) —— 对外 API 网关 -- [iotlcm-worker-svr](https://git.5iot.com/iotlcm-public/iotlcm-worker-svr) —— 异步执行 +- [`admin-ui/`](../admin-ui) —— 管理前端 +- [`openapi/`](../openapi) —— 对外 API 网关 +- [`worker-svr/`](../worker-svr) —— 异步执行 ## License diff --git a/admin-ui/.gitattributes b/admin-ui/.gitattributes deleted file mode 100644 index 33f3c22..0000000 --- a/admin-ui/.gitattributes +++ /dev/null @@ -1,14 +0,0 @@ -# 统一使用 LF,避免跨平台协作时产生整文件 diff -* text=auto eol=lf - -# 二进制文件不做行尾转换 -*.png binary -*.jpg binary -*.gif binary -*.ico binary -*.woff binary -*.woff2 binary -*.ttf binary -*.pdf binary -*.exe binary -*.xlsx binary diff --git a/admin-ui/.gitea/workflows/trigger-jenkins.yml b/admin-ui/.gitea/workflows/trigger-jenkins.yml deleted file mode 100644 index f58a800..0000000 --- a/admin-ui/.gitea/workflows/trigger-jenkins.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: trigger-jenkins-oss - -# 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 -on: - push: - tags: - - 'v*' - workflow_dispatch: - -# 同一 ref 连续触发时取消旧任务,只跑最新的 -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - trigger: - runs-on: host - steps: - - name: 触发 Jenkins 镜像构建 - env: - JU: ${{ secrets.JENKINS_USER }} - JT: ${{ secrets.JENKINS_API_TOKEN }} - JURL: ${{ secrets.JENKINS_URL }} - JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} - TAG_NAME: ${{ github.ref_name }} - run: | - set -eu - - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 - case "${GITHUB_REF:-}" in - refs/tags/v*) ;; - *) - if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then - echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" - exit 0 - fi - ;; - esac - - if [ -z "${TAG_NAME:-}" ]; then - echo "未取到 tag 名,退出" - exit 1 - fi - - # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), - # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 - JP="${JOB_PATH:-job/iotlcm-oss-build}" - - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - # 取 CSRF crumb - curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" - CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - - # 触发参数化任务:SERVICES=仓库名,VERSION=tag - code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ - -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ - --data-urlencode "VERSION=$TAG_NAME" \ - --data-urlencode "FORCE=true" \ - "$JURL/$JP/buildWithParameters") - - echo "Jenkins 触发 HTTP $code" - if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then - echo "触发失败:" - cat "$WORK/out" - exit 1 - fi - - LINK="$JURL/$JP/" - echo "==========================================" - echo "Jenkins 构建:$LINK" - echo "==========================================" - echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)" diff --git a/admin-ui/README.md b/admin-ui/README.md index ed3d167..f06887c 100644 --- a/admin-ui/README.md +++ b/admin-ui/README.md @@ -2,7 +2,7 @@ iotLCM 物联网卡全生命周期管理平台的**管理前端** —— 卡资产、通信管理、资费交易、告警工单、统计分析、账号治理。 -配套后端:[iotlcm-admin-svr](https://git.5iot.com/iotlcm-public/iotlcm-admin-svr)。 +配套后端:同仓 [`admin-svr/`](../admin-svr)。 ## 上游与许可 diff --git a/app/.gitattributes b/app/.gitattributes deleted file mode 100644 index 33f3c22..0000000 --- a/app/.gitattributes +++ /dev/null @@ -1,14 +0,0 @@ -# 统一使用 LF,避免跨平台协作时产生整文件 diff -* text=auto eol=lf - -# 二进制文件不做行尾转换 -*.png binary -*.jpg binary -*.gif binary -*.ico binary -*.woff binary -*.woff2 binary -*.ttf binary -*.pdf binary -*.exe binary -*.xlsx binary diff --git a/app/.gitea/workflows/mirror-to-gitee.yml b/app/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/app/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/app/LICENSE b/app/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/app/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/app/README.md b/app/README.md index 9b45d40..5b604d0 100644 --- a/app/README.md +++ b/app/README.md @@ -5,7 +5,7 @@ iotLCM 物联网卡全生命周期管理平台的**小程序端 + 用户端服 - `app/` —— uni-app 小程序前端(基于 [unibest](https://github.com/unibest-tech/unibest),MIT) - `server/` —— 用户端 GoFrame 服务(基于 XiuAdmin 框架,Apache-2.0) -配套管理后台:[iotlcm-admin-svr](https://git.5iot.com/iotlcm-public/iotlcm-admin-svr) / [iotlcm-admin-ui](https://git.5iot.com/iotlcm-public/iotlcm-admin-ui) +配套管理后台:同仓 [`admin-svr/`](../admin-svr) / [`admin-ui/`](../admin-ui) ## 特性 diff --git a/app/server/LICENSE b/app/server/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/app/server/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/bot/.gitattributes b/bot/.gitattributes deleted file mode 100644 index 5837541..0000000 --- a/bot/.gitattributes +++ /dev/null @@ -1,13 +0,0 @@ -# 统一使用 LF,避免跨平台协作时产生整文件 diff -* text=auto eol=lf - -# 二进制文件不做行尾转换 -*.png binary -*.jpg binary -*.gif binary -*.ico binary -*.woff binary -*.woff2 binary -*.ttf binary -*.pdf binary -*.exe binary diff --git a/bot/.gitea/workflows/mirror-to-gitee.yml b/bot/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/bot/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/bot/.gitea/workflows/trigger-jenkins.yml b/bot/.gitea/workflows/trigger-jenkins.yml deleted file mode 100644 index f58a800..0000000 --- a/bot/.gitea/workflows/trigger-jenkins.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: trigger-jenkins-oss - -# 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 -on: - push: - tags: - - 'v*' - workflow_dispatch: - -# 同一 ref 连续触发时取消旧任务,只跑最新的 -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - trigger: - runs-on: host - steps: - - name: 触发 Jenkins 镜像构建 - env: - JU: ${{ secrets.JENKINS_USER }} - JT: ${{ secrets.JENKINS_API_TOKEN }} - JURL: ${{ secrets.JENKINS_URL }} - JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} - TAG_NAME: ${{ github.ref_name }} - run: | - set -eu - - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 - case "${GITHUB_REF:-}" in - refs/tags/v*) ;; - *) - if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then - echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" - exit 0 - fi - ;; - esac - - if [ -z "${TAG_NAME:-}" ]; then - echo "未取到 tag 名,退出" - exit 1 - fi - - # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), - # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 - JP="${JOB_PATH:-job/iotlcm-oss-build}" - - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - # 取 CSRF crumb - curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" - CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - - # 触发参数化任务:SERVICES=仓库名,VERSION=tag - code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ - -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ - --data-urlencode "VERSION=$TAG_NAME" \ - --data-urlencode "FORCE=true" \ - "$JURL/$JP/buildWithParameters") - - echo "Jenkins 触发 HTTP $code" - if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then - echo "触发失败:" - cat "$WORK/out" - exit 1 - fi - - LINK="$JURL/$JP/" - echo "==========================================" - echo "Jenkins 构建:$LINK" - echo "==========================================" - echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)" diff --git a/bot/LICENSE b/bot/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/bot/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/deploy/.gitea/workflows/mirror-to-gitee.yml b/deploy/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/deploy/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/deploy/LICENSE b/deploy/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/deploy/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/deploy/README.md b/deploy/README.md index 07e527b..102c871 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -5,8 +5,8 @@ IotLCM 物联网卡管理平台的部署编排与数据库初始化脚本。使 ## 一键启动 ```bash -git clone <本仓库地址> iotlcm-deploy -cd iotlcm-deploy +git clone <仓库地址> iotlcm +cd iotlcm/deploy docker compose up -d ``` @@ -69,7 +69,7 @@ tag 格式统一为 **`<服务名>-<版本>`**。 ## 目录结构 ``` -iotlcm-deploy/ +iotlcm/deploy/ ├── docker-compose.yml # 服务编排(含全部默认值) ├── config/ # 各服务配置,已带可用默认值 │ ├── admin-svr/config.yaml @@ -102,7 +102,7 @@ TDengine 版本为 `3.3.6.13`(公开镜像可得),生产用的是 `3.4.0.9 ## 上线前必改 -默认口令仅用于快速试用。**正式部署前必须修改以下内容**,具体位置见[部署手册](https://git.5iot.com/iotlcm-public/iotlcm-docs): +默认口令仅用于快速试用。**正式部署前必须修改以下内容**,具体位置见[部署手册](../docs/docs/deploy/index.md): | 项 | 位置 | | --- | --- | diff --git a/docs/.gitea/workflows/mirror-to-gitee.yml b/docs/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/docs/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/docs/.gitea/workflows/trigger-jenkins.yml b/docs/.gitea/workflows/trigger-jenkins.yml deleted file mode 100644 index f58a800..0000000 --- a/docs/.gitea/workflows/trigger-jenkins.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: trigger-jenkins-oss - -# 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 -on: - push: - tags: - - 'v*' - workflow_dispatch: - -# 同一 ref 连续触发时取消旧任务,只跑最新的 -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - trigger: - runs-on: host - steps: - - name: 触发 Jenkins 镜像构建 - env: - JU: ${{ secrets.JENKINS_USER }} - JT: ${{ secrets.JENKINS_API_TOKEN }} - JURL: ${{ secrets.JENKINS_URL }} - JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} - TAG_NAME: ${{ github.ref_name }} - run: | - set -eu - - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 - case "${GITHUB_REF:-}" in - refs/tags/v*) ;; - *) - if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then - echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" - exit 0 - fi - ;; - esac - - if [ -z "${TAG_NAME:-}" ]; then - echo "未取到 tag 名,退出" - exit 1 - fi - - # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), - # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 - JP="${JOB_PATH:-job/iotlcm-oss-build}" - - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - # 取 CSRF crumb - curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" - CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - - # 触发参数化任务:SERVICES=仓库名,VERSION=tag - code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ - -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ - --data-urlencode "VERSION=$TAG_NAME" \ - --data-urlencode "FORCE=true" \ - "$JURL/$JP/buildWithParameters") - - echo "Jenkins 触发 HTTP $code" - if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then - echo "触发失败:" - cat "$WORK/out" - exit 1 - fi - - LINK="$JURL/$JP/" - echo "==========================================" - echo "Jenkins 构建:$LINK" - echo "==========================================" - echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)" diff --git a/docs/LICENSE b/docs/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/docs/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/docs/README.md b/docs/README.md index 97dc030..4618c94 100644 --- a/docs/README.md +++ b/docs/README.md @@ -49,7 +49,7 @@ npm run preview ## 部署 -**完整部署手册见文档站:[部署手册](https://git.5iot.com/iotlcm-public/iotlcm-docs) → `docs/deploy/`**,包含推荐环境、编译方法、nginx / 对象存储 / 离线环境部署方式与常见问题。 +**完整部署手册见文档站:[部署手册](./docs/deploy/index.md)**,包含推荐环境、编译方法、nginx / 对象存储 / 离线环境部署方式与常见问题。 最短路径(容器,推荐): @@ -81,8 +81,8 @@ docker run -d --name iotlcm-docs -p 8019:80 iotlcm-docs:latest ## 相关项目 -- [iotlcm-openapi](https://git.5iot.com/iotlcm-public/iotlcm-openapi) —— OpenAPI 服务实现 -- [iotlcm-admin-svr](https://git.5iot.com/iotlcm-public/iotlcm-admin-svr) —— Web 管理端后端 +- [`openapi/`](../openapi) —— OpenAPI 服务实现 +- [`admin-svr/`](../admin-svr) —— Web 管理端后端 ## License diff --git a/docs/docs/deploy/binary.md b/docs/docs/deploy/binary.md index 6a427a9..989e5f2 100644 --- a/docs/docs/deploy/binary.md +++ b/docs/docs/deploy/binary.md @@ -36,19 +36,21 @@ yum groupinstall -y "Development Tools" ## 各服务构建参数 -| 服务 | 仓库 | Go 版本 | CGO | 构建目录 | 产物名 | 监听端口 | -| --- | --- | --- | --- | --- | --- | --- | -| admin-svr | `iotlcm-admin-svr` | 1.23 | **需开启** | `server/` | `iotlcmadmin_svc` | 8008 | -| openapi | `iotlcm-openapi` | 1.23 | 关闭 | 根目录 | `iotlcm-openapi` | 8000 | -| worker-svr | `iotlcm-worker-svr` | 1.25 | 关闭 | 根目录 | `iotlcm-worker-svr` | 无(队列消费) | -| upstream-chan | `iotlcm-upstream-chan` | 1.25 | 关闭 | 根目录 | `iotlcmupstreamchan_svc` | 8110 / 8310 | -| upstream-proxy | `iotlcm-upstream-proxy` | 1.25 | 关闭 | 根目录 | `iotlcmupstreamproxy_svc` | 8510 | -| app-server | `iotlcm-app` | 1.23 | 关闭 | `server/` | `iotlcm-app-server` | 8010 | -| sms | `iotlcm-sms` | 1.25 | 关闭 | 根目录 | `iotlcm-sms` | 11190 / 11200 | -| bot | `iotlcm-bot` | 1.23 | 关闭 | `cmd/iotlcm-bot` | `iotlcm-bot` | 无 | +全部服务在同一仓的不同目录下,下表「目录」即 `git clone` 后的相对路径。 -::: warning 仓库里的 Dockerfile 不能直接照搬 -部分仓库的 Dockerfile 基础镜像指向私有仓库(见[自建镜像](build-image)),二进制构建不受影响,但 `FROM` 行需要替换。 +| 服务 | 目录 | Go 版本 | CGO | 构建目录 | 产物名 | 监听端口 | +| --- | --- | --- | --- | --- | --- | --- | +| admin-svr | `admin-svr/` | 1.23 | **需开启** | `server/` | `iotlcmadmin_svc` | 8008 | +| openapi | `openapi/` | 1.23 | 关闭 | 根目录 | `iotlcm-openapi` | 8000 | +| worker-svr | `worker-svr/` | 1.25 | 关闭 | 根目录 | `iotlcm-worker-svr` | 无(队列消费) | +| upstream-chan | `upstream-chan/` | 1.25 | 关闭 | 根目录 | `iotlcmupstreamchan_svc` | 8110 / 8310 | +| upstream-proxy | `upstream-proxy/` | 1.25 | 关闭 | 根目录 | `iotlcmupstreamproxy_svc` | 8510 | +| app-server | `app/server/` | 1.23 | 关闭 | `server/` | `iotlcm-app-server` | 8010 | +| sms | `sms/` | 1.25 | 关闭 | 根目录 | `iotlcm-sms` | 11190 / 11200 | +| bot | `bot/` | 1.23 | 关闭 | `cmd/iotlcm-bot` | `iotlcm-bot` | 无 | + +::: tip 基础镜像可替换 +所有构建用 Dockerfile 的 `FROM` 都走 `ARG BASE_REGISTRY`(默认 `docker.io/library`),需要私有基础镜像时用 `--build-arg BASE_REGISTRY=...` 覆盖即可,见[自建镜像](build-image)。 ::: ## 构建 @@ -56,8 +58,8 @@ yum groupinstall -y "Development Tools" ### admin-svr(需要 CGO) ```bash -git clone https://git.5iot.com/iotlcm-public/iotlcm-admin-svr.git -cd iotlcm-admin-svr/server +git clone <仓库地址> iotlcm +cd iotlcm/admin-svr/server CGO_ENABLED=1 GOOS=linux GOARCH=amd64 \ go build -trimpath \ @@ -71,8 +73,8 @@ go build -trimpath \ ### 其余服务(静态编译) ```bash -git clone https://git.5iot.com/iotlcm-public/iotlcm-openapi.git -cd iotlcm-openapi +git clone <仓库地址> iotlcm +cd iotlcm/openapi CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ go build -trimpath \ @@ -83,10 +85,10 @@ go build -trimpath \ -o iotlcm-openapi . ``` -替换仓库名与产物名即可用于其他服务,`bot` 需要指定子目录: +替换服务目录与产物名即可用于其他服务,`bot` 需要指定子目录: ```bash -cd iotlcm-bot +cd iotlcm/bot CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -o iotlcm-bot ./cmd/iotlcm-bot ``` diff --git a/docs/docs/deploy/build-image.md b/docs/docs/deploy/build-image.md index 404fbbb..ba6bc46 100644 --- a/docs/docs/deploy/build-image.md +++ b/docs/docs/deploy/build-image.md @@ -18,53 +18,53 @@ outline: deep ## 各服务构建文件 -| 服务 | 仓库 | Dockerfile | 构建上下文 | +全部服务在同一仓内,`git clone` 后按下表的**构建上下文**执行 `docker build`: + +| 服务 | 目录 | 构建上下文 | Dockerfile(相对上下文) | | --- | --- | --- | --- | -| admin-svr | `iotlcm-admin-svr` | `server/build/Dockerfile` | `server/` | -| openapi | `iotlcm-openapi` | `build/Dockerfile` | 仓库根目录 | -| worker-svr | `iotlcm-worker-svr` | `build/Dockerfile` | 仓库根目录 | -| upstream-chan | `iotlcm-upstream-chan` | `build/Dockerfile` | 仓库根目录 | -| upstream-proxy | `iotlcm-upstream-proxy` | `build/Dockerfile` | 仓库根目录 | -| app-server | `iotlcm-app` | `server/Dockerfile` | `server/` | -| app-web | `iotlcm-app` | `app/Dockerfile` | `app/` | -| admin-ui | `iotlcm-admin-ui` | `vue/build/Dockerfile` | `vue/` | -| sms | `iotlcm-sms` | `build/Dockerfile` | 仓库根目录 | -| bot | `iotlcm-bot` | `Dockerfile` | 仓库根目录 | -| docs | `iotlcm-docs` | `Dockerfile` | 仓库根目录 | -| onelink-mock | `iotlcm-onelink-mock` | `Dockerfile` | 仓库根目录 | +| admin-svr | `admin-svr/` | `admin-svr/server` | `build/Dockerfile` | +| admin-ui | `admin-ui/` | `admin-ui` | `vue/build/Dockerfile` | +| openapi | `openapi/` | `openapi` | `build/Dockerfile` | +| worker-svr | `worker-svr/` | `worker-svr` | `build/Dockerfile` | +| upstream-chan | `upstream-chan/` | `upstream-chan` | `build/Dockerfile` | +| upstream-proxy | `upstream-proxy/` | `upstream-proxy` | `build/Dockerfile` | +| app-server | `app/server/` | `app/server` | `Dockerfile` | +| app-web | `app/app/` | `app/app` | `Dockerfile` | +| sms | `sms/` | `sms` | `build/Dockerfile` | +| bot | `bot/` | `bot` | `Dockerfile` | +| docs | `docs/` | `docs` | `Dockerfile` | +| onelink-mock | `onelink-mock/` | `onelink-mock` | `Dockerfile` | -## ⚠️ 先处理私有基础镜像 +> `admin-ui` 的上下文必须是 `admin-ui/`(不是 `admin-ui/vue/`)——它的 Dockerfile 里引用了 `vue/build/nginx.conf`。 -**当前部分仓库的 Dockerfile 仍指向私有镜像仓库**,外部环境无法拉取,直接构建会失败: +一次构建全部:`make images REGISTRY=<镜像仓库>/iotlcm/iotlcm VERSION=<版本>`。 -| 仓库 | 文件 | 问题 | -| --- | --- | --- | -| `iotlcm-openapi` | `manifest/docker/Dockerfile` | `FROM` 指向私有仓库 | -| `iotlcm-app` | `app/Dockerfile` | 2 处 `FROM` 指向私有仓库 | -| `iotlcm-app` | `server/Dockerfile` | 2 处 `FROM` 指向私有仓库 | -| `iotlcm-admin-ui` | `vue/build/Dockerfile` | 2 处 `FROM` 指向私有仓库 | -| `iotlcm-admin-ui` | `vue/build/DockerfileNoBuild` | `FROM` 指向私有仓库 | +## 基础镜像可替换 -构建前把这些 `FROM` 改为公共镜像: +所有构建用 Dockerfile 都通过 `ARG BASE_REGISTRY` 拼接 `FROM`,默认值是公共镜像仓库 `docker.io/library`,**开箱即可构建**: ```dockerfile -# 修改前(私有仓库,外部不可达) -FROM crpi-xxxxxxxx.cn-beijing.personal.cr.aliyuncs.com/xxx/golangalpine:1.25.7-alpine3.23 AS builder - -# 修改后(公共镜像) -FROM golang:1.25-alpine AS builder +ARG BASE_REGISTRY=docker.io/library +FROM ${BASE_REGISTRY}/golang:1.25-alpine AS builder ``` -```dockerfile -FROM crpi-xxxxxxxx.cn-beijing.personal.cr.aliyuncs.com/xxx/nginx:1.30.0-alpine +内网或离线环境改走自己的镜像仓库时,构建时覆盖即可,不需要改 Dockerfile: -# 改为 -FROM nginx:1.30-alpine +```bash +docker build --build-arg BASE_REGISTRY=harbor.internal.example.com/library \ + -f admin-svr/server/build/Dockerfile -t ... admin-svr/server ``` -::: tip 其余仓库的 Dockerfile 已可用 -`admin-svr`、`worker-svr`、`upstream-chan`、`upstream-proxy`、`sms`、`bot`、`docs`、`onelink-mock` 的 Dockerfile 基础镜像均为公共镜像,可直接构建。 -::: +各服务实际用到的基础镜像版本: + +| 服务 | 基础镜像 | +| --- | --- | +| Go 服务(admin-svr / openapi / worker-svr / upstream-chan / upstream-proxy / app-server / sms / bot) | `golang:1.25-alpine`(bot 用 `golang:1.25-alpine`)、运行期 `alpine:3.23` | +| admin-ui / app-web | `node:24-alpine` 构建、`nginx:1.30-alpine` / `nginx:1.27-alpine` 运行 | +| docs | `node:22-alpine` 构建、`nginx:1.27-alpine` 运行 | +| onelink-mock | `golang:1.24-alpine` | + +> `*/manifest/docker/Dockerfile` 是 GoFrame 脚手架留下的模板,不参与构建,可以忽略。 ## 构建命令 @@ -75,36 +75,41 @@ COMMIT=$(git rev-parse --short HEAD) VERSION=$(git describe --tags --always) BUILD_TIME=$(date -u '+%Y-%m-%dT%H:%M:%SZ') +# 在仓库根目录执行(上下文 = openapi/) docker build \ --build-arg BuildVersion=$VERSION \ --build-arg CommitID=$COMMIT \ --build-arg BuildTime=$BUILD_TIME \ -t your-registry/iotlcm/iotlcm:iotlcm-openapi-$VERSION \ - . + -f openapi/build/Dockerfile openapi/ ``` -`admin-svr` 与 `app-server` 需指定上下文目录: +`admin-svr` 与 `app-server` 的上下文是模块目录: ```bash -cd iotlcm-admin-svr docker build \ --build-arg BuildVersion=$VERSION \ --build-arg CommitID=$COMMIT \ --build-arg BuildTime=$BUILD_TIME \ -t your-registry/iotlcm/iotlcm:iotlcm-admin-svr-$VERSION \ - -f server/build/Dockerfile server/ + -f admin-svr/server/build/Dockerfile admin-svr/server/ ``` ### 前端服务 ```bash -cd iotlcm-admin-ui/vue -docker build -t your-registry/iotlcm/iotlcm:iotlcm-admin-ui-$VERSION -f build/Dockerfile . +docker build -t your-registry/iotlcm/iotlcm:iotlcm-admin-ui-$VERSION \ + -f admin-ui/vue/build/Dockerfile admin-ui/ ``` ```bash -cd iotlcm-app/app -docker build -t your-registry/iotlcm/iotlcm:iotlcm-app-web-$VERSION . +docker build -t your-registry/iotlcm/iotlcm:iotlcm-app-web-$VERSION \ + -f app/app/Dockerfile app/app/ +``` + +```bash +docker build -t your-registry/iotlcm/iotlcm:iotlcm-app-server-$VERSION \ + -f app/server/Dockerfile app/server/ ``` ### 构建参数说明 @@ -115,7 +120,7 @@ docker build -t your-registry/iotlcm/iotlcm:iotlcm-app-web-$VERSION . | `CommitID` | 提交号,便于追溯 | | `BuildTime` | 构建时间 | -`openapi`、`worker-svr` 等仓库支持用 `GOPROXY` 构建参数替换代理: +`openapi`、`worker-svr` 等 Go 服务支持用 `GOPROXY` 构建参数替换代理: ```bash docker build --build-arg GOPROXY=https://goproxy.cn,direct -t ... . @@ -134,8 +139,8 @@ docker build --build-arg GOPROXY=https://goproxy.cn,direct -t ... . | admin-svr | `iotlcm-admin-svr-` | `.../iotlcm/iotlcm:iotlcm-admin-svr-v1.0.4` | | admin-ui | `iotlcm-admin-ui-` | `.../iotlcm/iotlcm:iotlcm-admin-ui-v1.0.4` | | openapi | `iotlcm-openapi-` | `.../iotlcm/iotlcm:iotlcm-openapi-v1.0.4` | -| app-server | `iotlcm-app-server-` | `.../iotlcm/iotlcm:iotlcm-app-server-v1.0.2` | -| app-web | `iotlcm-app-web-` | `.../iotlcm/iotlcm:iotlcm-app-web-v1.0.2` | +| app-server | `iotlcm-app-server-` | `.../iotlcm/iotlcm:iotlcm-app-server-v1.0.4` | +| app-web | `iotlcm-app-web-` | `.../iotlcm/iotlcm:iotlcm-app-web-v1.0.4` | | upstream-chan | `iotlcm-upstream-chan-` | `.../iotlcm/iotlcm:iotlcm-upstream-chan-v1.0.4` | | upstream-proxy | `iotlcm-upstream-proxy-` | `.../iotlcm/iotlcm:iotlcm-upstream-proxy-v1.0.4` | | worker-svr | `iotlcm-worker-svr-` | `.../iotlcm/iotlcm:iotlcm-worker-svr-v1.0.4` | diff --git a/docs/docs/deploy/index.md b/docs/docs/deploy/index.md index 94668b6..b6df808 100644 --- a/docs/docs/deploy/index.md +++ b/docs/docs/deploy/index.md @@ -6,15 +6,15 @@ outline: deep # 部署概览 -IotLCM 平台通过 Docker Compose 在单机上部署。部署编排与数据库初始化脚本在独立仓库: +IotLCM 平台通过 Docker Compose 在单机上部署。部署编排与数据库初始化脚本在**代码仓的 `deploy/` 目录**: ```bash -git clone https://git.5iot.com/iotlcm-public/iotlcm-deploy.git -cd iotlcm-deploy +git clone <仓库地址> iotlcm +cd iotlcm/deploy ``` ```text -iotlcm-deploy/ +deploy/ ├── docker-compose.yml # 服务编排(含默认口令与端口) ├── config/ # 各服务配置,10 份,已带可用默认值 └── schema/ # 数据库初始化脚本,13 个,首次启动自动执行 @@ -36,8 +36,8 @@ iotlcm-deploy/ ## 部署流程 ```bash -git clone <部署仓地址> iotlcm-deploy -cd iotlcm-deploy +git clone <仓库地址> iotlcm +cd iotlcm/deploy docker compose up -d ``` diff --git a/docs/docs/deploy/install.md b/docs/docs/deploy/install.md index c1a6643..4428e70 100644 --- a/docs/docs/deploy/install.md +++ b/docs/docs/deploy/install.md @@ -9,8 +9,8 @@ outline: deep ## 启动 ```bash -git clone <部署仓地址> iotlcm-deploy -cd iotlcm-deploy +git clone <仓库地址> iotlcm +cd iotlcm/deploy # 首次部署建议前台启动,便于观察初始化过程 docker compose up diff --git a/docs/docs/deploy/offline.md b/docs/docs/deploy/offline.md index edef7ad..82a384a 100644 --- a/docs/docs/deploy/offline.md +++ b/docs/docs/deploy/offline.md @@ -163,7 +163,7 @@ docker compose pull | 资源 | 说明 | | --- | --- | -| 部署仓代码 | `git clone` 或直接打包 `iotlcm-deploy/` 目录带过去 | +| 部署代码 | `git clone` 或直接打包 `deploy/` 目录带过去 | | 配置模板 | 已包含在部署仓 `config/` | | 数据库脚本 | 已包含在部署仓 `schema/` | | Docker 与 Compose | 目标机需预先安装,离线安装包需单独准备 | diff --git a/docs/docs/deploy/operations.md b/docs/docs/deploy/operations.md index f451bf4..ac420a6 100644 --- a/docs/docs/deploy/operations.md +++ b/docs/docs/deploy/operations.md @@ -163,7 +163,7 @@ find ./data/logs -name '*.log' -mtime +7 -delete 建议配置 cron 定期执行: ```cron -0 3 * * * root find /path/to/iotlcm-deploy/data/logs -name '*.log' -mtime +7 -delete +0 3 * * * root find /path/to/iotlcm/deploy/data/logs -name '*.log' -mtime +7 -delete ``` ## 监控 diff --git a/onelink-mock/.gitattributes b/onelink-mock/.gitattributes deleted file mode 100644 index 5837541..0000000 --- a/onelink-mock/.gitattributes +++ /dev/null @@ -1,13 +0,0 @@ -# 统一使用 LF,避免跨平台协作时产生整文件 diff -* text=auto eol=lf - -# 二进制文件不做行尾转换 -*.png binary -*.jpg binary -*.gif binary -*.ico binary -*.woff binary -*.woff2 binary -*.ttf binary -*.pdf binary -*.exe binary diff --git a/onelink-mock/.gitea/workflows/mirror-to-gitee.yml b/onelink-mock/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/onelink-mock/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/onelink-mock/.gitea/workflows/trigger-jenkins.yml b/onelink-mock/.gitea/workflows/trigger-jenkins.yml deleted file mode 100644 index f58a800..0000000 --- a/onelink-mock/.gitea/workflows/trigger-jenkins.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: trigger-jenkins-oss - -# 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 -on: - push: - tags: - - 'v*' - workflow_dispatch: - -# 同一 ref 连续触发时取消旧任务,只跑最新的 -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - trigger: - runs-on: host - steps: - - name: 触发 Jenkins 镜像构建 - env: - JU: ${{ secrets.JENKINS_USER }} - JT: ${{ secrets.JENKINS_API_TOKEN }} - JURL: ${{ secrets.JENKINS_URL }} - JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} - TAG_NAME: ${{ github.ref_name }} - run: | - set -eu - - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 - case "${GITHUB_REF:-}" in - refs/tags/v*) ;; - *) - if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then - echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" - exit 0 - fi - ;; - esac - - if [ -z "${TAG_NAME:-}" ]; then - echo "未取到 tag 名,退出" - exit 1 - fi - - # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), - # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 - JP="${JOB_PATH:-job/iotlcm-oss-build}" - - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - # 取 CSRF crumb - curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" - CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - - # 触发参数化任务:SERVICES=仓库名,VERSION=tag - code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ - -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ - --data-urlencode "VERSION=$TAG_NAME" \ - --data-urlencode "FORCE=true" \ - "$JURL/$JP/buildWithParameters") - - echo "Jenkins 触发 HTTP $code" - if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then - echo "触发失败:" - cat "$WORK/out" - exit 1 - fi - - LINK="$JURL/$JP/" - echo "==========================================" - echo "Jenkins 构建:$LINK" - echo "==========================================" - echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)" diff --git a/onelink-mock/LICENSE b/onelink-mock/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/onelink-mock/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/openapi/.gitattributes b/openapi/.gitattributes deleted file mode 100644 index 357a48f..0000000 --- a/openapi/.gitattributes +++ /dev/null @@ -1,14 +0,0 @@ -# 统一使用 LF,避免跨平台协作时产生整文件 diff -* text=auto eol=lf - -# 二进制文件不做行尾转换 -*.png binary -*.jpg binary -*.gif binary -*.ico binary -*.woff binary -*.woff2 binary -*.ttf binary -*.pdf binary -*.exe binary -*.go linguist-language=Go diff --git a/openapi/.gitea/workflows/mirror-to-gitee.yml b/openapi/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/openapi/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/openapi/.gitea/workflows/trigger-jenkins.yml b/openapi/.gitea/workflows/trigger-jenkins.yml deleted file mode 100644 index f58a800..0000000 --- a/openapi/.gitea/workflows/trigger-jenkins.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: trigger-jenkins-oss - -# 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 -on: - push: - tags: - - 'v*' - workflow_dispatch: - -# 同一 ref 连续触发时取消旧任务,只跑最新的 -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - trigger: - runs-on: host - steps: - - name: 触发 Jenkins 镜像构建 - env: - JU: ${{ secrets.JENKINS_USER }} - JT: ${{ secrets.JENKINS_API_TOKEN }} - JURL: ${{ secrets.JENKINS_URL }} - JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} - TAG_NAME: ${{ github.ref_name }} - run: | - set -eu - - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 - case "${GITHUB_REF:-}" in - refs/tags/v*) ;; - *) - if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then - echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" - exit 0 - fi - ;; - esac - - if [ -z "${TAG_NAME:-}" ]; then - echo "未取到 tag 名,退出" - exit 1 - fi - - # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), - # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 - JP="${JOB_PATH:-job/iotlcm-oss-build}" - - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - # 取 CSRF crumb - curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" - CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - - # 触发参数化任务:SERVICES=仓库名,VERSION=tag - code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ - -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ - --data-urlencode "VERSION=$TAG_NAME" \ - --data-urlencode "FORCE=true" \ - "$JURL/$JP/buildWithParameters") - - echo "Jenkins 触发 HTTP $code" - if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then - echo "触发失败:" - cat "$WORK/out" - exit 1 - fi - - LINK="$JURL/$JP/" - echo "==========================================" - echo "Jenkins 构建:$LINK" - echo "==========================================" - echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)" diff --git a/openapi/LICENSE b/openapi/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/openapi/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/sms/.gitattributes b/sms/.gitattributes deleted file mode 100644 index 5837541..0000000 --- a/sms/.gitattributes +++ /dev/null @@ -1,13 +0,0 @@ -# 统一使用 LF,避免跨平台协作时产生整文件 diff -* text=auto eol=lf - -# 二进制文件不做行尾转换 -*.png binary -*.jpg binary -*.gif binary -*.ico binary -*.woff binary -*.woff2 binary -*.ttf binary -*.pdf binary -*.exe binary diff --git a/sms/.gitea/workflows/mirror-to-gitee.yml b/sms/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/sms/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/sms/.gitea/workflows/trigger-jenkins.yml b/sms/.gitea/workflows/trigger-jenkins.yml deleted file mode 100644 index f58a800..0000000 --- a/sms/.gitea/workflows/trigger-jenkins.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: trigger-jenkins-oss - -# 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 -on: - push: - tags: - - 'v*' - workflow_dispatch: - -# 同一 ref 连续触发时取消旧任务,只跑最新的 -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - trigger: - runs-on: host - steps: - - name: 触发 Jenkins 镜像构建 - env: - JU: ${{ secrets.JENKINS_USER }} - JT: ${{ secrets.JENKINS_API_TOKEN }} - JURL: ${{ secrets.JENKINS_URL }} - JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} - TAG_NAME: ${{ github.ref_name }} - run: | - set -eu - - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 - case "${GITHUB_REF:-}" in - refs/tags/v*) ;; - *) - if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then - echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" - exit 0 - fi - ;; - esac - - if [ -z "${TAG_NAME:-}" ]; then - echo "未取到 tag 名,退出" - exit 1 - fi - - # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), - # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 - JP="${JOB_PATH:-job/iotlcm-oss-build}" - - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - # 取 CSRF crumb - curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" - CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - - # 触发参数化任务:SERVICES=仓库名,VERSION=tag - code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ - -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ - --data-urlencode "VERSION=$TAG_NAME" \ - --data-urlencode "FORCE=true" \ - "$JURL/$JP/buildWithParameters") - - echo "Jenkins 触发 HTTP $code" - if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then - echo "触发失败:" - cat "$WORK/out" - exit 1 - fi - - LINK="$JURL/$JP/" - echo "==========================================" - echo "Jenkins 构建:$LINK" - echo "==========================================" - echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)" diff --git a/sms/LICENSE b/sms/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/sms/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/upstream-chan/.gitattributes b/upstream-chan/.gitattributes deleted file mode 100644 index 357a48f..0000000 --- a/upstream-chan/.gitattributes +++ /dev/null @@ -1,14 +0,0 @@ -# 统一使用 LF,避免跨平台协作时产生整文件 diff -* text=auto eol=lf - -# 二进制文件不做行尾转换 -*.png binary -*.jpg binary -*.gif binary -*.ico binary -*.woff binary -*.woff2 binary -*.ttf binary -*.pdf binary -*.exe binary -*.go linguist-language=Go diff --git a/upstream-chan/.gitea/workflows/mirror-to-gitee.yml b/upstream-chan/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/upstream-chan/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/upstream-chan/.gitea/workflows/trigger-jenkins.yml b/upstream-chan/.gitea/workflows/trigger-jenkins.yml deleted file mode 100644 index f58a800..0000000 --- a/upstream-chan/.gitea/workflows/trigger-jenkins.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: trigger-jenkins-oss - -# 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 -on: - push: - tags: - - 'v*' - workflow_dispatch: - -# 同一 ref 连续触发时取消旧任务,只跑最新的 -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - trigger: - runs-on: host - steps: - - name: 触发 Jenkins 镜像构建 - env: - JU: ${{ secrets.JENKINS_USER }} - JT: ${{ secrets.JENKINS_API_TOKEN }} - JURL: ${{ secrets.JENKINS_URL }} - JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} - TAG_NAME: ${{ github.ref_name }} - run: | - set -eu - - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 - case "${GITHUB_REF:-}" in - refs/tags/v*) ;; - *) - if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then - echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" - exit 0 - fi - ;; - esac - - if [ -z "${TAG_NAME:-}" ]; then - echo "未取到 tag 名,退出" - exit 1 - fi - - # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), - # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 - JP="${JOB_PATH:-job/iotlcm-oss-build}" - - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - # 取 CSRF crumb - curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" - CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - - # 触发参数化任务:SERVICES=仓库名,VERSION=tag - code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ - -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ - --data-urlencode "VERSION=$TAG_NAME" \ - --data-urlencode "FORCE=true" \ - "$JURL/$JP/buildWithParameters") - - echo "Jenkins 触发 HTTP $code" - if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then - echo "触发失败:" - cat "$WORK/out" - exit 1 - fi - - LINK="$JURL/$JP/" - echo "==========================================" - echo "Jenkins 构建:$LINK" - echo "==========================================" - echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)" diff --git a/upstream-chan/LICENSE b/upstream-chan/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/upstream-chan/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/upstream-proxy/.gitattributes b/upstream-proxy/.gitattributes deleted file mode 100644 index 357a48f..0000000 --- a/upstream-proxy/.gitattributes +++ /dev/null @@ -1,14 +0,0 @@ -# 统一使用 LF,避免跨平台协作时产生整文件 diff -* text=auto eol=lf - -# 二进制文件不做行尾转换 -*.png binary -*.jpg binary -*.gif binary -*.ico binary -*.woff binary -*.woff2 binary -*.ttf binary -*.pdf binary -*.exe binary -*.go linguist-language=Go diff --git a/upstream-proxy/.gitea/workflows/mirror-to-gitee.yml b/upstream-proxy/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/upstream-proxy/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/upstream-proxy/.gitea/workflows/trigger-jenkins.yml b/upstream-proxy/.gitea/workflows/trigger-jenkins.yml deleted file mode 100644 index f58a800..0000000 --- a/upstream-proxy/.gitea/workflows/trigger-jenkins.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: trigger-jenkins-oss - -# 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 -on: - push: - tags: - - 'v*' - workflow_dispatch: - -# 同一 ref 连续触发时取消旧任务,只跑最新的 -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - trigger: - runs-on: host - steps: - - name: 触发 Jenkins 镜像构建 - env: - JU: ${{ secrets.JENKINS_USER }} - JT: ${{ secrets.JENKINS_API_TOKEN }} - JURL: ${{ secrets.JENKINS_URL }} - JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} - TAG_NAME: ${{ github.ref_name }} - run: | - set -eu - - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 - case "${GITHUB_REF:-}" in - refs/tags/v*) ;; - *) - if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then - echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" - exit 0 - fi - ;; - esac - - if [ -z "${TAG_NAME:-}" ]; then - echo "未取到 tag 名,退出" - exit 1 - fi - - # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), - # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 - JP="${JOB_PATH:-job/iotlcm-oss-build}" - - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - # 取 CSRF crumb - curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" - CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - - # 触发参数化任务:SERVICES=仓库名,VERSION=tag - code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ - -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ - --data-urlencode "VERSION=$TAG_NAME" \ - --data-urlencode "FORCE=true" \ - "$JURL/$JP/buildWithParameters") - - echo "Jenkins 触发 HTTP $code" - if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then - echo "触发失败:" - cat "$WORK/out" - exit 1 - fi - - LINK="$JURL/$JP/" - echo "==========================================" - echo "Jenkins 构建:$LINK" - echo "==========================================" - echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)" diff --git a/upstream-proxy/LICENSE b/upstream-proxy/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/upstream-proxy/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/worker-svr/.gitattributes b/worker-svr/.gitattributes deleted file mode 100644 index 357a48f..0000000 --- a/worker-svr/.gitattributes +++ /dev/null @@ -1,14 +0,0 @@ -# 统一使用 LF,避免跨平台协作时产生整文件 diff -* text=auto eol=lf - -# 二进制文件不做行尾转换 -*.png binary -*.jpg binary -*.gif binary -*.ico binary -*.woff binary -*.woff2 binary -*.ttf binary -*.pdf binary -*.exe binary -*.go linguist-language=Go diff --git a/worker-svr/.gitea/workflows/mirror-to-gitee.yml b/worker-svr/.gitea/workflows/mirror-to-gitee.yml deleted file mode 100644 index b8f8b52..0000000 --- a/worker-svr/.gitea/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: mirror-to-gitee - -# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。 -# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。 -on: - push: - branches: - - main - tags: - - 'v*' - schedule: - # Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间 - - cron: '30 18 * * *' - workflow_dispatch: - -concurrency: - group: mirror-${{ github.ref }} - cancel-in-progress: true - -jobs: - mirror: - runs-on: host - steps: - - name: 同步到 Gitee - env: - SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }} - DST_TOKEN: ${{ secrets.GITEE_TOKEN }} - DST_OWNER: ${{ secrets.GITEE_OWNER }} - DST_USER: ${{ secrets.GITEE_USER }} - REPO_NAME: ${{ github.event.repository.name }} - run: | - set -u - - if [ -z "${REPO_NAME:-}" ]; then - echo "未取到仓库名,退出"; exit 1 - fi - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - echo "源:git.5iot.com/iotlcm-public/$REPO_NAME" - echo "目标:gitee.com/$DST_OWNER/$REPO_NAME" - - git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git" - cd "$WORK/repo.git" - echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')" - - # Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout, - # 属服务端限流,退避重试即可。 - attempt=0 - while [ "$attempt" -lt 5 ]; do - attempt=$((attempt + 1)) - echo "----- 推送尝试 $attempt/5" - if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then - echo "✅ 已同步到 Gitee" - exit 0 - fi - wait_s=$((attempt * 30)) - echo "推送失败,${wait_s}s 后重试" - sleep "$wait_s" - done - - echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌" - exit 1 diff --git a/worker-svr/.gitea/workflows/trigger-jenkins.yml b/worker-svr/.gitea/workflows/trigger-jenkins.yml deleted file mode 100644 index f58a800..0000000 --- a/worker-svr/.gitea/workflows/trigger-jenkins.yml +++ /dev/null @@ -1,80 +0,0 @@ -name: trigger-jenkins-oss - -# 打 tag 时触发 Jenkins 构建开源镜像并推送到镜像仓库。 -# 仅在 tag 推送时触发;main 分支的日常提交不触发。 -on: - push: - tags: - - 'v*' - workflow_dispatch: - -# 同一 ref 连续触发时取消旧任务,只跑最新的 -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -jobs: - trigger: - runs-on: host - steps: - - name: 触发 Jenkins 镜像构建 - env: - JU: ${{ secrets.JENKINS_USER }} - JT: ${{ secrets.JENKINS_API_TOKEN }} - JURL: ${{ secrets.JENKINS_URL }} - JOB_PATH: ${{ secrets.JENKINS_JOB_PATH }} - REPO_NAME: ${{ github.event.repository.name }} - TAG_NAME: ${{ github.ref_name }} - run: | - set -eu - - # 只有 tag 推送才构建;手动触发时按 tag 取,没有就退出 - case "${GITHUB_REF:-}" in - refs/tags/v*) ;; - *) - if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then - echo "非 tag 推送,跳过:${GITHUB_REF:-unknown}" - exit 0 - fi - ;; - esac - - if [ -z "${TAG_NAME:-}" ]; then - echo "未取到 tag 名,退出" - exit 1 - fi - - # job 在 Jenkins 文件夹下的路径(组织密钥 JENKINS_JOB_PATH), - # 例如 job/iotlcm-opensrc/job/iotlcm-oss-build。 - # 用密钥而非硬编码,Jenkins 里移动 job 时不用改 11 个仓。 - JP="${JOB_PATH:-job/iotlcm-oss-build}" - - echo "仓库:$REPO_NAME 版本:$TAG_NAME job:$JP" - - WORK=$(mktemp -d) - trap 'rm -rf "$WORK"' EXIT - - # 取 CSRF crumb - curl -s -c "$WORK/cj" -u "$JU:$JT" "$JURL/crumbIssuer/api/json" -o "$WORK/crumb.json" - CR=$(python3 -c "import json;print(json.load(open('$WORK/crumb.json'))['crumb'])") - - # 触发参数化任务:SERVICES=仓库名,VERSION=tag - code=$(curl -s -o "$WORK/out" -w '%{http_code}' -X POST -b "$WORK/cj" -u "$JU:$JT" \ - -H "Jenkins-Crumb: $CR" \ - --data-urlencode "SERVICES=$REPO_NAME" \ - --data-urlencode "VERSION=$TAG_NAME" \ - --data-urlencode "FORCE=true" \ - "$JURL/$JP/buildWithParameters") - - echo "Jenkins 触发 HTTP $code" - if [ "$code" != "201" ] && [ "$code" != "200" ] && [ "$code" != "302" ] && [ "$code" != "303" ]; then - echo "触发失败:" - cat "$WORK/out" - exit 1 - fi - - LINK="$JURL/$JP/" - echo "==========================================" - echo "Jenkins 构建:$LINK" - echo "==========================================" - echo "::notice title=Jenkins 镜像构建::[$LINK]($LINK)" diff --git a/worker-svr/LICENSE b/worker-svr/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/worker-svr/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.