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