1 line
167 KiB
JSON
1 line
167 KiB
JSON
{"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"}}}} |