[{"data":1,"prerenderedAt":1617},["ShallowReactive",2],{"navigation":3,"github-latest-release":76,"docs-\u002Fdocs\u002Fguide\u002Fupgrade":79,"surround-\u002Fdocs\u002Fguide\u002Fupgrade":1612},[4],{"title":5,"path":6,"stem":7,"children":8,"page":42},"Docs","\u002Fdocs","docs",[9,43],{"title":10,"path":11,"stem":12,"children":13,"page":42},"Guide","\u002Fdocs\u002Fguide","docs\u002F1.guide",[14,18,22,26,30,34,38],{"title":15,"path":16,"stem":17},"介绍","\u002Fdocs\u002Fguide\u002Fintroduction","docs\u002F1.guide\u002F1.introduction",{"title":19,"path":20,"stem":21},"快速开始","\u002Fdocs\u002Fguide\u002Fquick-start","docs\u002F1.guide\u002F2.quick-start",{"title":23,"path":24,"stem":25},"配置说明","\u002Fdocs\u002Fguide\u002Fconfiguration","docs\u002F1.guide\u002F3.configuration",{"title":27,"path":28,"stem":29},"存储配置","\u002Fdocs\u002Fguide\u002Fstorage","docs\u002F1.guide\u002F4.storage",{"title":31,"path":32,"stem":33},"生产部署","\u002Fdocs\u002Fguide\u002Fdeployment","docs\u002F1.guide\u002F5.deployment",{"title":35,"path":36,"stem":37},"升级指南","\u002Fdocs\u002Fguide\u002Fupgrade","docs\u002F1.guide\u002F6.upgrade",{"title":39,"path":40,"stem":41},"第三方客户端","\u002Fdocs\u002Fguide\u002Fclients","docs\u002F1.guide\u002F7.clients",false,{"title":44,"path":45,"stem":46,"children":47,"page":42},"Api","\u002Fdocs\u002Fapi","docs\u002F2.api",[48,52,56,60,64,68,72],{"title":49,"path":50,"stem":51},"概述","\u002Fdocs\u002Fapi\u002Foverview","docs\u002F2.api\u002F1.overview",{"title":53,"path":54,"stem":55},"认证","\u002Fdocs\u002Fapi\u002Fauthentication","docs\u002F2.api\u002F2.authentication",{"title":57,"path":58,"stem":59},"文件上传","\u002Fdocs\u002Fapi\u002Fupload","docs\u002F2.api\u002F3.upload",{"title":61,"path":62,"stem":63},"文件管理","\u002Fdocs\u002Fapi\u002Ffiles","docs\u002F2.api\u002F4.files",{"title":65,"path":66,"stem":67},"相册","\u002Fdocs\u002Fapi\u002Falbums","docs\u002F2.api\u002F5.albums",{"title":69,"path":70,"stem":71},"API Token","\u002Fdocs\u002Fapi\u002Ftokens","docs\u002F2.api\u002F6.tokens",{"title":73,"path":74,"stem":75},"管理员 API","\u002Fdocs\u002Fapi\u002Fadmin","docs\u002F2.api\u002F7.admin",{"tag":77,"url":78},"v0.1.5","https:\u002F\u002Fgithub.com\u002Famigoer\u002Fkite\u002Freleases\u002Ftag\u002Fv0.1.5",{"id":80,"title":35,"body":81,"description":1606,"extension":1607,"meta":1608,"navigation":1609,"path":36,"seo":1610,"stem":37,"__hash__":1611},"docs\u002Fdocs\u002F1.guide\u002F6.upgrade.md",{"type":82,"value":83,"toc":1577},"minimark",[84,107,111,166,176,179,209,264,280,283,290,295,340,344,424,428,455,465,469,637,655,659,665,702,709,745,748,774,778,936,949,953,1012,1015,1059,1062,1068,1086,1142,1154,1157,1160,1190,1193,1223,1226,1233,1236,1311,1315,1325,1342,1345,1390,1393,1458,1461,1465,1468,1479,1483,1498,1501,1512,1515,1524,1527,1551,1554,1573],[85,86,87,88,95,96,101,102,106],"p",{},"Kite 遵循语义化版本（",[89,90,94],"a",{"href":91,"rel":92},"https:\u002F\u002Fsemver.org\u002Flang\u002Fzh-CN\u002F",[93],"nofollow","SemVer","），发布节奏以 ",[89,97,100],{"href":98,"rel":99},"https:\u002F\u002Fgithub.com\u002Famigoer\u002Fkite\u002Freleases",[93],"GitHub Releases"," 为准。每次升级推荐按",[103,104,105],"strong",{},"备份 → 升级 → 校验 → 回滚预案","的顺序执行。",[108,109,110],"h2",{"id":110},"升级流程总览",[112,113,118],"pre",{"className":114,"code":115,"language":116,"meta":117,"style":117},"language-mermaid shiki shiki-themes github-light github-dark","flowchart LR\n  Backup[备份数据] --> Pull[拉取新版本]\n  Pull --> Restart[重启服务]\n  Restart --> Migrate[自动数据库迁移]\n  Migrate --> Verify[校验功能]\n  Verify -->|异常| Rollback[回滚到上一个版本]\n  Verify -->|正常| Done[完成]\n","mermaid","",[119,120,121,130,136,142,148,154,160],"code",{"__ignoreMap":117},[122,123,126],"span",{"class":124,"line":125},"line",1,[122,127,129],{"class":128},"sVt8B","flowchart LR\n",[122,131,133],{"class":124,"line":132},2,[122,134,135],{"class":128},"  Backup[备份数据] --> Pull[拉取新版本]\n",[122,137,139],{"class":124,"line":138},3,[122,140,141],{"class":128},"  Pull --> Restart[重启服务]\n",[122,143,145],{"class":124,"line":144},4,[122,146,147],{"class":128},"  Restart --> Migrate[自动数据库迁移]\n",[122,149,151],{"class":124,"line":150},5,[122,152,153],{"class":128},"  Migrate --> Verify[校验功能]\n",[122,155,157],{"class":124,"line":156},6,[122,158,159],{"class":128},"  Verify -->|异常| Rollback[回滚到上一个版本]\n",[122,161,163],{"class":124,"line":162},7,[122,164,165],{"class":128},"  Verify -->|正常| Done[完成]\n",[167,168,169],"tip",{},[85,170,171,172,175],{},"Kite 每次启动都会通过 GORM 的 ",[119,173,174],{},"AutoMigrate"," 自动建表与补列，无需手动执行迁移脚本。但你仍应在升级前做一次完整备份。",[108,177,178],{"id":178},"升级前检查",[180,181,182,206],"ol",{},[183,184,185,186,190,191],"li",{},"查看 ",[89,187,189],{"href":98,"rel":188},[93],"Releases"," 的变更日志，特别关注：\n",[192,193,194,200,203],"ul",{},[183,195,196,199],{},[103,197,198],{},"Breaking changes","（通常见于主版本号变更）",[183,201,202],{},"新增的环境变量默认值",[183,204,205],{},"配置 \u002F 存储策略的兼容性说明",[183,207,208],{},"确认当前版本号，便于出现问题时回滚：",[112,210,214],{"className":211,"code":212,"language":213,"meta":117,"style":117},"language-bash shiki shiki-themes github-light github-dark","# Docker\ndocker inspect --format='{{.Config.Image}}' kite\n\n# 二进制\n.\u002Fkite -v    # 或 .\u002Fkite version（视版本而定）\n","bash",[119,215,216,222,242,248,253],{"__ignoreMap":117},[122,217,218],{"class":124,"line":125},[122,219,221],{"class":220},"sJ8bj","# Docker\n",[122,223,224,228,232,236,239],{"class":124,"line":132},[122,225,227],{"class":226},"sScJk","docker",[122,229,231],{"class":230},"sZZnC"," inspect",[122,233,235],{"class":234},"sj4cs"," --format=",[122,237,238],{"class":230},"'{{.Config.Image}}'",[122,240,241],{"class":230}," kite\n",[122,243,244],{"class":124,"line":138},[122,245,247],{"emptyLinePlaceholder":246},true,"\n",[122,249,250],{"class":124,"line":144},[122,251,252],{"class":220},"# 二进制\n",[122,254,255,258,261],{"class":124,"line":150},[122,256,257],{"class":226},".\u002Fkite",[122,259,260],{"class":234}," -v",[122,262,263],{"class":220},"    # 或 .\u002Fkite version（视版本而定）\n",[180,265,266],{"start":138},[183,267,268,269],{},"确认下述路径与权限仍然可用：\n",[192,270,271,274,277],{},[183,272,273],{},"数据目录（SQLite 与本地上传文件）",[183,275,276],{},"对象存储凭证仍然有效",[183,278,279],{},"反向代理的证书未过期",[108,281,282],{"id":282},"备份数据",[85,284,285,286,289],{},"无论采用哪种部署方式，升级前都",[103,287,288],{},"强烈建议","完整备份数据目录与数据库。",[291,292,294],"h3",{"id":293},"sqlite-本地存储","SQLite + 本地存储",[112,296,298],{"className":211,"code":297,"language":213,"meta":117,"style":117},"# 打包整个 data 目录（含 kite.db、uploads\u002F、thumbnails\u002F）\ntar -czf kite-backup-$(date +%F-%H%M).tar.gz -C \u002Fopt\u002Fkite data\n",[119,299,300,305],{"__ignoreMap":117},[122,301,302],{"class":124,"line":125},[122,303,304],{"class":220},"# 打包整个 data 目录（含 kite.db、uploads\u002F、thumbnails\u002F）\n",[122,306,307,310,313,316,319,322,325,328,331,334,337],{"class":124,"line":132},[122,308,309],{"class":226},"tar",[122,311,312],{"class":234}," -czf",[122,314,315],{"class":230}," kite-backup-",[122,317,318],{"class":128},"$(",[122,320,321],{"class":226},"date",[122,323,324],{"class":230}," +%F-%H%M",[122,326,327],{"class":128},")",[122,329,330],{"class":230},".tar.gz",[122,332,333],{"class":234}," -C",[122,335,336],{"class":230}," \u002Fopt\u002Fkite",[122,338,339],{"class":230}," data\n",[291,341,343],{"id":342},"mysql-postgresql","MySQL \u002F PostgreSQL",[112,345,347],{"className":211,"code":346,"language":213,"meta":117,"style":117},"# MySQL\nmysqldump -u kite -p kite > kite-$(date +%F).sql\n\n# PostgreSQL\npg_dump -U kite kite > kite-$(date +%F).sql\n",[119,348,349,354,389,393,398],{"__ignoreMap":117},[122,350,351],{"class":124,"line":125},[122,352,353],{"class":220},"# MySQL\n",[122,355,356,359,362,365,368,370,374,377,379,381,384,386],{"class":124,"line":132},[122,357,358],{"class":226},"mysqldump",[122,360,361],{"class":234}," -u",[122,363,364],{"class":230}," kite",[122,366,367],{"class":234}," -p",[122,369,364],{"class":230},[122,371,373],{"class":372},"szBVR"," >",[122,375,376],{"class":230}," kite-",[122,378,318],{"class":128},[122,380,321],{"class":226},[122,382,383],{"class":230}," +%F",[122,385,327],{"class":128},[122,387,388],{"class":230},".sql\n",[122,390,391],{"class":124,"line":138},[122,392,247],{"emptyLinePlaceholder":246},[122,394,395],{"class":124,"line":144},[122,396,397],{"class":220},"# PostgreSQL\n",[122,399,400,403,406,408,410,412,414,416,418,420,422],{"class":124,"line":150},[122,401,402],{"class":226},"pg_dump",[122,404,405],{"class":234}," -U",[122,407,364],{"class":230},[122,409,364],{"class":230},[122,411,373],{"class":372},[122,413,376],{"class":230},[122,415,318],{"class":128},[122,417,321],{"class":226},[122,419,383],{"class":230},[122,421,327],{"class":128},[122,423,388],{"class":230},[291,425,427],{"id":426},"仅数据库文件托管在-s3-时","仅数据库（文件托管在 S3 时）",[112,429,431],{"className":211,"code":430,"language":213,"meta":117,"style":117},"cp \u002Fopt\u002Fkite\u002Fdata\u002Fkite.db \u002Fopt\u002Fkite\u002Fkite-$(date +%F).db\n",[119,432,433],{"__ignoreMap":117},[122,434,435,438,441,444,446,448,450,452],{"class":124,"line":125},[122,436,437],{"class":226},"cp",[122,439,440],{"class":230}," \u002Fopt\u002Fkite\u002Fdata\u002Fkite.db",[122,442,443],{"class":230}," \u002Fopt\u002Fkite\u002Fkite-",[122,445,318],{"class":128},[122,447,321],{"class":226},[122,449,383],{"class":230},[122,451,327],{"class":128},[122,453,454],{"class":230},".db\n",[456,457,458],"warning",{},[85,459,460,461,464],{},"升级",[103,462,463],{},"有状态服务","时，数据库备份与对象存储的时间戳应尽可能一致，否则回滚后可能出现「数据库有记录但 S3 没对应文件」的孤立引用。",[108,466,468],{"id":467},"方案一docker-升级","方案一：Docker 升级",[112,470,472],{"className":211,"code":471,"language":213,"meta":117,"style":117},"# 1. 拉取新镜像\ndocker pull amigoer\u002Fkite:latest\n\n# 2. 停止并删除旧容器（数据目录通过 -v 持久化，不会丢失）\ndocker stop kite && docker rm kite\n\n# 3. 用相同参数启动新容器\ndocker run -d \\\n  --name kite \\\n  -p 8080:8080 \\\n  -v \u002Fopt\u002Fkite\u002Fdata:\u002Fapp\u002Fdata \\\n  -e GIN_MODE=release \\\n  -e KITE_SITE_URL=https:\u002F\u002Fkite.example.com \\\n  --restart unless-stopped \\\n  amigoer\u002Fkite:latest\n\n# 4. 观察启动日志\ndocker logs -f --tail=100 kite\n",[119,473,474,479,489,493,498,517,521,526,540,550,561,572,583,593,604,610,615,621],{"__ignoreMap":117},[122,475,476],{"class":124,"line":125},[122,477,478],{"class":220},"# 1. 拉取新镜像\n",[122,480,481,483,486],{"class":124,"line":132},[122,482,227],{"class":226},[122,484,485],{"class":230}," pull",[122,487,488],{"class":230}," amigoer\u002Fkite:latest\n",[122,490,491],{"class":124,"line":138},[122,492,247],{"emptyLinePlaceholder":246},[122,494,495],{"class":124,"line":144},[122,496,497],{"class":220},"# 2. 停止并删除旧容器（数据目录通过 -v 持久化，不会丢失）\n",[122,499,500,502,505,507,510,512,515],{"class":124,"line":150},[122,501,227],{"class":226},[122,503,504],{"class":230}," stop",[122,506,364],{"class":230},[122,508,509],{"class":128}," && ",[122,511,227],{"class":226},[122,513,514],{"class":230}," rm",[122,516,241],{"class":230},[122,518,519],{"class":124,"line":156},[122,520,247],{"emptyLinePlaceholder":246},[122,522,523],{"class":124,"line":162},[122,524,525],{"class":220},"# 3. 用相同参数启动新容器\n",[122,527,529,531,534,537],{"class":124,"line":528},8,[122,530,227],{"class":226},[122,532,533],{"class":230}," run",[122,535,536],{"class":234}," -d",[122,538,539],{"class":234}," \\\n",[122,541,543,546,548],{"class":124,"line":542},9,[122,544,545],{"class":234},"  --name",[122,547,364],{"class":230},[122,549,539],{"class":234},[122,551,553,556,559],{"class":124,"line":552},10,[122,554,555],{"class":234},"  -p",[122,557,558],{"class":230}," 8080:8080",[122,560,539],{"class":234},[122,562,564,567,570],{"class":124,"line":563},11,[122,565,566],{"class":234},"  -v",[122,568,569],{"class":230}," \u002Fopt\u002Fkite\u002Fdata:\u002Fapp\u002Fdata",[122,571,539],{"class":234},[122,573,575,578,581],{"class":124,"line":574},12,[122,576,577],{"class":234},"  -e",[122,579,580],{"class":230}," GIN_MODE=release",[122,582,539],{"class":234},[122,584,586,588,591],{"class":124,"line":585},13,[122,587,577],{"class":234},[122,589,590],{"class":230}," KITE_SITE_URL=https:\u002F\u002Fkite.example.com",[122,592,539],{"class":234},[122,594,596,599,602],{"class":124,"line":595},14,[122,597,598],{"class":234},"  --restart",[122,600,601],{"class":230}," unless-stopped",[122,603,539],{"class":234},[122,605,607],{"class":124,"line":606},15,[122,608,609],{"class":230},"  amigoer\u002Fkite:latest\n",[122,611,613],{"class":124,"line":612},16,[122,614,247],{"emptyLinePlaceholder":246},[122,616,618],{"class":124,"line":617},17,[122,619,620],{"class":220},"# 4. 观察启动日志\n",[122,622,624,626,629,632,635],{"class":124,"line":623},18,[122,625,227],{"class":226},[122,627,628],{"class":230}," logs",[122,630,631],{"class":234}," -f",[122,633,634],{"class":234}," --tail=100",[122,636,241],{"class":230},[638,639,640],"note",{},[85,641,642,643,646,647,650,651,654],{},"建议在生产环境使用",[103,644,645],{},"具体版本标签","（如 ",[119,648,649],{},"amigoer\u002Fkite:v0.1.5","）而非 ",[119,652,653],{},"latest","，避免下一次重建容器时被意外升级。",[108,656,658],{"id":657},"方案二docker-compose-升级","方案二：Docker Compose 升级",[85,660,661,662,664],{},"如果你按照 ",[89,663,31],{"href":32}," 使用 Compose，升级只需两条命令：",[112,666,668],{"className":211,"code":667,"language":213,"meta":117,"style":117},"cd \u002Fopt\u002Fkite\ndocker compose pull kite\ndocker compose up -d kite\n",[119,669,670,678,689],{"__ignoreMap":117},[122,671,672,675],{"class":124,"line":125},[122,673,674],{"class":234},"cd",[122,676,677],{"class":230}," \u002Fopt\u002Fkite\n",[122,679,680,682,685,687],{"class":124,"line":132},[122,681,227],{"class":226},[122,683,684],{"class":230}," compose",[122,686,485],{"class":230},[122,688,241],{"class":230},[122,690,691,693,695,698,700],{"class":124,"line":138},[122,692,227],{"class":226},[122,694,684],{"class":230},[122,696,697],{"class":230}," up",[122,699,536],{"class":234},[122,701,241],{"class":230},[85,703,704,705,708],{},"Compose 会用新镜像重建 Kite 容器；Nginx 等依赖服务不受影响。若 ",[119,706,707],{},"docker-compose.yml"," 中 Kite 使用了固定版本号，先编辑版本后再执行：",[112,710,714],{"className":711,"code":712,"language":713,"meta":117,"style":117},"language-yaml shiki shiki-themes github-light github-dark","services:\n  kite:\n    image: amigoer\u002Fkite:v0.1.5   # 改成要升级的版本\n","yaml",[119,715,716,725,732],{"__ignoreMap":117},[122,717,718,722],{"class":124,"line":125},[122,719,721],{"class":720},"s9eBZ","services",[122,723,724],{"class":128},":\n",[122,726,727,730],{"class":124,"line":132},[122,728,729],{"class":720},"  kite",[122,731,724],{"class":128},[122,733,734,737,740,742],{"class":124,"line":138},[122,735,736],{"class":720},"    image",[122,738,739],{"class":128},": ",[122,741,649],{"class":230},[122,743,744],{"class":220},"   # 改成要升级的版本\n",[85,746,747],{},"然后：",[112,749,751],{"className":211,"code":750,"language":213,"meta":117,"style":117},"docker compose up -d kite\ndocker compose ps\n",[119,752,753,765],{"__ignoreMap":117},[122,754,755,757,759,761,763],{"class":124,"line":125},[122,756,227],{"class":226},[122,758,684],{"class":230},[122,760,697],{"class":230},[122,762,536],{"class":234},[122,764,241],{"class":230},[122,766,767,769,771],{"class":124,"line":132},[122,768,227],{"class":226},[122,770,684],{"class":230},[122,772,773],{"class":230}," ps\n",[108,775,777],{"id":776},"方案三二进制升级","方案三：二进制升级",[112,779,781],{"className":211,"code":780,"language":213,"meta":117,"style":117},"cd \u002Fopt\u002Fkite\n\n# 1. 下载新版本到临时路径\ncurl -L -o kite.new \\\n  https:\u002F\u002Fgithub.com\u002Famigoer\u002Fkite\u002Freleases\u002Flatest\u002Fdownload\u002Fkite-linux-amd64.tar.gz\ntar -xzf kite.new kite -O > kite.next\nchmod +x kite.next\n\n# 2. 停止当前服务\nsudo systemctl stop kite\n\n# 3. 原地替换（保留旧版本以便回滚）\nmv kite kite.prev && mv kite.next kite\n\n# 4. 启动并查看日志\nsudo systemctl start kite\nsudo journalctl -u kite -f --since=\"1 min ago\"\n",[119,782,783,789,793,798,814,819,838,848,852,857,869,873,878,897,901,906,917],{"__ignoreMap":117},[122,784,785,787],{"class":124,"line":125},[122,786,674],{"class":234},[122,788,677],{"class":230},[122,790,791],{"class":124,"line":132},[122,792,247],{"emptyLinePlaceholder":246},[122,794,795],{"class":124,"line":138},[122,796,797],{"class":220},"# 1. 下载新版本到临时路径\n",[122,799,800,803,806,809,812],{"class":124,"line":144},[122,801,802],{"class":226},"curl",[122,804,805],{"class":234}," -L",[122,807,808],{"class":234}," -o",[122,810,811],{"class":230}," kite.new",[122,813,539],{"class":234},[122,815,816],{"class":124,"line":150},[122,817,818],{"class":230},"  https:\u002F\u002Fgithub.com\u002Famigoer\u002Fkite\u002Freleases\u002Flatest\u002Fdownload\u002Fkite-linux-amd64.tar.gz\n",[122,820,821,823,826,828,830,833,835],{"class":124,"line":156},[122,822,309],{"class":226},[122,824,825],{"class":234}," -xzf",[122,827,811],{"class":230},[122,829,364],{"class":230},[122,831,832],{"class":234}," -O",[122,834,373],{"class":372},[122,836,837],{"class":230}," kite.next\n",[122,839,840,843,846],{"class":124,"line":162},[122,841,842],{"class":226},"chmod",[122,844,845],{"class":230}," +x",[122,847,837],{"class":230},[122,849,850],{"class":124,"line":528},[122,851,247],{"emptyLinePlaceholder":246},[122,853,854],{"class":124,"line":542},[122,855,856],{"class":220},"# 2. 停止当前服务\n",[122,858,859,862,865,867],{"class":124,"line":552},[122,860,861],{"class":226},"sudo",[122,863,864],{"class":230}," systemctl",[122,866,504],{"class":230},[122,868,241],{"class":230},[122,870,871],{"class":124,"line":563},[122,872,247],{"emptyLinePlaceholder":246},[122,874,875],{"class":124,"line":574},[122,876,877],{"class":220},"# 3. 原地替换（保留旧版本以便回滚）\n",[122,879,880,883,885,888,890,892,895],{"class":124,"line":585},[122,881,882],{"class":226},"mv",[122,884,364],{"class":230},[122,886,887],{"class":230}," kite.prev",[122,889,509],{"class":128},[122,891,882],{"class":226},[122,893,894],{"class":230}," kite.next",[122,896,241],{"class":230},[122,898,899],{"class":124,"line":595},[122,900,247],{"emptyLinePlaceholder":246},[122,902,903],{"class":124,"line":606},[122,904,905],{"class":220},"# 4. 启动并查看日志\n",[122,907,908,910,912,915],{"class":124,"line":612},[122,909,861],{"class":226},[122,911,864],{"class":230},[122,913,914],{"class":230}," start",[122,916,241],{"class":230},[122,918,919,921,924,926,928,930,933],{"class":124,"line":617},[122,920,861],{"class":226},[122,922,923],{"class":230}," journalctl",[122,925,361],{"class":234},[122,927,364],{"class":230},[122,929,631],{"class":234},[122,931,932],{"class":234}," --since=",[122,934,935],{"class":230},"\"1 min ago\"\n",[167,937,938],{},[85,939,940,941,944,945,948],{},"保留至少一个历史版本（如上例中的 ",[119,942,943],{},"kite.prev","），可以在出问题时",[103,946,947],{},"秒级回滚","。",[108,950,952],{"id":951},"方案四源码升级","方案四：源码升级",[112,954,956],{"className":211,"code":955,"language":213,"meta":117,"style":117},"cd \u002Fpath\u002Fto\u002Fkite\ngit fetch --tags\ngit checkout v0.1.5       # 切到目标 tag，避免跟随主分支\n\nmake build\nsudo systemctl restart kite\n",[119,957,958,965,976,989,993,1001],{"__ignoreMap":117},[122,959,960,962],{"class":124,"line":125},[122,961,674],{"class":234},[122,963,964],{"class":230}," \u002Fpath\u002Fto\u002Fkite\n",[122,966,967,970,973],{"class":124,"line":132},[122,968,969],{"class":226},"git",[122,971,972],{"class":230}," fetch",[122,974,975],{"class":234}," --tags\n",[122,977,978,980,983,986],{"class":124,"line":138},[122,979,969],{"class":226},[122,981,982],{"class":230}," checkout",[122,984,985],{"class":230}," v0.1.5",[122,987,988],{"class":220},"       # 切到目标 tag，避免跟随主分支\n",[122,990,991],{"class":124,"line":144},[122,992,247],{"emptyLinePlaceholder":246},[122,994,995,998],{"class":124,"line":150},[122,996,997],{"class":226},"make",[122,999,1000],{"class":230}," build\n",[122,1002,1003,1005,1007,1010],{"class":124,"line":156},[122,1004,861],{"class":226},[122,1006,864],{"class":230},[122,1008,1009],{"class":230}," restart",[122,1011,241],{"class":230},[85,1013,1014],{},"若仅升级依赖：",[112,1016,1018],{"className":211,"code":1017,"language":213,"meta":117,"style":117},"go mod tidy\ncd web && pnpm install && cd -\nmake build\n",[119,1019,1020,1031,1053],{"__ignoreMap":117},[122,1021,1022,1025,1028],{"class":124,"line":125},[122,1023,1024],{"class":226},"go",[122,1026,1027],{"class":230}," mod",[122,1029,1030],{"class":230}," tidy\n",[122,1032,1033,1035,1038,1040,1043,1046,1048,1050],{"class":124,"line":132},[122,1034,674],{"class":234},[122,1036,1037],{"class":230}," web",[122,1039,509],{"class":128},[122,1041,1042],{"class":226},"pnpm",[122,1044,1045],{"class":230}," install",[122,1047,509],{"class":128},[122,1049,674],{"class":234},[122,1051,1052],{"class":230}," -\n",[122,1054,1055,1057],{"class":124,"line":138},[122,1056,997],{"class":226},[122,1058,1000],{"class":230},[108,1060,1061],{"id":1061},"数据库迁移",[85,1063,1064,1065,1067],{},"Kite 采用 GORM ",[119,1066,174],{},"，首次启动新版本时会：",[180,1069,1070,1073,1080],{},[183,1071,1072],{},"对比结构体与数据库的列差异",[183,1074,1075,1076,1079],{},"自动",[103,1077,1078],{},"新增列","、创建新表与索引",[183,1081,1082,1085],{},[103,1083,1084],{},"不会"," 删除已有列或修改类型（避免数据丢失）",[1087,1088,1089,1102],"table",{},[1090,1091,1092],"thead",{},[1093,1094,1095,1099],"tr",{},[1096,1097,1098],"th",{},"场景",[1096,1100,1101],{},"行为",[1103,1104,1105,1114,1122,1132],"tbody",{},[1093,1106,1107,1111],{},[1108,1109,1110],"td",{},"新增字段",[1108,1112,1113],{},"启动时自动补列",[1093,1115,1116,1119],{},[1108,1117,1118],{},"新增表",[1108,1120,1121],{},"启动时自动创建",[1093,1123,1124,1127],{},[1108,1125,1126],{},"字段改名",[1108,1128,1129,1131],{},[103,1130,1084],{},"自动重命名，需在 Release Notes 中说明人工操作",[1093,1133,1134,1137],{},[1108,1135,1136],{},"字段删除",[1108,1138,1139,1141],{},[103,1140,1084],{},"删除，表结构会出现「冗余列」，不影响使用",[456,1143,1144],{},[85,1145,1146,1147,1150,1151,948],{},"若某次升级的 Release Notes 标注了「",[103,1148,1149],{},"需要手动迁移","」，请严格按其中的 SQL 脚本执行，且",[103,1152,1153],{},"先备份再迁移",[108,1155,1156],{"id":1156},"升级后校验",[85,1158,1159],{},"升级完成后按以下清单快速验收：",[112,1161,1163],{"className":114,"code":1162,"language":116,"meta":117,"style":117},"flowchart TD\n  Health[GET \u002Fapi\u002Fv1\u002Fsetup\u002Fstatus] --> Login[登录后台]\n  Login --> Upload[上传测试图片]\n  Upload --> Link[访问短链]\n  Link --> Tokens[使用 PicGo 上传一次]\n",[119,1164,1165,1170,1175,1180,1185],{"__ignoreMap":117},[122,1166,1167],{"class":124,"line":125},[122,1168,1169],{"class":128},"flowchart TD\n",[122,1171,1172],{"class":124,"line":132},[122,1173,1174],{"class":128},"  Health[GET \u002Fapi\u002Fv1\u002Fsetup\u002Fstatus] --> Login[登录后台]\n",[122,1176,1177],{"class":124,"line":138},[122,1178,1179],{"class":128},"  Login --> Upload[上传测试图片]\n",[122,1181,1182],{"class":124,"line":144},[122,1183,1184],{"class":128},"  Upload --> Link[访问短链]\n",[122,1186,1187],{"class":124,"line":150},[122,1188,1189],{"class":128},"  Link --> Tokens[使用 PicGo 上传一次]\n",[85,1191,1192],{},"验收清单：",[180,1194,1195,1204,1207,1210,1213],{},[183,1196,1197,1200,1201],{},[119,1198,1199],{},"curl https:\u002F\u002Fkite.example.com\u002Fapi\u002Fv1\u002Fsetup\u002Fstatus"," 返回 ",[119,1202,1203],{},"initialized: true",[183,1205,1206],{},"后台登录正常，已有相册、文件、Token 全部可见",[183,1208,1209],{},"上传新图片得到的短链可在浏览器中打开",[183,1211,1212],{},"原有第三方客户端（PicGo、ShareX 等）无需改动仍可正常上传",[183,1214,1215,1216,1219,1220],{},"日志中没有出现 ",[119,1217,1218],{},"ERROR"," 或 ",[119,1221,1222],{},"panic",[108,1224,1225],{"id":1225},"回滚",[85,1227,1228,1229,1232],{},"若新版本出现严重问题，按部署方式回滚即可。",[103,1230,1231],{},"回滚前务必同步恢复数据库备份","，否则可能因旧代码无法识别新字段而出错。",[291,1234,1235],{"id":227},"Docker",[112,1237,1239],{"className":211,"code":1238,"language":213,"meta":117,"style":117},"docker stop kite && docker rm kite\n\ndocker run -d \\\n  --name kite \\\n  -p 8080:8080 \\\n  -v \u002Fopt\u002Fkite\u002Fdata:\u002Fapp\u002Fdata \\\n  --restart unless-stopped \\\n  amigoer\u002Fkite:v0.1.4    # 回到上一个稳定版本\n",[119,1240,1241,1257,1261,1271,1279,1287,1295,1303],{"__ignoreMap":117},[122,1242,1243,1245,1247,1249,1251,1253,1255],{"class":124,"line":125},[122,1244,227],{"class":226},[122,1246,504],{"class":230},[122,1248,364],{"class":230},[122,1250,509],{"class":128},[122,1252,227],{"class":226},[122,1254,514],{"class":230},[122,1256,241],{"class":230},[122,1258,1259],{"class":124,"line":132},[122,1260,247],{"emptyLinePlaceholder":246},[122,1262,1263,1265,1267,1269],{"class":124,"line":138},[122,1264,227],{"class":226},[122,1266,533],{"class":230},[122,1268,536],{"class":234},[122,1270,539],{"class":234},[122,1272,1273,1275,1277],{"class":124,"line":144},[122,1274,545],{"class":234},[122,1276,364],{"class":230},[122,1278,539],{"class":234},[122,1280,1281,1283,1285],{"class":124,"line":150},[122,1282,555],{"class":234},[122,1284,558],{"class":230},[122,1286,539],{"class":234},[122,1288,1289,1291,1293],{"class":124,"line":156},[122,1290,566],{"class":234},[122,1292,569],{"class":230},[122,1294,539],{"class":234},[122,1296,1297,1299,1301],{"class":124,"line":162},[122,1298,598],{"class":234},[122,1300,601],{"class":230},[122,1302,539],{"class":234},[122,1304,1305,1308],{"class":124,"line":528},[122,1306,1307],{"class":230},"  amigoer\u002Fkite:v0.1.4",[122,1309,1310],{"class":220},"    # 回到上一个稳定版本\n",[291,1312,1314],{"id":1313},"docker-compose","Docker Compose",[85,1316,1317,1318,1320,1321,1324],{},"编辑 ",[119,1319,707],{}," 中的 ",[119,1322,1323],{},"image"," 标签为上一个版本，然后：",[112,1326,1328],{"className":211,"code":1327,"language":213,"meta":117,"style":117},"docker compose up -d kite\n",[119,1329,1330],{"__ignoreMap":117},[122,1331,1332,1334,1336,1338,1340],{"class":124,"line":125},[122,1333,227],{"class":226},[122,1335,684],{"class":230},[122,1337,697],{"class":230},[122,1339,536],{"class":234},[122,1341,241],{"class":230},[291,1343,1344],{"id":1344},"二进制",[112,1346,1348],{"className":211,"code":1347,"language":213,"meta":117,"style":117},"sudo systemctl stop kite\nmv \u002Fopt\u002Fkite\u002Fkite \u002Fopt\u002Fkite\u002Fkite.bad\nmv \u002Fopt\u002Fkite\u002Fkite.prev \u002Fopt\u002Fkite\u002Fkite\nsudo systemctl start kite\n",[119,1349,1350,1360,1370,1380],{"__ignoreMap":117},[122,1351,1352,1354,1356,1358],{"class":124,"line":125},[122,1353,861],{"class":226},[122,1355,864],{"class":230},[122,1357,504],{"class":230},[122,1359,241],{"class":230},[122,1361,1362,1364,1367],{"class":124,"line":132},[122,1363,882],{"class":226},[122,1365,1366],{"class":230}," \u002Fopt\u002Fkite\u002Fkite",[122,1368,1369],{"class":230}," \u002Fopt\u002Fkite\u002Fkite.bad\n",[122,1371,1372,1374,1377],{"class":124,"line":138},[122,1373,882],{"class":226},[122,1375,1376],{"class":230}," \u002Fopt\u002Fkite\u002Fkite.prev",[122,1378,1379],{"class":230}," \u002Fopt\u002Fkite\u002Fkite\n",[122,1381,1382,1384,1386,1388],{"class":124,"line":144},[122,1383,861],{"class":226},[122,1385,864],{"class":230},[122,1387,914],{"class":230},[122,1389,241],{"class":230},[291,1391,1392],{"id":1392},"数据库回滚",[112,1394,1396],{"className":211,"code":1395,"language":213,"meta":117,"style":117},"# SQLite\nsystemctl stop kite\ncp \u002Fopt\u002Fkite\u002Fkite-YYYY-MM-DD.db \u002Fopt\u002Fkite\u002Fdata\u002Fkite.db\nsystemctl start kite\n\n# MySQL \u002F PostgreSQL\nmysql -u kite -p kite \u003C kite-YYYY-MM-DD.sql\n",[119,1397,1398,1403,1412,1422,1430,1434,1439],{"__ignoreMap":117},[122,1399,1400],{"class":124,"line":125},[122,1401,1402],{"class":220},"# SQLite\n",[122,1404,1405,1408,1410],{"class":124,"line":132},[122,1406,1407],{"class":226},"systemctl",[122,1409,504],{"class":230},[122,1411,241],{"class":230},[122,1413,1414,1416,1419],{"class":124,"line":138},[122,1415,437],{"class":226},[122,1417,1418],{"class":230}," \u002Fopt\u002Fkite\u002Fkite-YYYY-MM-DD.db",[122,1420,1421],{"class":230}," \u002Fopt\u002Fkite\u002Fdata\u002Fkite.db\n",[122,1423,1424,1426,1428],{"class":124,"line":144},[122,1425,1407],{"class":226},[122,1427,914],{"class":230},[122,1429,241],{"class":230},[122,1431,1432],{"class":124,"line":150},[122,1433,247],{"emptyLinePlaceholder":246},[122,1435,1436],{"class":124,"line":156},[122,1437,1438],{"class":220},"# MySQL \u002F PostgreSQL\n",[122,1440,1441,1444,1446,1448,1450,1452,1455],{"class":124,"line":162},[122,1442,1443],{"class":226},"mysql",[122,1445,361],{"class":234},[122,1447,364],{"class":230},[122,1449,367],{"class":234},[122,1451,364],{"class":230},[122,1453,1454],{"class":372}," \u003C",[122,1456,1457],{"class":230}," kite-YYYY-MM-DD.sql\n",[108,1459,1460],{"id":1460},"常见问题",[291,1462,1464],{"id":1463},"升级后无法启动日志提示表结构不匹配","升级后无法启动，日志提示「表结构不匹配」",[85,1466,1467],{},"通常是 Release Notes 中标注了手动迁移但被跳过。请：",[180,1469,1470,1473,1476],{},[183,1471,1472],{},"回滚到旧版本",[183,1474,1475],{},"按 Release Notes 执行 SQL 手动迁移",[183,1477,1478],{},"再次升级",[291,1480,1482],{"id":1481},"升级后短链全部-404","升级后短链全部 404",[85,1484,1485,1486,1489,1490,1493,1494,1497],{},"检查反向代理是否改动了 ",[119,1487,1488],{},"Host"," \u002F ",[119,1491,1492],{},"X-Forwarded-Proto"," 头；并确认 ",[119,1495,1496],{},"KITE_SITE_URL"," 与实际域名一致。",[291,1499,1500],{"id":1500},"新字段默认值异常",[85,1502,1503,1504,1507,1508,1511],{},"如上传体积限制、默认相册配置等。部分运行时配置存储在数据库的 ",[119,1505,1506],{},"settings"," 表中，新版本可能新增字段但默认值依旧生效。前往",[103,1509,1510],{},"后台 → 系统设置","检查即可。",[291,1513,1514],{"id":1514},"配置不兼容",[85,1516,1517,1518,1520,1521,948],{},"若 Release Notes 标注了某个环境变量被重命名或移除，请在升级前更新 systemd unit 文件或 ",[119,1519,707],{},"，",[103,1522,1523],{},"避免用错误的配置启动新版本",[108,1525,1526],{"id":1526},"订阅更新",[192,1528,1529,1539,1548],{},[183,1530,1531,1533,1534,1538],{},[103,1532,100],{},"：",[89,1535,1536],{"href":1536,"rel":1537},"https:\u002F\u002Fgithub.com\u002Famigoer\u002Fkite\u002Freleases.atom",[93]," 可直接订阅 RSS",[183,1540,1541,1544,1545],{},[103,1542,1543],{},"Watch 仓库","：在仓库主页点 ",[103,1546,1547],{},"Watch → Custom → Releases",[183,1549,1550],{},"站点首页与左上角版本徽标会在构建时读取最新 release",[108,1552,1553],{"id":1553},"下一步",[192,1555,1556,1563,1568],{},[183,1557,1558,1562],{},[89,1559,1561],{"href":1560},"\u002Fdocs\u002Fguide\u002Fdeployment#%E5%A4%87%E4%BB%BD%E4%B8%8E%E6%81%A2%E5%A4%8D","备份与恢复"," · 建立日常备份策略",[183,1564,1565,1567],{},[89,1566,31],{"href":32}," · 反向代理与 systemd 完整配置",[183,1569,1570,1572],{},[89,1571,69],{"href":70}," · 升级后轮换 Token 的建议",[1574,1575,1576],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":117,"searchDepth":138,"depth":138,"links":1578},[1579,1580,1581,1586,1587,1588,1589,1590,1591,1592,1598,1604,1605],{"id":110,"depth":132,"text":110},{"id":178,"depth":132,"text":178},{"id":282,"depth":132,"text":282,"children":1582},[1583,1584,1585],{"id":293,"depth":138,"text":294},{"id":342,"depth":138,"text":343},{"id":426,"depth":138,"text":427},{"id":467,"depth":132,"text":468},{"id":657,"depth":132,"text":658},{"id":776,"depth":132,"text":777},{"id":951,"depth":132,"text":952},{"id":1061,"depth":132,"text":1061},{"id":1156,"depth":132,"text":1156},{"id":1225,"depth":132,"text":1225,"children":1593},[1594,1595,1596,1597],{"id":227,"depth":138,"text":1235},{"id":1313,"depth":138,"text":1314},{"id":1344,"depth":138,"text":1344},{"id":1392,"depth":138,"text":1392},{"id":1460,"depth":132,"text":1460,"children":1599},[1600,1601,1602,1603],{"id":1463,"depth":138,"text":1464},{"id":1481,"depth":138,"text":1482},{"id":1500,"depth":138,"text":1500},{"id":1514,"depth":138,"text":1514},{"id":1526,"depth":132,"text":1526},{"id":1553,"depth":132,"text":1553},"将现有 Kite 实例升级到新版本：备份、升级、校验与回滚的完整流程。","md",{},{"title":35},{"title":35,"description":1606},"AIblpL3j-icJiTcPTj3V7moUgB1kfDT2rvzzSDl9HNM",[1613,1615],{"title":31,"path":32,"stem":33,"description":1614,"children":-1},"完整部署指南，覆盖源码部署、Docker 部署、Docker Compose 部署与静态二进制部署。",{"title":39,"path":40,"stem":41,"description":1616,"children":-1},"将 Kite 接入 PicGo、ShareX 等主流图床客户端。",1776871311071]