[{"data":1,"prerenderedAt":2272},["ShallowReactive",2],{"navigation":3,"docs-\u002Fdocs\u002Fguide\u002Fdeployment":72,"surround-\u002Fdocs\u002Fguide\u002Fdeployment":2267},[4],{"title":5,"path":6,"stem":7,"children":8,"page":38},"Docs","\u002Fdocs","docs",[9,39],{"title":10,"path":11,"stem":12,"children":13,"page":38},"Guide","\u002Fdocs\u002Fguide","docs\u002F1.guide",[14,18,22,26,30,34],{"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\u002Fclients","docs\u002F1.guide\u002F6.clients",false,{"title":40,"path":41,"stem":42,"children":43,"page":38},"Api","\u002Fdocs\u002Fapi","docs\u002F2.api",[44,48,52,56,60,64,68],{"title":45,"path":46,"stem":47},"概述","\u002Fdocs\u002Fapi\u002Foverview","docs\u002F2.api\u002F1.overview",{"title":49,"path":50,"stem":51},"认证","\u002Fdocs\u002Fapi\u002Fauthentication","docs\u002F2.api\u002F2.authentication",{"title":53,"path":54,"stem":55},"文件上传","\u002Fdocs\u002Fapi\u002Fupload","docs\u002F2.api\u002F3.upload",{"title":57,"path":58,"stem":59},"文件管理","\u002Fdocs\u002Fapi\u002Ffiles","docs\u002F2.api\u002F4.files",{"title":61,"path":62,"stem":63},"相册","\u002Fdocs\u002Fapi\u002Falbums","docs\u002F2.api\u002F5.albums",{"title":65,"path":66,"stem":67},"API Token","\u002Fdocs\u002Fapi\u002Ftokens","docs\u002F2.api\u002F6.tokens",{"title":69,"path":70,"stem":71},"管理员 API","\u002Fdocs\u002Fapi\u002Fadmin","docs\u002F2.api\u002F7.admin",{"id":73,"title":31,"body":74,"description":2261,"extension":2262,"meta":2263,"navigation":2264,"path":32,"seo":2265,"stem":33,"__hash__":2266},"docs\u002Fdocs\u002F1.guide\u002F5.deployment.md",{"type":75,"value":76,"toc":2227},"minimark",[77,81,97,101,193,196,226,232,236,239,244,261,265,302,309,313,402,406,570,574,577,602,606,707,711,736,740,743,746,754,760,767,1199,1202,1236,1243,1248,1641,1645,1653,1731,1735,1738,1749,1753,1756,1785,1789,1843,1847,1931,1935,1949,1952,1986,1989,2016,2019,2093,2096,2156,2159,2164,2181,2184,2206,2209,2223],[78,79,80],"p",{},"本章按「从轻到重」给出 4 套部署方案，便于你根据环境选择：",[82,83,84,88,91,94],"ol",{},[85,86,87],"li",{},"源码部署（适合二次开发）",[85,89,90],{},"Docker 部署（适合快速上线单机）",[85,92,93],{},"Docker Compose 部署（适合标准化生产环境）",[85,95,96],{},"静态二进制部署（适合极简运维）",[98,99,100],"h2",{"id":100},"部署决策流程",[102,103,108],"pre",{"className":104,"code":105,"language":106,"meta":107,"style":107},"language-mermaid shiki shiki-themes github-light github-dark","flowchart TD\n    Start([开始部署]) --> NeedModify{需要改源码吗?}\n    NeedModify -- 是 --> Source[源码部署]\n    NeedModify -- 否 --> UseContainer{是否使用容器?}\n    UseContainer -- 否 --> Binary[静态二进制部署]\n    UseContainer -- 是 --> MultiService{是否需要 Nginx\u002F多服务编排?}\n    MultiService -- 否 --> Docker[Docker 部署]\n    MultiService -- 是 --> Compose[Docker Compose 部署]\n\n    Source --> End([完成上线])\n    Docker --> End\n    Compose --> End\n    Binary --> End\n","mermaid","",[109,110,111,120,126,132,138,144,150,156,162,169,175,181,187],"code",{"__ignoreMap":107},[112,113,116],"span",{"class":114,"line":115},"line",1,[112,117,119],{"class":118},"sVt8B","flowchart TD\n",[112,121,123],{"class":114,"line":122},2,[112,124,125],{"class":118},"    Start([开始部署]) --> NeedModify{需要改源码吗?}\n",[112,127,129],{"class":114,"line":128},3,[112,130,131],{"class":118},"    NeedModify -- 是 --> Source[源码部署]\n",[112,133,135],{"class":114,"line":134},4,[112,136,137],{"class":118},"    NeedModify -- 否 --> UseContainer{是否使用容器?}\n",[112,139,141],{"class":114,"line":140},5,[112,142,143],{"class":118},"    UseContainer -- 否 --> Binary[静态二进制部署]\n",[112,145,147],{"class":114,"line":146},6,[112,148,149],{"class":118},"    UseContainer -- 是 --> MultiService{是否需要 Nginx\u002F多服务编排?}\n",[112,151,153],{"class":114,"line":152},7,[112,154,155],{"class":118},"    MultiService -- 否 --> Docker[Docker 部署]\n",[112,157,159],{"class":114,"line":158},8,[112,160,161],{"class":118},"    MultiService -- 是 --> Compose[Docker Compose 部署]\n",[112,163,165],{"class":114,"line":164},9,[112,166,168],{"emptyLinePlaceholder":167},true,"\n",[112,170,172],{"class":114,"line":171},10,[112,173,174],{"class":118},"    Source --> End([完成上线])\n",[112,176,178],{"class":114,"line":177},11,[112,179,180],{"class":118},"    Docker --> End\n",[112,182,184],{"class":114,"line":183},12,[112,185,186],{"class":118},"    Compose --> End\n",[112,188,190],{"class":114,"line":189},13,[112,191,192],{"class":118},"    Binary --> End\n",[98,194,195],{"id":195},"通用前置条件",[197,198,199,202,217,220],"ul",{},[85,200,201],{},"域名已解析到服务器（生产推荐）",[85,203,204,205,208,209,212,213,216],{},"开放端口：",[109,206,207],{},"80","\u002F",[109,210,211],{},"443","（反向代理场景）或 ",[109,214,215],{},"8080","（直连场景）",[85,218,219],{},"数据目录可持久化（至少包含数据库与上传文件）",[85,221,222,223],{},"建议最小规格：",[109,224,225],{},"1 vCPU \u002F 1 GB RAM \u002F 20 GB SSD",[227,228,229],"tip",{},[78,230,231],{},"无论采用哪种方式，都建议把数据目录单独挂载到独立磁盘或定期备份。",[98,233,235],{"id":234},"方案一源码部署","方案一：源码部署",[78,237,238],{},"适用场景：需要定制功能、二次开发、调试内部逻辑。",[240,241,243],"h3",{"id":242},"_1-安装依赖","1. 安装依赖",[197,245,246,252,258],{},[85,247,248,249],{},"Go ",[109,250,251],{},"1.25+",[85,253,254,255],{},"Node.js ",[109,256,257],{},"22+",[85,259,260],{},"GNU Make",[240,262,264],{"id":263},"_2-拉取并构建","2. 拉取并构建",[102,266,270],{"className":267,"code":268,"language":269,"meta":107,"style":107},"language-bash shiki shiki-themes github-light github-dark","git clone https:\u002F\u002Fgithub.com\u002Famigoer\u002Fkite.git\ncd kite\nmake build\n","bash",[109,271,272,285,294],{"__ignoreMap":107},[112,273,274,278,282],{"class":114,"line":115},[112,275,277],{"class":276},"sScJk","git",[112,279,281],{"class":280},"sZZnC"," clone",[112,283,284],{"class":280}," https:\u002F\u002Fgithub.com\u002Famigoer\u002Fkite.git\n",[112,286,287,291],{"class":114,"line":122},[112,288,290],{"class":289},"sj4cs","cd",[112,292,293],{"class":280}," kite\n",[112,295,296,299],{"class":114,"line":128},[112,297,298],{"class":276},"make",[112,300,301],{"class":280}," build\n",[78,303,304,305,308],{},"产物默认位于 ",[109,306,307],{},"build\u002Fkite","。",[240,310,312],{"id":311},"_3-配置并启动","3. 配置并启动",[102,314,316],{"className":267,"code":315,"language":269,"meta":107,"style":107},"export GIN_MODE=release\nexport KITE_HOST=0.0.0.0\nexport KITE_PORT=8080\nexport KITE_DB_DRIVER=sqlite\nexport KITE_DSN=.\u002Fdata\u002Fkite.db\nexport KITE_SITE_URL=https:\u002F\u002Fkite.example.com\n\n.\u002Fbuild\u002Fkite\n",[109,317,318,333,345,357,369,381,393,397],{"__ignoreMap":107},[112,319,320,324,327,330],{"class":114,"line":115},[112,321,323],{"class":322},"szBVR","export",[112,325,326],{"class":118}," GIN_MODE",[112,328,329],{"class":322},"=",[112,331,332],{"class":118},"release\n",[112,334,335,337,340,342],{"class":114,"line":122},[112,336,323],{"class":322},[112,338,339],{"class":118}," KITE_HOST",[112,341,329],{"class":322},[112,343,344],{"class":289},"0.0.0.0\n",[112,346,347,349,352,354],{"class":114,"line":128},[112,348,323],{"class":322},[112,350,351],{"class":118}," KITE_PORT",[112,353,329],{"class":322},[112,355,356],{"class":289},"8080\n",[112,358,359,361,364,366],{"class":114,"line":134},[112,360,323],{"class":322},[112,362,363],{"class":118}," KITE_DB_DRIVER",[112,365,329],{"class":322},[112,367,368],{"class":118},"sqlite\n",[112,370,371,373,376,378],{"class":114,"line":140},[112,372,323],{"class":322},[112,374,375],{"class":118}," KITE_DSN",[112,377,329],{"class":322},[112,379,380],{"class":118},".\u002Fdata\u002Fkite.db\n",[112,382,383,385,388,390],{"class":114,"line":146},[112,384,323],{"class":322},[112,386,387],{"class":118}," KITE_SITE_URL",[112,389,329],{"class":322},[112,391,392],{"class":118},"https:\u002F\u002Fkite.example.com\n",[112,394,395],{"class":114,"line":152},[112,396,168],{"emptyLinePlaceholder":167},[112,398,399],{"class":114,"line":158},[112,400,401],{"class":276},".\u002Fbuild\u002Fkite\n",[240,403,405],{"id":404},"_4-systemd-托管推荐","4. systemd 托管（推荐）",[102,407,411],{"className":408,"code":409,"language":410,"meta":107,"style":107},"language-ini shiki shiki-themes github-light github-dark","[Unit]\nDescription=Kite Service\nAfter=network.target\n\n[Service]\nWorkingDirectory=\u002Fopt\u002Fkite\nExecStart=\u002Fopt\u002Fkite\u002Fkite\nRestart=always\nRestartSec=5\nEnvironment=GIN_MODE=release\nEnvironment=KITE_HOST=0.0.0.0\nEnvironment=KITE_PORT=8080\nEnvironment=KITE_DB_DRIVER=sqlite\nEnvironment=KITE_DSN=\u002Fopt\u002Fkite\u002Fdata\u002Fkite.db\nEnvironment=KITE_SITE_URL=https:\u002F\u002Fkite.example.com\n\n[Install]\nWantedBy=multi-user.target\n","ini",[109,412,413,418,426,434,438,443,451,459,467,475,488,500,512,524,537,550,555,561],{"__ignoreMap":107},[112,414,415],{"class":114,"line":115},[112,416,417],{"class":276},"[Unit]\n",[112,419,420,423],{"class":114,"line":122},[112,421,422],{"class":322},"Description",[112,424,425],{"class":118},"=Kite Service\n",[112,427,428,431],{"class":114,"line":128},[112,429,430],{"class":322},"After",[112,432,433],{"class":118},"=network.target\n",[112,435,436],{"class":114,"line":134},[112,437,168],{"emptyLinePlaceholder":167},[112,439,440],{"class":114,"line":140},[112,441,442],{"class":276},"[Service]\n",[112,444,445,448],{"class":114,"line":146},[112,446,447],{"class":322},"WorkingDirectory",[112,449,450],{"class":118},"=\u002Fopt\u002Fkite\n",[112,452,453,456],{"class":114,"line":152},[112,454,455],{"class":322},"ExecStart",[112,457,458],{"class":118},"=\u002Fopt\u002Fkite\u002Fkite\n",[112,460,461,464],{"class":114,"line":158},[112,462,463],{"class":322},"Restart",[112,465,466],{"class":118},"=always\n",[112,468,469,472],{"class":114,"line":164},[112,470,471],{"class":322},"RestartSec",[112,473,474],{"class":118},"=5\n",[112,476,477,480,482,485],{"class":114,"line":171},[112,478,479],{"class":322},"Environment",[112,481,329],{"class":118},[112,483,484],{"class":322},"GIN_MODE",[112,486,487],{"class":118},"=release\n",[112,489,490,492,494,497],{"class":114,"line":177},[112,491,479],{"class":322},[112,493,329],{"class":118},[112,495,496],{"class":322},"KITE_HOST",[112,498,499],{"class":118},"=0.0.0.0\n",[112,501,502,504,506,509],{"class":114,"line":183},[112,503,479],{"class":322},[112,505,329],{"class":118},[112,507,508],{"class":322},"KITE_PORT",[112,510,511],{"class":118},"=8080\n",[112,513,514,516,518,521],{"class":114,"line":189},[112,515,479],{"class":322},[112,517,329],{"class":118},[112,519,520],{"class":322},"KITE_DB_DRIVER",[112,522,523],{"class":118},"=sqlite\n",[112,525,527,529,531,534],{"class":114,"line":526},14,[112,528,479],{"class":322},[112,530,329],{"class":118},[112,532,533],{"class":322},"KITE_DSN",[112,535,536],{"class":118},"=\u002Fopt\u002Fkite\u002Fdata\u002Fkite.db\n",[112,538,540,542,544,547],{"class":114,"line":539},15,[112,541,479],{"class":322},[112,543,329],{"class":118},[112,545,546],{"class":322},"KITE_SITE_URL",[112,548,549],{"class":118},"=https:\u002F\u002Fkite.example.com\n",[112,551,553],{"class":114,"line":552},16,[112,554,168],{"emptyLinePlaceholder":167},[112,556,558],{"class":114,"line":557},17,[112,559,560],{"class":276},"[Install]\n",[112,562,564,567],{"class":114,"line":563},18,[112,565,566],{"class":322},"WantedBy",[112,568,569],{"class":118},"=multi-user.target\n",[98,571,573],{"id":572},"方案二docker-部署","方案二：Docker 部署",[78,575,576],{},"适用场景：单机快速上线，运维简单。",[102,578,580],{"className":104,"code":579,"language":106,"meta":107,"style":107},"flowchart LR\n    Pull[拉取镜像] --> Run[启动容器]\n    Run --> Init[完成初始化]\n    Init --> Proxy[接入 Nginx\u002FHTTPS 可选]\n",[109,581,582,587,592,597],{"__ignoreMap":107},[112,583,584],{"class":114,"line":115},[112,585,586],{"class":118},"flowchart LR\n",[112,588,589],{"class":114,"line":122},[112,590,591],{"class":118},"    Pull[拉取镜像] --> Run[启动容器]\n",[112,593,594],{"class":114,"line":128},[112,595,596],{"class":118},"    Run --> Init[完成初始化]\n",[112,598,599],{"class":114,"line":134},[112,600,601],{"class":118},"    Init --> Proxy[接入 Nginx\u002FHTTPS 可选]\n",[240,603,605],{"id":604},"_1-启动容器","1. 启动容器",[102,607,609],{"className":267,"code":608,"language":269,"meta":107,"style":107},"docker run -d \\\n  --name kite \\\n  -p 8080:8080 \\\n  -e GIN_MODE=release \\\n  -e KITE_SITE_URL=https:\u002F\u002Fkite.example.com \\\n  -e KITE_DB_DRIVER=sqlite \\\n  -e KITE_DSN=\u002Fapp\u002Fdata\u002Fkite.db \\\n  -v \u002Fopt\u002Fkite\u002Fdata:\u002Fapp\u002Fdata \\\n  --restart unless-stopped \\\n  amigoer\u002Fkite:latest\n",[109,610,611,625,635,645,655,664,673,682,692,702],{"__ignoreMap":107},[112,612,613,616,619,622],{"class":114,"line":115},[112,614,615],{"class":276},"docker",[112,617,618],{"class":280}," run",[112,620,621],{"class":289}," -d",[112,623,624],{"class":289}," \\\n",[112,626,627,630,633],{"class":114,"line":122},[112,628,629],{"class":289},"  --name",[112,631,632],{"class":280}," kite",[112,634,624],{"class":289},[112,636,637,640,643],{"class":114,"line":128},[112,638,639],{"class":289},"  -p",[112,641,642],{"class":280}," 8080:8080",[112,644,624],{"class":289},[112,646,647,650,653],{"class":114,"line":134},[112,648,649],{"class":289},"  -e",[112,651,652],{"class":280}," GIN_MODE=release",[112,654,624],{"class":289},[112,656,657,659,662],{"class":114,"line":140},[112,658,649],{"class":289},[112,660,661],{"class":280}," KITE_SITE_URL=https:\u002F\u002Fkite.example.com",[112,663,624],{"class":289},[112,665,666,668,671],{"class":114,"line":146},[112,667,649],{"class":289},[112,669,670],{"class":280}," KITE_DB_DRIVER=sqlite",[112,672,624],{"class":289},[112,674,675,677,680],{"class":114,"line":152},[112,676,649],{"class":289},[112,678,679],{"class":280}," KITE_DSN=\u002Fapp\u002Fdata\u002Fkite.db",[112,681,624],{"class":289},[112,683,684,687,690],{"class":114,"line":158},[112,685,686],{"class":289},"  -v",[112,688,689],{"class":280}," \u002Fopt\u002Fkite\u002Fdata:\u002Fapp\u002Fdata",[112,691,624],{"class":289},[112,693,694,697,700],{"class":114,"line":164},[112,695,696],{"class":289},"  --restart",[112,698,699],{"class":280}," unless-stopped",[112,701,624],{"class":289},[112,703,704],{"class":114,"line":171},[112,705,706],{"class":280},"  amigoer\u002Fkite:latest\n",[240,708,710],{"id":709},"_2-健康检查","2. 健康检查",[102,712,714],{"className":267,"code":713,"language":269,"meta":107,"style":107},"curl http:\u002F\u002F127.0.0.1:8080\u002Fapi\u002Fv1\u002Fsetup\u002Fstatus\ndocker logs --tail=100 kite\n",[109,715,716,724],{"__ignoreMap":107},[112,717,718,721],{"class":114,"line":115},[112,719,720],{"class":276},"curl",[112,722,723],{"class":280}," http:\u002F\u002F127.0.0.1:8080\u002Fapi\u002Fv1\u002Fsetup\u002Fstatus\n",[112,725,726,728,731,734],{"class":114,"line":122},[112,727,615],{"class":276},[112,729,730],{"class":280}," logs",[112,732,733],{"class":289}," --tail=100",[112,735,293],{"class":280},[98,737,739],{"id":738},"方案三docker-compose-部署","方案三：Docker Compose 部署",[78,741,742],{},"适用场景：生产推荐，Kite + Nginx + 证书续期等多服务管理。",[98,744,745],{"id":745},"目录结构",[102,747,752],{"className":748,"code":750,"language":751},[749],"language-text","\u002Fopt\u002Fkite\n├── docker-compose.yml\n├── data\u002F                     # Kite 数据目录（SQLite + uploads）\n└── nginx\u002F\n    ├── conf.d\u002F\n    │   └── kite.conf\n    ├── ssl\u002F\n    │   ├── fullchain.pem\n    │   └── privkey.pem\n    ├── logs\u002F\n    └── www\u002F                  # Certbot ACME webroot\n","text",[109,753,750],{"__ignoreMap":107},[98,755,757],{"id":756},"docker-composeyml",[109,758,759],{},"docker-compose.yml",[78,761,762,763,766],{},"创建 ",[109,764,765],{},"\u002Fopt\u002Fkite\u002Fdocker-compose.yml","：",[102,768,772],{"className":769,"code":770,"language":771,"meta":107,"style":107},"language-yaml shiki shiki-themes github-light github-dark","services:\n  kite:\n    image: amigoer\u002Fkite:latest\n    container_name: kite\n    restart: unless-stopped\n    expose:\n      - \"8080\"\n    environment:\n      KITE_HOST: 0.0.0.0\n      KITE_PORT: \"8080\"\n      KITE_DB_DRIVER: sqlite\n      KITE_DSN: \u002Fapp\u002Fdata\u002Fkite.db\n      KITE_SITE_URL: https:\u002F\u002Fkite.your-domain.com\n      GIN_MODE: release\n      TZ: Asia\u002FShanghai\n    volumes:\n      - .\u002Fdata:\u002Fapp\u002Fdata\n    networks:\n      - kite-net\n    healthcheck:\n      test: [\"CMD\", \"wget\", \"-qO-\", \"http:\u002F\u002F127.0.0.1:8080\u002Fapi\u002Fv1\u002Fsetup\u002Fstatus\"]\n      interval: 30s\n      timeout: 5s\n      start_period: 10s\n      retries: 3\n\n  nginx:\n    image: nginx:1.27-alpine\n    container_name: kite-nginx\n    restart: unless-stopped\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n    volumes:\n      - .\u002Fnginx\u002Fconf.d:\u002Fetc\u002Fnginx\u002Fconf.d:ro\n      - .\u002Fnginx\u002Fssl:\u002Fetc\u002Fnginx\u002Fssl:ro\n      - .\u002Fnginx\u002Flogs:\u002Fvar\u002Flog\u002Fnginx\n      - .\u002Fnginx\u002Fwww:\u002Fvar\u002Fwww\u002Fcertbot\n    depends_on:\n      kite:\n        condition: service_healthy\n    networks:\n      - kite-net\n\nnetworks:\n  kite-net:\n    driver: bridge\n","yaml",[109,773,774,783,790,801,811,821,828,836,843,852,861,870,880,890,899,909,916,923,930,938,946,977,988,999,1010,1021,1026,1034,1044,1054,1063,1071,1079,1087,1094,1102,1110,1118,1126,1134,1142,1153,1160,1167,1172,1180,1188],{"__ignoreMap":107},[112,775,776,780],{"class":114,"line":115},[112,777,779],{"class":778},"s9eBZ","services",[112,781,782],{"class":118},":\n",[112,784,785,788],{"class":114,"line":122},[112,786,787],{"class":778},"  kite",[112,789,782],{"class":118},[112,791,792,795,798],{"class":114,"line":128},[112,793,794],{"class":778},"    image",[112,796,797],{"class":118},": ",[112,799,800],{"class":280},"amigoer\u002Fkite:latest\n",[112,802,803,806,808],{"class":114,"line":134},[112,804,805],{"class":778},"    container_name",[112,807,797],{"class":118},[112,809,810],{"class":280},"kite\n",[112,812,813,816,818],{"class":114,"line":140},[112,814,815],{"class":778},"    restart",[112,817,797],{"class":118},[112,819,820],{"class":280},"unless-stopped\n",[112,822,823,826],{"class":114,"line":146},[112,824,825],{"class":778},"    expose",[112,827,782],{"class":118},[112,829,830,833],{"class":114,"line":152},[112,831,832],{"class":118},"      - ",[112,834,835],{"class":280},"\"8080\"\n",[112,837,838,841],{"class":114,"line":158},[112,839,840],{"class":778},"    environment",[112,842,782],{"class":118},[112,844,845,848,850],{"class":114,"line":164},[112,846,847],{"class":778},"      KITE_HOST",[112,849,797],{"class":118},[112,851,344],{"class":289},[112,853,854,857,859],{"class":114,"line":171},[112,855,856],{"class":778},"      KITE_PORT",[112,858,797],{"class":118},[112,860,835],{"class":280},[112,862,863,866,868],{"class":114,"line":177},[112,864,865],{"class":778},"      KITE_DB_DRIVER",[112,867,797],{"class":118},[112,869,368],{"class":280},[112,871,872,875,877],{"class":114,"line":183},[112,873,874],{"class":778},"      KITE_DSN",[112,876,797],{"class":118},[112,878,879],{"class":280},"\u002Fapp\u002Fdata\u002Fkite.db\n",[112,881,882,885,887],{"class":114,"line":189},[112,883,884],{"class":778},"      KITE_SITE_URL",[112,886,797],{"class":118},[112,888,889],{"class":280},"https:\u002F\u002Fkite.your-domain.com\n",[112,891,892,895,897],{"class":114,"line":526},[112,893,894],{"class":778},"      GIN_MODE",[112,896,797],{"class":118},[112,898,332],{"class":280},[112,900,901,904,906],{"class":114,"line":539},[112,902,903],{"class":778},"      TZ",[112,905,797],{"class":118},[112,907,908],{"class":280},"Asia\u002FShanghai\n",[112,910,911,914],{"class":114,"line":552},[112,912,913],{"class":778},"    volumes",[112,915,782],{"class":118},[112,917,918,920],{"class":114,"line":557},[112,919,832],{"class":118},[112,921,922],{"class":280},".\u002Fdata:\u002Fapp\u002Fdata\n",[112,924,925,928],{"class":114,"line":563},[112,926,927],{"class":778},"    networks",[112,929,782],{"class":118},[112,931,933,935],{"class":114,"line":932},19,[112,934,832],{"class":118},[112,936,937],{"class":280},"kite-net\n",[112,939,941,944],{"class":114,"line":940},20,[112,942,943],{"class":778},"    healthcheck",[112,945,782],{"class":118},[112,947,949,952,955,958,961,964,966,969,971,974],{"class":114,"line":948},21,[112,950,951],{"class":778},"      test",[112,953,954],{"class":118},": [",[112,956,957],{"class":280},"\"CMD\"",[112,959,960],{"class":118},", ",[112,962,963],{"class":280},"\"wget\"",[112,965,960],{"class":118},[112,967,968],{"class":280},"\"-qO-\"",[112,970,960],{"class":118},[112,972,973],{"class":280},"\"http:\u002F\u002F127.0.0.1:8080\u002Fapi\u002Fv1\u002Fsetup\u002Fstatus\"",[112,975,976],{"class":118},"]\n",[112,978,980,983,985],{"class":114,"line":979},22,[112,981,982],{"class":778},"      interval",[112,984,797],{"class":118},[112,986,987],{"class":280},"30s\n",[112,989,991,994,996],{"class":114,"line":990},23,[112,992,993],{"class":778},"      timeout",[112,995,797],{"class":118},[112,997,998],{"class":280},"5s\n",[112,1000,1002,1005,1007],{"class":114,"line":1001},24,[112,1003,1004],{"class":778},"      start_period",[112,1006,797],{"class":118},[112,1008,1009],{"class":280},"10s\n",[112,1011,1013,1016,1018],{"class":114,"line":1012},25,[112,1014,1015],{"class":778},"      retries",[112,1017,797],{"class":118},[112,1019,1020],{"class":289},"3\n",[112,1022,1024],{"class":114,"line":1023},26,[112,1025,168],{"emptyLinePlaceholder":167},[112,1027,1029,1032],{"class":114,"line":1028},27,[112,1030,1031],{"class":778},"  nginx",[112,1033,782],{"class":118},[112,1035,1037,1039,1041],{"class":114,"line":1036},28,[112,1038,794],{"class":778},[112,1040,797],{"class":118},[112,1042,1043],{"class":280},"nginx:1.27-alpine\n",[112,1045,1047,1049,1051],{"class":114,"line":1046},29,[112,1048,805],{"class":778},[112,1050,797],{"class":118},[112,1052,1053],{"class":280},"kite-nginx\n",[112,1055,1057,1059,1061],{"class":114,"line":1056},30,[112,1058,815],{"class":778},[112,1060,797],{"class":118},[112,1062,820],{"class":280},[112,1064,1066,1069],{"class":114,"line":1065},31,[112,1067,1068],{"class":778},"    ports",[112,1070,782],{"class":118},[112,1072,1074,1076],{"class":114,"line":1073},32,[112,1075,832],{"class":118},[112,1077,1078],{"class":280},"\"80:80\"\n",[112,1080,1082,1084],{"class":114,"line":1081},33,[112,1083,832],{"class":118},[112,1085,1086],{"class":280},"\"443:443\"\n",[112,1088,1090,1092],{"class":114,"line":1089},34,[112,1091,913],{"class":778},[112,1093,782],{"class":118},[112,1095,1097,1099],{"class":114,"line":1096},35,[112,1098,832],{"class":118},[112,1100,1101],{"class":280},".\u002Fnginx\u002Fconf.d:\u002Fetc\u002Fnginx\u002Fconf.d:ro\n",[112,1103,1105,1107],{"class":114,"line":1104},36,[112,1106,832],{"class":118},[112,1108,1109],{"class":280},".\u002Fnginx\u002Fssl:\u002Fetc\u002Fnginx\u002Fssl:ro\n",[112,1111,1113,1115],{"class":114,"line":1112},37,[112,1114,832],{"class":118},[112,1116,1117],{"class":280},".\u002Fnginx\u002Flogs:\u002Fvar\u002Flog\u002Fnginx\n",[112,1119,1121,1123],{"class":114,"line":1120},38,[112,1122,832],{"class":118},[112,1124,1125],{"class":280},".\u002Fnginx\u002Fwww:\u002Fvar\u002Fwww\u002Fcertbot\n",[112,1127,1129,1132],{"class":114,"line":1128},39,[112,1130,1131],{"class":778},"    depends_on",[112,1133,782],{"class":118},[112,1135,1137,1140],{"class":114,"line":1136},40,[112,1138,1139],{"class":778},"      kite",[112,1141,782],{"class":118},[112,1143,1145,1148,1150],{"class":114,"line":1144},41,[112,1146,1147],{"class":778},"        condition",[112,1149,797],{"class":118},[112,1151,1152],{"class":280},"service_healthy\n",[112,1154,1156,1158],{"class":114,"line":1155},42,[112,1157,927],{"class":778},[112,1159,782],{"class":118},[112,1161,1163,1165],{"class":114,"line":1162},43,[112,1164,832],{"class":118},[112,1166,937],{"class":280},[112,1168,1170],{"class":114,"line":1169},44,[112,1171,168],{"emptyLinePlaceholder":167},[112,1173,1175,1178],{"class":114,"line":1174},45,[112,1176,1177],{"class":778},"networks",[112,1179,782],{"class":118},[112,1181,1183,1186],{"class":114,"line":1182},46,[112,1184,1185],{"class":778},"  kite-net",[112,1187,782],{"class":118},[112,1189,1191,1194,1196],{"class":114,"line":1190},47,[112,1192,1193],{"class":778},"    driver",[112,1195,797],{"class":118},[112,1197,1198],{"class":280},"bridge\n",[240,1200,1201],{"id":1201},"启动",[102,1203,1205],{"className":267,"code":1204,"language":269,"meta":107,"style":107},"cd \u002Fopt\u002Fkite\ndocker compose up -d\ndocker compose ps\n",[109,1206,1207,1214,1227],{"__ignoreMap":107},[112,1208,1209,1211],{"class":114,"line":115},[112,1210,290],{"class":289},[112,1212,1213],{"class":280}," \u002Fopt\u002Fkite\n",[112,1215,1216,1218,1221,1224],{"class":114,"line":122},[112,1217,615],{"class":276},[112,1219,1220],{"class":280}," compose",[112,1222,1223],{"class":280}," up",[112,1225,1226],{"class":289}," -d\n",[112,1228,1229,1231,1233],{"class":114,"line":128},[112,1230,615],{"class":276},[112,1232,1220],{"class":280},[112,1234,1235],{"class":280}," ps\n",[98,1237,1239,1242],{"id":1238},"kiteconfnginx",[109,1240,1241],{},"kite.conf","（Nginx）",[78,1244,762,1245,766],{},[109,1246,1247],{},"\u002Fopt\u002Fkite\u002Fnginx\u002Fconf.d\u002Fkite.conf",[102,1249,1253],{"className":1250,"code":1251,"language":1252,"meta":107,"style":107},"language-nginx shiki shiki-themes github-light github-dark","upstream kite_backend {\n    server kite:8080;\n}\n\n# HTTP → HTTPS 重定向 + Certbot 挑战\nserver {\n    listen 80;\n    server_name kite.your-domain.com;\n\n    location \u002F.well-known\u002Facme-challenge\u002F {\n        root \u002Fvar\u002Fwww\u002Fcertbot;\n    }\n\n    location \u002F {\n        return 301 https:\u002F\u002F$host$request_uri;\n    }\n}\n\n# HTTPS 主站点\nserver {\n    listen 443 ssl http2;\n    server_name kite.your-domain.com;\n\n    ssl_certificate     \u002Fetc\u002Fnginx\u002Fssl\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fnginx\u002Fssl\u002Fprivkey.pem;\n    ssl_protocols       TLSv1.2 TLSv1.3;\n    ssl_ciphers         HIGH:!aNULL:!MD5;\n\n    # 上传体积限制 —— 需 ≥ Kite 的 max_file_size\n    client_max_body_size 200m;\n    client_body_timeout  300s;\n    proxy_read_timeout   300s;\n\n    location \u002F {\n        proxy_pass         http:\u002F\u002Fkite_backend;\n        proxy_set_header   Host              $host;\n        proxy_set_header   X-Real-IP         $remote_addr;\n        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;\n        proxy_set_header   X-Forwarded-Proto $scheme;\n        proxy_http_version 1.1;\n    }\n\n    # 文件短链（\u002Fi\u002F* \u002Fv\u002F* \u002Fa\u002F* \u002Ff\u002F* \u002Ft\u002F*）长缓存\n    location ~ ^\u002F(i|v|a|f|t)\u002F {\n        proxy_pass         http:\u002F\u002Fkite_backend;\n        proxy_set_header   Host              $host;\n        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;\n        proxy_set_header   X-Forwarded-Proto $scheme;\n        proxy_http_version 1.1;\n\n        proxy_cache_valid      200 30d;\n        add_header  Cache-Control \"public, max-age=2592000, immutable\";\n    }\n}\n","nginx",[109,1254,1255,1266,1274,1279,1283,1289,1297,1307,1315,1319,1329,1337,1342,1346,1355,1366,1370,1374,1378,1383,1389,1398,1404,1408,1416,1424,1432,1440,1444,1449,1459,1469,1479,1483,1491,1499,1507,1514,1521,1528,1538,1542,1546,1551,1564,1570,1576,1582,1589,1598,1603,1617,1631,1636],{"__ignoreMap":107},[112,1256,1257,1260,1263],{"class":114,"line":115},[112,1258,1259],{"class":322},"upstream",[112,1261,1262],{"class":276}," kite_backend ",[112,1264,1265],{"class":118},"{\n",[112,1267,1268,1271],{"class":114,"line":122},[112,1269,1270],{"class":322},"    server",[112,1272,1273],{"class":118}," kite:8080;\n",[112,1275,1276],{"class":114,"line":128},[112,1277,1278],{"class":118},"}\n",[112,1280,1281],{"class":114,"line":134},[112,1282,168],{"emptyLinePlaceholder":167},[112,1284,1285],{"class":114,"line":140},[112,1286,1288],{"class":1287},"sJ8bj","# HTTP → HTTPS 重定向 + Certbot 挑战\n",[112,1290,1291,1294],{"class":114,"line":146},[112,1292,1293],{"class":322},"server",[112,1295,1296],{"class":118}," {\n",[112,1298,1299,1302,1304],{"class":114,"line":152},[112,1300,1301],{"class":322},"    listen ",[112,1303,207],{"class":289},[112,1305,1306],{"class":118},";\n",[112,1308,1309,1312],{"class":114,"line":158},[112,1310,1311],{"class":322},"    server_name ",[112,1313,1314],{"class":118},"kite.your-domain.com;\n",[112,1316,1317],{"class":114,"line":164},[112,1318,168],{"emptyLinePlaceholder":167},[112,1320,1321,1324,1327],{"class":114,"line":171},[112,1322,1323],{"class":322},"    location",[112,1325,1326],{"class":276}," \u002F.well-known\u002Facme-challenge\u002F ",[112,1328,1265],{"class":118},[112,1330,1331,1334],{"class":114,"line":177},[112,1332,1333],{"class":322},"        root ",[112,1335,1336],{"class":118},"\u002Fvar\u002Fwww\u002Fcertbot;\n",[112,1338,1339],{"class":114,"line":183},[112,1340,1341],{"class":118},"    }\n",[112,1343,1344],{"class":114,"line":189},[112,1345,168],{"emptyLinePlaceholder":167},[112,1347,1348,1350,1353],{"class":114,"line":526},[112,1349,1323],{"class":322},[112,1351,1352],{"class":276}," \u002F ",[112,1354,1265],{"class":118},[112,1356,1357,1360,1363],{"class":114,"line":539},[112,1358,1359],{"class":322},"        return",[112,1361,1362],{"class":289}," 301",[112,1364,1365],{"class":118}," https:\u002F\u002F$host$request_uri;\n",[112,1367,1368],{"class":114,"line":552},[112,1369,1341],{"class":118},[112,1371,1372],{"class":114,"line":557},[112,1373,1278],{"class":118},[112,1375,1376],{"class":114,"line":563},[112,1377,168],{"emptyLinePlaceholder":167},[112,1379,1380],{"class":114,"line":932},[112,1381,1382],{"class":1287},"# HTTPS 主站点\n",[112,1384,1385,1387],{"class":114,"line":940},[112,1386,1293],{"class":322},[112,1388,1296],{"class":118},[112,1390,1391,1393,1395],{"class":114,"line":948},[112,1392,1301],{"class":322},[112,1394,211],{"class":289},[112,1396,1397],{"class":118}," ssl http2;\n",[112,1399,1400,1402],{"class":114,"line":979},[112,1401,1311],{"class":322},[112,1403,1314],{"class":118},[112,1405,1406],{"class":114,"line":990},[112,1407,168],{"emptyLinePlaceholder":167},[112,1409,1410,1413],{"class":114,"line":1001},[112,1411,1412],{"class":322},"    ssl_certificate ",[112,1414,1415],{"class":118},"    \u002Fetc\u002Fnginx\u002Fssl\u002Ffullchain.pem;\n",[112,1417,1418,1421],{"class":114,"line":1012},[112,1419,1420],{"class":322},"    ssl_certificate_key ",[112,1422,1423],{"class":118},"\u002Fetc\u002Fnginx\u002Fssl\u002Fprivkey.pem;\n",[112,1425,1426,1429],{"class":114,"line":1023},[112,1427,1428],{"class":322},"    ssl_protocols ",[112,1430,1431],{"class":118},"      TLSv1.2 TLSv1.3;\n",[112,1433,1434,1437],{"class":114,"line":1028},[112,1435,1436],{"class":322},"    ssl_ciphers ",[112,1438,1439],{"class":118},"        HIGH:!aNULL:!MD5;\n",[112,1441,1442],{"class":114,"line":1036},[112,1443,168],{"emptyLinePlaceholder":167},[112,1445,1446],{"class":114,"line":1046},[112,1447,1448],{"class":1287},"    # 上传体积限制 —— 需 ≥ Kite 的 max_file_size\n",[112,1450,1451,1454,1457],{"class":114,"line":1056},[112,1452,1453],{"class":322},"    client_max_body_size ",[112,1455,1456],{"class":289},"200m",[112,1458,1306],{"class":118},[112,1460,1461,1464,1467],{"class":114,"line":1065},[112,1462,1463],{"class":322},"    client_body_timeout ",[112,1465,1466],{"class":289}," 300s",[112,1468,1306],{"class":118},[112,1470,1471,1474,1477],{"class":114,"line":1073},[112,1472,1473],{"class":322},"    proxy_read_timeout ",[112,1475,1476],{"class":289},"  300s",[112,1478,1306],{"class":118},[112,1480,1481],{"class":114,"line":1081},[112,1482,168],{"emptyLinePlaceholder":167},[112,1484,1485,1487,1489],{"class":114,"line":1089},[112,1486,1323],{"class":322},[112,1488,1352],{"class":276},[112,1490,1265],{"class":118},[112,1492,1493,1496],{"class":114,"line":1096},[112,1494,1495],{"class":322},"        proxy_pass ",[112,1497,1498],{"class":118},"        http:\u002F\u002Fkite_backend;\n",[112,1500,1501,1504],{"class":114,"line":1104},[112,1502,1503],{"class":322},"        proxy_set_header ",[112,1505,1506],{"class":118},"  Host              $host;\n",[112,1508,1509,1511],{"class":114,"line":1112},[112,1510,1503],{"class":322},[112,1512,1513],{"class":118},"  X-Real-IP         $remote_addr;\n",[112,1515,1516,1518],{"class":114,"line":1120},[112,1517,1503],{"class":322},[112,1519,1520],{"class":118},"  X-Forwarded-For   $proxy_add_x_forwarded_for;\n",[112,1522,1523,1525],{"class":114,"line":1128},[112,1524,1503],{"class":322},[112,1526,1527],{"class":118},"  X-Forwarded-Proto $scheme;\n",[112,1529,1530,1533,1536],{"class":114,"line":1136},[112,1531,1532],{"class":322},"        proxy_http_version ",[112,1534,1535],{"class":289},"1.1",[112,1537,1306],{"class":118},[112,1539,1540],{"class":114,"line":1144},[112,1541,1341],{"class":118},[112,1543,1544],{"class":114,"line":1155},[112,1545,168],{"emptyLinePlaceholder":167},[112,1547,1548],{"class":114,"line":1162},[112,1549,1550],{"class":1287},"    # 文件短链（\u002Fi\u002F* \u002Fv\u002F* \u002Fa\u002F* \u002Ff\u002F* \u002Ft\u002F*）长缓存\n",[112,1552,1553,1555,1558,1562],{"class":114,"line":1169},[112,1554,1323],{"class":322},[112,1556,1557],{"class":322}," ~",[112,1559,1561],{"class":1560},"sA_wV"," ^\u002F(i|v|a|f|t)\u002F ",[112,1563,1265],{"class":118},[112,1565,1566,1568],{"class":114,"line":1174},[112,1567,1495],{"class":322},[112,1569,1498],{"class":118},[112,1571,1572,1574],{"class":114,"line":1182},[112,1573,1503],{"class":322},[112,1575,1506],{"class":118},[112,1577,1578,1580],{"class":114,"line":1190},[112,1579,1503],{"class":322},[112,1581,1520],{"class":118},[112,1583,1585,1587],{"class":114,"line":1584},48,[112,1586,1503],{"class":322},[112,1588,1527],{"class":118},[112,1590,1592,1594,1596],{"class":114,"line":1591},49,[112,1593,1532],{"class":322},[112,1595,1535],{"class":289},[112,1597,1306],{"class":118},[112,1599,1601],{"class":114,"line":1600},50,[112,1602,168],{"emptyLinePlaceholder":167},[112,1604,1606,1609,1612,1615],{"class":114,"line":1605},51,[112,1607,1608],{"class":322},"        proxy_cache_valid ",[112,1610,1611],{"class":289},"     200",[112,1613,1614],{"class":289}," 30d",[112,1616,1306],{"class":118},[112,1618,1620,1623,1626,1629],{"class":114,"line":1619},52,[112,1621,1622],{"class":322},"        add_header ",[112,1624,1625],{"class":118}," Cache-Control ",[112,1627,1628],{"class":280},"\"public, max-age=2592000, immutable\"",[112,1630,1306],{"class":118},[112,1632,1634],{"class":114,"line":1633},53,[112,1635,1341],{"class":118},[112,1637,1639],{"class":114,"line":1638},54,[112,1640,1278],{"class":118},[98,1642,1644],{"id":1643},"tls-证书lets-encrypt","TLS 证书（Let's Encrypt）",[78,1646,1647,1648,1652],{},"首次启动前，需要先拿到 Let's Encrypt 证书。最简单的方式是使用 ",[1649,1650,1651],"strong",{},"certbot"," 的 standalone 模式（临时关闭 Nginx）：",[102,1654,1656],{"className":267,"code":1655,"language":269,"meta":107,"style":107},"sudo certbot certonly --standalone \\\n  -d kite.your-domain.com \\\n  --email you@example.com \\\n  --agree-tos --no-eff-email\n\nsudo cp \u002Fetc\u002Fletsencrypt\u002Flive\u002Fkite.your-domain.com\u002Ffullchain.pem \u002Fopt\u002Fkite\u002Fnginx\u002Fssl\u002F\nsudo cp \u002Fetc\u002Fletsencrypt\u002Flive\u002Fkite.your-domain.com\u002Fprivkey.pem   \u002Fopt\u002Fkite\u002Fnginx\u002Fssl\u002F\n",[109,1657,1658,1674,1684,1694,1702,1706,1719],{"__ignoreMap":107},[112,1659,1660,1663,1666,1669,1672],{"class":114,"line":115},[112,1661,1662],{"class":276},"sudo",[112,1664,1665],{"class":280}," certbot",[112,1667,1668],{"class":280}," certonly",[112,1670,1671],{"class":289}," --standalone",[112,1673,624],{"class":289},[112,1675,1676,1679,1682],{"class":114,"line":122},[112,1677,1678],{"class":289},"  -d",[112,1680,1681],{"class":280}," kite.your-domain.com",[112,1683,624],{"class":289},[112,1685,1686,1689,1692],{"class":114,"line":128},[112,1687,1688],{"class":289},"  --email",[112,1690,1691],{"class":280}," you@example.com",[112,1693,624],{"class":289},[112,1695,1696,1699],{"class":114,"line":134},[112,1697,1698],{"class":289},"  --agree-tos",[112,1700,1701],{"class":289}," --no-eff-email\n",[112,1703,1704],{"class":114,"line":140},[112,1705,168],{"emptyLinePlaceholder":167},[112,1707,1708,1710,1713,1716],{"class":114,"line":146},[112,1709,1662],{"class":276},[112,1711,1712],{"class":280}," cp",[112,1714,1715],{"class":280}," \u002Fetc\u002Fletsencrypt\u002Flive\u002Fkite.your-domain.com\u002Ffullchain.pem",[112,1717,1718],{"class":280}," \u002Fopt\u002Fkite\u002Fnginx\u002Fssl\u002F\n",[112,1720,1721,1723,1725,1728],{"class":114,"line":152},[112,1722,1662],{"class":276},[112,1724,1712],{"class":280},[112,1726,1727],{"class":280}," \u002Fetc\u002Fletsencrypt\u002Flive\u002Fkite.your-domain.com\u002Fprivkey.pem",[112,1729,1730],{"class":280},"   \u002Fopt\u002Fkite\u002Fnginx\u002Fssl\u002F\n",[240,1732,1734],{"id":1733},"自动续期compose-场景","自动续期（Compose 场景）",[78,1736,1737],{},"在 Crontab 中添加（每月 1 日凌晨续期）：",[102,1739,1743],{"className":1740,"code":1741,"language":1742,"meta":107,"style":107},"language-cron shiki shiki-themes github-light github-dark","0 3 1 * * certbot renew --webroot -w \u002Fopt\u002Fkite\u002Fnginx\u002Fwww --deploy-hook \"docker exec kite-nginx nginx -s reload\"\n","cron",[109,1744,1745],{"__ignoreMap":107},[112,1746,1747],{"class":114,"line":115},[112,1748,1741],{},[98,1750,1752],{"id":1751},"方案四静态二进制部署","方案四：静态二进制部署",[78,1754,1755],{},"适用场景：极简运维、离线网络、无需容器环境。",[102,1757,1759],{"className":104,"code":1758,"language":106,"meta":107,"style":107},"flowchart LR\n  Download[下载二进制] --> Verify[校验并授权执行]\n  Verify --> Configure[写入环境变量]\n  Configure --> RunSvc[systemd 启动]\n  RunSvc --> ReverseProxy[接入 Nginx 或 Caddy]\n",[109,1760,1761,1765,1770,1775,1780],{"__ignoreMap":107},[112,1762,1763],{"class":114,"line":115},[112,1764,586],{"class":118},[112,1766,1767],{"class":114,"line":122},[112,1768,1769],{"class":118},"  Download[下载二进制] --> Verify[校验并授权执行]\n",[112,1771,1772],{"class":114,"line":128},[112,1773,1774],{"class":118},"  Verify --> Configure[写入环境变量]\n",[112,1776,1777],{"class":114,"line":134},[112,1778,1779],{"class":118},"  Configure --> RunSvc[systemd 启动]\n",[112,1781,1782],{"class":114,"line":140},[112,1783,1784],{"class":118},"  RunSvc --> ReverseProxy[接入 Nginx 或 Caddy]\n",[240,1786,1788],{"id":1787},"_1-下载并解压","1. 下载并解压",[102,1790,1792],{"className":267,"code":1791,"language":269,"meta":107,"style":107},"mkdir -p \u002Fopt\u002Fkite && cd \u002Fopt\u002Fkite\ncurl -LO https:\u002F\u002Fgithub.com\u002Famigoer\u002Fkite\u002Freleases\u002Flatest\u002Fdownload\u002Fkite-linux-amd64.tar.gz\ntar -xzf kite-linux-amd64.tar.gz\nchmod +x kite\n",[109,1793,1794,1812,1822,1833],{"__ignoreMap":107},[112,1795,1796,1799,1802,1805,1808,1810],{"class":114,"line":115},[112,1797,1798],{"class":276},"mkdir",[112,1800,1801],{"class":289}," -p",[112,1803,1804],{"class":280}," \u002Fopt\u002Fkite",[112,1806,1807],{"class":118}," && ",[112,1809,290],{"class":289},[112,1811,1213],{"class":280},[112,1813,1814,1816,1819],{"class":114,"line":122},[112,1815,720],{"class":276},[112,1817,1818],{"class":289}," -LO",[112,1820,1821],{"class":280}," https:\u002F\u002Fgithub.com\u002Famigoer\u002Fkite\u002Freleases\u002Flatest\u002Fdownload\u002Fkite-linux-amd64.tar.gz\n",[112,1823,1824,1827,1830],{"class":114,"line":128},[112,1825,1826],{"class":276},"tar",[112,1828,1829],{"class":289}," -xzf",[112,1831,1832],{"class":280}," kite-linux-amd64.tar.gz\n",[112,1834,1835,1838,1841],{"class":114,"line":134},[112,1836,1837],{"class":276},"chmod",[112,1839,1840],{"class":280}," +x",[112,1842,293],{"class":280},[240,1844,1846],{"id":1845},"_2-创建目录并启动","2. 创建目录并启动",[102,1848,1850],{"className":267,"code":1849,"language":269,"meta":107,"style":107},"mkdir -p \u002Fopt\u002Fkite\u002Fdata\nexport GIN_MODE=release\nexport KITE_HOST=0.0.0.0\nexport KITE_PORT=8080\nexport KITE_DB_DRIVER=sqlite\nexport KITE_DSN=\u002Fopt\u002Fkite\u002Fdata\u002Fkite.db\nexport KITE_SITE_URL=https:\u002F\u002Fkite.example.com\n\n.\u002Fkite\n",[109,1851,1852,1861,1871,1881,1891,1901,1912,1922,1926],{"__ignoreMap":107},[112,1853,1854,1856,1858],{"class":114,"line":115},[112,1855,1798],{"class":276},[112,1857,1801],{"class":289},[112,1859,1860],{"class":280}," \u002Fopt\u002Fkite\u002Fdata\n",[112,1862,1863,1865,1867,1869],{"class":114,"line":122},[112,1864,323],{"class":322},[112,1866,326],{"class":118},[112,1868,329],{"class":322},[112,1870,332],{"class":118},[112,1872,1873,1875,1877,1879],{"class":114,"line":128},[112,1874,323],{"class":322},[112,1876,339],{"class":118},[112,1878,329],{"class":322},[112,1880,344],{"class":289},[112,1882,1883,1885,1887,1889],{"class":114,"line":134},[112,1884,323],{"class":322},[112,1886,351],{"class":118},[112,1888,329],{"class":322},[112,1890,356],{"class":289},[112,1892,1893,1895,1897,1899],{"class":114,"line":140},[112,1894,323],{"class":322},[112,1896,363],{"class":118},[112,1898,329],{"class":322},[112,1900,368],{"class":118},[112,1902,1903,1905,1907,1909],{"class":114,"line":146},[112,1904,323],{"class":322},[112,1906,375],{"class":118},[112,1908,329],{"class":322},[112,1910,1911],{"class":118},"\u002Fopt\u002Fkite\u002Fdata\u002Fkite.db\n",[112,1913,1914,1916,1918,1920],{"class":114,"line":152},[112,1915,323],{"class":322},[112,1917,387],{"class":118},[112,1919,329],{"class":322},[112,1921,392],{"class":118},[112,1923,1924],{"class":114,"line":158},[112,1925,168],{"emptyLinePlaceholder":167},[112,1927,1928],{"class":114,"line":164},[112,1929,1930],{"class":276},".\u002Fkite\n",[240,1932,1934],{"id":1933},"_3-建议接入反向代理","3. 建议接入反向代理",[78,1936,1937,1938,1940,1941,1944,1945,1948],{},"生产建议通过 Nginx\u002FCaddy 暴露 ",[109,1939,211],{},"，并把 ",[109,1942,1943],{},"Host"," 与 ",[109,1946,1947],{},"X-Forwarded-Proto"," 传递给 Kite。",[98,1950,1951],{"id":1951},"首次初始化与验收",[102,1953,1955],{"className":104,"code":1954,"language":106,"meta":107,"style":107},"flowchart TD\n  Open[访问站点] --> Login[admin\u002Fadmin 首次登录]\n  Login --> Reset[强制重置管理员账号]\n  Reset --> Upload[上传一张测试图片]\n  Upload --> API[调用 \u002Fapi\u002Fv1\u002Fsetup\u002Fstatus]\n  API --> Done[验收完成]\n",[109,1956,1957,1961,1966,1971,1976,1981],{"__ignoreMap":107},[112,1958,1959],{"class":114,"line":115},[112,1960,119],{"class":118},[112,1962,1963],{"class":114,"line":122},[112,1964,1965],{"class":118},"  Open[访问站点] --> Login[admin\u002Fadmin 首次登录]\n",[112,1967,1968],{"class":114,"line":128},[112,1969,1970],{"class":118},"  Login --> Reset[强制重置管理员账号]\n",[112,1972,1973],{"class":114,"line":134},[112,1974,1975],{"class":118},"  Reset --> Upload[上传一张测试图片]\n",[112,1977,1978],{"class":114,"line":140},[112,1979,1980],{"class":118},"  Upload --> API[调用 \u002Fapi\u002Fv1\u002Fsetup\u002Fstatus]\n",[112,1982,1983],{"class":114,"line":146},[112,1984,1985],{"class":118},"  API --> Done[验收完成]\n",[78,1987,1988],{},"验收检查清单：",[82,1990,1991,1994,1997,2006,2013],{},[85,1992,1993],{},"能正常登录后台并重置默认管理员账号",[85,1995,1996],{},"上传图片成功，返回短链可访问",[85,1998,1999,2002,2003],{},[109,2000,2001],{},"GET \u002Fapi\u002Fv1\u002Fsetup\u002Fstatus"," 返回 ",[109,2004,2005],{},"initialized: true",[85,2007,2008,2009,2012],{},"数据目录有 ",[109,2010,2011],{},"kite.db"," 与上传文件",[85,2014,2015],{},"重启进程\u002F容器后数据仍在",[98,2017,2018],{"id":2018},"备份与恢复",[102,2020,2022],{"className":267,"code":2021,"language":269,"meta":107,"style":107},"# 完整备份（SQLite + 本地文件）\ntar -czf kite-backup-$(date +%F).tar.gz -C \u002Fopt\u002Fkite data\n\n# 仅数据库备份（文件在 S3 时）\ncp \u002Fopt\u002Fkite\u002Fdata\u002Fkite.db \u002Fopt\u002Fkite\u002Fkite-$(date +%F).db\n",[109,2023,2024,2029,2062,2066,2071],{"__ignoreMap":107},[112,2025,2026],{"class":114,"line":115},[112,2027,2028],{"class":1287},"# 完整备份（SQLite + 本地文件）\n",[112,2030,2031,2033,2036,2039,2042,2045,2048,2051,2054,2057,2059],{"class":114,"line":122},[112,2032,1826],{"class":276},[112,2034,2035],{"class":289}," -czf",[112,2037,2038],{"class":280}," kite-backup-",[112,2040,2041],{"class":118},"$(",[112,2043,2044],{"class":276},"date",[112,2046,2047],{"class":280}," +%F",[112,2049,2050],{"class":118},")",[112,2052,2053],{"class":280},".tar.gz",[112,2055,2056],{"class":289}," -C",[112,2058,1804],{"class":280},[112,2060,2061],{"class":280}," data\n",[112,2063,2064],{"class":114,"line":128},[112,2065,168],{"emptyLinePlaceholder":167},[112,2067,2068],{"class":114,"line":134},[112,2069,2070],{"class":1287},"# 仅数据库备份（文件在 S3 时）\n",[112,2072,2073,2076,2079,2082,2084,2086,2088,2090],{"class":114,"line":140},[112,2074,2075],{"class":276},"cp",[112,2077,2078],{"class":280}," \u002Fopt\u002Fkite\u002Fdata\u002Fkite.db",[112,2080,2081],{"class":280}," \u002Fopt\u002Fkite\u002Fkite-",[112,2083,2041],{"class":118},[112,2085,2044],{"class":276},[112,2087,2047],{"class":280},[112,2089,2050],{"class":118},[112,2091,2092],{"class":280},".db\n",[98,2094,2095],{"id":2095},"容量规划",[2097,2098,2099,2115],"table",{},[2100,2101,2102],"thead",{},[2103,2104,2105,2109,2112],"tr",{},[2106,2107,2108],"th",{},"部署形态",[2106,2110,2111],{},"典型适用规模",[2106,2113,2114],{},"注意点",[2116,2117,2118,2134,2145],"tbody",{},[2103,2119,2120,2124,2127],{},[2121,2122,2123],"td",{},"SQLite + 本地存储",[2121,2125,2126],{},"单机、≤ 10 万文件",[2121,2128,2129,2130,2133],{},"备份即复制 ",[109,2131,2132],{},"data\u002F"," 目录",[2103,2135,2136,2139,2142],{},[2121,2137,2138],{},"SQLite + S3",[2121,2140,2141],{},"单机、百万级文件",[2121,2143,2144],{},"数据库仍在单机，文件无限扩展",[2103,2146,2147,2150,2153],{},[2121,2148,2149],{},"MySQL\u002FPG + S3",[2121,2151,2152],{},"多实例、大规模",[2121,2154,2155],{},"共享数据库 + 对象存储，水平扩展",[98,2157,2158],{"id":2158},"监控与告警",[78,2160,2161,2163],{},[109,2162,2001],{}," 是一个轻量的健康检查端点：",[102,2165,2167],{"className":267,"code":2166,"language":269,"meta":107,"style":107},"curl https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fsetup\u002Fstatus\n# {\"code\":0,\"message\":\"success\",\"data\":{\"initialized\":true}}\n",[109,2168,2169,2176],{"__ignoreMap":107},[112,2170,2171,2173],{"class":114,"line":115},[112,2172,720],{"class":276},[112,2174,2175],{"class":280}," https:\u002F\u002Fkite.your-domain.com\u002Fapi\u002Fv1\u002Fsetup\u002Fstatus\n",[112,2177,2178],{"class":114,"line":122},[112,2179,2180],{"class":1287},"# {\"code\":0,\"message\":\"success\",\"data\":{\"initialized\":true}}\n",[78,2182,2183],{},"Docker healthcheck 已默认使用它。接入 Uptime Kuma \u002F Grafana 时，建议同时监控：",[197,2185,2186,2192,2199],{},[85,2187,2188,2191],{},[109,2189,2190],{},"\u002Fapi\u002Fv1\u002Fsetup\u002Fstatus","（应用可用性）",[85,2193,2194,2195,2198],{},"反向代理 ",[109,2196,2197],{},"5xx"," 比例（网关健康）",[85,2200,2201,2202,2205],{},"磁盘剩余空间（避免 ",[109,2203,2204],{},"50700","）",[98,2207,2208],{"id":2208},"下一步",[197,2210,2211,2217],{},[85,2212,2213,2216],{},[2214,2215,35],"a",{"href":36}," · 接入 PicGo、ShareX",[85,2218,2219,2222],{},[2214,2220,2221],{"href":46},"API 参考"," · 自定义上传集成",[2224,2225,2226],"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 .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}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sA_wV, html code.shiki .sA_wV{--shiki-default:#032F62;--shiki-dark:#DBEDFF}",{"title":107,"searchDepth":128,"depth":128,"links":2228},[2229,2230,2231,2237,2241,2242,2243,2246,2248,2251,2256,2257,2258,2259,2260],{"id":100,"depth":122,"text":100},{"id":195,"depth":122,"text":195},{"id":234,"depth":122,"text":235,"children":2232},[2233,2234,2235,2236],{"id":242,"depth":128,"text":243},{"id":263,"depth":128,"text":264},{"id":311,"depth":128,"text":312},{"id":404,"depth":128,"text":405},{"id":572,"depth":122,"text":573,"children":2238},[2239,2240],{"id":604,"depth":128,"text":605},{"id":709,"depth":128,"text":710},{"id":738,"depth":122,"text":739},{"id":745,"depth":122,"text":745},{"id":756,"depth":122,"text":759,"children":2244},[2245],{"id":1201,"depth":128,"text":1201},{"id":1238,"depth":122,"text":2247},"kite.conf（Nginx）",{"id":1643,"depth":122,"text":1644,"children":2249},[2250],{"id":1733,"depth":128,"text":1734},{"id":1751,"depth":122,"text":1752,"children":2252},[2253,2254,2255],{"id":1787,"depth":128,"text":1788},{"id":1845,"depth":128,"text":1846},{"id":1933,"depth":128,"text":1934},{"id":1951,"depth":122,"text":1951},{"id":2018,"depth":122,"text":2018},{"id":2095,"depth":122,"text":2095},{"id":2158,"depth":122,"text":2158},{"id":2208,"depth":122,"text":2208},"完整部署指南，覆盖源码部署、Docker 部署、Docker Compose 部署与静态二进制部署。","md",{},{"title":31},{"title":31,"description":2261},"dpuVidPy1MSEU90yS3X_c5IpCUtc8V2iGjEhCd7T6CU",[2268,2270],{"title":27,"path":28,"stem":29,"description":2269,"children":-1},"本地磁盘与 S3 兼容存储的接入方法，包含阿里云 OSS、腾讯云 COS、Cloudflare R2、MinIO。",{"title":35,"path":36,"stem":37,"description":2271,"children":-1},"将 Kite 接入 PicGo、ShareX 等主流图床客户端。",1776443820142]