[{"data":1,"prerenderedAt":222},["ShallowReactive",2],{"\u002Fblog\u002Fdocker-migration":3,"\u002Fblog\u002Fdocker-migration-surround":108},{"id":4,"title":5,"body":6,"date":97,"description":98,"extension":99,"meta":100,"navigation":101,"path":102,"seo":103,"stem":104,"tags":105,"__hash__":107},"blog\u002Fblog\u002Fdocker-migration.md","用 Docker 让博客随时可迁移",{"type":7,"value":8,"toc":92},"minimark",[9,18,22,46,49,56,85,88],[10,11,12,13,17],"p",{},"服务器不会一直用同一台，所以部署方案的第一原则是：",[14,15,16],"strong",{},"随时能搬走","。",[19,20,21],"h2",{"id":21},"思路",[23,24,25,33,36,39],"ol",{},[26,27,28,32],"li",{},[29,30,31],"code",{},"npm run generate"," 把整站构建成静态文件",[26,34,35],{},"静态文件由 nginx 容器托管，打成一个很小的镜像",[26,37,38],{},"Caddy 容器做反向代理，负责 HTTPS 证书的自动申请和续期",[26,40,41,42,45],{},"两个容器用一个 ",[29,43,44],{},"docker-compose.yml"," 声明",[19,47,48],{"id":48},"迁移时做什么",[10,50,51,52,55],{},"新服务器上只需要三样东西：代码仓库、",[29,53,54],{},"docker compose up -d","、把域名解析切过去。",[57,58,63],"pre",{"className":59,"code":60,"language":61,"meta":62,"style":62},"language-bash shiki shiki-themes github-light","docker compose up -d\n","bash","",[29,64,65],{"__ignoreMap":62},[66,67,70,74,78,81],"span",{"class":68,"line":69},"line",1,[66,71,73],{"class":72},"s7eDp","docker",[66,75,77],{"class":76},"sYBdl"," compose",[66,79,80],{"class":76}," up",[66,82,84],{"class":83},"sYu0t"," -d\n",[10,86,87],{},"证书数据放在独立的 Docker volume 里，就算没搬过去，Caddy 也会在新机器上自动重新申请。",[89,90,91],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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);}",{"title":62,"searchDepth":93,"depth":93,"links":94},2,[95,96],{"id":21,"depth":93,"text":21},{"id":48,"depth":93,"text":48},"2026-10-24","记录这个博客的部署思路：静态构建 + nginx + Caddy，全部装进 Docker Compose，换服务器只搬配置。","md",{},true,"\u002Fblog\u002Fdocker-migration",{"title":5,"description":98},"blog\u002Fdocker-migration",[73,106],"部署","Mhs2UIoTc8BRwptvTSWfX7-5SSEDuoOUloYSlB5zrcY",{"prev":109,"next":110},null,{"id":111,"title":112,"body":113,"date":97,"description":213,"extension":99,"meta":214,"navigation":101,"path":215,"seo":216,"stem":217,"tags":218,"__hash__":221},"blog\u002Fblog\u002Fhello-world.md","你好，世界",{"type":7,"value":114,"toc":209},[115,118,121,128,144,147,157,203,206],[10,116,117],{},"欢迎来到我的博客！这是第一篇文章。",[19,119,120],{"id":120},"为什么是这个技术栈",[10,122,123,124,127],{},"这个博客用 ",[14,125,126],{},"Nuxt 4 + Nuxt Content v3"," 搭建：",[129,130,131,138,141],"ul",{},[26,132,133,134,137],{},"文章就是 Markdown 文件，放在 ",[29,135,136],{},"content\u002Fblog\u002F"," 目录下，用 Git 管理版本",[26,139,140],{},"Nuxt Content 负责解析 Markdown、生成列表和详情页",[26,142,143],{},"构建产物是纯静态文件，部署和迁移都很轻松",[19,145,146],{"id":146},"写一篇新文章",[10,148,149,150,152,153,156],{},"在 ",[29,151,136],{}," 下新建一个 ",[29,154,155],{},".md"," 文件，写上 frontmatter：",[57,158,162],{"className":159,"code":160,"language":161,"meta":62,"style":62},"language-markdown shiki shiki-themes github-light","---\ntitle: 文章标题\ndescription: 一句话摘要\ndate: 2026-10-24\n---\n\n正文从这里开始……\n","markdown",[29,163,164,169,174,180,186,191,197],{"__ignoreMap":62},[66,165,166],{"class":68,"line":69},[66,167,168],{},"---\n",[66,170,171],{"class":68,"line":93},[66,172,173],{},"title: 文章标题\n",[66,175,177],{"class":68,"line":176},3,[66,178,179],{},"description: 一句话摘要\n",[66,181,183],{"class":68,"line":182},4,[66,184,185],{},"date: 2026-10-24\n",[66,187,189],{"class":68,"line":188},5,[66,190,168],{},[66,192,194],{"class":68,"line":193},6,[66,195,196],{"emptyLinePlaceholder":101},"\n",[66,198,200],{"class":68,"line":199},7,[66,201,202],{},"正文从这里开始……\n",[10,204,205],{},"保存后开发服务器会自动热更新，首页和文章列表会自动收录。",[89,207,208],{},"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);}",{"title":62,"searchDepth":93,"depth":93,"links":210},[211,212],{"id":120,"depth":93,"text":120},{"id":146,"depth":93,"text":146},"博客的第一篇文章：为什么选择 Nuxt 4 + Nuxt Content，以及这个站是怎么搭起来的。",{},"\u002Fblog\u002Fhello-world",{"title":112,"description":213},"blog\u002Fhello-world",[219,220],"nuxt","随笔","xazW6ryJ0bSXKJKx_EYXbtaQ7i7S5APFUMkeyb6AmDg",1793263167229]