Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/ayeez757_ayeezblog.json
T

1 line
167 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "ayeez757/ayeezblog", "files": {"AyeezBlog-Backend/blog-server/src/main/resources/application.yml": {"e391a287b097b4c4c85b6b9db76b41919ae7c4d9": {"t": 1785746929.166775, "n": 5431, "h": "aa39fb3a43bf16e8", "c": "#\n# =========================\n# 本地开发 / 部署配置说明\n# =========================\n#\n# 1) 数据库(必填)\n# - 本项目 datasource 使用 hm.db.* 进行占位符注入;hm.db.username / hm.db.password 没有默认值,\n# 不配置会启动失败(典型报错:Could not resolve placeholder 'hm.db.username')。\n# - 可选:hm.db.port 默认 3306(见 spring.datasource.url 的 :${hm.db.port:3306})。\n#\n# 2) 环境变量(可选)\n# - 你可以选择“直接改本文件里的 hm.db.* / hm.deepseek.* / hm.volcengine.* / hm.qiniu.*”\n# 或者通过环境变量注入(见 application-dev.yml)。\n# - 注意:application-dev.yml 的数据库用户名变量名是 HM_DB_USER(不是 HM_DB_USERNAME)。\n#\n# Windows PowerShell 示例:\n# $env:HM_DB_HOST=\"localhost\"\n# $env:HM_DB_USER=\"root\"\n# $env:HM_DB_PASSWORD=\"your_password\"\n#\n# 3) 七牛(按需)\n# - 管理端“获取上传 token(/admin/upload/qiniu/token)”与“AI 生成封面后转存七牛”需要 qiniu.* 配置齐全;\n# 仅跑文章/分类/标签等基础接口可不配。\n# - 这里的 qiniu.* 实际读取自 qiniu.*(见 QiniuProperties prefix=\"qiniu\"),但为了兼容环境变量注入,\n# 本文件把 qiniu.* 的值写成从 hm.qiniu.* 取(hm.qiniu.* 通常由 application-dev.yml 从环境变量注入)。\n#\n# 4) AI(按需)\n# - 简介生成:配置 hm.deepseek.api-key,启用 hm.deepseek.summary-enabled=true\n# - 封面生成:配置 hm.volcengine.access-key / hm.volcengine.secret-key,启用 hm.volcengine.cover-enabled=true\n# 并确保七牛可用(因为生成的图片会转存到七牛后返回 URL)\n#\n# =========================\n# Spring / Datasource\n# =========================\nspring:\n application:\n name: blog-server\n config:\n import: optional:classpath:application-local-secret.yml\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # RabbitMQ 配置\n rabbitmq:\n host: ${hm.rabbitmq.host:localhost}\n port: ${hm.rabbitmq.port:5672}\n username: ${hm.rabbitmq.username:guest}\n password: ${hm.rabbitmq.password:guest}\n virtual-host: ${hm.rabbitmq.virtual-host:/}\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 3\n max-concurrency: 10\n prefetch: 50\n template:\n retry:\n enabled: true\n initial-interval: 1000\n max-attempts: 3\n max-interval: 10000\n multiplier: 2.0\n # =========================\n # DeepSeek(OpenAI 兼容 API)\n # =========================\n # - spring.ai.openai.api-key 默认绑定 hm.deepseek.api-key(空则不请求模型)\n # - 简介功能开关在 blog.ai.summary.enabled(默认引用 hm.deepseek.summary-enabled)\n ai:\n openai:\n # spring-ai 1.0.0 在启动时会校验 api-key 非空;默认给占位值,真实调用仍由 blog.ai.summary.enabled 控制\n api-key: ${hm.deepseek.api-key:disabled}\n base-url: https://api.deepseek.com\n chat:\n api-key: ${hm.deepseek.api-key:disabled}\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath*:cn/**/mapper/*.xml,classpath*:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\n# =========================\n# Aliyun OSS(当前项目代码中未见使用点,如后续使用再按需配置)\n# =========================\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# =========================\n# 七牛云图床(按需)\n# =========================\n# 需要场景:\n# - 管理端直传:GET /admin/upload/qiniu/token\n# - AI 封面:生成图片后转存七牛\n#\n# 配置项说明:\n# - qiniu.domain:外链域名(最终拼接成公开访问 URL,建议不带末尾 /)\n# - qiniu.uploadUrl:上传入口(按七牛空间所在区域选择)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# =========================\n# AI 开关(按需)\n# =========================\n# - enabled 默认引用 hm.deepseek.summary-enabled / hm.volcengine.cover-enabled\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "e802fcdf339c1c1b9ae4f93c70f183e2dee1dc22": {"t": 1785769112.1722038, "n": 5431, "h": "aa39fb3a43bf16e8", "c": "#\n# =========================\n# 本地开发 / 部署配置说明\n# =========================\n#\n# 1) 数据库(必填)\n# - 本项目 datasource 使用 hm.db.* 进行占位符注入;hm.db.username / hm.db.password 没有默认值,\n# 不配置会启动失败(典型报错:Could not resolve placeholder 'hm.db.username')。\n# - 可选:hm.db.port 默认 3306(见 spring.datasource.url 的 :${hm.db.port:3306})。\n#\n# 2) 环境变量(可选)\n# - 你可以选择“直接改本文件里的 hm.db.* / hm.deepseek.* / hm.volcengine.* / hm.qiniu.*”\n# 或者通过环境变量注入(见 application-dev.yml)。\n# - 注意:application-dev.yml 的数据库用户名变量名是 HM_DB_USER(不是 HM_DB_USERNAME)。\n#\n# Windows PowerShell 示例:\n# $env:HM_DB_HOST=\"localhost\"\n# $env:HM_DB_USER=\"root\"\n# $env:HM_DB_PASSWORD=\"your_password\"\n#\n# 3) 七牛(按需)\n# - 管理端“获取上传 token(/admin/upload/qiniu/token)”与“AI 生成封面后转存七牛”需要 qiniu.* 配置齐全;\n# 仅跑文章/分类/标签等基础接口可不配。\n# - 这里的 qiniu.* 实际读取自 qiniu.*(见 QiniuProperties prefix=\"qiniu\"),但为了兼容环境变量注入,\n# 本文件把 qiniu.* 的值写成从 hm.qiniu.* 取(hm.qiniu.* 通常由 application-dev.yml 从环境变量注入)。\n#\n# 4) AI(按需)\n# - 简介生成:配置 hm.deepseek.api-key,启用 hm.deepseek.summary-enabled=true\n# - 封面生成:配置 hm.volcengine.access-key / hm.volcengine.secret-key,启用 hm.volcengine.cover-enabled=true\n# 并确保七牛可用(因为生成的图片会转存到七牛后返回 URL)\n#\n# =========================\n# Spring / Datasource\n# =========================\nspring:\n application:\n name: blog-server\n config:\n import: optional:classpath:application-local-secret.yml\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # RabbitMQ 配置\n rabbitmq:\n host: ${hm.rabbitmq.host:localhost}\n port: ${hm.rabbitmq.port:5672}\n username: ${hm.rabbitmq.username:guest}\n password: ${hm.rabbitmq.password:guest}\n virtual-host: ${hm.rabbitmq.virtual-host:/}\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 3\n max-concurrency: 10\n prefetch: 50\n template:\n retry:\n enabled: true\n initial-interval: 1000\n max-attempts: 3\n max-interval: 10000\n multiplier: 2.0\n # =========================\n # DeepSeek(OpenAI 兼容 API)\n # =========================\n # - spring.ai.openai.api-key 默认绑定 hm.deepseek.api-key(空则不请求模型)\n # - 简介功能开关在 blog.ai.summary.enabled(默认引用 hm.deepseek.summary-enabled)\n ai:\n openai:\n # spring-ai 1.0.0 在启动时会校验 api-key 非空;默认给占位值,真实调用仍由 blog.ai.summary.enabled 控制\n api-key: ${hm.deepseek.api-key:disabled}\n base-url: https://api.deepseek.com\n chat:\n api-key: ${hm.deepseek.api-key:disabled}\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath*:cn/**/mapper/*.xml,classpath*:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\n# =========================\n# Aliyun OSS(当前项目代码中未见使用点,如后续使用再按需配置)\n# =========================\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# =========================\n# 七牛云图床(按需)\n# =========================\n# 需要场景:\n# - 管理端直传:GET /admin/upload/qiniu/token\n# - AI 封面:生成图片后转存七牛\n#\n# 配置项说明:\n# - qiniu.domain:外链域名(最终拼接成公开访问 URL,建议不带末尾 /)\n# - qiniu.uploadUrl:上传入口(按七牛空间所在区域选择)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# =========================\n# AI 开关(按需)\n# =========================\n# - enabled 默认引用 hm.deepseek.summary-enabled / hm.volcengine.cover-enabled\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "4297525900abdf9bbee31d0b759bbe146a5c4931": {"t": 1785769113.3439612, "n": 5290, "h": "ac842b8f91e2c7cd", "c": "#\n# =========================\n# 本地开发 / 部署配置说明\n# =========================\n#\n# 1) 数据库(必填)\n# - 本项目 datasource 使用 hm.db.* 进行占位符注入;hm.db.username / hm.db.password 没有默认值,\n# 不配置会启动失败(典型报错:Could not resolve placeholder 'hm.db.username')。\n# - 可选:hm.db.port 默认 3306(见 spring.datasource.url 的 :${hm.db.port:3306})。\n#\n# 2) 环境变量(可选)\n# - 你可以选择“直接改本文件里的 hm.db.* / hm.deepseek.* / hm.volcengine.* / hm.qiniu.*”\n# 或者通过环境变量注入(见 application-dev.yml)。\n# - 注意:application-dev.yml 的数据库用户名变量名是 HM_DB_USER(不是 HM_DB_USERNAME)。\n#\n# Windows PowerShell 示例:\n# $env:HM_DB_HOST=\"localhost\"\n# $env:HM_DB_USER=\"root\"\n# $env:HM_DB_PASSWORD=\"your_password\"\n#\n# 3) 七牛(按需)\n# - 管理端“获取上传 token(/admin/upload/qiniu/token)”与“AI 生成封面后转存七牛”需要 qiniu.* 配置齐全;\n# 仅跑文章/分类/标签等基础接口可不配。\n# - 这里的 qiniu.* 实际读取自 qiniu.*(见 QiniuProperties prefix=\"qiniu\"),但为了兼容环境变量注入,\n# 本文件把 qiniu.* 的值写成从 hm.qiniu.* 取(hm.qiniu.* 通常由 application-dev.yml 从环境变量注入)。\n#\n# 4) AI(按需)\n# - 简介生成:配置 hm.deepseek.api-key,启用 hm.deepseek.summary-enabled=true\n# - 封面生成:配置 hm.volcengine.access-key / hm.volcengine.secret-key,启用 hm.volcengine.cover-enabled=true\n# 并确保七牛可用(因为生成的图片会转存到七牛后返回 URL)\n#\n# =========================\n# Spring / Datasource\n# =========================\nspring:\n application:\n name: blog-server\n config:\n import: optional:classpath:application-local-secret.yml\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # RabbitMQ 配置\n rabbitmq:\n host: ${hm.rabbitmq.host:localhost}\n port: ${hm.rabbitmq.port:5672}\n username: ${hm.rabbitmq.username:guest}\n password: ${hm.rabbitmq.password:guest}\n virtual-host: ${hm.rabbitmq.virtual-host:/}\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 3\n max-concurrency: 10\n prefetch: 50\n template:\n retry:\n enabled: true\n initial-interval: 1000\n max-attempts: 3\n max-interval: 10000\n multiplier: 2.0\n # =========================\n # DeepSeek(OpenAI 兼容 API)\n # =========================\n # - spring.ai.openai.api-key 默认绑定 hm.deepseek.api-key(空则不请求模型)\n # - 简介功能开关在 blog.ai.summary.enabled(默认引用 hm.deepseek.summary-enabled)\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath*:cn/**/mapper/*.xml,classpath*:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\n# =========================\n# Aliyun OSS(当前项目代码中未见使用点,如后续使用再按需配置)\n# =========================\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# =========================\n# 七牛云图床(按需)\n# =========================\n# 需要场景:\n# - 管理端直传:GET /admin/upload/qiniu/token\n# - AI 封面:生成图片后转存七牛\n#\n# 配置项说明:\n# - qiniu.domain:外链域名(最终拼接成公开访问 URL,建议不带末尾 /)\n# - qiniu.uploadUrl:上传入口(按七牛空间所在区域选择)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# =========================\n# AI 开关(按需)\n# =========================\n# - enabled 默认引用 hm.deepseek.summary-enabled / hm.volcengine.cover-enabled\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "58a28863627469d54d170abd24dcb5abc5ca4a7d": {"t": 1785769114.7731984, "n": 5290, "h": "ac842b8f91e2c7cd", "c": "#\n# =========================\n# 本地开发 / 部署配置说明\n# =========================\n#\n# 1) 数据库(必填)\n# - 本项目 datasource 使用 hm.db.* 进行占位符注入;hm.db.username / hm.db.password 没有默认值,\n# 不配置会启动失败(典型报错:Could not resolve placeholder 'hm.db.username')。\n# - 可选:hm.db.port 默认 3306(见 spring.datasource.url 的 :${hm.db.port:3306})。\n#\n# 2) 环境变量(可选)\n# - 你可以选择“直接改本文件里的 hm.db.* / hm.deepseek.* / hm.volcengine.* / hm.qiniu.*”\n# 或者通过环境变量注入(见 application-dev.yml)。\n# - 注意:application-dev.yml 的数据库用户名变量名是 HM_DB_USER(不是 HM_DB_USERNAME)。\n#\n# Windows PowerShell 示例:\n# $env:HM_DB_HOST=\"localhost\"\n# $env:HM_DB_USER=\"root\"\n# $env:HM_DB_PASSWORD=\"your_password\"\n#\n# 3) 七牛(按需)\n# - 管理端“获取上传 token(/admin/upload/qiniu/token)”与“AI 生成封面后转存七牛”需要 qiniu.* 配置齐全;\n# 仅跑文章/分类/标签等基础接口可不配。\n# - 这里的 qiniu.* 实际读取自 qiniu.*(见 QiniuProperties prefix=\"qiniu\"),但为了兼容环境变量注入,\n# 本文件把 qiniu.* 的值写成从 hm.qiniu.* 取(hm.qiniu.* 通常由 application-dev.yml 从环境变量注入)。\n#\n# 4) AI(按需)\n# - 简介生成:配置 hm.deepseek.api-key,启用 hm.deepseek.summary-enabled=true\n# - 封面生成:配置 hm.volcengine.access-key / hm.volcengine.secret-key,启用 hm.volcengine.cover-enabled=true\n# 并确保七牛可用(因为生成的图片会转存到七牛后返回 URL)\n#\n# =========================\n# Spring / Datasource\n# =========================\nspring:\n application:\n name: blog-server\n config:\n import: optional:classpath:application-local-secret.yml\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # RabbitMQ 配置\n rabbitmq:\n host: ${hm.rabbitmq.host:localhost}\n port: ${hm.rabbitmq.port:5672}\n username: ${hm.rabbitmq.username:guest}\n password: ${hm.rabbitmq.password:guest}\n virtual-host: ${hm.rabbitmq.virtual-host:/}\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 3\n max-concurrency: 10\n prefetch: 50\n template:\n retry:\n enabled: true\n initial-interval: 1000\n max-attempts: 3\n max-interval: 10000\n multiplier: 2.0\n # =========================\n # DeepSeek(OpenAI 兼容 API)\n # =========================\n # - spring.ai.openai.api-key 默认绑定 hm.deepseek.api-key(空则不请求模型)\n # - 简介功能开关在 blog.ai.summary.enabled(默认引用 hm.deepseek.summary-enabled)\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath*:cn/**/mapper/*.xml,classpath*:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\n# =========================\n# Aliyun OSS(当前项目代码中未见使用点,如后续使用再按需配置)\n# =========================\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# =========================\n# 七牛云图床(按需)\n# =========================\n# 需要场景:\n# - 管理端直传:GET /admin/upload/qiniu/token\n# - AI 封面:生成图片后转存七牛\n#\n# 配置项说明:\n# - qiniu.domain:外链域名(最终拼接成公开访问 URL,建议不带末尾 /)\n# - qiniu.uploadUrl:上传入口(按七牛空间所在区域选择)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# =========================\n# AI 开关(按需)\n# =========================\n# - enabled 默认引用 hm.deepseek.summary-enabled / hm.volcengine.cover-enabled\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "a2b028cd3183d1031fa38a3bd9421a7013e52b27": {"t": 1785769116.060715, "n": 5259, "h": "519c480f03bf177a", "c": "#\n# =========================\n# 本地开发 / 部署配置说明\n# =========================\n#\n# 1) 数据库(必填)\n# - 本项目 datasource 使用 hm.db.* 进行占位符注入;hm.db.username / hm.db.password 没有默认值,\n# 不配置会启动失败(典型报错:Could not resolve placeholder 'hm.db.username')。\n# - 可选:hm.db.port 默认 3306(见 spring.datasource.url 的 :${hm.db.port:3306})。\n#\n# 2) 环境变量(可选)\n# - 你可以选择“直接改本文件里的 hm.db.* / hm.deepseek.* / hm.volcengine.* / hm.qiniu.*”\n# 或者通过环境变量注入(见 application-dev.yml)。\n# - 注意:application-dev.yml 的数据库用户名变量名是 HM_DB_USER(不是 HM_DB_USERNAME)。\n#\n# Windows PowerShell 示例:\n# $env:HM_DB_HOST=\"localhost\"\n# $env:HM_DB_USER=\"root\"\n# $env:HM_DB_PASSWORD=\"your_password\"\n#\n# 3) 七牛(按需)\n# - 管理端“获取上传 token(/admin/upload/qiniu/token)”与“AI 生成封面后转存七牛”需要 qiniu.* 配置齐全;\n# 仅跑文章/分类/标签等基础接口可不配。\n# - 这里的 qiniu.* 实际读取自 qiniu.*(见 QiniuProperties prefix=\"qiniu\"),但为了兼容环境变量注入,\n# 本文件把 qiniu.* 的值写成从 hm.qiniu.* 取(hm.qiniu.* 通常由 application-dev.yml 从环境变量注入)。\n#\n# 4) AI(按需)\n# - 简介生成:配置 hm.deepseek.api-key,启用 hm.deepseek.summary-enabled=true\n# - 封面生成:配置 hm.volcengine.access-key / hm.volcengine.secret-key,启用 hm.volcengine.cover-enabled=true\n# 并确保七牛可用(因为生成的图片会转存到七牛后返回 URL)\n#\n# =========================\n# Spring / Datasource\n# =========================\nspring:\n application:\n name: blog-server\n config:\n import: optional:classpath:application-local-secret.yml\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # RabbitMQ 配置\n rabbitmq:\n host: ${hm.rabbitmq.host:localhost}\n port: ${hm.rabbitmq.port:5672}\n username: ${hm.rabbitmq.username:guest}\n password: ${hm.rabbitmq.password:guest}\n virtual-host: ${hm.rabbitmq.virtual-host:/}\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 3\n max-concurrency: 10\n prefetch: 50\n template:\n retry:\n enabled: true\n initial-interval: 1000\n max-attempts: 3\n max-interval: 10000\n multiplier: 2.0\n # =========================\n # DeepSeek(OpenAI 兼容 API)\n # =========================\n # - spring.ai.openai.api-key 默认绑定 hm.deepseek.api-key(空则不请求模型)\n # - 简介功能开关在 blog.ai.summary.enabled(默认引用 hm.deepseek.summary-enabled)\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\n# =========================\n# Aliyun OSS(当前项目代码中未见使用点,如后续使用再按需配置)\n# =========================\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# =========================\n# 七牛云图床(按需)\n# =========================\n# 需要场景:\n# - 管理端直传:GET /admin/upload/qiniu/token\n# - AI 封面:生成图片后转存七牛\n#\n# 配置项说明:\n# - qiniu.domain:外链域名(最终拼接成公开访问 URL,建议不带末尾 /)\n# - qiniu.uploadUrl:上传入口(按七牛空间所在区域选择)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# =========================\n# AI 开关(按需)\n# =========================\n# - enabled 默认引用 hm.deepseek.summary-enabled / hm.volcengine.cover-enabled\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "905c78792eca251f8eb192887ad888607d729036": {"t": 1785769117.4593382, "n": 5259, "h": "519c480f03bf177a", "c": "#\n# =========================\n# 本地开发 / 部署配置说明\n# =========================\n#\n# 1) 数据库(必填)\n# - 本项目 datasource 使用 hm.db.* 进行占位符注入;hm.db.username / hm.db.password 没有默认值,\n# 不配置会启动失败(典型报错:Could not resolve placeholder 'hm.db.username')。\n# - 可选:hm.db.port 默认 3306(见 spring.datasource.url 的 :${hm.db.port:3306})。\n#\n# 2) 环境变量(可选)\n# - 你可以选择“直接改本文件里的 hm.db.* / hm.deepseek.* / hm.volcengine.* / hm.qiniu.*”\n# 或者通过环境变量注入(见 application-dev.yml)。\n# - 注意:application-dev.yml 的数据库用户名变量名是 HM_DB_USER(不是 HM_DB_USERNAME)。\n#\n# Windows PowerShell 示例:\n# $env:HM_DB_HOST=\"localhost\"\n# $env:HM_DB_USER=\"root\"\n# $env:HM_DB_PASSWORD=\"your_password\"\n#\n# 3) 七牛(按需)\n# - 管理端“获取上传 token(/admin/upload/qiniu/token)”与“AI 生成封面后转存七牛”需要 qiniu.* 配置齐全;\n# 仅跑文章/分类/标签等基础接口可不配。\n# - 这里的 qiniu.* 实际读取自 qiniu.*(见 QiniuProperties prefix=\"qiniu\"),但为了兼容环境变量注入,\n# 本文件把 qiniu.* 的值写成从 hm.qiniu.* 取(hm.qiniu.* 通常由 application-dev.yml 从环境变量注入)。\n#\n# 4) AI(按需)\n# - 简介生成:配置 hm.deepseek.api-key,启用 hm.deepseek.summary-enabled=true\n# - 封面生成:配置 hm.volcengine.access-key / hm.volcengine.secret-key,启用 hm.volcengine.cover-enabled=true\n# 并确保七牛可用(因为生成的图片会转存到七牛后返回 URL)\n#\n# =========================\n# Spring / Datasource\n# =========================\nspring:\n application:\n name: blog-server\n config:\n import: optional:classpath:application-local-secret.yml\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # RabbitMQ 配置\n rabbitmq:\n host: ${hm.rabbitmq.host:localhost}\n port: ${hm.rabbitmq.port:5672}\n username: ${hm.rabbitmq.username:guest}\n password: ${hm.rabbitmq.password:guest}\n virtual-host: ${hm.rabbitmq.virtual-host:/}\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 3\n max-concurrency: 10\n prefetch: 50\n template:\n retry:\n enabled: true\n initial-interval: 1000\n max-attempts: 3\n max-interval: 10000\n multiplier: 2.0\n # =========================\n # DeepSeek(OpenAI 兼容 API)\n # =========================\n # - spring.ai.openai.api-key 默认绑定 hm.deepseek.api-key(空则不请求模型)\n # - 简介功能开关在 blog.ai.summary.enabled(默认引用 hm.deepseek.summary-enabled)\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\n# =========================\n# Aliyun OSS(当前项目代码中未见使用点,如后续使用再按需配置)\n# =========================\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# =========================\n# 七牛云图床(按需)\n# =========================\n# 需要场景:\n# - 管理端直传:GET /admin/upload/qiniu/token\n# - AI 封面:生成图片后转存七牛\n#\n# 配置项说明:\n# - qiniu.domain:外链域名(最终拼接成公开访问 URL,建议不带末尾 /)\n# - qiniu.uploadUrl:上传入口(按七牛空间所在区域选择)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# =========================\n# AI 开关(按需)\n# =========================\n# - enabled 默认引用 hm.deepseek.summary-enabled / hm.volcengine.cover-enabled\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "d885c7217f8f94a9b7af822d6cd980fd1947876c": {"t": 1785769118.9607687, "n": 5189, "h": "6d6141285d9f88fe", "c": "#\n# =========================\n# 本地开发 / 部署配置说明\n# =========================\n#\n# 1) 数据库(必填)\n# - 本项目 datasource 使用 hm.db.* 进行占位符注入;hm.db.username / hm.db.password 没有默认值,\n# 不配置会启动失败(典型报错:Could not resolve placeholder 'hm.db.username')。\n# - 可选:hm.db.port 默认 3306(见 spring.datasource.url 的 :${hm.db.port:3306})。\n#\n# 2) 环境变量(可选)\n# - 你可以选择“直接改本文件里的 hm.db.* / hm.deepseek.* / hm.volcengine.* / hm.qiniu.*”\n# 或者通过环境变量注入(见 application-dev.yml)。\n# - 注意:application-dev.yml 的数据库用户名变量名是 HM_DB_USER(不是 HM_DB_USERNAME)。\n#\n# Windows PowerShell 示例:\n# $env:HM_DB_HOST=\"localhost\"\n# $env:HM_DB_USER=\"root\"\n# $env:HM_DB_PASSWORD=\"your_password\"\n#\n# 3) 七牛(按需)\n# - 管理端“获取上传 token(/admin/upload/qiniu/token)”与“AI 生成封面后转存七牛”需要 qiniu.* 配置齐全;\n# 仅跑文章/分类/标签等基础接口可不配。\n# - 这里的 qiniu.* 实际读取自 qiniu.*(见 QiniuProperties prefix=\"qiniu\"),但为了兼容环境变量注入,\n# 本文件把 qiniu.* 的值写成从 hm.qiniu.* 取(hm.qiniu.* 通常由 application-dev.yml 从环境变量注入)。\n#\n# 4) AI(按需)\n# - 简介生成:配置 hm.deepseek.api-key,启用 hm.deepseek.summary-enabled=true\n# - 封面生成:配置 hm.volcengine.access-key / hm.volcengine.secret-key,启用 hm.volcengine.cover-enabled=true\n# 并确保七牛可用(因为生成的图片会转存到七牛后返回 URL)\n#\n# =========================\n# Spring / Datasource\n# =========================\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # RabbitMQ 配置\n rabbitmq:\n host: ${hm.rabbitmq.host:localhost}\n port: ${hm.rabbitmq.port:5672}\n username: ${hm.rabbitmq.username:guest}\n password: ${hm.rabbitmq.password:guest}\n virtual-host: ${hm.rabbitmq.virtual-host:/}\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 3\n max-concurrency: 10\n prefetch: 50\n template:\n retry:\n enabled: true\n initial-interval: 1000\n max-attempts: 3\n max-interval: 10000\n multiplier: 2.0\n # =========================\n # DeepSeek(OpenAI 兼容 API)\n # =========================\n # - spring.ai.openai.api-key 默认绑定 hm.deepseek.api-key(空则不请求模型)\n # - 简介功能开关在 blog.ai.summary.enabled(默认引用 hm.deepseek.summary-enabled)\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\n# =========================\n# Aliyun OSS(当前项目代码中未见使用点,如后续使用再按需配置)\n# =========================\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# =========================\n# 七牛云图床(按需)\n# =========================\n# 需要场景:\n# - 管理端直传:GET /admin/upload/qiniu/token\n# - AI 封面:生成图片后转存七牛\n#\n# 配置项说明:\n# - qiniu.domain:外链域名(最终拼接成公开访问 URL,建议不带末尾 /)\n# - qiniu.uploadUrl:上传入口(按七牛空间所在区域选择)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# =========================\n# AI 开关(按需)\n# =========================\n# - enabled 默认引用 hm.deepseek.summary-enabled / hm.volcengine.cover-enabled\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "eb815a025ede7adf332e1b7c9f52c2e47f4dad7e": {"t": 1785769120.4815578, "n": 5189, "h": "6d6141285d9f88fe", "c": "#\n# =========================\n# 本地开发 / 部署配置说明\n# =========================\n#\n# 1) 数据库(必填)\n# - 本项目 datasource 使用 hm.db.* 进行占位符注入;hm.db.username / hm.db.password 没有默认值,\n# 不配置会启动失败(典型报错:Could not resolve placeholder 'hm.db.username')。\n# - 可选:hm.db.port 默认 3306(见 spring.datasource.url 的 :${hm.db.port:3306})。\n#\n# 2) 环境变量(可选)\n# - 你可以选择“直接改本文件里的 hm.db.* / hm.deepseek.* / hm.volcengine.* / hm.qiniu.*”\n# 或者通过环境变量注入(见 application-dev.yml)。\n# - 注意:application-dev.yml 的数据库用户名变量名是 HM_DB_USER(不是 HM_DB_USERNAME)。\n#\n# Windows PowerShell 示例:\n# $env:HM_DB_HOST=\"localhost\"\n# $env:HM_DB_USER=\"root\"\n# $env:HM_DB_PASSWORD=\"your_password\"\n#\n# 3) 七牛(按需)\n# - 管理端“获取上传 token(/admin/upload/qiniu/token)”与“AI 生成封面后转存七牛”需要 qiniu.* 配置齐全;\n# 仅跑文章/分类/标签等基础接口可不配。\n# - 这里的 qiniu.* 实际读取自 qiniu.*(见 QiniuProperties prefix=\"qiniu\"),但为了兼容环境变量注入,\n# 本文件把 qiniu.* 的值写成从 hm.qiniu.* 取(hm.qiniu.* 通常由 application-dev.yml 从环境变量注入)。\n#\n# 4) AI(按需)\n# - 简介生成:配置 hm.deepseek.api-key,启用 hm.deepseek.summary-enabled=true\n# - 封面生成:配置 hm.volcengine.access-key / hm.volcengine.secret-key,启用 hm.volcengine.cover-enabled=true\n# 并确保七牛可用(因为生成的图片会转存到七牛后返回 URL)\n#\n# =========================\n# Spring / Datasource\n# =========================\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # RabbitMQ 配置\n rabbitmq:\n host: ${hm.rabbitmq.host:localhost}\n port: ${hm.rabbitmq.port:5672}\n username: ${hm.rabbitmq.username:guest}\n password: ${hm.rabbitmq.password:guest}\n virtual-host: ${hm.rabbitmq.virtual-host:/}\n listener:\n simple:\n acknowledge-mode: manual\n concurrency: 3\n max-concurrency: 10\n prefetch: 50\n template:\n retry:\n enabled: true\n initial-interval: 1000\n max-attempts: 3\n max-interval: 10000\n multiplier: 2.0\n # =========================\n # DeepSeek(OpenAI 兼容 API)\n # =========================\n # - spring.ai.openai.api-key 默认绑定 hm.deepseek.api-key(空则不请求模型)\n # - 简介功能开关在 blog.ai.summary.enabled(默认引用 hm.deepseek.summary-enabled)\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\n# =========================\n# Aliyun OSS(当前项目代码中未见使用点,如后续使用再按需配置)\n# =========================\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# =========================\n# 七牛云图床(按需)\n# =========================\n# 需要场景:\n# - 管理端直传:GET /admin/upload/qiniu/token\n# - AI 封面:生成图片后转存七牛\n#\n# 配置项说明:\n# - qiniu.domain:外链域名(最终拼接成公开访问 URL,建议不带末尾 /)\n# - qiniu.uploadUrl:上传入口(按七牛空间所在区域选择)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# =========================\n# AI 开关(按需)\n# =========================\n# - enabled 默认引用 hm.deepseek.summary-enabled / hm.volcengine.cover-enabled\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "f5c27032e28803c1823f886a291c6db95530bd4a": {"t": 1785769121.822745, "n": 4649, "h": "a83ae4c5db25e0c0", "c": "#\n# =========================\n# 本地开发 / 部署配置说明\n# =========================\n#\n# 1) 数据库(必填)\n# - 本项目 datasource 使用 hm.db.* 进行占位符注入;hm.db.username / hm.db.password 没有默认值,\n# 不配置会启动失败(典型报错:Could not resolve placeholder 'hm.db.username')。\n# - 可选:hm.db.port 默认 3306(见 spring.datasource.url 的 :${hm.db.port:3306})。\n#\n# 2) 环境变量(可选)\n# - 你可以选择“直接改本文件里的 hm.db.* / hm.deepseek.* / hm.volcengine.* / hm.qiniu.*”\n# 或者通过环境变量注入(见 application-dev.yml)。\n# - 注意:application-dev.yml 的数据库用户名变量名是 HM_DB_USER(不是 HM_DB_USERNAME)。\n#\n# Windows PowerShell 示例:\n# $env:HM_DB_HOST=\"localhost\"\n# $env:HM_DB_USER=\"root\"\n# $env:HM_DB_PASSWORD=\"your_password\"\n#\n# 3) 七牛(按需)\n# - 管理端“获取上传 token(/admin/upload/qiniu/token)”与“AI 生成封面后转存七牛”需要 qiniu.* 配置齐全;\n# 仅跑文章/分类/标签等基础接口可不配。\n# - 这里的 qiniu.* 实际读取自 qiniu.*(见 QiniuProperties prefix=\"qiniu\"),但为了兼容环境变量注入,\n# 本文件把 qiniu.* 的值写成从 hm.qiniu.* 取(hm.qiniu.* 通常由 application-dev.yml 从环境变量注入)。\n#\n# 4) AI(按需)\n# - 简介生成:配置 hm.deepseek.api-key,启用 hm.deepseek.summary-enabled=true\n# - 封面生成:配置 hm.volcengine.access-key / hm.volcengine.secret-key,启用 hm.volcengine.cover-enabled=true\n# 并确保七牛可用(因为生成的图片会转存到七牛后返回 URL)\n#\n# =========================\n# Spring / Datasource\n# =========================\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n# =========================\n# DeepSeek(OpenAI 兼容 API)\n# =========================\n# - spring.ai.openai.api-key 默认绑定 hm.deepseek.api-key(空则不请求模型)\n# - 简介功能开关在 blog.ai.summary.enabled(默认引用 hm.deepseek.summary-enabled)\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\n# =========================\n# Aliyun OSS(当前项目代码中未见使用点,如后续使用再按需配置)\n# =========================\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# =========================\n# 七牛云图床(按需)\n# =========================\n# 需要场景:\n# - 管理端直传:GET /admin/upload/qiniu/token\n# - AI 封面:生成图片后转存七牛\n#\n# 配置项说明:\n# - qiniu.domain:外链域名(最终拼接成公开访问 URL,建议不带末尾 /)\n# - qiniu.uploadUrl:上传入口(按七牛空间所在区域选择)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# =========================\n# AI 开关(按需)\n# =========================\n# - enabled 默认引用 hm.deepseek.summary-enabled / hm.volcengine.cover-enabled\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "05ee76dd3e50e0583fe0aaa62e1b72d83b805e32": {"t": 1785769123.1943913, "n": 4649, "h": "a83ae4c5db25e0c0", "c": "#\n# =========================\n# 本地开发 / 部署配置说明\n# =========================\n#\n# 1) 数据库(必填)\n# - 本项目 datasource 使用 hm.db.* 进行占位符注入;hm.db.username / hm.db.password 没有默认值,\n# 不配置会启动失败(典型报错:Could not resolve placeholder 'hm.db.username')。\n# - 可选:hm.db.port 默认 3306(见 spring.datasource.url 的 :${hm.db.port:3306})。\n#\n# 2) 环境变量(可选)\n# - 你可以选择“直接改本文件里的 hm.db.* / hm.deepseek.* / hm.volcengine.* / hm.qiniu.*”\n# 或者通过环境变量注入(见 application-dev.yml)。\n# - 注意:application-dev.yml 的数据库用户名变量名是 HM_DB_USER(不是 HM_DB_USERNAME)。\n#\n# Windows PowerShell 示例:\n# $env:HM_DB_HOST=\"localhost\"\n# $env:HM_DB_USER=\"root\"\n# $env:HM_DB_PASSWORD=\"your_password\"\n#\n# 3) 七牛(按需)\n# - 管理端“获取上传 token(/admin/upload/qiniu/token)”与“AI 生成封面后转存七牛”需要 qiniu.* 配置齐全;\n# 仅跑文章/分类/标签等基础接口可不配。\n# - 这里的 qiniu.* 实际读取自 qiniu.*(见 QiniuProperties prefix=\"qiniu\"),但为了兼容环境变量注入,\n# 本文件把 qiniu.* 的值写成从 hm.qiniu.* 取(hm.qiniu.* 通常由 application-dev.yml 从环境变量注入)。\n#\n# 4) AI(按需)\n# - 简介生成:配置 hm.deepseek.api-key,启用 hm.deepseek.summary-enabled=true\n# - 封面生成:配置 hm.volcengine.access-key / hm.volcengine.secret-key,启用 hm.volcengine.cover-enabled=true\n# 并确保七牛可用(因为生成的图片会转存到七牛后返回 URL)\n#\n# =========================\n# Spring / Datasource\n# =========================\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n# =========================\n# DeepSeek(OpenAI 兼容 API)\n# =========================\n# - spring.ai.openai.api-key 默认绑定 hm.deepseek.api-key(空则不请求模型)\n# - 简介功能开关在 blog.ai.summary.enabled(默认引用 hm.deepseek.summary-enabled)\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\n# =========================\n# Aliyun OSS(当前项目代码中未见使用点,如后续使用再按需配置)\n# =========================\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# =========================\n# 七牛云图床(按需)\n# =========================\n# 需要场景:\n# - 管理端直传:GET /admin/upload/qiniu/token\n# - AI 封面:生成图片后转存七牛\n#\n# 配置项说明:\n# - qiniu.domain:外链域名(最终拼接成公开访问 URL,建议不带末尾 /)\n# - qiniu.uploadUrl:上传入口(按七牛空间所在区域选择)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# =========================\n# AI 开关(按需)\n# =========================\n# - enabled 默认引用 hm.deepseek.summary-enabled / hm.volcengine.cover-enabled\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "e4cea6bda05efbd706df7b4c18bb9c03f499e6d5": {"t": 1785769124.6039412, "n": 2893, "h": "acef37a56811e661", "c": "\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # DeepSeek(OpenAI 兼容 API);密钥建议用环境变量 hm.deepseek.api-key\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# 七牛云图床(管理端直传需要后端下发 uploadToken)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# 是否在保存文章时,在描述为空时自动调用模型生成简介\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "1d0ba211181f2035a387ba4633cc542bbd6d42d8": {"t": 1785769125.9953592, "n": 2893, "h": "acef37a56811e661", "c": "\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:${hm.db.port:3306}/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # DeepSeek(OpenAI 兼容 API);密钥建议用环境变量 hm.deepseek.api-key\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# 七牛云图床(管理端直传需要后端下发 uploadToken)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# 是否在保存文章时,在描述为空时自动调用模型生成简介\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "4740e9fdf2e7973f65227b28fd967f811c837344": {"t": 1785769127.6477733, "n": 2879, "h": "655f24bdbead443e", "c": "\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:3306/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # DeepSeek(OpenAI 兼容 API);密钥建议用环境变量 hm.deepseek.api-key\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# 七牛云图床(管理端直传需要后端下发 uploadToken)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# 是否在保存文章时,在描述为空时自动调用模型生成简介\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "b04000fc7bba766957a9200682659ebc5a44a660": {"t": 1785769128.8669624, "n": 2879, "h": "655f24bdbead443e", "c": "\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:3306/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${hm.db.username}\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # DeepSeek(OpenAI 兼容 API);密钥建议用环境变量 hm.deepseek.api-key\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# 七牛云图床(管理端直传需要后端下发 uploadToken)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# 是否在保存文章时,在描述为空时自动调用模型生成简介\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "ab69eec84a9c8368cf7960d5b7cd63e9412df0ed": {"t": 1785769130.4925337, "n": 2866, "h": "c641f354f24c1c88", "c": "\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:3306/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # DeepSeek(OpenAI 兼容 API);密钥建议用环境变量 hm.deepseek.api-key\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# 七牛云图床(管理端直传需要后端下发 uploadToken)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# 是否在保存文章时,在描述为空时自动调用模型生成简介\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "8d5c77afc1f3c2601cad6bccb0aa8d96c78bf6bb": {"t": 1785769131.8784368, "n": 2866, "h": "c641f354f24c1c88", "c": "\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:3306/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n # DeepSeek(OpenAI 兼容 API);密钥建议用环境变量 hm.deepseek.api-key\n ai:\n openai:\n api-key: ${hm.deepseek.api-key:}\n base-url: https://api.deepseek.com\n chat:\n options:\n model: deepseek-chat\n temperature: 0.3\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\n# AI:封面/简介在 INFO 输出 [AI-COVER] / [AI-SUMMARY](需 blog.ai.*.verbose-* 为 true);包级 DEBUG 保留其它调试行\nlogging:\n level:\n cn.ayeez.blogserver.service.ai: DEBUG\n cn.ayeez.blogserver.controller.admin.AdminAiController: DEBUG\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# 七牛云图床(管理端直传需要后端下发 uploadToken)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n\n# 是否在保存文章时,在描述为空时自动调用模型生成简介\nblog:\n ai:\n summary:\n enabled: ${hm.deepseek.summary-enabled:false}\n max-content-chars: 12000\n max-description-length: 240\n # 为 true 时 INFO 打印 DeepSeek 系统/用户提示词与模型原始输出\n verbose-log: ${hm.deepseek.verbose-log:true}\n # 火山引擎即梦:智能视觉 CVProcess(签名鉴权)→ 临时图 URL → 下载后转存七牛\n # 密钥为控制台「访问控制」API 访问密钥(Access Key + Secret),非百炼 sk-。\n cover:\n enabled: ${hm.volcengine.cover-enabled:false}\n access-key: ${hm.volcengine.access-key:}\n secret-key: ${hm.volcengine.secret-key:}\n host: visual.volcengineapi.com\n action: CVProcess\n version: 2022-08-31\n region: cn-north-1\n service: cv\n req-key: jimeng_high_aes_general_v21_L\n width: 1664\n height: 928\n seed: -1\n return-url: true\n max-content-excerpt-chars: 2000\n max-total-prompt-chars: 1200\n max-user-prompt-chars: 300\n # 为 true 时易改写 prompt、偏离固定封面风格,建议 false\n use-pre-llm: ${hm.volcengine.use-pre-llm:false}\n # 为 true 时 INFO 打印即梦完整请求 JSON、URL、响应体(不含 Authorization 明文)\n verbose-http-log: ${hm.volcengine.verbose-http-log:true}\n"}, "942a6945404bc6e7c8e3a05d22d1139196593e7b": {"t": 1785769133.0978205, "n": 1294, "h": "9e9627a62bdc2de6", "c": "#TODO部署后要改配置\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:3306/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# 七牛云图床(管理端直传需要后端下发 uploadToken)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n"}, "b5274970c2946a275e087fd71a793ed81ee17417": {"t": 1785769134.9239757, "n": 1294, "h": "9e9627a62bdc2de6", "c": "#TODO部署后要改配置\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:3306/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# 七牛云图床(管理端直传需要后端下发 uploadToken)\nqiniu:\n accessKey: ${hm.qiniu.access-key:}\n secretKey: ${hm.qiniu.secret-key:}\n bucket: ${hm.qiniu.bucket:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${hm.qiniu.domain:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${hm.qiniu.upload-url:https://up-z2.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${hm.qiniu.token-expires:1800}\n"}, "c4ea90c6de872c2279d5bbb248a3228c25c2f3e1": {"t": 1785769136.163504, "n": 1277, "h": "10d9e2d2a4aa6848", "c": "#TODO部署后要改配置\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:3306/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# 七牛云图床(管理端直传需要后端下发 uploadToken)\nqiniu:\n accessKey: ${QINIU_ACCESS_KEY:}\n secretKey: ${QINIU_SECRET_KEY:}\n bucket: ${QINIU_BUCKET:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${QINIU_DOMAIN:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${QINIU_UPLOAD_URL:https://upload.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${QINIU_TOKEN_EXPIRES:1800}\n"}, "1136dacc6cfd553fb0189b812d83400a12e8ed48": {"t": 1785769137.522672, "n": 1277, "h": "10d9e2d2a4aa6848", "c": "#TODO部署后要改配置\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:3306/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n\n# 七牛云图床(管理端直传需要后端下发 uploadToken)\nqiniu:\n accessKey: ${QINIU_ACCESS_KEY:}\n secretKey: ${QINIU_SECRET_KEY:}\n bucket: ${QINIU_BUCKET:}\n # 外链域名(例如:https://img.example.com 或 https://xxx.qiniucdn.com)\n domain: ${QINIU_DOMAIN:}\n # 上传入口(默认华东);如需按区域替换为对应 upload host\n uploadUrl: ${QINIU_UPLOAD_URL:https://upload.qiniup.com}\n # token 有效期(秒)\n tokenExpires: ${QINIU_TOKEN_EXPIRES:1800}\n"}, "90ae625338bfcaebb6b1d57f28d58222d7b23da2": {"t": 1785769139.0275862, "n": 892, "h": "0d0727db63dc451c", "c": "#TODO部署后要改配置\n#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://${hm.db.host}:3306/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: ${hm.db.password}\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n"}, "21e06863adc2701c84cad8141947860c805b89b9": {"t": 1785769140.2586877, "n": 862, "h": "4f1051cacf191394", "c": "#配置数据库的连接信息\nspring:\n application:\n name: blog-server\n #数据库的链接信息\n datasource:\n url: jdbc:mysql://localhost:3306/ayeezblog\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: 1234\n servlet:\n multipart:\n max-file-size: 10MB\n max-request-size: 100MB\n\n#mybatis的相关配置\nmybatis:\n configuration:\n log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n #开启驼峰命名映射\n map-underscore-to-camel-case: true\n # 添加Mapper位置配置\n mapper-locations: classpath:mapper/*.xml\n type-aliases-package: cn.ayeez.blogpojo.entity\n\n# PageHelper分页配置\npagehelper:\n helper-dialect: mysql\n reasonable: true\n support-methods-arguments: true\n params: pageNum=pageNum;pageSize=pageSize;\n\n# 服务器端口配置\nserver:\n port: 8080\n\naliyun:\n oss:\n endpoint: https://oss-cn-beijing.aliyuncs.com\n bucketName: javaweb-ayeez\n region: cn-beijing\n"}}, ".github/workflows/cicd-deploy.yml": {"e391a287b097b4c4c85b6b9db76b41919ae7c4d9": {"t": 1785747038.6968577, "n": 9942, "h": "70d6d65f692f3fdf", "c": "name: CI/CD Deploy (Single Production)\n\non:\n push:\n branches: [ master ]\n paths:\n - \"AyeezBlog-Backend/**\"\n - \"AyeezBlog-Frontend/**\"\n - \"AyeezBlog-AdminPanel/**\"\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n workflow_dispatch:\n\njobs:\n detect-changes:\n runs-on: ubuntu-latest\n outputs:\n backend: ${{ steps.filter.outputs.backend }}\n frontend: ${{ steps.filter.outputs.frontend }}\n adminpanel: ${{ steps.filter.outputs.adminpanel }}\n deploy_other: ${{ steps.filter.outputs.deploy_other }}\n runtime_config: ${{ steps.filter.outputs.runtime_config }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Detect changed paths\n id: filter\n uses: dorny/paths-filter@v3\n with:\n filters: |\n backend:\n - \"AyeezBlog-Backend/**\"\n frontend:\n - \"AyeezBlog-Frontend/**\"\n adminpanel:\n - \"AyeezBlog-AdminPanel/**\"\n deploy_other:\n - \"deploy/**\"\n - \"!deploy/prod/runtime-config.yml\"\n runtime_config:\n - \"deploy/prod/runtime-config.yml\"\n\n deploy-runtime-config:\n needs: detect-changes\n if: needs.detect-changes.outputs.runtime_config == 'true' && needs.detect-changes.outputs.backend != 'true'\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure deploy config directory\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR/deploy/prod\"\n\n - name: Upload runtime config only\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"deploy/prod/runtime-config.yml\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Verify backend container not recreated\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n docker inspect ayeezblog-backend --format='StartedAt={{.State.StartedAt}} Status={{.State.Status}} RestartCount={{.RestartCount}}'\n\n - name: Trigger runtime config reload without restart\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n echo \"Triggering runtime config reload...\"\n curl -fsS http://127.0.0.1:8080/post/runtime/reload-config\n echo\n echo \"Current runtime config:\"\n curl -fsS http://127.0.0.1:8080/post/runtime/config\n\n deploy-stack:\n needs: detect-changes\n if: needs.detect-changes.outputs.backend == 'true' || (needs.detect-changes.outputs.deploy_other == 'true' && needs.detect-changes.outputs.runtime_config != 'true')\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n HM_JWT_SECRET_KEY: ${{ secrets.HM_JWT_SECRET_KEY }}\n HM_DB_USER: ${{ secrets.HM_DB_USER }}\n HM_DB_PASSWORD: ${{ secrets.HM_DB_PASSWORD }}\n MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD || '' }}\n QINIU_ACCESS_KEY: ${{ secrets.QINIU_ACCESS_KEY }}\n QINIU_SECRET_KEY: ${{ secrets.QINIU_SECRET_KEY }}\n QINIU_BUCKET: ${{ secrets.QINIU_BUCKET }}\n QINIU_DOMAIN: ${{ secrets.QINIU_DOMAIN }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n VOLCENGINE_ACCESS_KEY: ${{ secrets.VOLCENGINE_ACCESS_KEY }}\n VOLCENGINE_SECRET_KEY: ${{ secrets.VOLCENGINE_SECRET_KEY }}\n MYSQL_VOLUME_NAME: 00bf7a5c3317bc4d650e5815dbfd74b4866867e2d46cba4e75958b8434e28e08\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure source sync target\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR\"\n\n - name: Upload source to server\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"AyeezBlog-Backend,deploy\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Compose deploy on server\n uses: appleboy/ssh-action@v1.2.0\n env:\n CHANGED_BACKEND: ${{ needs.detect-changes.outputs.backend }}\n CHANGED_DEPLOY_OTHER: ${{ needs.detect-changes.outputs.deploy_other }}\n CHANGED_RUNTIME_CONFIG: ${{ needs.detect-changes.outputs.runtime_config }}\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 60m\n envs: SERVER_BASE_DIR,HM_JWT_SECRET_KEY,HM_DB_USER,HM_DB_PASSWORD,MYSQL_ROOT_PASSWORD,QINIU_ACCESS_KEY,QINIU_SECRET_KEY,QINIU_BUCKET,QINIU_DOMAIN,DEEPSEEK_API_KEY,VOLCENGINE_ACCESS_KEY,VOLCENGINE_SECRET_KEY,MYSQL_VOLUME_NAME,CHANGED_BACKEND,CHANGED_DEPLOY_OTHER,CHANGED_RUNTIME_CONFIG\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n SOURCE_DIR=\"$BASE_DIR\"\n cd \"$SOURCE_DIR\"\n\n cat > deploy/prod/.env <<EOF\n TZ=Asia/Shanghai\n MYSQL_VOLUME_NAME=${MYSQL_VOLUME_NAME}\n MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}\n HM_DB_USER=${HM_DB_USER}\n HM_DB_PASSWORD=${HM_DB_PASSWORD}\n HM_JWT_SECRET_KEY=${HM_JWT_SECRET_KEY}\n QINIU_ACCESS_KEY=${QINIU_ACCESS_KEY}\n QINIU_SECRET_KEY=${QINIU_SECRET_KEY}\n QINIU_BUCKET=${QINIU_BUCKET}\n QINIU_DOMAIN=${QINIU_DOMAIN}\n DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n VOLCENGINE_ACCESS_KEY=${VOLCENGINE_ACCESS_KEY}\n VOLCENGINE_SECRET_KEY=${VOLCENGINE_SECRET_KEY}\n EOF\n\n SERVICES=\"backend\"\n if [ \"${CHANGED_DEPLOY_OTHER}\" = \"true\" ]; then\n SERVICES=\"mysql backend nginx\"\n fi\n\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env up -d --build ${SERVICES}\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env ps\n\n deploy-frontend:\n needs: detect-changes\n if: needs.detect-changes.outputs.frontend == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-Frontend/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-Frontend\n run: npm ci\n\n - name: Build frontend\n working-directory: ./AyeezBlog-Frontend\n run: npm run build\n\n - name: Sync to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete --exclude=admin/\n path: AyeezBlog-Frontend/dist/\n remote_path: /var/lib/docker/volumes/html/_data/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n\n deploy-adminpanel:\n needs: detect-changes\n if: needs.detect-changes.outputs.adminpanel == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-AdminPanel/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-AdminPanel\n run: npm ci\n\n - name: Build admin panel\n working-directory: ./AyeezBlog-AdminPanel\n run: npm run build\n\n - name: Sync admin to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete\n path: AyeezBlog-AdminPanel/dist/\n remote_path: /var/lib/docker/volumes/html/_data/admin/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n"}, "fbbde2ef980e849990da832e9786994c9e96bd21": {"t": 1785769110.2030978, "n": 9942, "h": "70d6d65f692f3fdf", "c": "name: CI/CD Deploy (Single Production)\n\non:\n push:\n branches: [ master ]\n paths:\n - \"AyeezBlog-Backend/**\"\n - \"AyeezBlog-Frontend/**\"\n - \"AyeezBlog-AdminPanel/**\"\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n workflow_dispatch:\n\njobs:\n detect-changes:\n runs-on: ubuntu-latest\n outputs:\n backend: ${{ steps.filter.outputs.backend }}\n frontend: ${{ steps.filter.outputs.frontend }}\n adminpanel: ${{ steps.filter.outputs.adminpanel }}\n deploy_other: ${{ steps.filter.outputs.deploy_other }}\n runtime_config: ${{ steps.filter.outputs.runtime_config }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Detect changed paths\n id: filter\n uses: dorny/paths-filter@v3\n with:\n filters: |\n backend:\n - \"AyeezBlog-Backend/**\"\n frontend:\n - \"AyeezBlog-Frontend/**\"\n adminpanel:\n - \"AyeezBlog-AdminPanel/**\"\n deploy_other:\n - \"deploy/**\"\n - \"!deploy/prod/runtime-config.yml\"\n runtime_config:\n - \"deploy/prod/runtime-config.yml\"\n\n deploy-runtime-config:\n needs: detect-changes\n if: needs.detect-changes.outputs.runtime_config == 'true' && needs.detect-changes.outputs.backend != 'true'\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure deploy config directory\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR/deploy/prod\"\n\n - name: Upload runtime config only\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"deploy/prod/runtime-config.yml\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Verify backend container not recreated\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n docker inspect ayeezblog-backend --format='StartedAt={{.State.StartedAt}} Status={{.State.Status}} RestartCount={{.RestartCount}}'\n\n - name: Trigger runtime config reload without restart\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n echo \"Triggering runtime config reload...\"\n curl -fsS http://127.0.0.1:8080/post/runtime/reload-config\n echo\n echo \"Current runtime config:\"\n curl -fsS http://127.0.0.1:8080/post/runtime/config\n\n deploy-stack:\n needs: detect-changes\n if: needs.detect-changes.outputs.backend == 'true' || (needs.detect-changes.outputs.deploy_other == 'true' && needs.detect-changes.outputs.runtime_config != 'true')\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n HM_JWT_SECRET_KEY: ${{ secrets.HM_JWT_SECRET_KEY }}\n HM_DB_USER: ${{ secrets.HM_DB_USER }}\n HM_DB_PASSWORD: ${{ secrets.HM_DB_PASSWORD }}\n MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD || '' }}\n QINIU_ACCESS_KEY: ${{ secrets.QINIU_ACCESS_KEY }}\n QINIU_SECRET_KEY: ${{ secrets.QINIU_SECRET_KEY }}\n QINIU_BUCKET: ${{ secrets.QINIU_BUCKET }}\n QINIU_DOMAIN: ${{ secrets.QINIU_DOMAIN }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n VOLCENGINE_ACCESS_KEY: ${{ secrets.VOLCENGINE_ACCESS_KEY }}\n VOLCENGINE_SECRET_KEY: ${{ secrets.VOLCENGINE_SECRET_KEY }}\n MYSQL_VOLUME_NAME: 00bf7a5c3317bc4d650e5815dbfd74b4866867e2d46cba4e75958b8434e28e08\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure source sync target\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR\"\n\n - name: Upload source to server\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"AyeezBlog-Backend,deploy\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Compose deploy on server\n uses: appleboy/ssh-action@v1.2.0\n env:\n CHANGED_BACKEND: ${{ needs.detect-changes.outputs.backend }}\n CHANGED_DEPLOY_OTHER: ${{ needs.detect-changes.outputs.deploy_other }}\n CHANGED_RUNTIME_CONFIG: ${{ needs.detect-changes.outputs.runtime_config }}\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 60m\n envs: SERVER_BASE_DIR,HM_JWT_SECRET_KEY,HM_DB_USER,HM_DB_PASSWORD,MYSQL_ROOT_PASSWORD,QINIU_ACCESS_KEY,QINIU_SECRET_KEY,QINIU_BUCKET,QINIU_DOMAIN,DEEPSEEK_API_KEY,VOLCENGINE_ACCESS_KEY,VOLCENGINE_SECRET_KEY,MYSQL_VOLUME_NAME,CHANGED_BACKEND,CHANGED_DEPLOY_OTHER,CHANGED_RUNTIME_CONFIG\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n SOURCE_DIR=\"$BASE_DIR\"\n cd \"$SOURCE_DIR\"\n\n cat > deploy/prod/.env <<EOF\n TZ=Asia/Shanghai\n MYSQL_VOLUME_NAME=${MYSQL_VOLUME_NAME}\n MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}\n HM_DB_USER=${HM_DB_USER}\n HM_DB_PASSWORD=${HM_DB_PASSWORD}\n HM_JWT_SECRET_KEY=${HM_JWT_SECRET_KEY}\n QINIU_ACCESS_KEY=${QINIU_ACCESS_KEY}\n QINIU_SECRET_KEY=${QINIU_SECRET_KEY}\n QINIU_BUCKET=${QINIU_BUCKET}\n QINIU_DOMAIN=${QINIU_DOMAIN}\n DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n VOLCENGINE_ACCESS_KEY=${VOLCENGINE_ACCESS_KEY}\n VOLCENGINE_SECRET_KEY=${VOLCENGINE_SECRET_KEY}\n EOF\n\n SERVICES=\"backend\"\n if [ \"${CHANGED_DEPLOY_OTHER}\" = \"true\" ]; then\n SERVICES=\"mysql backend nginx\"\n fi\n\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env up -d --build ${SERVICES}\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env ps\n\n deploy-frontend:\n needs: detect-changes\n if: needs.detect-changes.outputs.frontend == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-Frontend/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-Frontend\n run: npm ci\n\n - name: Build frontend\n working-directory: ./AyeezBlog-Frontend\n run: npm run build\n\n - name: Sync to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete --exclude=admin/\n path: AyeezBlog-Frontend/dist/\n remote_path: /var/lib/docker/volumes/html/_data/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n\n deploy-adminpanel:\n needs: detect-changes\n if: needs.detect-changes.outputs.adminpanel == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-AdminPanel/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-AdminPanel\n run: npm ci\n\n - name: Build admin panel\n working-directory: ./AyeezBlog-AdminPanel\n run: npm run build\n\n - name: Sync admin to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete\n path: AyeezBlog-AdminPanel/dist/\n remote_path: /var/lib/docker/volumes/html/_data/admin/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n"}, "8b5affdb4c9e85d1980c1d2ade65c1d683165623": {"t": 1785769111.4965112, "n": 9320, "h": "76edbdba62b150f3", "c": "name: CI/CD Deploy (Single Production)\n\non:\n push:\n branches: [ master ]\n paths:\n - \"AyeezBlog-Backend/**\"\n - \"AyeezBlog-Frontend/**\"\n - \"AyeezBlog-AdminPanel/**\"\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n workflow_dispatch:\n\njobs:\n detect-changes:\n runs-on: ubuntu-latest\n outputs:\n backend: ${{ steps.filter.outputs.backend }}\n frontend: ${{ steps.filter.outputs.frontend }}\n adminpanel: ${{ steps.filter.outputs.adminpanel }}\n deploy_other: ${{ steps.filter.outputs.deploy_other }}\n runtime_config: ${{ steps.filter.outputs.runtime_config }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Detect changed paths\n id: filter\n uses: dorny/paths-filter@v3\n with:\n filters: |\n backend:\n - \"AyeezBlog-Backend/**\"\n frontend:\n - \"AyeezBlog-Frontend/**\"\n adminpanel:\n - \"AyeezBlog-AdminPanel/**\"\n deploy_other:\n - \"deploy/**\"\n - \"!deploy/prod/runtime-config.yml\"\n runtime_config:\n - \"deploy/prod/runtime-config.yml\"\n\n deploy-runtime-config:\n needs: detect-changes\n if: needs.detect-changes.outputs.runtime_config == 'true' && needs.detect-changes.outputs.backend != 'true'\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure deploy config directory\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR/deploy/prod\"\n\n - name: Upload runtime config only\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"deploy/prod/runtime-config.yml\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Verify backend container not recreated\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n docker inspect ayeezblog-backend --format='StartedAt={{.State.StartedAt}} Status={{.State.Status}} RestartCount={{.RestartCount}}'\n\n deploy-stack:\n needs: detect-changes\n if: needs.detect-changes.outputs.backend == 'true' || (needs.detect-changes.outputs.deploy_other == 'true' && needs.detect-changes.outputs.runtime_config != 'true')\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n HM_JWT_SECRET_KEY: ${{ secrets.HM_JWT_SECRET_KEY }}\n HM_DB_USER: ${{ secrets.HM_DB_USER }}\n HM_DB_PASSWORD: ${{ secrets.HM_DB_PASSWORD }}\n MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD || '' }}\n QINIU_ACCESS_KEY: ${{ secrets.QINIU_ACCESS_KEY }}\n QINIU_SECRET_KEY: ${{ secrets.QINIU_SECRET_KEY }}\n QINIU_BUCKET: ${{ secrets.QINIU_BUCKET }}\n QINIU_DOMAIN: ${{ secrets.QINIU_DOMAIN }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n VOLCENGINE_ACCESS_KEY: ${{ secrets.VOLCENGINE_ACCESS_KEY }}\n VOLCENGINE_SECRET_KEY: ${{ secrets.VOLCENGINE_SECRET_KEY }}\n MYSQL_VOLUME_NAME: 00bf7a5c3317bc4d650e5815dbfd74b4866867e2d46cba4e75958b8434e28e08\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure source sync target\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR\"\n\n - name: Upload source to server\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"AyeezBlog-Backend,deploy\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Compose deploy on server\n uses: appleboy/ssh-action@v1.2.0\n env:\n CHANGED_BACKEND: ${{ needs.detect-changes.outputs.backend }}\n CHANGED_DEPLOY_OTHER: ${{ needs.detect-changes.outputs.deploy_other }}\n CHANGED_RUNTIME_CONFIG: ${{ needs.detect-changes.outputs.runtime_config }}\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 60m\n envs: SERVER_BASE_DIR,HM_JWT_SECRET_KEY,HM_DB_USER,HM_DB_PASSWORD,MYSQL_ROOT_PASSWORD,QINIU_ACCESS_KEY,QINIU_SECRET_KEY,QINIU_BUCKET,QINIU_DOMAIN,DEEPSEEK_API_KEY,VOLCENGINE_ACCESS_KEY,VOLCENGINE_SECRET_KEY,MYSQL_VOLUME_NAME,CHANGED_BACKEND,CHANGED_DEPLOY_OTHER,CHANGED_RUNTIME_CONFIG\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n SOURCE_DIR=\"$BASE_DIR\"\n cd \"$SOURCE_DIR\"\n\n cat > deploy/prod/.env <<EOF\n TZ=Asia/Shanghai\n MYSQL_VOLUME_NAME=${MYSQL_VOLUME_NAME}\n MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}\n HM_DB_USER=${HM_DB_USER}\n HM_DB_PASSWORD=${HM_DB_PASSWORD}\n HM_JWT_SECRET_KEY=${HM_JWT_SECRET_KEY}\n QINIU_ACCESS_KEY=${QINIU_ACCESS_KEY}\n QINIU_SECRET_KEY=${QINIU_SECRET_KEY}\n QINIU_BUCKET=${QINIU_BUCKET}\n QINIU_DOMAIN=${QINIU_DOMAIN}\n DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n VOLCENGINE_ACCESS_KEY=${VOLCENGINE_ACCESS_KEY}\n VOLCENGINE_SECRET_KEY=${VOLCENGINE_SECRET_KEY}\n EOF\n\n SERVICES=\"backend\"\n if [ \"${CHANGED_DEPLOY_OTHER}\" = \"true\" ]; then\n SERVICES=\"mysql backend nginx\"\n fi\n\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env up -d --build ${SERVICES}\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env ps\n\n deploy-frontend:\n needs: detect-changes\n if: needs.detect-changes.outputs.frontend == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-Frontend/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-Frontend\n run: npm ci\n\n - name: Build frontend\n working-directory: ./AyeezBlog-Frontend\n run: npm run build\n\n - name: Sync to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete --exclude=admin/\n path: AyeezBlog-Frontend/dist/\n remote_path: /var/lib/docker/volumes/html/_data/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n\n deploy-adminpanel:\n needs: detect-changes\n if: needs.detect-changes.outputs.adminpanel == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-AdminPanel/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-AdminPanel\n run: npm ci\n\n - name: Build admin panel\n working-directory: ./AyeezBlog-AdminPanel\n run: npm run build\n\n - name: Sync admin to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete\n path: AyeezBlog-AdminPanel/dist/\n remote_path: /var/lib/docker/volumes/html/_data/admin/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n"}, "09eaba7e42c8c108e6e9bfeaea0bca9e6f4da33e": {"t": 1785769113.183482, "n": 9316, "h": "494541c4fbf74196", "c": "name: CI/CD Deploy (Single Production)\n\non:\n push:\n branches: [ master ]\n paths:\n - \"AyeezBlog-Backend/**\"\n - \"AyeezBlog-Frontend/**\"\n - \"AyeezBlog-AdminPanel/**\"\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n workflow_dispatch:\n\njobs:\n detect-changes:\n runs-on: ubuntu-latest\n outputs:\n backend: ${{ steps.filter.outputs.backend }}\n frontend: ${{ steps.filter.outputs.frontend }}\n adminpanel: ${{ steps.filter.outputs.adminpanel }}\n deploy_other: ${{ steps.filter.outputs.deploy_other }}\n runtime_config: ${{ steps.filter.outputs.runtime_config }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Detect changed paths\n id: filter\n uses: dorny/paths-filter@v3\n with:\n filters: |\n backend:\n - \"AyeezBlog-Backend/**\"\n frontend:\n - \"AyeezBlog-Frontend/**\"\n adminpanel:\n - \"AyeezBlog-AdminPanel/**\"\n deploy_other:\n - \"deploy/**\"\n - \"!deploy/prod/runtime-config.yml\"\n runtime_config:\n - \"deploy/prod/runtime-config.yml\"\n\n deploy-runtime-config:\n needs: detect-changes\n if: needs.detect-changes.outputs.runtime_config == 'true' && needs.detect-changes.outputs.backend != 'true' && needs.detect-changes.outputs.deploy_other != 'true'\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure deploy config directory\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR/deploy/prod\"\n\n - name: Upload runtime config only\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"deploy/prod/runtime-config.yml\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Verify backend container not recreated\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n docker inspect ayeezblog-backend --format='StartedAt={{.State.StartedAt}} Status={{.State.Status}} RestartCount={{.RestartCount}}'\n\n deploy-stack:\n needs: detect-changes\n if: needs.detect-changes.outputs.backend == 'true' || needs.detect-changes.outputs.deploy_other == 'true'\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n HM_JWT_SECRET_KEY: ${{ secrets.HM_JWT_SECRET_KEY }}\n HM_DB_USER: ${{ secrets.HM_DB_USER }}\n HM_DB_PASSWORD: ${{ secrets.HM_DB_PASSWORD }}\n MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD || '' }}\n QINIU_ACCESS_KEY: ${{ secrets.QINIU_ACCESS_KEY }}\n QINIU_SECRET_KEY: ${{ secrets.QINIU_SECRET_KEY }}\n QINIU_BUCKET: ${{ secrets.QINIU_BUCKET }}\n QINIU_DOMAIN: ${{ secrets.QINIU_DOMAIN }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n VOLCENGINE_ACCESS_KEY: ${{ secrets.VOLCENGINE_ACCESS_KEY }}\n VOLCENGINE_SECRET_KEY: ${{ secrets.VOLCENGINE_SECRET_KEY }}\n MYSQL_VOLUME_NAME: 00bf7a5c3317bc4d650e5815dbfd74b4866867e2d46cba4e75958b8434e28e08\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure source sync target\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR\"\n\n - name: Upload source to server\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"AyeezBlog-Backend,deploy\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Compose deploy on server\n uses: appleboy/ssh-action@v1.2.0\n env:\n CHANGED_BACKEND: ${{ needs.detect-changes.outputs.backend }}\n CHANGED_DEPLOY_OTHER: ${{ needs.detect-changes.outputs.deploy_other }}\n CHANGED_RUNTIME_CONFIG: ${{ needs.detect-changes.outputs.runtime_config }}\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 60m\n envs: SERVER_BASE_DIR,HM_JWT_SECRET_KEY,HM_DB_USER,HM_DB_PASSWORD,MYSQL_ROOT_PASSWORD,QINIU_ACCESS_KEY,QINIU_SECRET_KEY,QINIU_BUCKET,QINIU_DOMAIN,DEEPSEEK_API_KEY,VOLCENGINE_ACCESS_KEY,VOLCENGINE_SECRET_KEY,MYSQL_VOLUME_NAME,CHANGED_BACKEND,CHANGED_DEPLOY_OTHER,CHANGED_RUNTIME_CONFIG\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n SOURCE_DIR=\"$BASE_DIR\"\n cd \"$SOURCE_DIR\"\n\n cat > deploy/prod/.env <<EOF\n TZ=Asia/Shanghai\n MYSQL_VOLUME_NAME=${MYSQL_VOLUME_NAME}\n MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}\n HM_DB_USER=${HM_DB_USER}\n HM_DB_PASSWORD=${HM_DB_PASSWORD}\n HM_JWT_SECRET_KEY=${HM_JWT_SECRET_KEY}\n QINIU_ACCESS_KEY=${QINIU_ACCESS_KEY}\n QINIU_SECRET_KEY=${QINIU_SECRET_KEY}\n QINIU_BUCKET=${QINIU_BUCKET}\n QINIU_DOMAIN=${QINIU_DOMAIN}\n DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n VOLCENGINE_ACCESS_KEY=${VOLCENGINE_ACCESS_KEY}\n VOLCENGINE_SECRET_KEY=${VOLCENGINE_SECRET_KEY}\n EOF\n\n SERVICES=\"backend\"\n if [ \"${CHANGED_DEPLOY_OTHER}\" = \"true\" ]; then\n SERVICES=\"mysql backend nginx\"\n fi\n\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env up -d --build ${SERVICES}\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env ps\n\n deploy-frontend:\n needs: detect-changes\n if: needs.detect-changes.outputs.frontend == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-Frontend/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-Frontend\n run: npm ci\n\n - name: Build frontend\n working-directory: ./AyeezBlog-Frontend\n run: npm run build\n\n - name: Sync to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete --exclude=admin/\n path: AyeezBlog-Frontend/dist/\n remote_path: /var/lib/docker/volumes/html/_data/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n\n deploy-adminpanel:\n needs: detect-changes\n if: needs.detect-changes.outputs.adminpanel == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-AdminPanel/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-AdminPanel\n run: npm ci\n\n - name: Build admin panel\n working-directory: ./AyeezBlog-AdminPanel\n run: npm run build\n\n - name: Sync admin to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete\n path: AyeezBlog-AdminPanel/dist/\n remote_path: /var/lib/docker/volumes/html/_data/admin/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n"}, "4f23b73fb6d4c5806588332cff04f7c8fd4c522c": {"t": 1785769114.5194716, "n": 9368, "h": "f6c422c80130c42c", "c": "name: CI/CD Deploy (Single Production)\n\non:\n push:\n branches: [ master ]\n paths:\n - \"AyeezBlog-Backend/**\"\n - \"AyeezBlog-Frontend/**\"\n - \"AyeezBlog-AdminPanel/**\"\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n workflow_dispatch:\n\njobs:\n detect-changes:\n runs-on: ubuntu-latest\n outputs:\n backend: ${{ steps.filter.outputs.backend }}\n frontend: ${{ steps.filter.outputs.frontend }}\n adminpanel: ${{ steps.filter.outputs.adminpanel }}\n deploy_other: ${{ steps.filter.outputs.deploy_other }}\n runtime_config: ${{ steps.filter.outputs.runtime_config }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Detect changed paths\n id: filter\n uses: dorny/paths-filter@v3\n with:\n filters: |\n backend:\n - \"AyeezBlog-Backend/**\"\n frontend:\n - \"AyeezBlog-Frontend/**\"\n adminpanel:\n - \"AyeezBlog-AdminPanel/**\"\n deploy_other:\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n - \"!deploy/prod/runtime-config.yml\"\n runtime_config:\n - \"deploy/prod/runtime-config.yml\"\n\n deploy-runtime-config:\n needs: detect-changes\n if: needs.detect-changes.outputs.runtime_config == 'true' && needs.detect-changes.outputs.backend != 'true' && needs.detect-changes.outputs.deploy_other != 'true'\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure deploy config directory\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR/deploy/prod\"\n\n - name: Upload runtime config only\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"deploy/prod/runtime-config.yml\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Verify backend container not recreated\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n docker inspect ayeezblog-backend --format='StartedAt={{.State.StartedAt}} Status={{.State.Status}} RestartCount={{.RestartCount}}'\n\n deploy-stack:\n needs: detect-changes\n if: needs.detect-changes.outputs.backend == 'true' || needs.detect-changes.outputs.deploy_other == 'true'\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n HM_JWT_SECRET_KEY: ${{ secrets.HM_JWT_SECRET_KEY }}\n HM_DB_USER: ${{ secrets.HM_DB_USER }}\n HM_DB_PASSWORD: ${{ secrets.HM_DB_PASSWORD }}\n MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD || '' }}\n QINIU_ACCESS_KEY: ${{ secrets.QINIU_ACCESS_KEY }}\n QINIU_SECRET_KEY: ${{ secrets.QINIU_SECRET_KEY }}\n QINIU_BUCKET: ${{ secrets.QINIU_BUCKET }}\n QINIU_DOMAIN: ${{ secrets.QINIU_DOMAIN }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n VOLCENGINE_ACCESS_KEY: ${{ secrets.VOLCENGINE_ACCESS_KEY }}\n VOLCENGINE_SECRET_KEY: ${{ secrets.VOLCENGINE_SECRET_KEY }}\n MYSQL_VOLUME_NAME: 00bf7a5c3317bc4d650e5815dbfd74b4866867e2d46cba4e75958b8434e28e08\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure source sync target\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR\"\n\n - name: Upload source to server\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"AyeezBlog-Backend,deploy\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Compose deploy on server\n uses: appleboy/ssh-action@v1.2.0\n env:\n CHANGED_BACKEND: ${{ needs.detect-changes.outputs.backend }}\n CHANGED_DEPLOY_OTHER: ${{ needs.detect-changes.outputs.deploy_other }}\n CHANGED_RUNTIME_CONFIG: ${{ needs.detect-changes.outputs.runtime_config }}\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 60m\n envs: SERVER_BASE_DIR,HM_JWT_SECRET_KEY,HM_DB_USER,HM_DB_PASSWORD,MYSQL_ROOT_PASSWORD,QINIU_ACCESS_KEY,QINIU_SECRET_KEY,QINIU_BUCKET,QINIU_DOMAIN,DEEPSEEK_API_KEY,VOLCENGINE_ACCESS_KEY,VOLCENGINE_SECRET_KEY,MYSQL_VOLUME_NAME,CHANGED_BACKEND,CHANGED_DEPLOY_OTHER,CHANGED_RUNTIME_CONFIG\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n SOURCE_DIR=\"$BASE_DIR\"\n cd \"$SOURCE_DIR\"\n\n cat > deploy/prod/.env <<EOF\n TZ=Asia/Shanghai\n MYSQL_VOLUME_NAME=${MYSQL_VOLUME_NAME}\n MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}\n HM_DB_USER=${HM_DB_USER}\n HM_DB_PASSWORD=${HM_DB_PASSWORD}\n HM_JWT_SECRET_KEY=${HM_JWT_SECRET_KEY}\n QINIU_ACCESS_KEY=${QINIU_ACCESS_KEY}\n QINIU_SECRET_KEY=${QINIU_SECRET_KEY}\n QINIU_BUCKET=${QINIU_BUCKET}\n QINIU_DOMAIN=${QINIU_DOMAIN}\n DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n VOLCENGINE_ACCESS_KEY=${VOLCENGINE_ACCESS_KEY}\n VOLCENGINE_SECRET_KEY=${VOLCENGINE_SECRET_KEY}\n EOF\n\n SERVICES=\"backend\"\n if [ \"${CHANGED_DEPLOY_OTHER}\" = \"true\" ]; then\n SERVICES=\"mysql backend nginx\"\n fi\n\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env up -d --build ${SERVICES}\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env ps\n\n deploy-frontend:\n needs: detect-changes\n if: needs.detect-changes.outputs.frontend == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-Frontend/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-Frontend\n run: npm ci\n\n - name: Build frontend\n working-directory: ./AyeezBlog-Frontend\n run: npm run build\n\n - name: Sync to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete --exclude=admin/\n path: AyeezBlog-Frontend/dist/\n remote_path: /var/lib/docker/volumes/html/_data/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n\n deploy-adminpanel:\n needs: detect-changes\n if: needs.detect-changes.outputs.adminpanel == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-AdminPanel/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-AdminPanel\n run: npm ci\n\n - name: Build admin panel\n working-directory: ./AyeezBlog-AdminPanel\n run: npm run build\n\n - name: Sync admin to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete\n path: AyeezBlog-AdminPanel/dist/\n remote_path: /var/lib/docker/volumes/html/_data/admin/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n"}, "42ee53132daf6b4463e28c05f07c22ca9bef6a9f": {"t": 1785769115.861481, "n": 7887, "h": "f1365894ccc14c10", "c": "name: CI/CD Deploy (Single Production)\n\non:\n push:\n branches: [ master ]\n paths:\n - \"AyeezBlog-Backend/**\"\n - \"AyeezBlog-Frontend/**\"\n - \"AyeezBlog-AdminPanel/**\"\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n workflow_dispatch:\n\njobs:\n detect-changes:\n runs-on: ubuntu-latest\n outputs:\n backend: ${{ steps.filter.outputs.backend }}\n frontend: ${{ steps.filter.outputs.frontend }}\n adminpanel: ${{ steps.filter.outputs.adminpanel }}\n deploy_other: ${{ steps.filter.outputs.deploy_other }}\n runtime_config: ${{ steps.filter.outputs.runtime_config }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Detect changed paths\n id: filter\n uses: dorny/paths-filter@v3\n with:\n filters: |\n backend:\n - \"AyeezBlog-Backend/**\"\n frontend:\n - \"AyeezBlog-Frontend/**\"\n adminpanel:\n - \"AyeezBlog-AdminPanel/**\"\n deploy_other:\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n - \"!deploy/prod/runtime-config.yml\"\n runtime_config:\n - \"deploy/prod/runtime-config.yml\"\n\n deploy-stack:\n needs: detect-changes\n if: needs.detect-changes.outputs.backend == 'true' || needs.detect-changes.outputs.deploy_other == 'true' || needs.detect-changes.outputs.runtime_config == 'true'\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n HM_JWT_SECRET_KEY: ${{ secrets.HM_JWT_SECRET_KEY }}\n HM_DB_USER: ${{ secrets.HM_DB_USER }}\n HM_DB_PASSWORD: ${{ secrets.HM_DB_PASSWORD }}\n MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD || '' }}\n QINIU_ACCESS_KEY: ${{ secrets.QINIU_ACCESS_KEY }}\n QINIU_SECRET_KEY: ${{ secrets.QINIU_SECRET_KEY }}\n QINIU_BUCKET: ${{ secrets.QINIU_BUCKET }}\n QINIU_DOMAIN: ${{ secrets.QINIU_DOMAIN }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n VOLCENGINE_ACCESS_KEY: ${{ secrets.VOLCENGINE_ACCESS_KEY }}\n VOLCENGINE_SECRET_KEY: ${{ secrets.VOLCENGINE_SECRET_KEY }}\n MYSQL_VOLUME_NAME: 00bf7a5c3317bc4d650e5815dbfd74b4866867e2d46cba4e75958b8434e28e08\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure source sync target\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR\"\n\n - name: Upload source to server\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"AyeezBlog-Backend,deploy\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Compose deploy on server\n uses: appleboy/ssh-action@v1.2.0\n env:\n CHANGED_BACKEND: ${{ needs.detect-changes.outputs.backend }}\n CHANGED_DEPLOY_OTHER: ${{ needs.detect-changes.outputs.deploy_other }}\n CHANGED_RUNTIME_CONFIG: ${{ needs.detect-changes.outputs.runtime_config }}\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 60m\n envs: SERVER_BASE_DIR,HM_JWT_SECRET_KEY,HM_DB_USER,HM_DB_PASSWORD,MYSQL_ROOT_PASSWORD,QINIU_ACCESS_KEY,QINIU_SECRET_KEY,QINIU_BUCKET,QINIU_DOMAIN,DEEPSEEK_API_KEY,VOLCENGINE_ACCESS_KEY,VOLCENGINE_SECRET_KEY,MYSQL_VOLUME_NAME,CHANGED_BACKEND,CHANGED_DEPLOY_OTHER,CHANGED_RUNTIME_CONFIG\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n SOURCE_DIR=\"$BASE_DIR\"\n cd \"$SOURCE_DIR\"\n\n cat > deploy/prod/.env <<EOF\n TZ=Asia/Shanghai\n MYSQL_VOLUME_NAME=${MYSQL_VOLUME_NAME}\n MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}\n HM_DB_USER=${HM_DB_USER}\n HM_DB_PASSWORD=${HM_DB_PASSWORD}\n HM_JWT_SECRET_KEY=${HM_JWT_SECRET_KEY}\n QINIU_ACCESS_KEY=${QINIU_ACCESS_KEY}\n QINIU_SECRET_KEY=${QINIU_SECRET_KEY}\n QINIU_BUCKET=${QINIU_BUCKET}\n QINIU_DOMAIN=${QINIU_DOMAIN}\n DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n VOLCENGINE_ACCESS_KEY=${VOLCENGINE_ACCESS_KEY}\n VOLCENGINE_SECRET_KEY=${VOLCENGINE_SECRET_KEY}\n EOF\n\n # 仅修改 runtime-config.yml 时,不执行 compose up,避免重启容器。\n if [ \"${CHANGED_RUNTIME_CONFIG}\" = \"true\" ] && [ \"${CHANGED_BACKEND}\" != \"true\" ] && [ \"${CHANGED_DEPLOY_OTHER}\" != \"true\" ]; then\n echo \"Detected runtime config only change. Skip compose up to keep containers running.\"\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env ps\n exit 0\n fi\n\n SERVICES=\"backend\"\n if [ \"${CHANGED_DEPLOY_OTHER}\" = \"true\" ]; then\n SERVICES=\"mysql backend nginx\"\n fi\n\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env up -d --build ${SERVICES}\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env ps\n\n deploy-frontend:\n needs: detect-changes\n if: needs.detect-changes.outputs.frontend == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-Frontend/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-Frontend\n run: npm ci\n\n - name: Build frontend\n working-directory: ./AyeezBlog-Frontend\n run: npm run build\n\n - name: Sync to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete --exclude=admin/\n path: AyeezBlog-Frontend/dist/\n remote_path: /var/lib/docker/volumes/html/_data/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n\n deploy-adminpanel:\n needs: detect-changes\n if: needs.detect-changes.outputs.adminpanel == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-AdminPanel/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-AdminPanel\n run: npm ci\n\n - name: Build admin panel\n working-directory: ./AyeezBlog-AdminPanel\n run: npm run build\n\n - name: Sync admin to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete\n path: AyeezBlog-AdminPanel/dist/\n remote_path: /var/lib/docker/volumes/html/_data/admin/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n"}, "6bd54fc23b00634aee03e08963d9997889eb7179": {"t": 1785769117.3122933, "n": 7142, "h": "1b821627c0e9ec2f", "c": "name: CI/CD Deploy (Single Production)\n\non:\n push:\n branches: [ master ]\n paths:\n - \"AyeezBlog-Backend/**\"\n - \"AyeezBlog-Frontend/**\"\n - \"AyeezBlog-AdminPanel/**\"\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n workflow_dispatch:\n\njobs:\n detect-changes:\n runs-on: ubuntu-latest\n outputs:\n backend: ${{ steps.filter.outputs.backend }}\n frontend: ${{ steps.filter.outputs.frontend }}\n adminpanel: ${{ steps.filter.outputs.adminpanel }}\n deploy: ${{ steps.filter.outputs.deploy }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Detect changed paths\n id: filter\n uses: dorny/paths-filter@v3\n with:\n filters: |\n backend:\n - \"AyeezBlog-Backend/**\"\n frontend:\n - \"AyeezBlog-Frontend/**\"\n adminpanel:\n - \"AyeezBlog-AdminPanel/**\"\n deploy:\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n\n deploy-stack:\n needs: detect-changes\n if: needs.detect-changes.outputs.backend == 'true' || needs.detect-changes.outputs.deploy == 'true'\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n HM_JWT_SECRET_KEY: ${{ secrets.HM_JWT_SECRET_KEY }}\n HM_DB_USER: ${{ secrets.HM_DB_USER }}\n HM_DB_PASSWORD: ${{ secrets.HM_DB_PASSWORD }}\n MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD || '' }}\n QINIU_ACCESS_KEY: ${{ secrets.QINIU_ACCESS_KEY }}\n QINIU_SECRET_KEY: ${{ secrets.QINIU_SECRET_KEY }}\n QINIU_BUCKET: ${{ secrets.QINIU_BUCKET }}\n QINIU_DOMAIN: ${{ secrets.QINIU_DOMAIN }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n VOLCENGINE_ACCESS_KEY: ${{ secrets.VOLCENGINE_ACCESS_KEY }}\n VOLCENGINE_SECRET_KEY: ${{ secrets.VOLCENGINE_SECRET_KEY }}\n MYSQL_VOLUME_NAME: 00bf7a5c3317bc4d650e5815dbfd74b4866867e2d46cba4e75958b8434e28e08\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure source sync target\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 15m\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR\"\n\n - name: Upload source to server\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"AyeezBlog-Backend,deploy\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Compose deploy on server\n uses: appleboy/ssh-action@v1.2.0\n env:\n CHANGED_BACKEND: ${{ needs.detect-changes.outputs.backend }}\n CHANGED_DEPLOY: ${{ needs.detect-changes.outputs.deploy }}\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n timeout: 60s\n command_timeout: 60m\n envs: SERVER_BASE_DIR,HM_JWT_SECRET_KEY,HM_DB_USER,HM_DB_PASSWORD,MYSQL_ROOT_PASSWORD,QINIU_ACCESS_KEY,QINIU_SECRET_KEY,QINIU_BUCKET,QINIU_DOMAIN,DEEPSEEK_API_KEY,VOLCENGINE_ACCESS_KEY,VOLCENGINE_SECRET_KEY,MYSQL_VOLUME_NAME,CHANGED_BACKEND,CHANGED_DEPLOY\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n SOURCE_DIR=\"$BASE_DIR\"\n cd \"$SOURCE_DIR\"\n\n cat > deploy/prod/.env <<EOF\n TZ=Asia/Shanghai\n MYSQL_VOLUME_NAME=${MYSQL_VOLUME_NAME}\n MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}\n HM_DB_USER=${HM_DB_USER}\n HM_DB_PASSWORD=${HM_DB_PASSWORD}\n HM_JWT_SECRET_KEY=${HM_JWT_SECRET_KEY}\n QINIU_ACCESS_KEY=${QINIU_ACCESS_KEY}\n QINIU_SECRET_KEY=${QINIU_SECRET_KEY}\n QINIU_BUCKET=${QINIU_BUCKET}\n QINIU_DOMAIN=${QINIU_DOMAIN}\n DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n VOLCENGINE_ACCESS_KEY=${VOLCENGINE_ACCESS_KEY}\n VOLCENGINE_SECRET_KEY=${VOLCENGINE_SECRET_KEY}\n EOF\n\n SERVICES=\"backend\"\n if [ \"${CHANGED_DEPLOY}\" = \"true\" ]; then\n SERVICES=\"mysql backend nginx\"\n fi\n\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env up -d --build ${SERVICES}\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env ps\n\n deploy-frontend:\n needs: detect-changes\n if: needs.detect-changes.outputs.frontend == 'true' || needs.detect-changes.outputs.deploy == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-Frontend/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-Frontend\n run: npm ci\n\n - name: Build frontend\n working-directory: ./AyeezBlog-Frontend\n run: npm run build\n\n - name: Sync to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete --exclude=admin/\n path: AyeezBlog-Frontend/dist/\n remote_path: /var/lib/docker/volumes/html/_data/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n\n deploy-adminpanel:\n needs: detect-changes\n if: needs.detect-changes.outputs.adminpanel == 'true' || needs.detect-changes.outputs.deploy == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-AdminPanel/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-AdminPanel\n run: npm ci\n\n - name: Build admin panel\n working-directory: ./AyeezBlog-AdminPanel\n run: npm run build\n\n - name: Sync admin to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete\n path: AyeezBlog-AdminPanel/dist/\n remote_path: /var/lib/docker/volumes/html/_data/admin/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n"}, "d81ad0d4327dbf723ae576af9a35edb21e66241c": {"t": 1785769118.6295426, "n": 7034, "h": "b88e0c5a6f862c88", "c": "name: CI/CD Deploy (Single Production)\n\non:\n push:\n branches: [ master ]\n paths:\n - \"AyeezBlog-Backend/**\"\n - \"AyeezBlog-Frontend/**\"\n - \"AyeezBlog-AdminPanel/**\"\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n workflow_dispatch:\n\njobs:\n detect-changes:\n runs-on: ubuntu-latest\n outputs:\n backend: ${{ steps.filter.outputs.backend }}\n frontend: ${{ steps.filter.outputs.frontend }}\n adminpanel: ${{ steps.filter.outputs.adminpanel }}\n deploy: ${{ steps.filter.outputs.deploy }}\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Detect changed paths\n id: filter\n uses: dorny/paths-filter@v3\n with:\n filters: |\n backend:\n - \"AyeezBlog-Backend/**\"\n frontend:\n - \"AyeezBlog-Frontend/**\"\n adminpanel:\n - \"AyeezBlog-AdminPanel/**\"\n deploy:\n - \"deploy/**\"\n - \".github/workflows/cicd-deploy.yml\"\n\n deploy-stack:\n needs: detect-changes\n if: needs.detect-changes.outputs.backend == 'true' || needs.detect-changes.outputs.deploy == 'true'\n runs-on: ubuntu-latest\n env:\n SERVER_HOST: ${{ secrets.SERVER_HOST }}\n SERVER_PORT: ${{ secrets.SERVER_PORT || '22' }}\n SERVER_USER: ${{ secrets.SERVER_USER }}\n SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}\n SERVER_BASE_DIR: ${{ secrets.SERVER_BASE_DIR || '/opt/ayeezblog' }}\n HM_JWT_SECRET_KEY: ${{ secrets.HM_JWT_SECRET_KEY }}\n HM_DB_USER: ${{ secrets.HM_DB_USER }}\n HM_DB_PASSWORD: ${{ secrets.HM_DB_PASSWORD }}\n MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD || '' }}\n QINIU_ACCESS_KEY: ${{ secrets.QINIU_ACCESS_KEY }}\n QINIU_SECRET_KEY: ${{ secrets.QINIU_SECRET_KEY }}\n QINIU_BUCKET: ${{ secrets.QINIU_BUCKET }}\n QINIU_DOMAIN: ${{ secrets.QINIU_DOMAIN }}\n DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}\n VOLCENGINE_ACCESS_KEY: ${{ secrets.VOLCENGINE_ACCESS_KEY }}\n VOLCENGINE_SECRET_KEY: ${{ secrets.VOLCENGINE_SECRET_KEY }}\n MYSQL_VOLUME_NAME: 00bf7a5c3317bc4d650e5815dbfd74b4866867e2d46cba4e75958b8434e28e08\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Ensure source sync target\n uses: appleboy/ssh-action@v1.2.0\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n mkdir -p \"$BASE_DIR\"\n\n - name: Upload source to server\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n source: \"AyeezBlog-Backend,deploy\"\n target: ${{ env.SERVER_BASE_DIR }}\n overwrite: true\n strip_components: 0\n\n - name: Compose deploy on server\n uses: appleboy/ssh-action@v1.2.0\n env:\n CHANGED_BACKEND: ${{ needs.detect-changes.outputs.backend }}\n CHANGED_DEPLOY: ${{ needs.detect-changes.outputs.deploy }}\n with:\n host: ${{ env.SERVER_HOST }}\n username: ${{ env.SERVER_USER }}\n port: ${{ env.SERVER_PORT }}\n key: ${{ env.SERVER_SSH_KEY }}\n envs: SERVER_BASE_DIR,HM_JWT_SECRET_KEY,HM_DB_USER,HM_DB_PASSWORD,MYSQL_ROOT_PASSWORD,QINIU_ACCESS_KEY,QINIU_SECRET_KEY,QINIU_BUCKET,QINIU_DOMAIN,DEEPSEEK_API_KEY,VOLCENGINE_ACCESS_KEY,VOLCENGINE_SECRET_KEY,MYSQL_VOLUME_NAME,CHANGED_BACKEND,CHANGED_DEPLOY\n script: |\n set -eu\n BASE_DIR=\"${SERVER_BASE_DIR:-/opt/ayeezblog}\"\n SOURCE_DIR=\"$BASE_DIR\"\n cd \"$SOURCE_DIR\"\n\n cat > deploy/prod/.env <<EOF\n TZ=Asia/Shanghai\n MYSQL_VOLUME_NAME=${MYSQL_VOLUME_NAME}\n MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}\n HM_DB_USER=${HM_DB_USER}\n HM_DB_PASSWORD=${HM_DB_PASSWORD}\n HM_JWT_SECRET_KEY=${HM_JWT_SECRET_KEY}\n QINIU_ACCESS_KEY=${QINIU_ACCESS_KEY}\n QINIU_SECRET_KEY=${QINIU_SECRET_KEY}\n QINIU_BUCKET=${QINIU_BUCKET}\n QINIU_DOMAIN=${QINIU_DOMAIN}\n DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}\n VOLCENGINE_ACCESS_KEY=${VOLCENGINE_ACCESS_KEY}\n VOLCENGINE_SECRET_KEY=${VOLCENGINE_SECRET_KEY}\n EOF\n\n SERVICES=\"backend\"\n if [ \"${CHANGED_DEPLOY}\" = \"true\" ]; then\n SERVICES=\"mysql backend nginx\"\n fi\n\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env up -d --build ${SERVICES}\n docker compose -f deploy/prod/docker-compose.yml --env-file deploy/prod/.env ps\n\n deploy-frontend:\n needs: detect-changes\n if: needs.detect-changes.outputs.frontend == 'true' || needs.detect-changes.outputs.deploy == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-Frontend/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-Frontend\n run: npm ci\n\n - name: Build frontend\n working-directory: ./AyeezBlog-Frontend\n run: npm run build\n\n - name: Sync to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete --exclude=admin/\n path: AyeezBlog-Frontend/dist/\n remote_path: /var/lib/docker/volumes/html/_data/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n\n deploy-adminpanel:\n needs: detect-changes\n if: needs.detect-changes.outputs.adminpanel == 'true' || needs.detect-changes.outputs.deploy == 'true'\n runs-on: ubuntu-latest\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node\n uses: actions/setup-node@v4\n with:\n node-version: 18\n cache: npm\n cache-dependency-path: AyeezBlog-AdminPanel/package-lock.json\n\n - name: Install dependencies\n working-directory: ./AyeezBlog-AdminPanel\n run: npm ci\n\n - name: Build admin panel\n working-directory: ./AyeezBlog-AdminPanel\n run: npm run build\n\n - name: Sync admin to nginx html volume\n uses: burnett01/rsync-deployments@7.0.1\n with:\n switches: -avz --delete\n path: AyeezBlog-AdminPanel/dist/\n remote_path: /var/lib/docker/volumes/html/_data/admin/\n remote_host: ${{ secrets.SERVER_HOST }}\n remote_user: ${{ secrets.SERVER_USER }}\n remote_key: ${{ secrets.SERVER_SSH_KEY }}\n"}}}}