[{"data":1,"prerenderedAt":1093},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fenv-variables":3},{"doc":4,"prev":1053,"next":1060,"resolvedType":8,"readingMinutes":103,"audience":1067,"checklist":1071,"related":1075},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fenv-variables","环境变量管理","dotenv 配置、各平台环境变量设置、.env 文件规范与安全实践","article",null,"dev-environment","开发环境","2026-02-27","i-carbon-code",{"type":15,"value":16,"toc":1027},"minimark",[17,20,29,47,51,67,71,78,113,126,131,139,143,146,161,165,168,188,226,230,236,285,366,370,386,438,442,609,612,615,621,663,667,756,760,824,856,859,886,921,924,927,951,954,958,964,967,970,977,983,1023],[18,19,6],"h1",{"id":6},[21,22,23,24,28],"p",{},"环境变量的核心不是“怎么声明”，而是",[25,26,27],"strong",{},"怎么分层、怎么隔离、怎么避免泄露","。很多部署问题和本地能跑线上不能跑，本质上都和环境变量管理混乱有关。",[21,30,31,32,37,38,42,43,46],{},"如果你是在重装 \u002F 新装系统后恢复整机环境，请先看 ",[33,34,36],"a",{"href":35},"\u002Fsetup","Windows 重装部署顺序指南","。整机恢复时，环境变量不是最后补，而是要在安装 ",[39,40,41],"code",{},"scoop","、",[39,44,45],{},"mise","、语言运行时之前先定好的底层约束。这一页只讲变量管理本身，不重新定义整机顺序。",[48,49,50],"h2",{"id":50},"推荐管理原则",[52,53,54,58,61,64],"ul",{},[55,56,57],"li",{},"本地值、本地覆盖、生产值分开",[55,59,60],{},"把变量名文档化，而不是只靠口口相传",[55,62,63],{},"客户端可见变量和服务端私密变量严格区分",[55,65,66],{},"密钥永远不要写死进源码",[48,68,70],{"id":69},"env-文件",".env 文件",[21,72,73,74,77],{},"项目根目录创建 ",[39,75,76],{},".env","：",[79,80,85],"pre",{"className":81,"code":82,"language":83,"meta":84,"style":84},"language-env shiki shiki-themes github-light github-dark","DATABASE_URL=postgres:\u002F\u002Fuser:pass@localhost:5432\u002Fmydb\nAPI_KEY=sk-xxxxxxxxxxxx\nNODE_ENV=development\nPORT=3000\n","env","",[39,86,87,95,101,107],{"__ignoreMap":84},[88,89,92],"span",{"class":90,"line":91},"line",1,[88,93,94],{},"DATABASE_URL=postgres:\u002F\u002Fuser:pass@localhost:5432\u002Fmydb\n",[88,96,98],{"class":90,"line":97},2,[88,99,100],{},"API_KEY=sk-xxxxxxxxxxxx\n",[88,102,104],{"class":90,"line":103},3,[88,105,106],{},"NODE_ENV=development\n",[88,108,110],{"class":90,"line":109},4,[88,111,112],{},"PORT=3000\n",[114,115,116],"blockquote",{},[21,117,118,119,121,122,125],{},"务必将 ",[39,120,76],{}," 加入 ",[39,123,124],{},".gitignore","。",[127,128,130],"h3",{"id":129},"env-文件优先级常见约定",".env 文件优先级（常见约定）",[79,132,137],{"className":133,"code":135,"language":136},[134],"language-text",".env.local          # 本地覆盖，不提交\n.env.development    # 开发环境\n.env.production     # 生产环境\n.env                # 默认，所有环境\n","text",[39,138,135],{"__ignoreMap":84},[127,140,142],{"id":141},"envexample",".env.example",[21,144,145],{},"提交一个示例文件供团队参考：",[79,147,149],{"className":81,"code":148,"language":83,"meta":84,"style":84},"DATABASE_URL=postgres:\u002F\u002Fuser:password@localhost:5432\u002Fdbname\nAPI_KEY=your-api-key-here\n",[39,150,151,156],{"__ignoreMap":84},[88,152,153],{"class":90,"line":91},[88,154,155],{},"DATABASE_URL=postgres:\u002F\u002Fuser:password@localhost:5432\u002Fdbname\n",[88,157,158],{"class":90,"line":97},[88,159,160],{},"API_KEY=your-api-key-here\n",[48,162,164],{"id":163},"nodejs","Node.js",[127,166,167],{"id":167},"dotenv",[79,169,173],{"className":170,"code":171,"language":172,"meta":84,"style":84},"language-bash shiki shiki-themes github-light github-dark","pnpm add dotenv\n","bash",[39,174,175],{"__ignoreMap":84},[88,176,177,181,185],{"class":90,"line":91},[88,178,180],{"class":179},"sScJk","pnpm",[88,182,184],{"class":183},"sZZnC"," add",[88,186,187],{"class":183}," dotenv\n",[79,189,193],{"className":190,"code":191,"language":192,"meta":84,"style":84},"language-javascript shiki shiki-themes github-light github-dark","import \"dotenv\u002Fconfig\";\nconsole.log(process.env.API_KEY);\n","javascript",[39,194,195,208],{"__ignoreMap":84},[88,196,197,201,204],{"class":90,"line":91},[88,198,200],{"class":199},"szBVR","import",[88,202,203],{"class":183}," \"dotenv\u002Fconfig\"",[88,205,207],{"class":206},"sVt8B",";\n",[88,209,210,213,216,219,223],{"class":90,"line":97},[88,211,212],{"class":206},"console.",[88,214,215],{"class":179},"log",[88,217,218],{"class":206},"(process.env.",[88,220,222],{"class":221},"sj4cs","API_KEY",[88,224,225],{"class":206},");\n",[127,227,229],{"id":228},"vite-nuxt","Vite \u002F Nuxt",[21,231,232,233,235],{},"Vite 和 Nuxt 原生支持 ",[39,234,76],{}," 文件：",[79,237,239],{"className":81,"code":238,"language":83,"meta":84,"style":84},"# 客户端可见（Vite）\nVITE_API_URL=https:\u002F\u002Fapi.example.com\n\n# 客户端可见（Nuxt）\nNUXT_PUBLIC_API_URL=https:\u002F\u002Fapi.example.com\n\n# 仅服务端（Nuxt）\nNUXT_API_SECRET=secret\n",[39,240,241,246,251,257,262,268,273,279],{"__ignoreMap":84},[88,242,243],{"class":90,"line":91},[88,244,245],{},"# 客户端可见（Vite）\n",[88,247,248],{"class":90,"line":97},[88,249,250],{},"VITE_API_URL=https:\u002F\u002Fapi.example.com\n",[88,252,253],{"class":90,"line":103},[88,254,256],{"emptyLinePlaceholder":255},true,"\n",[88,258,259],{"class":90,"line":109},[88,260,261],{},"# 客户端可见（Nuxt）\n",[88,263,265],{"class":90,"line":264},5,[88,266,267],{},"NUXT_PUBLIC_API_URL=https:\u002F\u002Fapi.example.com\n",[88,269,271],{"class":90,"line":270},6,[88,272,256],{"emptyLinePlaceholder":255},[88,274,276],{"class":90,"line":275},7,[88,277,278],{},"# 仅服务端（Nuxt）\n",[88,280,282],{"class":90,"line":281},8,[88,283,284],{},"NUXT_API_SECRET=secret\n",[79,286,290],{"className":287,"code":288,"language":289,"meta":84,"style":84},"language-typescript shiki shiki-themes github-light github-dark","\u002F\u002F Vite\nconst apiUrl = import.meta.env.VITE_API_URL;\n\n\u002F\u002F Nuxt\nconst config = useRuntimeConfig();\nconfig.public.apiUrl; \u002F\u002F 客户端\nconfig.apiSecret; \u002F\u002F 仅服务端\n","typescript",[39,291,292,298,326,330,335,350,358],{"__ignoreMap":84},[88,293,294],{"class":90,"line":91},[88,295,297],{"class":296},"sJ8bj","\u002F\u002F Vite\n",[88,299,300,303,306,309,312,315,318,321,324],{"class":90,"line":97},[88,301,302],{"class":199},"const",[88,304,305],{"class":221}," apiUrl",[88,307,308],{"class":199}," =",[88,310,311],{"class":199}," import",[88,313,314],{"class":206},".",[88,316,317],{"class":221},"meta",[88,319,320],{"class":206},".env.",[88,322,323],{"class":221},"VITE_API_URL",[88,325,207],{"class":206},[88,327,328],{"class":90,"line":103},[88,329,256],{"emptyLinePlaceholder":255},[88,331,332],{"class":90,"line":109},[88,333,334],{"class":296},"\u002F\u002F Nuxt\n",[88,336,337,339,342,344,347],{"class":90,"line":264},[88,338,302],{"class":199},[88,340,341],{"class":221}," config",[88,343,308],{"class":199},[88,345,346],{"class":179}," useRuntimeConfig",[88,348,349],{"class":206},"();\n",[88,351,352,355],{"class":90,"line":270},[88,353,354],{"class":206},"config.public.apiUrl; ",[88,356,357],{"class":296},"\u002F\u002F 客户端\n",[88,359,360,363],{"class":90,"line":275},[88,361,362],{"class":206},"config.apiSecret; ",[88,364,365],{"class":296},"\u002F\u002F 仅服务端\n",[48,367,369],{"id":368},"python","Python",[79,371,373],{"className":170,"code":372,"language":172,"meta":84,"style":84},"pip install python-dotenv\n",[39,374,375],{"__ignoreMap":84},[88,376,377,380,383],{"class":90,"line":91},[88,378,379],{"class":179},"pip",[88,381,382],{"class":183}," install",[88,384,385],{"class":183}," python-dotenv\n",[79,387,390],{"className":388,"code":389,"language":368,"meta":84,"style":84},"language-python shiki shiki-themes github-light github-dark","from dotenv import load_dotenv\nimport os\n\nload_dotenv()\napi_key = os.getenv('API_KEY')\n",[39,391,392,405,412,416,421],{"__ignoreMap":84},[88,393,394,397,400,402],{"class":90,"line":91},[88,395,396],{"class":199},"from",[88,398,399],{"class":206}," dotenv ",[88,401,200],{"class":199},[88,403,404],{"class":206}," load_dotenv\n",[88,406,407,409],{"class":90,"line":97},[88,408,200],{"class":199},[88,410,411],{"class":206}," os\n",[88,413,414],{"class":90,"line":103},[88,415,256],{"emptyLinePlaceholder":255},[88,417,418],{"class":90,"line":109},[88,419,420],{"class":206},"load_dotenv()\n",[88,422,423,426,429,432,435],{"class":90,"line":264},[88,424,425],{"class":206},"api_key ",[88,427,428],{"class":199},"=",[88,430,431],{"class":206}," os.getenv(",[88,433,434],{"class":183},"'API_KEY'",[88,436,437],{"class":206},")\n",[48,439,441],{"id":440},"windows-环境变量","Windows 环境变量",[79,443,447],{"className":444,"code":445,"language":446,"meta":84,"style":84},"language-powershell shiki shiki-themes github-light github-dark","# 查看\n$env:PATH\n[Environment]::GetEnvironmentVariable(\"PATH\", \"User\")\n\n# 临时设置（当前会话）\n$env:NODE_ENV = \"production\"\n\n# 永久设置（用户级）\n[Environment]::SetEnvironmentVariable(\"MY_VAR\", \"value\", \"User\")\n\n# 永久设置（系统级，需管理员）\n[Environment]::SetEnvironmentVariable(\"MY_VAR\", \"value\", \"Machine\")\n\n# 删除\n[Environment]::SetEnvironmentVariable(\"MY_VAR\", $null, \"User\")\n","powershell",[39,448,449,454,465,487,491,496,510,514,519,543,548,554,576,581,587],{"__ignoreMap":84},[88,450,451],{"class":90,"line":91},[88,452,453],{"class":296},"# 查看\n",[88,455,456,459,462],{"class":90,"line":97},[88,457,458],{"class":206},"$",[88,460,461],{"class":221},"env:",[88,463,464],{"class":206},"PATH\n",[88,466,467,470,473,476,479,482,485],{"class":90,"line":103},[88,468,469],{"class":206},"[",[88,471,472],{"class":199},"Environment",[88,474,475],{"class":206},"]::GetEnvironmentVariable(",[88,477,478],{"class":183},"\"PATH\"",[88,480,481],{"class":199},",",[88,483,484],{"class":183}," \"User\"",[88,486,437],{"class":206},[88,488,489],{"class":90,"line":109},[88,490,256],{"emptyLinePlaceholder":255},[88,492,493],{"class":90,"line":264},[88,494,495],{"class":296},"# 临时设置（当前会话）\n",[88,497,498,500,502,505,507],{"class":90,"line":270},[88,499,458],{"class":206},[88,501,461],{"class":221},[88,503,504],{"class":206},"NODE_ENV ",[88,506,428],{"class":199},[88,508,509],{"class":183}," \"production\"\n",[88,511,512],{"class":90,"line":275},[88,513,256],{"emptyLinePlaceholder":255},[88,515,516],{"class":90,"line":281},[88,517,518],{"class":296},"# 永久设置（用户级）\n",[88,520,522,524,526,529,532,534,537,539,541],{"class":90,"line":521},9,[88,523,469],{"class":206},[88,525,472],{"class":199},[88,527,528],{"class":206},"]::SetEnvironmentVariable(",[88,530,531],{"class":183},"\"MY_VAR\"",[88,533,481],{"class":199},[88,535,536],{"class":183}," \"value\"",[88,538,481],{"class":199},[88,540,484],{"class":183},[88,542,437],{"class":206},[88,544,546],{"class":90,"line":545},10,[88,547,256],{"emptyLinePlaceholder":255},[88,549,551],{"class":90,"line":550},11,[88,552,553],{"class":296},"# 永久设置（系统级，需管理员）\n",[88,555,557,559,561,563,565,567,569,571,574],{"class":90,"line":556},12,[88,558,469],{"class":206},[88,560,472],{"class":199},[88,562,528],{"class":206},[88,564,531],{"class":183},[88,566,481],{"class":199},[88,568,536],{"class":183},[88,570,481],{"class":199},[88,572,573],{"class":183}," \"Machine\"",[88,575,437],{"class":206},[88,577,579],{"class":90,"line":578},13,[88,580,256],{"emptyLinePlaceholder":255},[88,582,584],{"class":90,"line":583},14,[88,585,586],{"class":296},"# 删除\n",[88,588,590,592,594,596,598,600,603,605,607],{"class":90,"line":589},15,[88,591,469],{"class":206},[88,593,472],{"class":199},[88,595,528],{"class":206},[88,597,531],{"class":183},[88,599,481],{"class":199},[88,601,602],{"class":221}," $null",[88,604,481],{"class":199},[88,606,484],{"class":183},[88,608,437],{"class":206},[21,610,611],{},"GUI 方式：设置 → 系统 → 关于 → 高级系统设置 → 环境变量",[127,613,614],{"id":614},"重装场景下优先确认的变量",[21,616,617,618,620],{},"如果你是在按 ",[39,619,35],{}," 恢复一台 Windows 开发机，建议优先把这些变量先写好：",[52,622,623,628,633,638,643,648,653,658],{},[55,624,625],{},[39,626,627],{},"WORKSPACE_ROOT",[55,629,630],{},[39,631,632],{},"CACHE_ROOT",[55,634,635],{},[39,636,637],{},"SCOOP",[55,639,640],{},[39,641,642],{},"SCOOP_GLOBAL",[55,644,645],{},[39,646,647],{},"MISE_DATA_DIR",[55,649,650],{},[39,651,652],{},"MISE_CONFIG_DIR",[55,654,655],{},[39,656,657],{},"UV_CACHE_DIR",[55,659,660],{},[39,661,662],{},"BUN_INSTALL",[48,664,666],{"id":665},"linux-macos","Linux \u002F macOS",[79,668,670],{"className":170,"code":669,"language":172,"meta":84,"style":84},"# 临时设置\nexport API_KEY=xxx\n\n# 永久设置（添加到 ~\u002F.bashrc 或 ~\u002F.zshrc）\necho 'export API_KEY=xxx' >> ~\u002F.bashrc\nsource ~\u002F.bashrc\n\n# 查看\necho $API_KEY\nenv | grep API\nprintenv API_KEY\n",[39,671,672,677,690,694,699,713,720,724,728,735,748],{"__ignoreMap":84},[88,673,674],{"class":90,"line":91},[88,675,676],{"class":296},"# 临时设置\n",[88,678,679,682,685,687],{"class":90,"line":97},[88,680,681],{"class":199},"export",[88,683,684],{"class":206}," API_KEY",[88,686,428],{"class":199},[88,688,689],{"class":206},"xxx\n",[88,691,692],{"class":90,"line":103},[88,693,256],{"emptyLinePlaceholder":255},[88,695,696],{"class":90,"line":109},[88,697,698],{"class":296},"# 永久设置（添加到 ~\u002F.bashrc 或 ~\u002F.zshrc）\n",[88,700,701,704,707,710],{"class":90,"line":264},[88,702,703],{"class":221},"echo",[88,705,706],{"class":183}," 'export API_KEY=xxx'",[88,708,709],{"class":199}," >>",[88,711,712],{"class":183}," ~\u002F.bashrc\n",[88,714,715,718],{"class":90,"line":270},[88,716,717],{"class":221},"source",[88,719,712],{"class":183},[88,721,722],{"class":90,"line":275},[88,723,256],{"emptyLinePlaceholder":255},[88,725,726],{"class":90,"line":281},[88,727,453],{"class":296},[88,729,730,732],{"class":90,"line":521},[88,731,703],{"class":221},[88,733,734],{"class":206}," $API_KEY\n",[88,736,737,739,742,745],{"class":90,"line":545},[88,738,83],{"class":179},[88,740,741],{"class":199}," |",[88,743,744],{"class":179}," grep",[88,746,747],{"class":183}," API\n",[88,749,750,753],{"class":90,"line":550},[88,751,752],{"class":179},"printenv",[88,754,755],{"class":183}," API_KEY\n",[48,757,759],{"id":758},"docker","Docker",[79,761,765],{"className":762,"code":763,"language":764,"meta":84,"style":84},"language-yaml shiki shiki-themes github-light github-dark","# docker-compose.yml\nservices:\n  app:\n    env_file:\n      - .env\n    environment:\n      - NODE_ENV=production\n      - EXTRA_VAR=value\n","yaml",[39,766,767,772,781,788,795,803,810,817],{"__ignoreMap":84},[88,768,769],{"class":90,"line":91},[88,770,771],{"class":296},"# docker-compose.yml\n",[88,773,774,778],{"class":90,"line":97},[88,775,777],{"class":776},"s9eBZ","services",[88,779,780],{"class":206},":\n",[88,782,783,786],{"class":90,"line":103},[88,784,785],{"class":776},"  app",[88,787,780],{"class":206},[88,789,790,793],{"class":90,"line":109},[88,791,792],{"class":776},"    env_file",[88,794,780],{"class":206},[88,796,797,800],{"class":90,"line":264},[88,798,799],{"class":206},"      - ",[88,801,802],{"class":183},".env\n",[88,804,805,808],{"class":90,"line":270},[88,806,807],{"class":776},"    environment",[88,809,780],{"class":206},[88,811,812,814],{"class":90,"line":275},[88,813,799],{"class":206},[88,815,816],{"class":183},"NODE_ENV=production\n",[88,818,819,821],{"class":90,"line":281},[88,820,799],{"class":206},[88,822,823],{"class":183},"EXTRA_VAR=value\n",[79,825,827],{"className":170,"code":826,"language":172,"meta":84,"style":84},"# docker run\ndocker run --env-file .env -e NODE_ENV=production my-app\n",[39,828,829,834],{"__ignoreMap":84},[88,830,831],{"class":90,"line":91},[88,832,833],{"class":296},"# docker run\n",[88,835,836,838,841,844,847,850,853],{"class":90,"line":97},[88,837,758],{"class":179},[88,839,840],{"class":183}," run",[88,842,843],{"class":221}," --env-file",[88,845,846],{"class":183}," .env",[88,848,849],{"class":221}," -e",[88,851,852],{"class":183}," NODE_ENV=production",[88,854,855],{"class":183}," my-app\n",[48,857,858],{"id":858},"安全实践",[52,860,861,864,870,873,876],{},[55,862,863],{},"永远不要将密钥提交到 Git",[55,865,866,867,869],{},"使用 ",[39,868,142],{}," 记录需要的变量名",[55,871,872],{},"生产环境使用平台的 Secrets 管理（Vercel、Cloudflare、GitHub Secrets）",[55,874,875],{},"定期轮换 API 密钥",[55,877,866,878,881,882,885],{},[39,879,880],{},"git-secrets"," 或 ",[39,883,884],{},"gitleaks"," 扫描泄露",[79,887,889],{"className":170,"code":888,"language":172,"meta":84,"style":84},"# 安装 gitleaks\nscoop install gitleaks\n\n# 扫描仓库\ngitleaks detect\n",[39,890,891,896,905,909,914],{"__ignoreMap":84},[88,892,893],{"class":90,"line":91},[88,894,895],{"class":296},"# 安装 gitleaks\n",[88,897,898,900,902],{"class":90,"line":97},[88,899,41],{"class":179},[88,901,382],{"class":183},[88,903,904],{"class":183}," gitleaks\n",[88,906,907],{"class":90,"line":103},[88,908,256],{"emptyLinePlaceholder":255},[88,910,911],{"class":90,"line":109},[88,912,913],{"class":296},"# 扫描仓库\n",[88,915,916,918],{"class":90,"line":264},[88,917,884],{"class":179},[88,919,920],{"class":183}," detect\n",[48,922,923],{"id":923},"参考链接",[48,925,926],{"id":926},"推荐检查清单",[52,928,929,934,942,945,948],{},[55,930,931,932],{},"仓库里有 ",[39,933,142],{},[55,935,936,42,938,941],{},[39,937,76],{},[39,939,940],{},".env.local"," 已被忽略",[55,943,944],{},"生产变量已在平台 Secret \u002F Variables 中配置",[55,946,947],{},"客户端变量前缀符合框架约定",[55,949,950],{},"密钥轮换流程有记录",[48,952,953],{"id":953},"常见问题",[127,955,957],{"id":956},"本地能跑部署后报缺少变量","本地能跑，部署后报缺少变量",[21,959,960,961,963],{},"最常见原因就是本地 ",[39,962,76],{}," 生效了，但云平台里没有配对应变量。",[127,965,966],{"id":966},"为什么变量在客户端暴露了",[21,968,969],{},"通常是用了错误前缀，或者把本该服务端读取的变量放进了公共运行时配置。",[127,971,973,974,976],{"id":972},"能不能把-env-加密后提交","能不能把 ",[39,975,76],{}," 加密后提交",[21,978,979,980,982],{},"可以有更高级的方案，但对大多数项目来说，先把 ",[39,981,142],{},"、Secrets 平台和最小暴露原则做好，收益更直接。",[52,984,985,993,1001,1009,1016],{},[55,986,987,992],{},[33,988,167],{"href":989,"rel":990},"https:\u002F\u002Fgithub.com\u002Fmotdotla\u002Fdotenv",[991],"nofollow"," — Node.js",[55,994,995,1000],{},[33,996,999],{"href":997,"rel":998},"https:\u002F\u002Fgithub.com\u002Ftheskumar\u002Fpython-dotenv",[991],"python-dotenv"," — Python",[55,1002,1003,1008],{},[33,1004,1007],{"href":1005,"rel":1006},"https:\u002F\u002Fvite.dev\u002Fguide\u002Fenv-and-mode",[991],"Vite 环境变量"," — 文档",[55,1010,1011,1015],{},[33,1012,884],{"href":1013,"rel":1014},"https:\u002F\u002Fgithub.com\u002Fgitleaks\u002Fgitleaks",[991]," — 密钥泄露检测",[55,1017,1018,1022],{},[33,1019,1021],{"href":1020},"\u002Fdocs\u002Flocal-setup","本地运行与部署"," — 结合当前项目实际开发和构建流程一起看",[1024,1025,1026],"style",{},"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 .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":84,"searchDepth":97,"depth":97,"links":1028},[1029,1030,1034,1038,1039,1042,1043,1044,1045,1046,1047],{"id":50,"depth":97,"text":50},{"id":69,"depth":97,"text":70,"children":1031},[1032,1033],{"id":129,"depth":103,"text":130},{"id":141,"depth":103,"text":142},{"id":163,"depth":97,"text":164,"children":1035},[1036,1037],{"id":167,"depth":103,"text":167},{"id":228,"depth":103,"text":229},{"id":368,"depth":97,"text":369},{"id":440,"depth":97,"text":441,"children":1040},[1041],{"id":614,"depth":103,"text":614},{"id":665,"depth":97,"text":666},{"id":758,"depth":97,"text":759},{"id":858,"depth":97,"text":858},{"id":923,"depth":97,"text":923},{"id":926,"depth":97,"text":926},{"id":953,"depth":97,"text":953,"children":1048},[1049,1050,1051],{"id":956,"depth":103,"text":957},{"id":966,"depth":103,"text":966},{"id":972,"depth":103,"text":1052},"能不能把 .env 加密后提交",{"path":1054,"title":1055,"description":1056,"docType":8,"resourceKind":9,"categoryId":1057,"categoryLabel":1058,"updatedAt":12,"publishedAt":12,"icon":1059},"\u002Fdocs\u002Fsecurity-hardening","服务器安全加固","SSH 安全、防火墙配置、fail2ban、自动更新与安全检查清单","network-security","网络与安全","i-carbon-network-4",{"path":1061,"title":1062,"description":1063,"docType":8,"resourceKind":9,"categoryId":1064,"categoryLabel":1065,"updatedAt":12,"publishedAt":12,"icon":1066},"\u002Fdocs\u002Fmonitoring-logging","监控与日志","服务器监控工具、日志管理、Uptime 监控与告警配置","infra-deployment","服务器与部署","i-carbon-cloud",[1068,1069,1070],"希望把零散经验整理成长期可复用工作流的人","正在搭建开发环境、统一工具链或排查构建问题的开发者","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1072,1073,1074],"先浏览标题、摘要和目录，带着问题阅读会更高效","确认本机 Node、包管理器、终端和仓库依赖版本是否一致","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1076,1079,1084,1089],{"path":1020,"title":1021,"description":1077,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1078,"publishedAt":1078,"icon":13},"使用 bun 安装、开发、构建与预览 DomiVault 的完整本地流程与排障指引","2026-03-10",{"path":1080,"title":1081,"description":1082,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1083,"publishedAt":1083,"icon":13},"\u002Fdocs\u002Fvolta-guide","Volta Node 版本管理","使用 Volta 管理 Node.js、npm、pnpm 和 Yarn，并在项目中固定 JavaScript 工具链版本","2026-03-08",{"path":1085,"title":1086,"description":1087,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1088,"publishedAt":1088,"icon":13},"\u002Fdocs\u002Fpnpm-monorepo","pnpm 与 Monorepo","pnpm 使用技巧、workspace 配置、Monorepo 项目管理与 Turborepo","2026-02-28",{"path":1090,"title":1091,"description":1092,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fapi-testing","API 测试与调试","curl、HTTPie、Postman、Bruno 等 API 测试工具与常用技巧",1776215712948]