<!DOCTYPE html><html lang="zh_CN"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="https://img.neotalks.org/2026/02/a6a1d0531dfd3d7cc3eedf6849aa95cb.png"/><link rel="preload" as="image" href="https://img.neotalks.org/2026/02/5782054664c31d38eab44aa4c413a50a.gif"/><link rel="preload" as="image" href="https://img.neotalks.org/2026/02/11930194faae066907dca28046f29e7a.png"/><link rel="preload" as="image" href="https://img.neotalks.org/2026/01/9a668590c3c646e5ff3cf83731a3aeb9.png"/><link rel="preload" as="image" href="https://img.neotalks.org/2026/01/b7be49b88ef6994bc0daf22e40374f4c.png"/><link rel="preload" as="image" href="https://img.neotalks.org/2026/01/a5f04d10688a33bc116ad9df67f7e0cf.png"/><link rel="preload" as="image" href="https://img.neotalks.org/2026/01/937e8d0149eab51386b51e2e8d34387b.png"/><link rel="preload" as="image" href="https://img.neotalks.org/2026/01/0613ba1ea817a50dc48d4dbca416d310.png"/><link rel="preload" as="image" href="https://img.neotalks.org/2026/01/44ec766fe8a7503e27b1bc0de9bbc98b.png"/><link rel="preload" as="image" href="https://img.neotalks.org/2026/01/13d52c899c9753b77734405fe5f21d6e.jpg"/><link rel="stylesheet" href="/_next/static/chunks/1eb4e623bbab9d80.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/chunks/ee29aad0f5404c1a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/271cd972cc21572d.js"/><script src="/_next/static/chunks/236f7e5abd6f09ff.js" async=""></script><script src="/_next/static/chunks/41bbd0e22e673b81.js" async=""></script><script src="/_next/static/chunks/17bb38bff44521fb.js" async=""></script><script src="/_next/static/chunks/turbopack-17ed645892144c61.js" async=""></script><script src="/_next/static/chunks/295d483fd0fe7058.js" async=""></script><script src="/_next/static/chunks/90133f3a98134237.js" async=""></script><script src="/_next/static/chunks/9a8c152fe936fdb1.js" async=""></script><script src="/_next/static/chunks/b7c457a3aba29949.js" async=""></script><script src="/_next/static/chunks/9a932f32d4998aba.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/839ab1df2e8507d5.js" async=""></script><script src="/_next/static/chunks/a2482c2cb1e6ce2d.js" async=""></script><script src="/_next/static/chunks/2b195bdb5f7e8b9c.js" async=""></script><script src="/_next/static/chunks/803a574de9eda7ae.js" async=""></script><script src="/_next/static/chunks/cd9e183a5b732415.js" async=""></script><link rel="preload" as="image" href="https://img.neotalks.org/2025/12/d2b5c8dcb2966dd69fa3ff7cb1a5be17.jpg"/><link rel="preload" as="image" href="https://img.neotalks.org/2025/12/f0d8d0b57c18d1b1280c6fcdfd13f894.png"/><title>新青年talks</title><meta name="description" content="分享编程技术、生活感悟和个人项目的展示平台"/><meta name="author" content="李星河"/><meta name="keywords" content="博客,李星河,前端开发,全栈开发,技术分享,编程,新青年talks"/><meta name="creator" content="李星河"/><meta name="publisher" content="李星河"/><meta name="robots" content="index, follow"/><meta property="og:title" content="新青年talks"/><meta property="og:description" content="分享编程技术、生活感悟和个人项目的展示平台"/><meta property="og:url" content="https://neotalks.org"/><meta property="og:site_name" content="新青年talks"/><meta property="og:locale" content="zh_CN"/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="新青年talks"/><meta name="twitter:description" content="分享编程技术、生活感悟和个人项目的展示平台"/><link rel="icon" href="/favicon.ico?favicon.da58135a.ico" sizes="48x48" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script><style data-emotion="mui-global o6gwfi">html{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;-webkit-text-size-adjust:100%;}*,*::before,*::after{box-sizing:inherit;}strong,b{font-weight:700;}body{margin:0;color:rgba(0, 0, 0, 0.87);font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:1rem;line-height:1.5;letter-spacing:0.00938em;background-color:#fff;}@media print{body{background-color:#fff;}}body::backdrop{background-color:#fff;}</style><style data-emotion="mui 1rrgw22 2ua4m4 rn44y9 awgou1 i9gxme cg4bv9 1lhyht2 10sxck q7mezt 16rvy67 1ah0jjf qczhs4 3b8ywx 1eiq2rz 1cmizrj rqnj93 wnbpzh q7u9va 15gku5u 101c9j6 10izahe 1uedjar 0 vxgrp0 xvkitm h5fkc8 5l6nrt ip4y8a rpcq65 16x07r3 1effwaz 6w7dle ljvr2e 130sxs2 1kwoqpp 1rpvezq 7yakh 1h3bboh 9y3ish 15q2cw4 1lrclm3 l6pb42 srzspa 12e41m1 51eq8m 1cp7dfl 1owhhco 1uirv3s 4v85u4">.mui-1rrgw22{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background-color:rgba(255, 255, 255, 0.3);box-shadow:none;}.mui-2ua4m4{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;box-sizing:border-box;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:fixed;z-index:1100;top:0;left:auto;right:0;--AppBar-background:transparent;--AppBar-color:inherit;background-color:var(--AppBar-background);color:var(--AppBar-color);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background-color:rgba(255, 255, 255, 0.3);box-shadow:none;}@media print{.mui-2ua4m4{position:absolute;}}.mui-rn44y9{background-color:#fff;color:rgba(0, 0, 0, 0.87);-webkit-transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;box-shadow:var(--Paper-shadow);background-image:var(--Paper-overlay);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;box-sizing:border-box;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:fixed;z-index:1100;top:0;left:auto;right:0;--AppBar-background:transparent;--AppBar-color:inherit;background-color:var(--AppBar-background);color:var(--AppBar-color);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background-color:rgba(255, 255, 255, 0.3);box-shadow:none;}@media print{.mui-rn44y9{position:absolute;}}.mui-awgou1{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:16px;padding-right:16px;min-height:56px;}@media (min-width:600px){.mui-awgou1{padding-left:24px;padding-right:24px;}}@media (min-width:0px){@media (orientation: landscape){.mui-awgou1{min-height:48px;}}}@media (min-width:600px){.mui-awgou1{min-height:64px;}}.mui-i9gxme{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.mui-cg4bv9{font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:500;font-size:0.875rem;line-height:1.75;letter-spacing:0.02857em;text-transform:uppercase;min-width:64px;padding:6px 16px;border:0;border-radius:4px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:6px 8px;color:var(--variant-textColor);background-color:var(--variant-textBg);--variant-textColor:#d9e2e7;--variant-outlinedColor:#d9e2e7;--variant-outlinedBorder:rgba(217, 226, 231, 0.5);--variant-containedColor:rgba(0, 0, 0, 0.87);--variant-containedBg:#d9e2e7;padding:4px 5px;font-size:0.8125rem;margin-right:16px;color:#154b77;}.mui-cg4bv9:hover{-webkit-text-decoration:none;text-decoration:none;}.mui-cg4bv9.Mui-disabled{color:rgba(0, 0, 0, 0.26);}@media (hover: hover){.mui-cg4bv9:hover{--variant-containedBg:rgb(151, 158, 161);--variant-textBg:rgba(217, 226, 231, 0.04);--variant-outlinedBorder:#d9e2e7;--variant-outlinedBg:rgba(217, 226, 231, 0.04);}}.mui-1lhyht2{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:500;font-size:0.875rem;line-height:1.75;letter-spacing:0.02857em;text-transform:uppercase;min-width:64px;padding:6px 16px;border:0;border-radius:4px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:6px 8px;color:var(--variant-textColor);background-color:var(--variant-textBg);--variant-textColor:#d9e2e7;--variant-outlinedColor:#d9e2e7;--variant-outlinedBorder:rgba(217, 226, 231, 0.5);--variant-containedColor:rgba(0, 0, 0, 0.87);--variant-containedBg:#d9e2e7;padding:4px 5px;font-size:0.8125rem;margin-right:16px;color:#154b77;}.mui-1lhyht2::-moz-focus-inner{border-style:none;}.mui-1lhyht2.Mui-disabled{pointer-events:none;cursor:default;}@media print{.mui-1lhyht2{-webkit-print-color-adjust:exact;color-adjust:exact;}}.mui-1lhyht2:hover{-webkit-text-decoration:none;text-decoration:none;}.mui-1lhyht2.Mui-disabled{color:rgba(0, 0, 0, 0.26);}@media (hover: hover){.mui-1lhyht2:hover{--variant-containedBg:rgb(151, 158, 161);--variant-textBg:rgba(217, 226, 231, 0.04);--variant-outlinedBorder:#d9e2e7;--variant-outlinedBg:rgba(217, 226, 231, 0.04);}}.mui-10sxck{margin:0;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:1rem;line-height:1.5;letter-spacing:0.00938em;position:relative;padding-bottom:8px;}.mui-10sxck::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#154b77;-webkit-transition:background-color 0.3s ease;transition:background-color 0.3s ease;}.mui-q7mezt{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;fill:currentColor;font-size:1.5rem;}.mui-16rvy67{font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:500;font-size:0.875rem;line-height:1.75;letter-spacing:0.02857em;text-transform:uppercase;min-width:64px;padding:6px 16px;border:0;border-radius:4px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:6px 8px;color:var(--variant-textColor);background-color:var(--variant-textBg);--variant-textColor:#d9e2e7;--variant-outlinedColor:#d9e2e7;--variant-outlinedBorder:rgba(217, 226, 231, 0.5);--variant-containedColor:rgba(0, 0, 0, 0.87);--variant-containedBg:#d9e2e7;padding:4px 5px;font-size:0.8125rem;margin-right:16px;color:#afc9db;}.mui-16rvy67:hover{-webkit-text-decoration:none;text-decoration:none;}.mui-16rvy67.Mui-disabled{color:rgba(0, 0, 0, 0.26);}@media (hover: hover){.mui-16rvy67:hover{--variant-containedBg:rgb(151, 158, 161);--variant-textBg:rgba(217, 226, 231, 0.04);--variant-outlinedBorder:#d9e2e7;--variant-outlinedBg:rgba(217, 226, 231, 0.04);}}.mui-1ah0jjf{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:500;font-size:0.875rem;line-height:1.75;letter-spacing:0.02857em;text-transform:uppercase;min-width:64px;padding:6px 16px;border:0;border-radius:4px;-webkit-transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,box-shadow 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,border-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;padding:6px 8px;color:var(--variant-textColor);background-color:var(--variant-textBg);--variant-textColor:#d9e2e7;--variant-outlinedColor:#d9e2e7;--variant-outlinedBorder:rgba(217, 226, 231, 0.5);--variant-containedColor:rgba(0, 0, 0, 0.87);--variant-containedBg:#d9e2e7;padding:4px 5px;font-size:0.8125rem;margin-right:16px;color:#afc9db;}.mui-1ah0jjf::-moz-focus-inner{border-style:none;}.mui-1ah0jjf.Mui-disabled{pointer-events:none;cursor:default;}@media print{.mui-1ah0jjf{-webkit-print-color-adjust:exact;color-adjust:exact;}}.mui-1ah0jjf:hover{-webkit-text-decoration:none;text-decoration:none;}.mui-1ah0jjf.Mui-disabled{color:rgba(0, 0, 0, 0.26);}@media (hover: hover){.mui-1ah0jjf:hover{--variant-containedBg:rgb(151, 158, 161);--variant-textBg:rgba(217, 226, 231, 0.04);--variant-outlinedBorder:#d9e2e7;--variant-outlinedBg:rgba(217, 226, 231, 0.04);}}.mui-qczhs4{margin:0;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:1rem;line-height:1.5;letter-spacing:0.00938em;position:relative;padding-bottom:8px;}.mui-qczhs4::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:transparent;-webkit-transition:background-color 0.3s ease;transition:background-color 0.3s ease;}.mui-3b8ywx{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:85vh;}.mui-1eiq2rz{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-top:64px;}.mui-1cmizrj{width:100%;margin-left:auto;box-sizing:border-box;margin-right:auto;padding-left:16px;padding-right:16px;}@media (min-width:600px){.mui-1cmizrj{padding-left:24px;padding-right:24px;}}@media (min-width:1536px){.mui-1cmizrj{max-width:1536px;}}.mui-rqnj93{--Grid-columns:24;--Grid-columnSpacing:0px;--Grid-rowSpacing:0px;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;min-width:0;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--Grid-rowSpacing) var(--Grid-columnSpacing);-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}.mui-rqnj93 >*{--Grid-parent-columns:24;}.mui-rqnj93 >*{--Grid-parent-columnSpacing:0px;}.mui-rqnj93 >*{--Grid-parent-rowSpacing:0px;}.mui-wnbpzh{padding-top:16px;padding-bottom:16px;margin-top:64px;background-color:transparent;color:black;}.mui-q7u9va{width:100%;margin-left:auto;box-sizing:border-box;margin-right:auto;padding-left:16px;padding-right:16px;}@media (min-width:600px){.mui-q7u9va{padding-left:24px;padding-right:24px;}}@media (min-width:900px){.mui-q7u9va{max-width:900px;}}.mui-15gku5u{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;}.mui-101c9j6{margin:0;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:1rem;line-height:1.5;letter-spacing:0.00938em;text-align:var(--Typography-textAlign);}.mui-10izahe{margin:0;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:0.75rem;line-height:1.66;letter-spacing:0.03333em;text-align:var(--Typography-textAlign);color:rgba(0, 0, 0, 0.6);}.mui-1uedjar{min-width:0;box-sizing:border-box;margin-left:calc(100% * 0.4 / var(--Grid-parent-columns) + var(--Grid-parent-columnSpacing) * 0.4 / var(--Grid-parent-columns));}@media (min-width:600px){.mui-1uedjar{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 0 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 0) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));}}@media (min-width:900px){.mui-1uedjar{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 6 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 6) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));}}@media (min-width:1200px){.mui-1uedjar{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 6 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 6) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));}}@media (min-width:0px){.mui-1uedjar{display:none;}}@media (min-width:900px){.mui-1uedjar{display:block;}}.mui-vxgrp0{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}.mui-xvkitm{min-width:0;box-sizing:border-box;}@media (min-width:600px){.mui-xvkitm{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 20 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 20) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));}}@media (min-width:900px){.mui-xvkitm{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 14 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 14) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));}}@media (min-width:1200px){.mui-xvkitm{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 15 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 15) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));}}.mui-h5fkc8{margin-top:32px;}.mui-5l6nrt{--Grid-columns:12;--Grid-columnSpacing:0px;--Grid-rowSpacing:0px;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;min-width:0;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--Grid-rowSpacing) var(--Grid-columnSpacing);-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}.mui-5l6nrt >*{--Grid-parent-columns:12;}.mui-5l6nrt >*{--Grid-parent-columnSpacing:0px;}.mui-5l6nrt >*{--Grid-parent-rowSpacing:0px;}.mui-ip4y8a{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 0 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 0) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));min-width:0;box-sizing:border-box;}@media (min-width:600px){.mui-ip4y8a{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 3 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 3) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));}}@media (min-width:900px){.mui-ip4y8a{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 3 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 3) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));}}.mui-rpcq65{-webkit-background-size:cover;background-size:cover;-webkit-background-position:center;background-position:center;}.mui-16x07r3{--Grid-columns:4;--Grid-columnSpacing:8px;--Grid-rowSpacing:8px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 8 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 8) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-width:0;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--Grid-rowSpacing) var(--Grid-columnSpacing);-webkit-align-items:start;-webkit-box-align:start;-ms-flex-align:start;align-items:start;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}.mui-16x07r3 >*{--Grid-parent-columns:4;}.mui-16x07r3 >*{--Grid-parent-columnSpacing:8px;}.mui-16x07r3 >*{--Grid-parent-rowSpacing:8px;}.mui-1effwaz{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 3 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 3) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));min-width:0;box-sizing:border-box;margin-left:0px;}@media (min-width:600px){.mui-1effwaz{margin-left:calc(100% * 0.5 / var(--Grid-parent-columns) + var(--Grid-parent-columnSpacing) * 0.5 / var(--Grid-parent-columns));}}@media (min-width:900px){.mui-1effwaz{margin-left:calc(100% * 0.5 / var(--Grid-parent-columns) + var(--Grid-parent-columnSpacing) * 0.5 / var(--Grid-parent-columns));}}.mui-6w7dle{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 4 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 4) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));min-width:0;box-sizing:border-box;margin-left:0px;}@media (min-width:600px){.mui-6w7dle{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 3 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 3) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));}}@media (min-width:900px){.mui-6w7dle{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;width:calc(100% * 3 / var(--Grid-parent-columns) - (var(--Grid-parent-columns) - 3) * (var(--Grid-parent-columnSpacing) / var(--Grid-parent-columns)));}}@media (min-width:600px){.mui-6w7dle{margin-left:calc(100% * 0.5 / var(--Grid-parent-columns) + var(--Grid-parent-columnSpacing) * 0.5 / var(--Grid-parent-columns));}}@media (min-width:900px){.mui-6w7dle{margin-left:calc(100% * 0.5 / var(--Grid-parent-columns) + var(--Grid-parent-columnSpacing) * 0.5 / var(--Grid-parent-columns));}}.mui-ljvr2e{color:rgb(100 116 139);min-height:12vh;max-height:14vh;overflow:hidden;}.mui-130sxs2{--Grid-columns:12;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;min-width:0;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;gap:var(--Grid-rowSpacing) var(--Grid-columnSpacing);-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;}.mui-130sxs2 >*{--Grid-parent-columns:12;}.mui-1kwoqpp{min-width:0;box-sizing:border-box;}@media (min-width:600px){.mui-1kwoqpp{margin-left:40px;}}@media (min-width:900px){.mui-1kwoqpp{margin-left:32px;}}@media (min-width:1200px){.mui-1kwoqpp{margin-left:64px;}}.mui-1rpvezq{min-width:0;box-sizing:border-box;color:rgb(148 163 184);font-size:0.8rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:4px;}.mui-7yakh{overflow:hidden;max-width:345px;}.mui-1h3bboh{background-color:#fff;color:rgba(0, 0, 0, 0.87);-webkit-transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;border-radius:4px;box-shadow:var(--Paper-shadow);background-image:var(--Paper-overlay);overflow:hidden;max-width:345px;}.mui-9y3ish{display:block;-webkit-background-size:cover;background-size:cover;background-repeat:no-repeat;-webkit-background-position:center;background-position:center;width:100%;object-fit:cover;}.mui-15q2cw4{padding:16px;}.mui-15q2cw4:last-child{padding-bottom:24px;}.mui-1lrclm3{margin:0;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:1.5rem;line-height:1.334;letter-spacing:0em;margin-bottom:0.35em;}.mui-l6pb42{margin:0;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:0.875rem;line-height:1.43;letter-spacing:0.01071em;color:rgba(0, 0, 0, 0.6);}.mui-srzspa{margin-top:40px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end;}.mui-12e41m1 .MuiPaginationItem-root.Mui-selected{background-color:#538bb5;color:white;}.mui-51eq8m{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0;margin:0;list-style:none;}.mui-1cp7dfl{font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:0.875rem;line-height:1.43;letter-spacing:0.01071em;border-radius:16px;text-align:center;box-sizing:border-box;min-width:32px;height:32px;padding:0 6px;margin:0 3px;color:rgba(0, 0, 0, 0.87);-webkit-transition:color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.mui-1cp7dfl.Mui-focusVisible{background-color:rgba(0, 0, 0, 0.12);}.mui-1cp7dfl.Mui-disabled{opacity:0.38;}.mui-1cp7dfl:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.mui-1cp7dfl:hover{background-color:transparent;}}.mui-1cp7dfl.Mui-selected{background-color:rgba(0, 0, 0, 0.08);}.mui-1cp7dfl.Mui-selected:hover{background-color:rgba(0, 0, 0, 0.12);}@media (hover: none){.mui-1cp7dfl.Mui-selected:hover{background-color:rgba(0, 0, 0, 0.08);}}.mui-1cp7dfl.Mui-selected.Mui-focusVisible{background-color:rgba(0, 0, 0, 0.2);}.mui-1cp7dfl.Mui-selected.Mui-disabled{opacity:1;color:rgba(0, 0, 0, 0.26);background-color:rgba(0, 0, 0, 0.08);}.mui-1cp7dfl.Mui-selected.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.mui-1cp7dfl.Mui-selected{color:rgba(0, 0, 0, 0.87);background-color:#d9e2e7;}.mui-1cp7dfl.Mui-selected:hover{background-color:rgb(151, 158, 161);}@media (hover: none){.mui-1cp7dfl.Mui-selected:hover{background-color:#d9e2e7;}}.mui-1cp7dfl.Mui-selected.Mui-focusVisible{background-color:rgb(151, 158, 161);}.mui-1cp7dfl.Mui-selected.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.mui-1owhhco{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;position:relative;box-sizing:border-box;-webkit-tap-highlight-color:transparent;background-color:transparent;outline:0;border:0;margin:0;border-radius:0;padding:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-moz-appearance:none;-webkit-appearance:none;-webkit-text-decoration:none;text-decoration:none;color:inherit;font-family:"Roboto","Helvetica","Arial",sans-serif;font-weight:400;font-size:0.875rem;line-height:1.43;letter-spacing:0.01071em;border-radius:16px;text-align:center;box-sizing:border-box;min-width:32px;height:32px;padding:0 6px;margin:0 3px;color:rgba(0, 0, 0, 0.87);-webkit-transition:color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms,background-color 250ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;}.mui-1owhhco::-moz-focus-inner{border-style:none;}.mui-1owhhco.Mui-disabled{pointer-events:none;cursor:default;}@media print{.mui-1owhhco{-webkit-print-color-adjust:exact;color-adjust:exact;}}.mui-1owhhco.Mui-focusVisible{background-color:rgba(0, 0, 0, 0.12);}.mui-1owhhco.Mui-disabled{opacity:0.38;}.mui-1owhhco:hover{background-color:rgba(0, 0, 0, 0.04);}@media (hover: none){.mui-1owhhco:hover{background-color:transparent;}}.mui-1owhhco.Mui-selected{background-color:rgba(0, 0, 0, 0.08);}.mui-1owhhco.Mui-selected:hover{background-color:rgba(0, 0, 0, 0.12);}@media (hover: none){.mui-1owhhco.Mui-selected:hover{background-color:rgba(0, 0, 0, 0.08);}}.mui-1owhhco.Mui-selected.Mui-focusVisible{background-color:rgba(0, 0, 0, 0.2);}.mui-1owhhco.Mui-selected.Mui-disabled{opacity:1;color:rgba(0, 0, 0, 0.26);background-color:rgba(0, 0, 0, 0.08);}.mui-1owhhco.Mui-selected.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.mui-1owhhco.Mui-selected{color:rgba(0, 0, 0, 0.87);background-color:#d9e2e7;}.mui-1owhhco.Mui-selected:hover{background-color:rgb(151, 158, 161);}@media (hover: none){.mui-1owhhco.Mui-selected:hover{background-color:#d9e2e7;}}.mui-1owhhco.Mui-selected.Mui-focusVisible{background-color:rgb(151, 158, 161);}.mui-1owhhco.Mui-selected.Mui-disabled{color:rgba(0, 0, 0, 0.26);}.mui-1uirv3s{font-size:1.25rem;margin:0 -8px;}.mui-4v85u4{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:1em;height:1em;display:inline-block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;transition:fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;fill:currentColor;font-size:1.5rem;font-size:1.25rem;margin:0 -8px;}</style></head><body><div hidden=""><!--$--><!--/$--></div><header class="MuiPaper-root MuiPaper-elevation MuiPaper-elevation4 MuiAppBar-root MuiAppBar-colorTransparent MuiAppBar-positionFixed mui-fixed mui-rn44y9" style="--Paper-shadow:0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)"><div class="MuiToolbar-root MuiToolbar-gutters MuiToolbar-regular mui-awgou1"><div class="MuiBox-root mui-i9gxme"></div><button class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary mui-1lhyht2" tabindex="0" type="button" aria-label="主页"><span class="MuiTypography-root MuiTypography-body1 font-custom flex items-center mui-10sxck"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="HomeIcon"><path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"></path></svg>主页</span></button><button class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeSmall MuiButton-textSizeSmall MuiButton-colorPrimary mui-1ah0jjf" tabindex="0" type="button" aria-label="归档"><span class="MuiTypography-root MuiTypography-body1 font-custom flex items-center mui-qczhs4"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="ArchiveIcon"><path d="m20.54 5.23-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.16.55L3.46 5.23C3.17 5.57 3 6.02 3 6.5V19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.48-.17-.93-.46-1.27M12 17.5 6.5 12H10v-2h4v2h3.5zM5.12 5l.81-1h12l.94 1z"></path></svg>归档</span></button></div></header><main class="MuiBox-root mui-3b8ywx"><div style="opacity:0;transform:translateY(15px)"><div class="MuiBox-root mui-1eiq2rz"><div><div class="swiper swiper-container"><div class="swiper-wrapper"></div><div class="swiper-pagination"></div></div></div><div class="MuiContainer-root MuiContainer-maxWidthXl mui-1cmizrj"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-rqnj93"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-sm-20 MuiGrid2-grid-md-14 MuiGrid2-grid-lg-15 mui-xvkitm"><a target="_blank" href="/articles/22"><article class="MuiBox-root mui-h5fkc8"><div class="hidden md:block "><div style="opacity:0;transform:translateY(50px)"><section style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="mx-auto w-full relative overflow-hidden bg-white/80 backdrop-blur-md border border-white/40 shadow-xl rounded-2xl hover:shadow-[0_20px_50px_rgba(99,102,241,0.3)] transition-shadow duration-500"><div class="relative  h-full [background-image:radial-gradient(88%_100%_at_top,rgba(255,255,255,0.5),rgba(255,255,255,0))]  sm:mx-0 sm:rounded-2xl overflow-hidden" style="box-shadow:0 10px 32px rgba(34, 42, 53, 0.12), 0 1px 1px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(34, 42, 53, 0.05), 0 4px 6px rgba(34, 42, 53, 0.08), 0 24px 108px rgba(47, 48, 55, 0.10)"><div style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="h-full px-1 py-10 sm:px-10"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-5l6nrt"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-0 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-ip4y8a"><div class="MuiBox-root mui-rpcq65"><img src="https://img.neotalks.org/2026/02/a6a1d0531dfd3d7cc3eedf6849aa95cb.png" class="w-full h-full object-cover rounded-xl"/></div></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-column MuiGrid2-grid-xs-8 MuiGrid2-spacing-xs-1 mui-16x07r3"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-3 mui-1effwaz"><h2 class="font-bold text-slate-800 text-lg tracking-wide transition-all duration-300 hover:text-transparent hover:bg-clip-text hover:bg-gradient-to-r hover:from-blue-600 hover:to-purple-600 cursor-pointer">Arch Linux 安装与美化终极指南：Hyprland</h2></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-4 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-6w7dle"><p class="MuiBox-root mui-ljvr2e">三个月，从bspwm崩溃到Hyprland稳定运行。这是我踩过的所有坑和一键解决方案。  -- 从桌...</p></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-130sxs2"><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1kwoqpp"><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">arch</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">极客</span></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1rpvezq"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DriveFileRenameOutlineIcon"><path d="M18.41 5.8 17.2 4.59c-.78-.78-2.05-.78-2.83 0l-2.68 2.68L3 15.96V20h4.04l8.74-8.74 2.63-2.63c.79-.78.79-2.05 0-2.83M6.21 18H5v-1.21l8.66-8.66 1.21 1.21zM11 20l4-4h6v4z"></path></svg>2026-02-28</div></div></div></div></div></div></section></div></div><div class=" md:hidden flex justify-center"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root mui-1h3bboh" style="--Paper-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)"><img class="MuiCardMedia-root MuiCardMedia-media MuiCardMedia-img mui-9y3ish" src="https://img.neotalks.org/2026/02/5782054664c31d38eab44aa4c413a50a.gif" height="140"/><div class="MuiCardContent-root mui-15q2cw4"><div class="MuiTypography-root MuiTypography-h5 MuiTypography-gutterBottom mui-1lrclm3">Arch Linux 安装与美化终极指南：Hyprland</div><p class="MuiTypography-root MuiTypography-body2 mui-l6pb42">三个月，从bspwm崩溃到Hyprland稳定运行。这是我踩过的所有坑和一键解决方案。  -- 从桌...</p></div></div></div></article></a><a target="_blank" href="/articles/21"><article class="MuiBox-root mui-h5fkc8"><div class="hidden md:block "><div style="opacity:0;transform:translateY(50px)"><section style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="mx-auto w-full relative overflow-hidden bg-white/80 backdrop-blur-md border border-white/40 shadow-xl rounded-2xl hover:shadow-[0_20px_50px_rgba(99,102,241,0.3)] transition-shadow duration-500"><div class="relative  h-full [background-image:radial-gradient(88%_100%_at_top,rgba(255,255,255,0.5),rgba(255,255,255,0))]  sm:mx-0 sm:rounded-2xl overflow-hidden" style="box-shadow:0 10px 32px rgba(34, 42, 53, 0.12), 0 1px 1px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(34, 42, 53, 0.05), 0 4px 6px rgba(34, 42, 53, 0.08), 0 24px 108px rgba(47, 48, 55, 0.10)"><div style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="h-full px-1 py-10 sm:px-10"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-5l6nrt"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-0 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-ip4y8a"><div class="MuiBox-root mui-rpcq65"><img src="https://img.neotalks.org/2026/02/11930194faae066907dca28046f29e7a.png" class="w-full h-full object-cover rounded-xl"/></div></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-column MuiGrid2-grid-xs-8 MuiGrid2-spacing-xs-1 mui-16x07r3"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-3 mui-1effwaz"><h2 class="font-bold text-slate-800 text-lg tracking-wide transition-all duration-300 hover:text-transparent hover:bg-clip-text hover:bg-gradient-to-r hover:from-blue-600 hover:to-purple-600 cursor-pointer">公网IP安全指南：用 V2Ray 实现“单端口复用”，给你的NAS和远程桌面穿上隐身衣</h2></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-4 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-6w7dle"><p class="MuiBox-root mui-ljvr2e">🔥 本文阅读指南：  1. 为什么你的公网IP正在被&quot;全球直播&quot;？ 2. V2Ray 如何实现&quot;单...</p></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-130sxs2"><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1kwoqpp"><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">服务器</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">极客</span></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1rpvezq"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DriveFileRenameOutlineIcon"><path d="M18.41 5.8 17.2 4.59c-.78-.78-2.05-.78-2.83 0l-2.68 2.68L3 15.96V20h4.04l8.74-8.74 2.63-2.63c.79-.78.79-2.05 0-2.83M6.21 18H5v-1.21l8.66-8.66 1.21 1.21zM11 20l4-4h6v4z"></path></svg>2026-02-07</div></div></div></div></div></div></section></div></div><div class=" md:hidden flex justify-center"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root mui-1h3bboh" style="--Paper-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)"><img class="MuiCardMedia-root MuiCardMedia-media MuiCardMedia-img mui-9y3ish" src="https://img.neotalks.org/2026/02/11930194faae066907dca28046f29e7a.png" height="140"/><div class="MuiCardContent-root mui-15q2cw4"><div class="MuiTypography-root MuiTypography-h5 MuiTypography-gutterBottom mui-1lrclm3">公网IP安全指南：用 V2Ray 实现“单端口复用”，给你的NAS和远程桌面穿上隐身衣</div><p class="MuiTypography-root MuiTypography-body2 mui-l6pb42">🔥 本文阅读指南：  1. 为什么你的公网IP正在被&quot;全球直播&quot;？ 2. V2Ray 如何实现&quot;单...</p></div></div></div></article></a><a target="_blank" href="/articles/20"><article class="MuiBox-root mui-h5fkc8"><div class="hidden md:block "><div style="opacity:0;transform:translateY(50px)"><section style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="mx-auto w-full relative overflow-hidden bg-white/80 backdrop-blur-md border border-white/40 shadow-xl rounded-2xl hover:shadow-[0_20px_50px_rgba(99,102,241,0.3)] transition-shadow duration-500"><div class="relative  h-full [background-image:radial-gradient(88%_100%_at_top,rgba(255,255,255,0.5),rgba(255,255,255,0))]  sm:mx-0 sm:rounded-2xl overflow-hidden" style="box-shadow:0 10px 32px rgba(34, 42, 53, 0.12), 0 1px 1px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(34, 42, 53, 0.05), 0 4px 6px rgba(34, 42, 53, 0.08), 0 24px 108px rgba(47, 48, 55, 0.10)"><div style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="h-full px-1 py-10 sm:px-10"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-5l6nrt"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-0 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-ip4y8a"><div class="MuiBox-root mui-rpcq65"><img src="https://img.neotalks.org/2026/01/9a668590c3c646e5ff3cf83731a3aeb9.png" class="w-full h-full object-cover rounded-xl"/></div></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-column MuiGrid2-grid-xs-8 MuiGrid2-spacing-xs-1 mui-16x07r3"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-3 mui-1effwaz"><h2 class="font-bold text-slate-800 text-lg tracking-wide transition-all duration-300 hover:text-transparent hover:bg-clip-text hover:bg-gradient-to-r hover:from-blue-600 hover:to-purple-600 cursor-pointer">0成本搭建私人影视库｜告别会员费，NAS秒变追剧神器</h2></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-4 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-6w7dle"><p class="MuiBox-root mui-ljvr2e">🎬 NAS买回来只当网盘用？Plex/Emby会员费太贵？本文手把手教你搭建完全免费的家庭影院！ ...</p></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-130sxs2"><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1kwoqpp"><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">服务器</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">极客</span></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1rpvezq"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DriveFileRenameOutlineIcon"><path d="M18.41 5.8 17.2 4.59c-.78-.78-2.05-.78-2.83 0l-2.68 2.68L3 15.96V20h4.04l8.74-8.74 2.63-2.63c.79-.78.79-2.05 0-2.83M6.21 18H5v-1.21l8.66-8.66 1.21 1.21zM11 20l4-4h6v4z"></path></svg>2026-02-03</div></div></div></div></div></div></section></div></div><div class=" md:hidden flex justify-center"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root mui-1h3bboh" style="--Paper-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)"><img class="MuiCardMedia-root MuiCardMedia-media MuiCardMedia-img mui-9y3ish" src="https://img.neotalks.org/2026/01/9a668590c3c646e5ff3cf83731a3aeb9.png" height="140"/><div class="MuiCardContent-root mui-15q2cw4"><div class="MuiTypography-root MuiTypography-h5 MuiTypography-gutterBottom mui-1lrclm3">0成本搭建私人影视库｜告别会员费，NAS秒变追剧神器</div><p class="MuiTypography-root MuiTypography-body2 mui-l6pb42">🎬 NAS买回来只当网盘用？Plex/Emby会员费太贵？本文手把手教你搭建完全免费的家庭影院！ ...</p></div></div></div></article></a><a target="_blank" href="/articles/19"><article class="MuiBox-root mui-h5fkc8"><div class="hidden md:block "><div style="opacity:0;transform:translateY(50px)"><section style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="mx-auto w-full relative overflow-hidden bg-white/80 backdrop-blur-md border border-white/40 shadow-xl rounded-2xl hover:shadow-[0_20px_50px_rgba(99,102,241,0.3)] transition-shadow duration-500"><div class="relative  h-full [background-image:radial-gradient(88%_100%_at_top,rgba(255,255,255,0.5),rgba(255,255,255,0))]  sm:mx-0 sm:rounded-2xl overflow-hidden" style="box-shadow:0 10px 32px rgba(34, 42, 53, 0.12), 0 1px 1px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(34, 42, 53, 0.05), 0 4px 6px rgba(34, 42, 53, 0.08), 0 24px 108px rgba(47, 48, 55, 0.10)"><div style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="h-full px-1 py-10 sm:px-10"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-5l6nrt"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-0 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-ip4y8a"><div class="MuiBox-root mui-rpcq65"><img src="https://img.neotalks.org/2026/01/b7be49b88ef6994bc0daf22e40374f4c.png" class="w-full h-full object-cover rounded-xl"/></div></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-column MuiGrid2-grid-xs-8 MuiGrid2-spacing-xs-1 mui-16x07r3"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-3 mui-1effwaz"><h2 class="font-bold text-slate-800 text-lg tracking-wide transition-all duration-300 hover:text-transparent hover:bg-clip-text hover:bg-gradient-to-r hover:from-blue-600 hover:to-purple-600 cursor-pointer">codcompanion.nvim配置教程</h2></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-4 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-6w7dle"><p class="MuiBox-root mui-ljvr2e"> 导语  AI 辅助编程工具遍地开花 🌸，但说实话，能真正完美融入 Neovim 工作流的，屈指可...</p></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-130sxs2"><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1kwoqpp"><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">极客</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">vim</span></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1rpvezq"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DriveFileRenameOutlineIcon"><path d="M18.41 5.8 17.2 4.59c-.78-.78-2.05-.78-2.83 0l-2.68 2.68L3 15.96V20h4.04l8.74-8.74 2.63-2.63c.79-.78.79-2.05 0-2.83M6.21 18H5v-1.21l8.66-8.66 1.21 1.21zM11 20l4-4h6v4z"></path></svg>2026-01-18</div></div></div></div></div></div></section></div></div><div class=" md:hidden flex justify-center"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root mui-1h3bboh" style="--Paper-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)"><img class="MuiCardMedia-root MuiCardMedia-media MuiCardMedia-img mui-9y3ish" src="https://img.neotalks.org/2026/01/b7be49b88ef6994bc0daf22e40374f4c.png" height="140"/><div class="MuiCardContent-root mui-15q2cw4"><div class="MuiTypography-root MuiTypography-h5 MuiTypography-gutterBottom mui-1lrclm3">codcompanion.nvim配置教程</div><p class="MuiTypography-root MuiTypography-body2 mui-l6pb42"> 导语  AI 辅助编程工具遍地开花 🌸，但说实话，能真正完美融入 Neovim 工作流的，屈指可...</p></div></div></div></article></a><a target="_blank" href="/articles/18"><article class="MuiBox-root mui-h5fkc8"><div class="hidden md:block "><div style="opacity:0;transform:translateY(50px)"><section style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="mx-auto w-full relative overflow-hidden bg-white/80 backdrop-blur-md border border-white/40 shadow-xl rounded-2xl hover:shadow-[0_20px_50px_rgba(99,102,241,0.3)] transition-shadow duration-500"><div class="relative  h-full [background-image:radial-gradient(88%_100%_at_top,rgba(255,255,255,0.5),rgba(255,255,255,0))]  sm:mx-0 sm:rounded-2xl overflow-hidden" style="box-shadow:0 10px 32px rgba(34, 42, 53, 0.12), 0 1px 1px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(34, 42, 53, 0.05), 0 4px 6px rgba(34, 42, 53, 0.08), 0 24px 108px rgba(47, 48, 55, 0.10)"><div style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="h-full px-1 py-10 sm:px-10"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-5l6nrt"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-0 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-ip4y8a"><div class="MuiBox-root mui-rpcq65"><img src="https://img.neotalks.org/2026/01/a5f04d10688a33bc116ad9df67f7e0cf.png" class="w-full h-full object-cover rounded-xl"/></div></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-column MuiGrid2-grid-xs-8 MuiGrid2-spacing-xs-1 mui-16x07r3"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-3 mui-1effwaz"><h2 class="font-bold text-slate-800 text-lg tracking-wide transition-all duration-300 hover:text-transparent hover:bg-clip-text hover:bg-gradient-to-r hover:from-blue-600 hover:to-purple-600 cursor-pointer">旧电脑别扔！我花10分钟把它变成24小时下载机，从此告别龟速</h2></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-4 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-6w7dle"><p class="MuiBox-root mui-ljvr2e"> 你有没有过这种体验？  找了2小时的资源，点下载，进度条纹丝不动。 挂了一整夜，早上起来一看——3...</p></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-130sxs2"><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1kwoqpp"><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">极客</span></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1rpvezq"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DriveFileRenameOutlineIcon"><path d="M18.41 5.8 17.2 4.59c-.78-.78-2.05-.78-2.83 0l-2.68 2.68L3 15.96V20h4.04l8.74-8.74 2.63-2.63c.79-.78.79-2.05 0-2.83M6.21 18H5v-1.21l8.66-8.66 1.21 1.21zM11 20l4-4h6v4z"></path></svg>2026-01-16</div></div></div></div></div></div></section></div></div><div class=" md:hidden flex justify-center"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root mui-1h3bboh" style="--Paper-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)"><img class="MuiCardMedia-root MuiCardMedia-media MuiCardMedia-img mui-9y3ish" src="https://img.neotalks.org/2026/01/a5f04d10688a33bc116ad9df67f7e0cf.png" height="140"/><div class="MuiCardContent-root mui-15q2cw4"><div class="MuiTypography-root MuiTypography-h5 MuiTypography-gutterBottom mui-1lrclm3">旧电脑别扔！我花10分钟把它变成24小时下载机，从此告别龟速</div><p class="MuiTypography-root MuiTypography-body2 mui-l6pb42"> 你有没有过这种体验？  找了2小时的资源，点下载，进度条纹丝不动。 挂了一整夜，早上起来一看——3...</p></div></div></div></article></a><a target="_blank" href="/articles/17"><article class="MuiBox-root mui-h5fkc8"><div class="hidden md:block "><div style="opacity:0;transform:translateY(50px)"><section style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="mx-auto w-full relative overflow-hidden bg-white/80 backdrop-blur-md border border-white/40 shadow-xl rounded-2xl hover:shadow-[0_20px_50px_rgba(99,102,241,0.3)] transition-shadow duration-500"><div class="relative  h-full [background-image:radial-gradient(88%_100%_at_top,rgba(255,255,255,0.5),rgba(255,255,255,0))]  sm:mx-0 sm:rounded-2xl overflow-hidden" style="box-shadow:0 10px 32px rgba(34, 42, 53, 0.12), 0 1px 1px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(34, 42, 53, 0.05), 0 4px 6px rgba(34, 42, 53, 0.08), 0 24px 108px rgba(47, 48, 55, 0.10)"><div style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="h-full px-1 py-10 sm:px-10"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-5l6nrt"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-0 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-ip4y8a"><div class="MuiBox-root mui-rpcq65"><img src="https://img.neotalks.org/2026/01/937e8d0149eab51386b51e2e8d34387b.png" class="w-full h-full object-cover rounded-xl"/></div></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-column MuiGrid2-grid-xs-8 MuiGrid2-spacing-xs-1 mui-16x07r3"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-3 mui-1effwaz"><h2 class="font-bold text-slate-800 text-lg tracking-wide transition-all duration-300 hover:text-transparent hover:bg-clip-text hover:bg-gradient-to-r hover:from-blue-600 hover:to-purple-600 cursor-pointer">告别 VS Code！2026 版 NeoVim 配置全攻略：30分钟打造 AI 编程神器</h2></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-4 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-6w7dle"><p class="MuiBox-root mui-ljvr2e">!nvim  |                                          ...</p></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-130sxs2"><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1kwoqpp"><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">极客</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">vim</span></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1rpvezq"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DriveFileRenameOutlineIcon"><path d="M18.41 5.8 17.2 4.59c-.78-.78-2.05-.78-2.83 0l-2.68 2.68L3 15.96V20h4.04l8.74-8.74 2.63-2.63c.79-.78.79-2.05 0-2.83M6.21 18H5v-1.21l8.66-8.66 1.21 1.21zM11 20l4-4h6v4z"></path></svg>2026-01-12</div></div></div></div></div></div></section></div></div><div class=" md:hidden flex justify-center"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root mui-1h3bboh" style="--Paper-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)"><img class="MuiCardMedia-root MuiCardMedia-media MuiCardMedia-img mui-9y3ish" src="https://img.neotalks.org/2026/01/937e8d0149eab51386b51e2e8d34387b.png" height="140"/><div class="MuiCardContent-root mui-15q2cw4"><div class="MuiTypography-root MuiTypography-h5 MuiTypography-gutterBottom mui-1lrclm3">告别 VS Code！2026 版 NeoVim 配置全攻略：30分钟打造 AI 编程神器</div><p class="MuiTypography-root MuiTypography-body2 mui-l6pb42">!nvim  |                                          ...</p></div></div></div></article></a><a target="_blank" href="/articles/16"><article class="MuiBox-root mui-h5fkc8"><div class="hidden md:block "><div style="opacity:0;transform:translateY(50px)"><section style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="mx-auto w-full relative overflow-hidden bg-white/80 backdrop-blur-md border border-white/40 shadow-xl rounded-2xl hover:shadow-[0_20px_50px_rgba(99,102,241,0.3)] transition-shadow duration-500"><div class="relative  h-full [background-image:radial-gradient(88%_100%_at_top,rgba(255,255,255,0.5),rgba(255,255,255,0))]  sm:mx-0 sm:rounded-2xl overflow-hidden" style="box-shadow:0 10px 32px rgba(34, 42, 53, 0.12), 0 1px 1px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(34, 42, 53, 0.05), 0 4px 6px rgba(34, 42, 53, 0.08), 0 24px 108px rgba(47, 48, 55, 0.10)"><div style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="h-full px-1 py-10 sm:px-10"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-5l6nrt"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-0 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-ip4y8a"><div class="MuiBox-root mui-rpcq65"><img src="https://img.neotalks.org/2026/01/0613ba1ea817a50dc48d4dbca416d310.png" class="w-full h-full object-cover rounded-xl"/></div></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-column MuiGrid2-grid-xs-8 MuiGrid2-spacing-xs-1 mui-16x07r3"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-3 mui-1effwaz"><h2 class="font-bold text-slate-800 text-lg tracking-wide transition-all duration-300 hover:text-transparent hover:bg-clip-text hover:bg-gradient-to-r hover:from-blue-600 hover:to-purple-600 cursor-pointer">劝退！90%的人买NAS都在吃灰，这个“零成本”方案才是家庭影音的终极答案 🚀</h2></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-4 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-6w7dle"><p class="MuiBox-root mui-ljvr2e">效果展示：极速访问，丝般顺滑  &lt;table border=&quot;0&quot;&gt;   &lt;tr&gt;     &lt;td&gt;...</p></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-130sxs2"><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1kwoqpp"><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">arch</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">服务器</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">极客</span></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1rpvezq"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DriveFileRenameOutlineIcon"><path d="M18.41 5.8 17.2 4.59c-.78-.78-2.05-.78-2.83 0l-2.68 2.68L3 15.96V20h4.04l8.74-8.74 2.63-2.63c.79-.78.79-2.05 0-2.83M6.21 18H5v-1.21l8.66-8.66 1.21 1.21zM11 20l4-4h6v4z"></path></svg>2026-01-08</div></div></div></div></div></div></section></div></div><div class=" md:hidden flex justify-center"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root mui-1h3bboh" style="--Paper-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)"><img class="MuiCardMedia-root MuiCardMedia-media MuiCardMedia-img mui-9y3ish" src="https://img.neotalks.org/2026/01/0613ba1ea817a50dc48d4dbca416d310.png" height="140"/><div class="MuiCardContent-root mui-15q2cw4"><div class="MuiTypography-root MuiTypography-h5 MuiTypography-gutterBottom mui-1lrclm3">劝退！90%的人买NAS都在吃灰，这个“零成本”方案才是家庭影音的终极答案 🚀</div><p class="MuiTypography-root MuiTypography-body2 mui-l6pb42">效果展示：极速访问，丝般顺滑  &lt;table border=&quot;0&quot;&gt;   &lt;tr&gt;     &lt;td&gt;...</p></div></div></div></article></a><a target="_blank" href="/articles/15"><article class="MuiBox-root mui-h5fkc8"><div class="hidden md:block "><div style="opacity:0;transform:translateY(50px)"><section style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="mx-auto w-full relative overflow-hidden bg-white/80 backdrop-blur-md border border-white/40 shadow-xl rounded-2xl hover:shadow-[0_20px_50px_rgba(99,102,241,0.3)] transition-shadow duration-500"><div class="relative  h-full [background-image:radial-gradient(88%_100%_at_top,rgba(255,255,255,0.5),rgba(255,255,255,0))]  sm:mx-0 sm:rounded-2xl overflow-hidden" style="box-shadow:0 10px 32px rgba(34, 42, 53, 0.12), 0 1px 1px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(34, 42, 53, 0.05), 0 4px 6px rgba(34, 42, 53, 0.08), 0 24px 108px rgba(47, 48, 55, 0.10)"><div style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="h-full px-1 py-10 sm:px-10"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-5l6nrt"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-0 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-ip4y8a"><div class="MuiBox-root mui-rpcq65"><img src="https://img.neotalks.org/2026/01/44ec766fe8a7503e27b1bc0de9bbc98b.png" class="w-full h-full object-cover rounded-xl"/></div></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-column MuiGrid2-grid-xs-8 MuiGrid2-spacing-xs-1 mui-16x07r3"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-3 mui-1effwaz"><h2 class="font-bold text-slate-800 text-lg tracking-wide transition-all duration-300 hover:text-transparent hover:bg-clip-text hover:bg-gradient-to-r hover:from-blue-600 hover:to-purple-600 cursor-pointer">告别付费软件！用Python一键批量压缩图片</h2></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-4 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-6w7dle"><p class="MuiBox-root mui-ljvr2e">🖼️ 告别付费软件！用Python一键批量压缩图片，小白也能轻松上手 最近在做教程时发现手机拍出来...</p></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-130sxs2"><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1kwoqpp"><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">python</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">极客</span></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1rpvezq"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DriveFileRenameOutlineIcon"><path d="M18.41 5.8 17.2 4.59c-.78-.78-2.05-.78-2.83 0l-2.68 2.68L3 15.96V20h4.04l8.74-8.74 2.63-2.63c.79-.78.79-2.05 0-2.83M6.21 18H5v-1.21l8.66-8.66 1.21 1.21zM11 20l4-4h6v4z"></path></svg>2026-01-07</div></div></div></div></div></div></section></div></div><div class=" md:hidden flex justify-center"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root mui-1h3bboh" style="--Paper-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)"><img class="MuiCardMedia-root MuiCardMedia-media MuiCardMedia-img mui-9y3ish" src="https://img.neotalks.org/2026/01/44ec766fe8a7503e27b1bc0de9bbc98b.png" height="140"/><div class="MuiCardContent-root mui-15q2cw4"><div class="MuiTypography-root MuiTypography-h5 MuiTypography-gutterBottom mui-1lrclm3">告别付费软件！用Python一键批量压缩图片</div><p class="MuiTypography-root MuiTypography-body2 mui-l6pb42">🖼️ 告别付费软件！用Python一键批量压缩图片，小白也能轻松上手 最近在做教程时发现手机拍出来...</p></div></div></div></article></a><a target="_blank" href="/articles/13"><article class="MuiBox-root mui-h5fkc8"><div class="hidden md:block "><div style="opacity:0;transform:translateY(50px)"><section style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="mx-auto w-full relative overflow-hidden bg-white/80 backdrop-blur-md border border-white/40 shadow-xl rounded-2xl hover:shadow-[0_20px_50px_rgba(99,102,241,0.3)] transition-shadow duration-500"><div class="relative  h-full [background-image:radial-gradient(88%_100%_at_top,rgba(255,255,255,0.5),rgba(255,255,255,0))]  sm:mx-0 sm:rounded-2xl overflow-hidden" style="box-shadow:0 10px 32px rgba(34, 42, 53, 0.12), 0 1px 1px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(34, 42, 53, 0.05), 0 4px 6px rgba(34, 42, 53, 0.08), 0 24px 108px rgba(47, 48, 55, 0.10)"><div style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="h-full px-1 py-10 sm:px-10"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-5l6nrt"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-0 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-ip4y8a"><div class="MuiBox-root mui-rpcq65"><img src="https://img.neotalks.org/2026/01/13d52c899c9753b77734405fe5f21d6e.jpg" class="w-full h-full object-cover rounded-xl"/></div></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-column MuiGrid2-grid-xs-8 MuiGrid2-spacing-xs-1 mui-16x07r3"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-3 mui-1effwaz"><h2 class="font-bold text-slate-800 text-lg tracking-wide transition-all duration-300 hover:text-transparent hover:bg-clip-text hover:bg-gradient-to-r hover:from-blue-600 hover:to-purple-600 cursor-pointer">老旧电脑不要扔！做一台自己的服务器</h2></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-4 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-6w7dle"><p class="MuiBox-root mui-ljvr2e">🐧 老旧电脑不要扔！做一台自己的服务器  家里有老旧笔记本电脑扔了可惜，不如改成一个小型服务器！用...</p></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-130sxs2"><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1kwoqpp"><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">arch</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">服务器</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">极客</span></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1rpvezq"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DriveFileRenameOutlineIcon"><path d="M18.41 5.8 17.2 4.59c-.78-.78-2.05-.78-2.83 0l-2.68 2.68L3 15.96V20h4.04l8.74-8.74 2.63-2.63c.79-.78.79-2.05 0-2.83M6.21 18H5v-1.21l8.66-8.66 1.21 1.21zM11 20l4-4h6v4z"></path></svg>2026-01-03</div></div></div></div></div></div></section></div></div><div class=" md:hidden flex justify-center"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root mui-1h3bboh" style="--Paper-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)"><img class="MuiCardMedia-root MuiCardMedia-media MuiCardMedia-img mui-9y3ish" src="https://img.neotalks.org/2026/01/13d52c899c9753b77734405fe5f21d6e.jpg" height="140"/><div class="MuiCardContent-root mui-15q2cw4"><div class="MuiTypography-root MuiTypography-h5 MuiTypography-gutterBottom mui-1lrclm3">老旧电脑不要扔！做一台自己的服务器</div><p class="MuiTypography-root MuiTypography-body2 mui-l6pb42">🐧 老旧电脑不要扔！做一台自己的服务器  家里有老旧笔记本电脑扔了可惜，不如改成一个小型服务器！用...</p></div></div></div></article></a><a target="_blank" href="/articles/12"><article class="MuiBox-root mui-h5fkc8"><div class="hidden md:block "><div style="opacity:0;transform:translateY(50px)"><section style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="mx-auto w-full relative overflow-hidden bg-white/80 backdrop-blur-md border border-white/40 shadow-xl rounded-2xl hover:shadow-[0_20px_50px_rgba(99,102,241,0.3)] transition-shadow duration-500"><div class="relative  h-full [background-image:radial-gradient(88%_100%_at_top,rgba(255,255,255,0.5),rgba(255,255,255,0))]  sm:mx-0 sm:rounded-2xl overflow-hidden" style="box-shadow:0 10px 32px rgba(34, 42, 53, 0.12), 0 1px 1px rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(34, 42, 53, 0.05), 0 4px 6px rgba(34, 42, 53, 0.08), 0 24px 108px rgba(47, 48, 55, 0.10)"><div style="transform:translate3d(0px, 0px, 0) scale3d(1, 1, 1);transition:transform 0.1s ease-out" class="h-full px-1 py-10 sm:px-10"><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-5l6nrt"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-0 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-ip4y8a"><div class="MuiBox-root mui-rpcq65"><img src="https://img.neotalks.org/2025/12/d2b5c8dcb2966dd69fa3ff7cb1a5be17.jpg" class="w-full h-full object-cover rounded-xl"/></div></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-column MuiGrid2-grid-xs-8 MuiGrid2-spacing-xs-1 mui-16x07r3"><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-3 mui-1effwaz"><h2 class="font-bold text-slate-800 text-lg tracking-wide transition-all duration-300 hover:text-transparent hover:bg-clip-text hover:bg-gradient-to-r hover:from-blue-600 hover:to-purple-600 cursor-pointer">自建网站全流程</h2></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-xs-4 MuiGrid2-grid-sm-3 MuiGrid2-grid-md-3 mui-6w7dle"><p class="MuiBox-root mui-ljvr2e">导言 建过好几次站，虽然都没有坚持下去，但还是记录一下，本次使用的是穷鬼一条龙，前半部分的非服务器...</p></div><div class="MuiGrid2-root MuiGrid2-container MuiGrid2-direction-xs-row mui-130sxs2"><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1kwoqpp"><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">web</span><span class="px-3 py-1 bg-slate-100 text-slate-600 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300 ml-2 text-xs font-semibold tracking-wide">typescript</span></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row mui-1rpvezq"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium mui-q7mezt" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="DriveFileRenameOutlineIcon"><path d="M18.41 5.8 17.2 4.59c-.78-.78-2.05-.78-2.83 0l-2.68 2.68L3 15.96V20h4.04l8.74-8.74 2.63-2.63c.79-.78.79-2.05 0-2.83M6.21 18H5v-1.21l8.66-8.66 1.21 1.21zM11 20l4-4h6v4z"></path></svg>2025-12-27</div></div></div></div></div></div></section></div></div><div class=" md:hidden flex justify-center"><div class="MuiPaper-root MuiPaper-elevation MuiPaper-rounded MuiPaper-elevation1 MuiCard-root mui-1h3bboh" style="--Paper-shadow:0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)"><img class="MuiCardMedia-root MuiCardMedia-media MuiCardMedia-img mui-9y3ish" src="https://img.neotalks.org/2025/12/f0d8d0b57c18d1b1280c6fcdfd13f894.png" height="140"/><div class="MuiCardContent-root mui-15q2cw4"><div class="MuiTypography-root MuiTypography-h5 MuiTypography-gutterBottom mui-1lrclm3">自建网站全流程</div><p class="MuiTypography-root MuiTypography-body2 mui-l6pb42">导言 建过好几次站，虽然都没有坚持下去，但还是记录一下，本次使用的是穷鬼一条龙，前半部分的非服务器...</p></div></div></div></article></a><div class="MuiBox-root mui-srzspa"><nav aria-label="pagination navigation" class="MuiPagination-root MuiPagination-text mui-12e41m1"><ul class="MuiPagination-ul mui-51eq8m"><li><button class="MuiButtonBase-root Mui-disabled MuiPaginationItem-root MuiPaginationItem-sizeMedium MuiPaginationItem-text MuiPaginationItem-circular MuiPaginationItem-colorPrimary MuiPaginationItem-textPrimary Mui-disabled MuiPaginationItem-previousNext mui-1owhhco" tabindex="-1" type="button" disabled="" aria-label="Go to previous page"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium MuiPaginationItem-icon mui-4v85u4" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="NavigateBeforeIcon"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"></path></svg></button></li><li><button class="MuiButtonBase-root MuiPaginationItem-root MuiPaginationItem-sizeMedium MuiPaginationItem-text MuiPaginationItem-circular MuiPaginationItem-colorPrimary MuiPaginationItem-textPrimary Mui-selected MuiPaginationItem-page mui-1owhhco" tabindex="0" type="button" aria-current="true" aria-label="page 1">1</button></li><li><button class="MuiButtonBase-root MuiPaginationItem-root MuiPaginationItem-sizeMedium MuiPaginationItem-text MuiPaginationItem-circular MuiPaginationItem-colorPrimary MuiPaginationItem-textPrimary MuiPaginationItem-page mui-1owhhco" tabindex="0" type="button" aria-label="Go to page 2">2</button></li><li><button class="MuiButtonBase-root MuiPaginationItem-root MuiPaginationItem-sizeMedium MuiPaginationItem-text MuiPaginationItem-circular MuiPaginationItem-colorPrimary MuiPaginationItem-textPrimary MuiPaginationItem-previousNext mui-1owhhco" tabindex="0" type="button" aria-label="Go to next page"><svg class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium MuiPaginationItem-icon mui-4v85u4" focusable="false" aria-hidden="true" viewBox="0 0 24 24" data-testid="NavigateNextIcon"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"></path></svg></button></li></ul></nav></div></div><div class="MuiGrid2-root MuiGrid2-direction-xs-row MuiGrid2-grid-sm-0 MuiGrid2-grid-md-6 MuiGrid2-grid-lg-6 mui-1uedjar"><div style="position:relative"><div><aside class="MuiBox-root mui-0"><div class="py-7 flex items-center justify-center" style="perspective:1000px"><div class="flex items-center justify-center relative transition-all duration-200 ease-linear inter-var" style="transform-style:preserve-3d"><div class="w-auto [transform-style:preserve-3d] [&amp;&gt;*]:[transform-style:preserve-3d] bg-gray-50 relative group/card dark:hover:shadow-2xl dark:hover:shadow-emerald-500/[0.1] dark:bg-black dark:border-white/[0.2] border-black/[0.1] h-auto rounded-xl p-6 border"><div class="transition duration-200 ease-linear text-0.8xl font-bold text-neutral-600 dark:text-white w-full flex justify-center">所有标签</div><div class="border-t border-gray-300 my-4 flex"></div><div class="MuiBox-root mui-vxgrp0"><div class="flex flex-wrap gap-1 p-2 "><a target="_blank" href="/tags/golang"><div class="tag flex items-center px-3 py-1 text-xs font-semibold tracking-wide text-slate-600 bg-slate-100 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300">golang</div></a></div><div class="flex flex-wrap gap-1 p-2 "><a target="_blank" href="/tags/python"><div class="tag flex items-center px-3 py-1 text-xs font-semibold tracking-wide text-slate-600 bg-slate-100 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300">python</div></a></div><div class="flex flex-wrap gap-1 p-2 "><a target="_blank" href="/tags/AI"><div class="tag flex items-center px-3 py-1 text-xs font-semibold tracking-wide text-slate-600 bg-slate-100 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300">AI</div></a></div><div class="flex flex-wrap gap-1 p-2 "><a target="_blank" href="/tags/web"><div class="tag flex items-center px-3 py-1 text-xs font-semibold tracking-wide text-slate-600 bg-slate-100 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300">web</div></a></div><div class="flex flex-wrap gap-1 p-2 "><a target="_blank" href="/tags/typescript"><div class="tag flex items-center px-3 py-1 text-xs font-semibold tracking-wide text-slate-600 bg-slate-100 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300">typescript</div></a></div><div class="flex flex-wrap gap-1 p-2 "><a target="_blank" href="/tags/arch"><div class="tag flex items-center px-3 py-1 text-xs font-semibold tracking-wide text-slate-600 bg-slate-100 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300">arch</div></a></div><div class="flex flex-wrap gap-1 p-2 "><a target="_blank" href="/tags/服务器"><div class="tag flex items-center px-3 py-1 text-xs font-semibold tracking-wide text-slate-600 bg-slate-100 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300">服务器</div></a></div><div class="flex flex-wrap gap-1 p-2 "><a target="_blank" href="/tags/极客"><div class="tag flex items-center px-3 py-1 text-xs font-semibold tracking-wide text-slate-600 bg-slate-100 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300">极客</div></a></div><div class="flex flex-wrap gap-1 p-2 "><a target="_blank" href="/tags/vim"><div class="tag flex items-center px-3 py-1 text-xs font-semibold tracking-wide text-slate-600 bg-slate-100 border border-slate-200 rounded-full shadow-sm hover:bg-gradient-to-r hover:from-blue-500 hover:to-purple-500 hover:text-white hover:border-transparent transform hover:-translate-y-0.5 transition-all duration-300">vim</div></a></div></div></div></div></div></aside></div></div></div></div></div></div><!--$--><!--/$--></div></main><footer class="MuiBox-root mui-wnbpzh"><div class="MuiContainer-root MuiContainer-maxWidthMd mui-q7u9va"><div class="MuiBox-root mui-15gku5u"><p class="MuiTypography-root MuiTypography-body1 MuiTypography-alignCenter mui-101c9j6" style="--Typography-textAlign:center">© 星河的博客 <!-- -->2026</p><span class="MuiTypography-root MuiTypography-caption MuiTypography-alignCenter mui-10izahe" style="--Typography-textAlign:center">网站已安全运行 </span></div></div></footer><script src="/_next/static/chunks/271cd972cc21572d.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[78446,[\"/_next/static/chunks/295d483fd0fe7058.js\",\"/_next/static/chunks/90133f3a98134237.js\",\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"/_next/static/chunks/b7c457a3aba29949.js\",\"/_next/static/chunks/9a932f32d4998aba.js\"],\"default\"]\n3:I[11553,[\"/_next/static/chunks/295d483fd0fe7058.js\",\"/_next/static/chunks/90133f3a98134237.js\",\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"/_next/static/chunks/b7c457a3aba29949.js\",\"/_next/static/chunks/9a932f32d4998aba.js\"],\"default\"]\n4:I[63665,[\"/_next/static/chunks/295d483fd0fe7058.js\",\"/_next/static/chunks/90133f3a98134237.js\",\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"/_next/static/chunks/b7c457a3aba29949.js\",\"/_next/static/chunks/9a932f32d4998aba.js\",\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/839ab1df2e8507d5.js\",\"/_next/static/chunks/a2482c2cb1e6ce2d.js\",\"/_next/static/chunks/2b195bdb5f7e8b9c.js\"],\"default\"]\n5:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"default\"]\n6:I[16868,[\"/_next/static/chunks/295d483fd0fe7058.js\",\"/_next/static/chunks/90133f3a98134237.js\",\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"/_next/static/chunks/b7c457a3aba29949.js\",\"/_next/static/chunks/9a932f32d4998aba.js\",\"/_next/static/chunks/cd9e183a5b732415.js\"],\"default\"]\n7:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"default\"]\n8:I[54231,[\"/_next/static/chunks/295d483fd0fe7058.js\",\"/_next/static/chunks/90133f3a98134237.js\",\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"/_next/static/chunks/b7c457a3aba29949.js\",\"/_next/static/chunks/9a932f32d4998aba.js\"],\"default\"]\n9:I[82307,[\"/_next/static/chunks/295d483fd0fe7058.js\",\"/_next/static/chunks/90133f3a98134237.js\",\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"/_next/static/chunks/b7c457a3aba29949.js\",\"/_next/static/chunks/9a932f32d4998aba.js\",\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/839ab1df2e8507d5.js\",\"/_next/static/chunks/a2482c2cb1e6ce2d.js\",\"/_next/static/chunks/2b195bdb5f7e8b9c.js\"],\"default\"]\na:I[54526,[\"/_next/static/chunks/295d483fd0fe7058.js\",\"/_next/static/chunks/90133f3a98134237.js\",\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"/_next/static/chunks/b7c457a3aba29949.js\",\"/_next/static/chunks/9a932f32d4998aba.js\",\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/839ab1df2e8507d5.js\",\"/_next/static/chunks/a2482c2cb1e6ce2d.js\",\"/_next/static/chunks/2b195bdb5f7e8b9c.js\"],\"default\"]\nb:I[43487,[\"/_next/static/chunks/295d483fd0fe7058.js\",\"/_next/static/chunks/90133f3a98134237.js\",\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"/_next/static/chunks/b7c457a3aba29949.js\",\"/_next/static/chunks/9a932f32d4998aba.js\",\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/839ab1df2e8507d5.js\",\"/_next/static/chunks/a2482c2cb1e6ce2d.js\",\"/_next/static/chunks/2b195bdb5f7e8b9c.js\"],\"default\"]\ne:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"OutletBoundary\"]\nf:\"$Sreact.suspense\"\n11:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"ViewportBoundary\"]\n13:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"MetadataBoundary\"]\n15:I[68027,[],\"default\"]\n16:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/803a574de9eda7ae.js\"],\"IconMark\"]\n:HL[\"/_next/static/chunks/1eb4e623bbab9d80.css\",\"style\"]\n:HL[\"/_next/static/chunks/ee29aad0f5404c1a.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"gaSl0AwE2DLwfiXHSPG-I\",\"c\":[\"\",\"?feed=rss2\"],\"q\":\"?feed=rss2\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__?{\\\"feed\\\":\\\"rss2\\\"}\",{}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/1eb4e623bbab9d80.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/295d483fd0fe7058.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/90133f3a98134237.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/b7c457a3aba29949.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-4\",{\"src\":\"/_next/static/chunks/9a932f32d4998aba.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh_CN\",\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[[\"$\",\"$L3\",null,{}],[\"$\",\"$L4\",null,{\"component\":\"main\",\"sx\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"minHeight\":\"85vh\"},\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$L7\",null,{}]}],\"templateStyles\":[],\"templateScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/cd9e183a5b732415.js\",\"async\":true}]],\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L4\",null,{\"component\":\"footer\",\"sx\":{\"py\":2,\"mt\":8,\"backgroundColor\":\"transparent\",\"color\":\"black\"},\"children\":[\"$\",\"$L8\",null,{}]}]]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L4\",null,{\"sx\":{\"flexGrow\":1,\"mt\":8},\"children\":[[\"$\",\"$L9\",null,{}],[\"$\",\"$La\",null,{\"maxWidth\":\"xl\",\"children\":[\"$\",\"$Lb\",null,{\"container\":true,\"justifyContent\":\"center\",\"columns\":24,\"children\":[[\"$\",\"$Lb\",null,{\"size\":{\"sm\":20,\"md\":14,\"lg\":15},\"children\":\"$Lc\"}],[\"$\",\"$Lb\",null,{\"size\":{\"sm\":0,\"md\":6,\"lg\":6},\"offset\":0.4,\"sx\":{\"display\":{\"xs\":\"none\",\"md\":\"block\"}},\"children\":\"$Ld\"}]]}]}]]}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/ee29aad0f5404c1a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/ff1a16fafef87110.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/839ab1df2e8507d5.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/a2482c2cb1e6ce2d.js\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/2b195bdb5f7e8b9c.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$Le\",null,{\"children\":[\"$\",\"$f\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@10\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L11\",null,{\"children\":\"$L12\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L13\",null,{\"children\":[\"$\",\"$f\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L14\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$15\",[]],\"S\":false}\n"])</script><script>self.__next_f.push([1,"12:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n10:null\n14:[[\"$\",\"title\",\"0\",{\"children\":\"新青年talks\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"分享编程技术、生活感悟和个人项目的展示平台\"}],[\"$\",\"meta\",\"2\",{\"name\":\"author\",\"content\":\"李星河\"}],[\"$\",\"meta\",\"3\",{\"name\":\"keywords\",\"content\":\"博客,李星河,前端开发,全栈开发,技术分享,编程,新青年talks\"}],[\"$\",\"meta\",\"4\",{\"name\":\"creator\",\"content\":\"李星河\"}],[\"$\",\"meta\",\"5\",{\"name\":\"publisher\",\"content\":\"李星河\"}],[\"$\",\"meta\",\"6\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:title\",\"content\":\"新青年talks\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:description\",\"content\":\"分享编程技术、生活感悟和个人项目的展示平台\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:url\",\"content\":\"https://neotalks.org\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:site_name\",\"content\":\"新青年talks\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:locale\",\"content\":\"zh_CN\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:title\",\"content\":\"新青年talks\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:description\",\"content\":\"分享编程技术、生活感悟和个人项目的展示平台\"}],[\"$\",\"link\",\"16\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.da58135a.ico\",\"sizes\":\"48x48\",\"type\":\"image/x-icon\"}],[\"$\",\"$L16\",\"17\",{}]]\n"])</script><script>self.__next_f.push([1,"17:I[37172,[\"/_next/static/chunks/295d483fd0fe7058.js\",\"/_next/static/chunks/90133f3a98134237.js\",\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"/_next/static/chunks/b7c457a3aba29949.js\",\"/_next/static/chunks/9a932f32d4998aba.js\",\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/839ab1df2e8507d5.js\",\"/_next/static/chunks/a2482c2cb1e6ce2d.js\",\"/_next/static/chunks/2b195bdb5f7e8b9c.js\"],\"TagsCard_client\"]\n18:I[19485,[\"/_next/static/chunks/295d483fd0fe7058.js\",\"/_next/static/chunks/90133f3a98134237.js\",\"/_next/static/chunks/9a8c152fe936fdb1.js\",\"/_next/static/chunks/b7c457a3aba29949.js\",\"/_next/static/chunks/9a932f32d4998aba.js\",\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/839ab1df2e8507d5.js\",\"/_next/static/chunks/a2482c2cb1e6ce2d.js\",\"/_next/static/chunks/2b195bdb5f7e8b9c.js\"],\"default\"]\nd:[\"$\",\"$L17\",null,{\"data\":[{\"id\":1,\"name\":\"golang\",\"createdAt\":\"2025-12-24T14:53:28.941Z\",\"updatedAt\":\"2025-12-24T14:53:28.941Z\"},{\"id\":2,\"name\":\"python\",\"createdAt\":\"2025-12-24T14:53:33.617Z\",\"updatedAt\":\"2025-12-24T14:53:33.617Z\"},{\"id\":4,\"name\":\"AI\",\"createdAt\":\"2025-12-26T12:11:42.614Z\",\"updatedAt\":\"2025-12-26T12:11:42.614Z\"},{\"id\":5,\"name\":\"web\",\"createdAt\":\"2025-12-27T11:50:28.624Z\",\"updatedAt\":\"2025-12-27T11:50:28.624Z\"},{\"id\":6,\"name\":\"typescript\",\"createdAt\":\"2025-12-27T11:50:38.215Z\",\"updatedAt\":\"2025-12-27T11:50:38.215Z\"},{\"id\":7,\"name\":\"arch\",\"createdAt\":\"2026-01-03T11:43:48.050Z\",\"updatedAt\":\"2026-01-03T11:43:48.050Z\"},{\"id\":8,\"name\":\"服务器\",\"createdAt\":\"2026-01-03T11:43:57.216Z\",\"updatedAt\":\"2026-01-03T11:43:57.216Z\"},{\"id\":9,\"name\":\"极客\",\"createdAt\":\"2026-01-03T11:44:07.845Z\",\"updatedAt\":\"2026-01-03T11:44:07.845Z\"},{\"id\":10,\"name\":\"vim\",\"createdAt\":\"2026-01-12T11:35:42.682Z\",\"updatedAt\":\"2026-01-12T11:35:42.682Z\"}]}]\n19:T331c,"])</script><script>self.__next_f.push([1,"\u003e 三个月，从bspwm崩溃到Hyprland稳定运行。这是我踩过的所有坑和一键解决方案。\n\n---\n\n## 从桌面废墟到效率神殿\n\n我在2023年的某个深夜卸载了bspwm。\n\n那是我第N次重装系统。之前用bspwm+picom组合时，桌面会在运行一周后毫无征兆地卡死。我不得不频繁重启Xorg，丢失未保存的代码。并且picom的版本众多，每个版本的配置参数都不一样，而且基本没人维护。当我看到GitHub上最后一次提交还是两年前时，突然意识到自己正在用程序员的尊严换取一个不稳定的桌面环境。\n\n后来我尝试了KDE，但它的花里胡哨像过度装修的客厅，好看却找不到落脚的地方。我花了三个周末调试主题，结果换来的是启动时间增加两倍、内存占用翻倍。\n\n为什么我们总在重复无效的折腾？\n\n就像用锤子拧螺丝，明明有更高效的工具，却非要用熟悉的方式解决问题。传统桌面系统的交互逻辑，本质上还是停留在鼠标统治的时代。我们用点击代替思考，用拖拽代替决策，把本该用来写代码的精力浪费在调整窗口大小上。\n\nHyprland不是另一个美化工具，它是桌面交互的重新定义。\n\n![](https://img.neotalks.org/2026/02/5782054664c31d38eab44aa4c413a50a.gif)\n\n---\n\n## 平铺桌面的效率革命\n\n平铺桌面的核心原理，是将空间利用从“手动管理”升级为“自动调度”。\n\n传统桌面系统中，每个窗口都需要手动拖拽、调整大小，就像在拥挤的停车场里找车位。你需要时刻关注窗口的位置和大小，生怕遮挡了重要内容。这种交互方式的本质，是让用户承担了本该由系统完成的空间管理工作。\n\n平铺桌面则不同。它会自动将窗口排列成整齐的网格，每个窗口都能获得合理的空间分配。就像餐厅里的智能取餐系统，不用你排队等待，系统会自动为你安排最合适的位置。当你打开新窗口时，它会智能调整现有布局，确保所有内容都能完整展示。\n\nHyprland将这种效率提升到了新的高度。它不仅支持动态平铺，还能通过窗口规则自定义布局策略。比如你可以设置浏览器固定占据屏幕特定比例，终端自动填充剩余区域。几行配置下来，就能获得完全贴合你工作习惯的桌面布局。\n\n更重要的是，Hyprland内置了 compositor，无需额外安装picom。它的动画效果流畅自然，不会出现卡顿或撕裂。我已经连续运行Hyprland三个月，从未出现过系统卡死的情况。这种稳定性，是bspwm+picom组合无法比拟的。\n\n![](https://img.neotalks.org/2026/02/a3b4d92db9914b7564390c13456e506c.png)\n![](https://img.neotalks.org/2026/02/a6a1d0531dfd3d7cc3eedf6849aa95cb.png)\n\n---\n\n## 五分钟上手：安装 Hyprland\n\n如果你用的是Arch Linux，安装Hyprland只需要几行命令：\n\n```bash\n# 安装 Hyprland 和基础组件\nsudo pacman -S hyprland kitty waybar rofi-wayland\n\n# NVIDIA 显卡用户额外安装\nsudo pacman -S nvidia-dkms libva-nvidia-driver\n```\n\nNVIDIA用户还需要在`config/env.conf`里加上这几行环境变量，否则大概率黑屏或画面撕裂：\n\n```bash\nenv = LIBVA_DRIVER_NAME,nvidia\nenv = __GLX_VENDOR_LIBRARY_NAME,nvidia\nenv = GBM_BACKEND,nvidia-drm\nenv = NVD_BACKEND,direct\n```\n\n装完之后在TTY终端输入`Hyprland`就能进入桌面。第一次启动会看到一个空白屏幕和一个提示框——不要慌，按`Super+Q`打开终端，你的Hyprland之旅就正式开始了。\n\n\u003e 如果你不想从零开始配置，可以直接跳到最后一节获取我的完整配置包，一键搞定。\n\n---\n\n## 避坑指南：从理论到实战\n\n网上90%的教程都在教你如何美化Hyprland，却没人告诉你Wayland生态下隐藏的致命陷阱。\n\n我在使用Hyprland的前三个月里，遇到过无数次崩溃、卡顿和兼容性问题。这些问题就像隐藏在道路上的暗坑，一不小心就会让你前功尽弃。\n\n### 中文输入法的终极解决方案\n\n我第一次在Hyprland上安装Fcitx5时，候选词框像幽灵一样在屏幕上乱飞。我试遍了网上所有的教程，修改了无数次环境变量，结果依然是徒劳。直到我发现了问题的本质：Wayland和X11的输入模型完全不同。\n\n网上大多数教程都让你在`~/.zprofile`或`~/.bashrc`里用`export`写环境变量，但Hyprland有自己专属的配置语法。直接在Hyprland配置里用`env`声明，才是正统做法。\n\n我的配置文件`config/env.conf`中，输入法相关的部分是这样的：\n\n```bash\n# env = GTK_IM_MODULE,fcitx  # 注意：这行故意注释掉了！\nenv = QT_IM_MODULE,fcitx\nenv = XMODIFIERS,@im=fcitx\nenv = SDL_IM_MODULE,fcitx\nenv = GLFW_IM_MODULE,ibus\nenv = QT_IM_MODULES,wayland;fcitx;ibus\n```\n\n这里有个关键的坑：`GTK_IM_MODULE`在较新的Wayland环境下**必须注释掉**。如果你还像X11时代一样设置`GTK_IM_MODULE=fcitx`，反而会导致GTK应用里中文输入法无法弹出候选框、甚至直接失效。这是因为新版GTK已经原生支持Wayland输入协议，强行指定输入模块会和原生协议打架。\n\n另外一条容易被忽略的是`QT_IM_MODULES=wayland;fcitx;ibus`。这是Qt应用的输入法回退链——优先走Wayland原生协议，不行就回退到Fcitx，再不行还有ibus兜底。三道保险，确保Qt应用在任何场景下都能正常输入中文。不过根据经验，ibus真不如fcitx5。\n\n假如你用的ibus发现各种问题，可以尝试换成fcitx5+rime。经过我多次重装测试，这套配置在arch+hyprland下表现最好。\n\n```bash\nyay -S fcitx5-im fcitx5-configtool fcitx5-gtk fcitx5-rime\n```\n\n光配环境变量还不够，你还需要让Fcitx5在Hyprland启动时自动拉起来。在`config/bootup.conf`加一行：\n\n```bash\n# Fcitx5\nexec = fcitx5 -d --replace\n```\n\n注意这里用的是`exec`而不是`exec-once`。区别在于：`exec`在每次Hyprland重载配置时都会重新执行，相当于自带\"掉线重连\"机制。Fcitx5在某些情况下会莫名其妙挂掉，用`exec`加上`--replace`参数，可以确保即使进程崩了，重载配置后也会自动恢复。\n\n### 屏幕共享的救赎之路\n\n线上会议时屏幕共享崩溃，是Wayland生态下最常见的社死现场。我第一次在腾讯会议上共享屏幕时，整个画面瞬间变成了黑屏。\n\n问题的根源在于Xwayland的捕获机制。你需要卸载旧的portal组件，强制安装Hyprland专用的版本：\n\n```bash\nsudo pacman -Rns xdg-desktop-portal-gnome xdg-desktop-portal-kde\nsudo pacman -S xdg-desktop-portal-hyprland xdg-desktop-portal-wlr\n```\n\n但这只解决了一半问题。你还需要安装`xwaylandvideobridge`，它是Xwayland和Wayland之间的视频桥接器，让那些只支持X11屏幕捕获的应用（比如腾讯会议、钉钉）也能正常共享画面。\n\n```bash\nyay -S xwaylandvideobridge\n```\n\n装完之后你会发现桌面上多了一个透明窗口在那里晃——这就是视频桥的捕获窗口。不要手动关掉它，而是在`config/winrule.conf`里加上这条规则，让它彻底隐身：\n\n```bash\nwindowrule {\n    name = xwaylandvideobridge-rules\n    match:class = ^(xwaylandvideobridge)$\n    opacity = 0.0 override 0.0 override\n    animation = none\n    no_focus = on\n    no_initial_focus = on\n}\n```\n\n把透明度设成`0.0 override`，这个窗口就完全不可见了。`no_focus`和`no_initial_focus`确保它永远不会抢焦点，你甚至感知不到它的存在。但它其实一直在后台默默工作，把Wayland的画面转发给那些古董级的X11应用。\n\n### 国产软件的使用\n\n```bash\nyay -S wechat-bin\n```\n\n直接一键安装微信，目前只能说是能用的地步，没有字体模糊问题，但要和mac/win下一样丝滑，那不要想了。\n\n微信在平铺桌面下有个很恼人的问题：它的窗口死活不肯自动平铺，强行平铺会导致布局错乱。解决方案是在`config/winrule.conf`里给它指定浮动规则：\n\n```bash\nwindowrule = match:class ^(wechat)$, float on\n```\n\n同理，WPS Office全家桶也需要特殊处理。WPS的窗口类名分别是`wps`（Writer）、`et`（Excel）、`wpspdf`（PDF阅读器），每个都要单独设置浮动+最大化：\n\n```bash\nwindowrule {\n    name = wps-writer-rules\n    match:class = ^(wps)$\n    float = on\n    maximize = on\n}\n\nwindowrule {\n    name = wps-spreadsheet-rules\n    match:class = ^(et)$\n    float = on\n    maximize = on\n}\n```\n\n为什么要`float`和`maximize`一起用？因为WPS在平铺模式下会出现工具栏消失、菜单无法展开等奇葩问题。让它浮动再最大化，视觉效果和全屏一样，但底层逻辑完全不同——WPS以为自己是一个自由窗口，就不会闹脾气了。\n\n要查看一个应用的窗口类名，可以在终端运行`hyprctl clients`，找到对应窗口的`class`字段。这是写窗口规则的必备技能。\n\n![](https://img.neotalks.org/2026/02/56b8836b7d480de81ca4f7715a984adc.png)\n\n### 窗口「一键收纳」\n\n你有没有遇到过这种场景：正在全神贯注地写代码，突然需要打开一个参考文档，看完之后又不想关掉它，但它占着屏幕碍事。\n\n在传统桌面上你会把它最小化到任务栏，但平铺桌面没有最小化这个概念。我写了一个脚本来解决这个问题：按`Super+V`把当前窗口「藏」到一个隐藏的工作区，按`Super+Shift+V`再把它「变」回来。\n\n原理很简单：创建一个编号为88的「隐藏工作区」，把不想看的窗口丢过去，需要的时候再捞回来。脚本用一个栈结构来记录藏起来的窗口PID，取回时按后进先出的顺序恢复：\n\n```bash\n# 藏窗口：把当前窗口移到工作区88\npid=$(hyprctl activewindow -j | jq '.pid')\nhyprctl dispatch movetoworkspacesilent 88,pid:$pid\n\n# 取窗口：把最后一个藏起来的窗口移回当前工作区\npid=$(tail -1 $stack_file \u0026\u0026 sed -i '$d' $stack_file)\ncurrent_workspace=$(hyprctl activeworkspace -j | jq '.id')\nhyprctl dispatch movetoworkspacesilent $current_workspace,pid:$pid\n```\n\n在`config/binds.conf`里绑定快捷键：\n\n```bash\n# 藏起当前窗口\nbind = $mainMod, V, exec, $HyprTool/hide_unhide_window.sh h\n# 取回最后藏起的窗口\nbind = $shiftMod, V, exec, $HyprTool/hide_unhide_window.sh s\n```\n\n用起来的感觉就像魔术：窗口嗖一下消失，再嗖一下回来，而且完全不影响当前的布局。这个小技巧让我在多任务切换时效率提升了不止一个档次。\n\n### 壁纸自动轮换\n\n盯着同一张壁纸写代码，时间长了审美疲劳是真的。我用`swww`写了一个壁纸轮换脚本，每隔一段时间自动换一张壁纸，还带随机过渡动画。\n\n先安装swww：\n\n```bash\nyay -S swww\n```\n\n把你喜欢的壁纸丢到`~/.config/hypr/images`目录下，然后在`config/bootup.conf`里加一行：\n\n```bash\nexec-once = $HyprDir/script/wallpaper-rotate.sh --interval 6400\n```\n\n`--interval 6400`表示每6400秒（大约1小时45分钟）换一次。为什么不用整数的3600？因为整点切换的话，你每次开会或者写代码到同一个时间点就会看到壁纸突然变，反而打断思路。用个不规则的数字，切换时机更随机，感知更自然。\n\n如果你突然想手动换一张，按`Super+Shift+B`就行：\n\n```bash\nbind = $shiftMod, B, exec, $HyprTool/wallpaper-rotate.sh --once\n```\n\nswww的过渡动画是这套配置的点睛之笔。它支持fade、wipe、wave、grow等十几种过渡效果，我把它设成了`random`，每次切换都是不同的动画，开盲盒的感觉。\n\n![](https://img.neotalks.org/2026/02/467231a53f11f2f68b583c46b025756e.gif)\n\n## 一键获取我的终极配置\n\n我花了三个月时间打磨这套Hyprland配置。从Waybar的主题配色到Rofi的启动动画，从Fcitx5的输入优化到屏幕共享兼容，每一个细节都经过了反复调试。\n\n你不需要重复我走过的弯路——只需运行一个脚本，就能获得和我一模一样的桌面环境。\n\n**配置包包含：**\n\n- ✅ 完整的Hyprland配置文件（含本文所有避坑方案）\n- ✅ 精美的Waybar主题和动画\n- ✅ 智能的Rofi启动器配置\n- ✅ Fcitx5中文输入法完美解决方案\n- ✅ 屏幕共享 + 国产软件兼容性优化\n- ✅ 一键安装脚本，开箱即用\n\n安装只需三步：\n\n```bash\ngit clone https://github.com/xinghe98/hyprland_dotfile.git\ncd hyprland_dotfile\nchmod +x install.sh \u0026\u0026 ./install.sh\n```\n\n📦 **想要更详细的安装指南和疑难解答？公众号后台回复「hyprland」即可获取。**\n\n---\n\n**写在最后**\n\n以上均为个人使用体验，也许有些说法带着主观滤镜，但这确实是我目前找到的最适合开发者的桌面方案。Hyprland不完美，但它让我重新找回了对桌面的掌控感——用三个月省下了以前每周重启Xorg的时间。\n\n如果这篇文章帮你避开了哪怕一个坑，**点个「在看」** 让更多Linux用户看到。\n\n![](https://img.neotalks.org/640.jpg)\n\n"])</script><script>self.__next_f.push([1,"1a:T2368,"])</script><script>self.__next_f.push([1,"\u003e 🔥 **本文阅读指南**：\n\u003e \n\u003e 1. 为什么你的公网IP正在被\"全球直播\"？\n\u003e 2. V2Ray 如何实现\"单端口复用\"的黑科技？\n\u003e 3. 手把手教你给家庭网络穿上\"隐身衣\"。\n\u003e \n\u003e *文末有懒人配置福利，建议先收藏再食用。*\n\n\u003e ⚠️ **高能预警**：本文硬核，涉及网络安全底护。请严格遵守法律法规，技术仅用于个人合法的家庭网络远程访问。\n\n---\n\n## 🛑 你的家庭网络，可能正在\"裸奔\"\n\n写这篇文章的起因，是昨晚凌晨3点，我被NAS的报警邮件吵醒。\n\n扫了一眼后台日志，背脊发凉——**短短6小时，SSH端口被暴力尝试破解了84,320次。**\n\n平均每秒3.9次。\n\n这意味着，此时此刻，互联网黑暗森林里有成千上万个自动化脚本，正在疯狂敲你家的\"数字大门\"。\n\n你可能会说：\"我设了强密码，也没几个人知道我的IP。\"\n\n**错。大错特错。**\n\n在黑客的自动化扫描器眼里，互联网没有秘密。你开放的每一个端口——NAS的80、远程桌面的3389、摄像头的554——就像是在漆黑的荒野里点燃的火把。\n\n**只要火把亮着，猎食者闻着味儿就来了。**\n\n一旦被攻破，你的私人照片、工作文档、家庭摄像头画面，可能下一秒就会出现在暗网的售卖清单上。\n\n**怎么办？拔网线吗？**\n\n当然不是。今天，我教你一招**\"网络隐身术\"**：\n\n**只保留一个端口，用 v2ray 充当\"守门人\"。** 让所有服务（NAS、RDP、Web）都折叠进这一个加密隧道里。\n\n在外人眼里，你的家是封闭的铜墙铁壁；而在你手里，却握着唯一通行的\"9¾站台\"钥匙。\n\n---\n\n## 一、为什么\"只开一个端口\"是降维打击？\n\nv2ray 不仅仅是一个代理工具，它的本质是一个**企业级的模块化网络神盾**。\n\n用人话解释，它和普通VPN的区别，就像**\"哆啦A梦的任意门\"** vs **\"大巴车\"**。\n\n### 🚇 传统VPN：笨重的大巴车\n\nVPN 就像一辆封闭的大巴车。一旦你连上VPN：\n\n* **全员上车**：你去百度查资料、刷B站、甚至聊微信，流量都要绕回家里遛一圈。\n* **速度感人**：不仅慢，还浪费家里宝贵的上行带宽。\n* **特征明显**：很容易被运营商识别并干扰。\n\n### 🚪 v2ray：智能的任意门\n\n而我们今天要搭建的 v2ray 方案，实现了**应用层（L7）的智能分流**：\n\n* **像开了天眼**：你想回家访问NAS？自动走加密隧道。你想刷抖音？自动直连公网，不占家里带宽。\n* **隐形**：使用 VMess/VLESS 协议，流量看起来就像普通的网页访问，扫描器根本不知道这里藏着一个入口。\n* **极致安全**：没有正确的 UUID（身份验证），连门缝都摸不到。对于非法请求，它直接丢进黑洞，连个\"密码错误\"的提示都不给。\n\n**一句话总结：给你的家庭网络穿上防弹衣，同时保留了裸跑的速度。**\n\n---\n\n## 二、极速部署：给大门上锁\n\n废话少说，直接上实操。我们需要在家里有公网IP的设备（Linux服务器/NAS/软路由）上安装 v2ray。\n\n### 🔧 1. 一键安装（Linux/软路由）\n\n打开终端，复制这行命令，回车：\n\n```bash\n# 官方推荐安装脚本（安全、纯净）\nsudo bash \u003c(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)\n```\n\n如果你是 Arch 用户（致敬），直接 `sudo pacman -S v2ray`。\n\n### 🔧 2. 验证是否存活\n\n```bash\nsudo systemctl start v2ray  # 启动服务\nsudo systemctl status v2ray # 查看状态\n```\n\n看到绿色的 `active (running)`？恭喜，门框已经搭好了。\n\n![](https://img.neotalks.org/2026/02/11930194faae066907dca28046f29e7a.png)\n---\n\n## 三、核心配置：一张图看懂\"单端口复用\"\n\n这是本文的**灵魂**所在。我们要实现的效果如下：\n\n```\n🌍 外部邪恶世界\n           │\n           ▼\n    ┌─────────────┐\n    │ 唯一开放端口 │  \u003c-- 只暴露这一个！(如 10086)\n    │  (v2ray)    │\n    └─────────────┘\n           │\n      🔍 身份核验 (UUID)\n           │\n     ┌─────┴─────┐\n     ▼           ▼\n   ✅通过       ❌滚蛋\n     │           │\n  ┌──┴──┐      直接丢弃\n  │ 路由 │      (静默)\n  └──┬──┘\n     │\n  ┌──┼──┐\n  ▼  ▼  ▼\n NAS PC 摄像头\n```\n\n### 📋 懒人配置模板 (Copy \u0026 Paste)\n\n**🔍 第一步：确认你的配置文件在哪？**\n\n不同安装方式路径不同，输入下面命令查看：\n\n```bash\nsudo systemctl status v2ray\n```\n\n查看输出信息中 `config` 后面跟的路径，就是你的配置文件位置（如下图红框所示）。\n\n![](https://img.neotalks.org/2026/02/1ab997baedfac92dbe60b1a93951e7e9.png)\n\n**🔍 第二步：写入配置**\n\n使用你熟悉的编辑器（如 `nano` 或 `vim`）打开找到的配置文件，清空原内容，**直接粘贴**这一段：\n\n```json\n{\n  \"inbounds\": [{\n    \"port\": 5678,           \n    \"listen\": \"0.0.0.0\",\n    \"protocol\": \"vmess\",\n    \"settings\": {\n      \"clients\": [\n        {\n          \"id\": \"f349d2c6-81fe-4da0-95aa-9cce50af6f5a\", \n          \"level\": 1,\n          \"alterId\": 0\n        }\n      ]\n    }\n  }],\n  \"outbounds\": [\n    {\n      \"protocol\": \"freedom\",\n      \"settings\": {},\n      \"tag\": \"direct\"\n    }\n  ],\n  \"domainStrategy\": \"IPOnDemand\"\n}\n```\n\n\u003e **💡 30秒看懂你在配什么**：\n\u003e \n\u003e * **`inbounds` (入口)**：我们在 `5678` 端口开了个只有你知道的暗门。\n\u003e * **`vmess` (暗语)**：这是特工专用的加密协议，墙外的扫描器根本看不懂你在传什么。\n\u003e * **`outbounds` (出口)**：`freedom` 代表自由。只要对了暗号（UUID），我就给你自由，直接连接你家里的所有设备。\n\n### ⚠️ **两个必须要改的地方（敲黑板！）**\n\n1. **`\"port\": 5678`**\n   \n   * 这就是你那一扇\"唯一的门\"。建议改成 `10000` 到 `60000` 之间的任意数字，比如 `34567`。\n   * **记得在路由器做端口映射！** 把公网的 `34567` 转发到这台设备的 `34567`。\n2. **`\"id\": \"f349...\"` (UUID)**\n   \n   * 这是你的**私钥**。千万别用文章里这个！\n   * **生成方法**：在终端输入 `uuidgen`，或者百度搜\"UUID生成器\"，换成一个新的。\n   * 谁拿到了这个UUID，谁就能进你家内网。\n\n### 🔄 让魔法生效\n\n修改完后，别忘了重启服务：\n\n```bash\nsudo v2ray test -c /usr/local/etc/v2ray/config.json  # 先测语法，别报错\nsudo systemctl restart v2ray                         # 重启生效\n```\n\n![](https://img.neotalks.org/2026/02/acebd074a28f8b96c8543bcdbf18fd1e.png)\n---\n\n## 四、避坑指南：给新手配个\"听诊器\"\n\n配置好了连不上？别急，根据我多年的填坑经验，90%的问题出在这里：\n\n### 🚑 症状1：死活连不上\n\n* **查时间**：v2ray 对时间极度敏感。只要你服务器时间和标准时间差了**90秒**以上，连接直接被拒。\n  * *解药*：`sudo timedatectl set-ntp true`\n* **查防火墙**：如果你在Linux上配的，记得放行端口。\n  * *解药*：`sudo ufw allow 5678/tcp` (假设你用了5678)\n\n### 🚑 症状2：连上了但上不了网\n\n* **查客户端“自作聪明”的规则（重灾区！）**：\n  * **陷阱**：Clash、Shadowrocket（小火箭）等软件，默认都有个**\"绕过局域网\"**的策略。当你人在星巴克，想访问家里的 `192.168.x.x` 时，软件会误以为你要访问星巴克的内网，直接选择直连，根本不走代理通道。\n  * **解药**：\n    * **Clash/v2rayN**：将代理模式暂时改为 **\"全局 (Global)\"**。\n    * **Shadowrocket**：将\"全局路由\"改为 **\"代理\"**；或者是添加一条规则 `IP-CIDR, 192.168.0.0/16, PROXY`。\n* **查UUID**：复制粘贴时有没有多复制了空格？这是最常见但也最难发现的坑。\n\n### 🛡️ 进阶：Zero Trust (零信任) 玩法\n\n想更变态一点？你可以给家里每个人发不同的 UUID：\n\n```json\n\"clients\": [\n  { \"id\": \"老爸的UUID\", \"email\": \"dad\" },\n  { \"id\": \"老妈的UUID\", \"email\": \"mom\" }\n]\n```\n\n谁的手机丢了，直接在服务端删掉对应的 UUID，毫秒级阻断，其他设备完全不受影响。这才是真正的企业级安全管理。\n\n---\n\n## 💭 写在最后：技术是为了自由\n\n折腾 v2ray，折腾内网穿透，本质上是我们对互联网\"所有权\"的一种执念。\n\n在这个数据越来越不属于自己的时代，拥有一台只有你能掌控的服务器，一条只有你能通行的加密隧道，是一种**现代数字游民的浪漫**。\n\n如果这篇文章帮你的 NAS 挡住了一次攻击，或者帮你省下了一笔买宽带叠加包的钱，那它就值了。\n\n---\n\n\u003e **👨‍💻 互动时间**\n\u003e \n\u003e 你的 NAS 现在正开着哪些端口？去看看日志，有没有被陌生IP\"敲门\"？\n\u003e \n\u003e **在评论区告诉我你的\"被攻击次数\"，看看谁才是真正的\"吸黑体质\"。**\n\n"])</script><script>self.__next_f.push([1,"1b:T416b,"])</script><script>self.__next_f.push([1,"\n\n\u003e 🎬 NAS买回来只当网盘用？Plex/Emby会员费太贵？本文手把手教你搭建完全免费的家庭影院！\n\n---\n\n## 为什么你需要 Jellyfin？\n\n先说结论：**如果你在意免费+开源+硬解，Jellyfin 是唯一选择。**\n\n我身边很多朋友买了NAS之后，装了群晖、绿联或威联通，结果它就安静地躺在角落当网盘用。偶尔想看个电影，还得把文件下载到本地，或者忍受网页播放的卡顿——这种体验，怎么说呢，**有点像买了辆跑车却只用来买菜**。\n\n更让人肉疼的是，想要流畅播放4K视频，Plex要买终身会员（$119.99），Emby也要Premier订阅。**就为了一个硬件转码功能，掏这么多钱？** 换言之，你的核显明明闲着，却还要额外付费才能用上它。\n\nJellyfin 完美解决了这个痛点——**完全免费、开源、硬件转码免费**。简单来说，它就是 Plex 的\"开源平替\"，而且功能丝毫不差。\n\n---\n\n## Jellyfin vs Plex vs Emby：一张表说清楚\n\n| 特性           | Jellyfin     | Plex                          | Emby                          |\n| -------------- | ------------ | ----------------------------- | ----------------------------- |\n| 💰 **价格**     | **完全免费** | 免费版受限 / Pass $119.99终身 | 免费版受限 / Premier $119终身 |\n| 🔓 **开源**     | ✅ 完全开源   | ❌ 闭源                        | ❌ 部分开源                    |\n| 🖥️ **硬件转码** | ✅ **免费**   | ❌ 需Plex Pass                 | ❌ 需Premier                   |\n| 🌐 **远程访问** | 需自行配置   | 一键中继                      | 需自行配置                    |\n| 📱 **客户端**   | 免费         | 部分收费                      | 部分收费                      |\n\n\u003e 💡 Jellyfin 唯一的\"缺点\"是远程访问需要自己配置，但别担心，本文后面会教你用 **Tailscale 5分钟搞定**——比你泡一杯咖啡的时间还短。\n\n---\n\n## 安装教程：群晖/绿联/威联通全平台覆盖\n\n### 方案一：群晖 Docker 安装（推荐）\n\n群晖是目前最主流的NAS系统，而 Docker 安装是最灵活的方式。举个例子，它就像用乐高积木搭建——想怎么组合随你心意。\n\n**Step 1：创建目录结构**\n\n在群晖文件管理器中创建以下目录：\n\n```\n/docker/jellyfin/\n├── config    # 配置文件\n├── cache     # 缓存目录\n└── media     # 媒体文件\n    ├── movies    # 电影\n    └── tv        # 电视剧\n```\n\n**Step 2：Docker Compose 配置**\n\n创建 `docker-compose.yml` 文件：\n\n```yaml\nversion: \"3\"\nservices:\n  jellyfin:\n    image: nyanmisaka/jellyfin:latest  # 推荐！预置硬解支持\n    container_name: jellyfin\n    restart: unless-stopped\n    ports:\n      - 8096:8096\n    volumes:\n      - /volume1/docker/jellyfin/config:/config\n      - /volume1/docker/jellyfin/cache:/cache\n      - /volume1/video:/media  # 你的媒体目录\n    devices:\n      - /dev/dri:/dev/dri  # Intel核显直通，硬解必需！\n    environment:\n      - TZ=Asia/Shanghai\n```\n\n\u003e ⚠️ **重要提示**：强烈推荐使用 `nyanmisaka/jellyfin` 镜像，而不是官方镜像。为什么？这个镜像预置了中文字体、硬解驱动，省去大量配置工作。**用官方的还要自己配字体，何必呢？**\n\n**Step 3：启动容器**\n\n```bash\ndocker-compose up -d\n```\n\n**Step 4：访问配置**\n\n浏览器打开 `http://你的NAS-IP:8096`，按向导完成初始化：\n\n- 语言选择：`Chinese`\n- 地区选择：`People's Republic of China`\n- 创建管理员账号\n\n到这里，你已经完成了基础安装——是不是比想象的简单？\n\n---\n\n### 方案二：绿联/威联通 Docker 安装\n\n配置基本相同，只需调整挂载路径。简单来说，就是把地址换一下而已：\n\n**绿联 UGOS：**\n\n```yaml\nvolumes:\n  - /mnt/media_rw/docker/jellyfin/config:/config\n  - /mnt/media_rw/docker/jellyfin/cache:/cache\n  - /mnt/media_rw/video:/media\n```\n\n**威联通 QTS：**\n\n```yaml\nvolumes:\n  - /share/Container/jellyfin/config:/config\n  - /share/Container/jellyfin/cache:/cache\n  - /share/Multimedia:/media\n```\n\n---\n\n### 方案三：Arch Linux 本地安装（详细版）\n\nArch Linux 是追求极简和最新软件的 Linux 发行版，非常适合作为家庭服务器。如果你也是\"用最新软件才有安全感\"的人，这个方案适合你。\n\n![](https://img.neotalks.org/2026/01/9a668590c3c646e5ff3cf83731a3aeb9.png)\n\n---\n\n#### Step 1：安装 Jellyfin 包\n\n好消息！Jellyfin 已进入 Arch 官方仓库，无需折腾 AUR：\n\n```bash\n# 安装服务端 + Web 界面\nsudo pacman -S jellyfin-server jellyfin-web\n\n# 可选：安装 ffmpeg（用于转码）\nsudo pacman -S jellyfin-ffmpeg\n```\n\n\u003e 💡 **包说明**：\n\u003e \n\u003e - `jellyfin-server`：核心服务端，大脑\n\u003e - `jellyfin-web`：Web 管理界面，颜值担当\n\u003e - `jellyfin-ffmpeg`：针对 Jellyfin 优化的 ffmpeg 版本，转码利器\n\n![](https://img.neotalks.org/2026/01/e995541b670668cee7929911d358256b.png)\n\n---\n\n#### Step 2：启动 Jellyfin 服务\n\n```bash\n# 启动服务\nsudo systemctl start jellyfin.service\n\n# 设置开机自启\nsudo systemctl enable jellyfin.service\n\n# 查看运行状态\nsudo systemctl status jellyfin.service\n```\n\n![](https://img.neotalks.org/2026/01/97d494a73907c7217c1710cf5cd3ab6e.png)\n\n首次启动后，Jellyfin 会在 `/var/lib/jellyfin/` 创建配置和数据目录。\n\n浏览器访问：`http://你的IP地址:8096`（如 `http://192.168.31.9:8096`）完成初始化向导。\n\n---\n\n#### Step 3：配置文件权限（重要！）\n\n**这是 Arch Linux 安装最常见的坑！** 我当时在这里卡了半天，特地记录下来帮你避雷。\n\nJellyfin 以 `jellyfin` 用户运行，**默认无法访问你的 home 目录**。为什么会这样？因为 Linux 的权限隔离机制——它很安全，但也很\"不近人情\"。\n\n**方案 A：使用 ACL 授权已有目录（推荐）**\n\n如果你的媒体文件已经在某个目录（比如迅雷下载目录），使用 ACL 精确授权最可靠：\n\n```bash\n# 安装 ACL 工具\nsudo pacman -S acl\n\n# 使用 ACL 给 jellyfin 用户授权（替换为你的实际路径）\nsudo setfacl -m u:jellyfin:rx /home/你的用户名\nsudo setfacl -m u:jellyfin:rx /home/你的用户名/媒体目录\nsudo setfacl -R -m u:jellyfin:rx /home/你的用户名/媒体目录\n\n# 重启服务\nsudo systemctl restart jellyfin\n```\n\n\u003e ⚠️ **不要使用 `usermod -aG` 把 jellyfin 加入你的用户组！** 为什么？因为你的 home 目录组权限通常是空的（`---`），加入用户组反而会导致权限匹配失败。这就像给人发了钥匙，但门锁根本不认这把钥匙。ACL 方式直接指定用户权限，更精确可靠。\n\n\u003e 💡 这样配置后，下载目录的电影/剧集会自动出现在 Jellyfin 媒体库中，无需手动移动文件。**一次配置，终身省心。**\n\n**方案 B：创建专用媒体目录**\n\n如果你想单独管理媒体文件，可以创建专用目录（权限配置更简单）：\n\n```bash\n# 创建媒体目录\nsudo mkdir -p /media/jellyfin/{movies,tv,music}\n\n# 设置权限\nsudo chown -R $USER:$USER /media/jellyfin\nsudo chmod -R 755 /media/jellyfin\n```\n\n在 Jellyfin 中添加媒体库时，指向 `/media/jellyfin/movies` 等目录即可。\n\n\u003e ⚠️ **注意**：外接硬盘如果是桌面环境自动挂载的（通过 FUSE），Jellyfin 也无法访问。需要在 `/etc/fstab` 中手动配置挂载点。这个坑我也踩过，简单来说，就是「自动挂载」和「权限隔离」天生不合。\n\n网页端配置时添加你的目录：\n\n![](https://img.neotalks.org/2026/01/1c877c871575c620c0ba77d3b590491c.png)\n\n---\n\n#### Step 4：Intel QSV 硬件转码配置\n\n如果你的 CPU 有 Intel 核显（6代酷睿及以上），可以启用 QSV 硬解，大幅降低 CPU 占用。换言之，**让核显干活，而不是 CPU 受累**。\n\n**安装必要驱动：**\n\n```bash\n# 安装 Intel 媒体驱动（QSV 必需！）\nsudo pacman -S vpl-gpu-rt\n\n# 安装监控工具（可选）\nsudo pacman -S intel-gpu-tools\n```\n\n\u003e 💡 `vpl-gpu-rt` 是 Intel OneVPL GPU Runtime，Jellyfin 的 jellyfin-ffmpeg 依赖此包进行硬件加速。没装这个，核显就只能干瞪眼。\n\n**验证核显是否可用：**\n\n```bash\n# 查看渲染设备\nls -la /dev/dri/\n# 应该看到：card0, card1, renderD128 等\n\n# 检查 jellyfin 用户是否有权限\ngroups jellyfin\n# 应该包含 render 或 video 组\n\n# 如果没有，手动添加\nsudo usermod -aG render jellyfin\nsudo usermod -aG video jellyfin\nsudo systemctl restart jellyfin\n```\n\n![](https://img.neotalks.org/2026/01/139658477cecc19d817ee9a321ac2524.png)\n\n**在 Jellyfin 中启用硬解：**\n\n1. 进入：`控制台 → 播放 → 转码`\n2. 硬件加速选择：`Intel QuickSync (QSV)`\n3. 勾选：`启用硬件解码` 下的所有格式\n4. 勾选：`启用硬件编码`\n5. 保存\n\n![](https://img.neotalks.org/2026/01/32792e80aa909d243f70a340b3ff2560.png)\n\n**验证硬解生效：**\n\n```bash\n# 播放一个需要转码的视频，然后执行：\nsudo intel_gpu_top\n\n# 如果看到 Video 引擎有负载，说明硬解生效\n```\n\n看到 Video 引擎跳动起来的那一刻，成就感拉满。\n\n---\n\n#### Step 5：常见问题排查\n\n**问题1：Jellyfin 检测不到媒体文件夹**\n\n```bash\n# 检查目录权限\nsudo -u jellyfin ls /path/to/media\n\n# 如果报错 Permission denied，执行：\nsudo chmod -R 755 /path/to/media\n```\n\n**问题2：更新后跳转到初始化向导**\n\n这是已知 Bug，修复方法：\n\n```bash\n# 编辑配置文件\nsudo nano /etc/jellyfin/system.xml\n\n# 确保以下值为 true\n\u003cIsStartupWizardCompleted\u003etrue\u003c/IsStartupWizardCompleted\u003e\n\n# 重启服务\nsudo systemctl restart jellyfin\n```\n\n**问题3：转码路径错误导致直播失败**\n\n如果使用 TVHeadend 插件，检查转码路径：\n\n- ✅ 正确：`/var/transcode`\n- ❌ 错误：`/var/transcode/`（多了斜杠）\n\n就一个斜杠的差别，能折腾你一下午——别问我怎么知道的。\n\n---\n\n#### Step 6：配置 Nginx 反向代理（可选）\n\n如果需要通过域名访问并启用 HTTPS，这一步适合你：\n\n```bash\n# 安装 Nginx 和 Certbot\nsudo pacman -S nginx certbot certbot-nginx\n```\n\n创建配置文件 `/etc/nginx/sites-available/jellyfin.conf`：\n\n```nginx\nserver {\n    listen 80;\n    server_name your.domain.com;\n    return 301 https://$server_name$request_uri;\n}\n\nserver {\n    listen 443 ssl http2;\n    server_name your.domain.com;\n\n    ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem;\n    ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem;\n\n    location / {\n        proxy_pass http://127.0.0.1:8096;\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_buffering off;\n    }\n\n    location /socket {\n        proxy_pass http://127.0.0.1:8096;\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection \"upgrade\";\n        proxy_set_header Host $host;\n    }\n}\n```\n\n```bash\n# 启用配置并重启\nsudo mkdir -p /etc/nginx/sites-enabled\nsudo ln -s /etc/nginx/sites-available/jellyfin.conf /etc/nginx/sites-enabled/\nsudo nginx -t \u0026\u0026 sudo systemctl restart nginx\n```\n\n---\n\n### 方案四：Windows 本地安装\n\n如果你用的是 Windows 系统，那恭喜你，这是最省事的方案：\n\n1. 访问 [jellyfin.org/downloads](https://jellyfin.org/downloads) 下载安装包\n2. 双击运行，按向导安装\n3. 安装完成后访问 `http://localhost:8096`\n\n\u003e 💡 Windows 版自带托盘图标，支持开机自启，配置相对简单。说实话，如果不是为了折腾，Windows 版真挺省心的。\n\n---\n\n## ⚠️ 避坑指南：这些坑我帮你踩过了\n\n\u003e 接下来是全文最有价值的部分——我踩过的坑，你不用再踩一遍。\n\n### 坑1：Docker 镜像拉取失败\n\n**症状**：`Error response from daemon: Get \"https://registry-1.docker.io/v2/\": net/http: request canceled`\n\n**原因**：国内网络访问 Docker Hub 不稳定。嗯，你懂的。\n\n**解决方案**：配置国内镜像加速\n\n```bash\n# 编辑或创建 /etc/docker/daemon.json\nsudo nano /etc/docker/daemon.json\n```\n\n添加以下内容：\n\n```json\n{\n  \"registry-mirrors\": [\n    \"https://docker.1ms.run\",\n    \"https://docker.xuanyuan.me\"\n  ]\n}\n```\n\n重启 Docker：\n\n```bash\nsudo systemctl restart docker\n```\n\n---\n\n### 坑2：硬件转码不生效，CPU 100%\n\n**症状**：播放视频时 CPU 占用飙到100%，风扇狂转，但明明有核显\n\n**原因**：没有正确配置设备直通。核显虽然在，但 Docker 容器\"看不见\"它。\n\n**解决方案**：\n\n**Intel 核显（最常见）：**\n在 docker-compose.yml 中添加：\n\n```yaml\ndevices:\n  - /dev/dri:/dev/dri\n```\n\n**验证是否生效**：\n\n```bash\n# 进入容器\ndocker exec -it jellyfin bash\n\n# 查看是否识别到核显\nls -la /dev/dri/\n# 应该看到 card0, renderD128 等设备\n\n# 播放视频时监控核显负载\nintel_gpu_top\n```\n\n在 Jellyfin 后台开启硬解：\n`控制台 → 播放 → 转码 → 硬件加速` 选择 `Video Acceleration API (VAAPI)`\n\n---\n\n### 坑3：海报墙全是灰色，刮削失败\n\n**症状**：媒体库扫描完成，但封面全是灰色占位图\n\n**原因**：默认刮削器 TMDB 在国内访问不稳定。又是网络问题。\n\n**解决方案**：安装 MetaShark 插件\n\n1. 进入 `控制台 → 插件 → 存储库 → 添加`\n2. 填入国内加速地址：\n\n```\nhttps://ghproxy.com/https://github.com/cxfksword/jellyfin-plugin-metashark/releases/download/manifest/manifest_cn.json\n```\n\n3. 在插件目录找到 `MetaShark` 并安装\n4. **重启 Jellyfin 容器**（这步别忘了！）\n5. 在媒体库设置中将 MetaShark 设为首选元数据提供商\n\n安装完刷新媒体库，看着海报墙一张张被填满，那种满足感不亚于吃火锅时肉刚好熟了。\n\n---\n\n### 坑4：外网无法访问\n\n**症状**：家里内网正常播放，出门后打不开\n\n**解决方案对比**：\n\n| 方案            | 难度 | 成本       | 推荐场景          |\n| --------------- | ---- | ---------- | ----------------- |\n| **Tailscale**   | ⭐    | 免费       | 个人/家庭使用首选 |\n| frp 内网穿透    | ⭐⭐⭐  | 需云服务器 | 有服务器资源      |\n| DDNS + 端口转发 | ⭐⭐   | 免费       | 有公网IP          |\n\n**Tailscale 极简配置（5分钟搞定）：**\n\n1. 注册 [Tailscale](https://tailscale.com) 账号\n2. NAS 上安装 Tailscale 客户端\n3. 手机/电脑安装 Tailscale 客户端\n4. 全部登录同一账号\n5. 使用 Tailscale 分配的内网IP访问 Jellyfin\n\n\u003e 💡 Tailscale 的原理是建立设备间的点对点 VPN 隧道，不经过公网，速度快且安全。简单来说，就像给你的所有设备拉了一条专线，走到哪都像在家里。\n\n---\n\n## 客户端推荐\n\n| 平台         | 推荐客户端              | 说明                |\n| ------------ | ----------------------- | ------------------- |\n| 🌐 Web        | 直接浏览器访问          | `http://IP:8096`    |\n| 📱 iOS        | **Swiftfin**            | App Store 免费下载  |\n| 🤖 Android    | **Findroid**            | Play Store / GitHub |\n| 📺 Android TV | Jellyfin for Android TV | 官方客户端          |\n| 🍎 Apple TV   | Swiftfin                | tvOS 版本           |\n| 💻 Windows    | Jellyfin Media Player   | 官方桌面客户端      |\n\n\u003e 💡 **小建议**：iOS 用户首选 Swiftfin，界面比官方客户端好看太多；Android 用户试试 Findroid，流畅度更佳。\n\n---\n\n## 效果展示\n\n完成以上配置后，你将获得：\n\n- 🎬 **精美的海报墙**：自动刮削电影/电视剧封面、简介、评分\n- 📱 **多端同步**：手机、平板、电视、电脑随时续播\n- ⚡ **流畅硬解**：4K HDR 也能流畅转码播放\n- 🌍 **随时随地**：通过 Tailscale 外网也能秒开\n\n愉快的追剧吧！🍿\n\n![](https://img.neotalks.org/2026/01/6defcce254e5c605ee10d5a682cb4771.png)\n\n![](https://img.neotalks.org/2026/01/14ffa0d48ce1519d7a9d4f306f4b6db8.png)\n\n---\n\n## 写在最后\n\nJellyfin 是目前最值得推荐的开源家庭影院方案。虽然配置比 Plex 稍复杂，但一次配好，终身免费——这笔账怎么算都划算。\n\n折腾的过程本身也很有趣。从一开始对着一堆报错抓耳挠腮，到最后看着精美的海报墙怦然心动，这种**从无序到有序**的掌控感，大概就是我们这些\"折腾党\"乐此不疲的原因吧。\n\n如果你在配置过程中遇到问题，欢迎评论区留言，我会尽量解答~\n\n"])</script><script>self.__next_f.push([1,"1c:T43bd,"])</script><script>self.__next_f.push([1,"\n## 导语\n\nAI 辅助编程工具遍地开花 🌸，但说实话，能真正**完美融入** Neovim 工作流的，屈指可数。\n\n这就好比给一辆手动挡的 911 装自动驾驶，装不好就是“车毁人亡” 💥。\n\n很多兄弟可能首选 `avante.nvim`，它确实是当下的“网红”插件，功能极其强大。但如果你是多环境切换的重度用户，它可能会成为你的噩梦 👻：\n\n![avante](https://img.neotalks.org/2026/01/b7be49b88ef6994bc0daf22e40374f4c.png)\n\n还得自己去插件目录手动 `build`？对于崇尚“开箱即用”或者不爱啃生肉文档的新手来说，这简直是**劝退劝退劝退** 🛑。\n\n更要命的是，Avante 是个“急性子”。它的机制非常勤劳，会在后台疯狂消耗你的 Token。假如你是 **Windows 用户 + 不稳定第三方 API 中转** 这种“炼狱级”配置的选手，等着你的就是满屏的 `400` 错误，和一堆乱码。\n\n![](https://img.neotalks.org/2026/01/a17a0e6ed14b427d8376536b29902055.png)\n\n这还不是最惨的。一旦触发 `Rate limit reached`，它还会像个不知疲倦的复读机一样在后台无限重试。如果不手动 Kill 进程，你的余额就会像流水一样逝去——简直是**给本不富裕的生活雪上加霜** 💸。\n\n当然，如果你是此时此刻手里握着官方 API 的“富哥们” 💎，Avante 的省瓦力的确无可挑剔。但如果你想要**更高的可控性、更丝滑的自定义体验**，以及更符合 Vimer 直觉的操作逻辑，**CodeCompanion 才是你的终极归宿** 🏠。\n\n具体怎么选？\n\n* 🥊 **Avante**：侵略性强，不管你愿不愿意，它都给你安排得明明白白。\n* 🤝 **CodeCompanion**：听话、懂事，高度配合你的 LSP 和工作流，打造真正的**私人定制**。\n\n## 基础配置：从 0 到 1 的优雅集成 🛠️\n\n### 1. 安装插件：起步 🏁\n\n首先，把这位“伴侣”请进门。这里以 `lazy.nvim` 为例，配置极其清爽：\n\n```lua\nreturn {\n  \"olimorris/codecompanion.nvim\",\n  opts = {}\n}\n```\n\n**💡 注意：** 接下来的所有配置项，我们都会写在 `opts` 这个表里。为了版面整洁，后面我就不重复写外层的 `return` 结构了。\n\n### 2. 快捷键映射 (Keymaps)：人剑合一 ⚔️\n\n为了让 AI 像你的手指延伸一样自然，我们需要配置几组符合直觉的快捷键。**这一步决定了你后续的使用爽感。**\n\n```lua\n--- lua/config/keymaps.lua\n--- CodeCompanion\n-- 切换 AI 对话窗口 (类似于打开侧边栏)\nkeymap(\"n\", \"\u003cleader\u003eaa\", \"\u003ccmd\u003eCodeCompanionChat Toggle\u003ccr\u003e\", opts)\n-- 针对选中文本输入 AI 指令 (Visual 模式下的核心键)\nkeymap(\"v\", \"\u003cleader\u003eaa\", \":CodeCompanion \", { noremap = true, silent = false })\n-- 打开 AI 操作面板 (选择预设好的各种 Action)\nkeymap(\"n\", \"\u003cleader\u003eac\", \"\u003ccmd\u003eCodeCompanionActions\u003ccr\u003e\", opts)\n```\n\n### 3. 配置模型 API (Adapters)：注入灵魂 👻\n\n**这是全篇最关键的一步，请集中注意力。**\n\nCodeCompanion 之所以强大，是因为它是一个**“模型混元体”** 🧛。它允许你在这个环节用 DeepSeek 进行深度推理，在那个环节用 GPT-4o 进行精准补全。\n\n建议把你所有的 Adapter 配置都集中管理，打造一个强大的军火库：\n\n```lua\n--- 所有模型配置都写在 adapters 中\nadapters = {\n  http = {\n    --- DeepSeek 配置\n    deepseek = function()\n      return require(\"codecompanion.adapters\").extend(\"deepseek\", {\n        env = {\n          -- 推荐使用 cmd 命令读取环境变量，避免 API Key 硬编码在代码里\n          api_key = \"cmd:echo $DEEPSEEK_KEY\",\n        },\n        schema = {\n          model = {\n            -- 🔴 关键点：Inline 模式下绝对不要用 deepseek-reasoner (R1)\n            -- 因为 Reasoner 模型的输出格式会导致 Inline 替换失败\n            default = \"deepseek-chat\",\n          },\n          temperature = {\n            default = 0.0,\n          },\n        },\n      })\n    end,\n\n    --- 第三方 API 配置 (比如我自己在用的云雾)\n    --- 注册地址：https://yunwu.zeabur.app/register?aff=EQXn\n    yunwu = function()\n      return require(\"codecompanion.adapters\").extend(\"openai_compatible\", {\n        env = {\n          -- 1. Base URL (通常是域名，注意不带 /v1/chat/completions)\n          url = \"https://yunwu.ai\",\n\n          -- 2. API Key\n          api_key = \"cmd:echo $YUNWU_KEY\",\n\n          -- 3. Chat Endpoint (官方文档强调这种分离写法)\n          chat_url = \"/v1/chat/completions\",\n        },\n        schema = {\n          model = {\n            default = \"gemini-3-pro-preview-thinking\", -- 填入你实际使用的模型名称\n          },\n          -- 可选：针对某些第三方模型可能需要调整参数\n          temperature = {\n            default = 0.0,\n          },\n        },\n      })\n    end,\n  },\n},\n```\n\n**🚩 高能避坑指南**：虽然 DeepSeek 的 `deepseek-reasoner` (R1) 模型强得离谱，但在 **Inline 模式（行内修改）** 下，请务必将其锁死在 `deepseek-chat`。\n\n* 🚫 **为什么？** 因为 R1 输出的思维链（Chain of Thought）会干扰插件的代码替换逻辑，导致你的代码里出现一堆 AI 的碎碎念。别问我是怎么知道的，全是血泪教训。\n\n接下来，我们要给这位“伴侣”立规矩。告诉它：**什么时候该干什么事**。\n\nCodeCompanion 贴心地把场景分为了三大战区 🛡️：\n\n* **`chat` (对话)**：日常闲聊、问答。\n* **`inline` (行内)**：外科手术级的代码修改。\n* **`agent` (特工)**：拥有自主行动力的智能体。\n\n```lua\n-- 写到 opts={} 中\nstrategies = {\n  -- 将所有策略指向你自定义的适配器\n  chat = {\n    adapter = \"yunwu\",\n  },\n  inline = {\n    adapter = \"yunwu\",\n    -- 如果你想用 DeepSeek 做行内修改，可以解开下面这行：\n    -- adapter = \"deepseek\"\n  },\n  agent = {\n    adapter = \"yunwu\",\n  },\n},\n```\n\n同样你也可以自定义配置 **MCP (Model Context Protocol)**。这个协议能让 AI 读取本地文件系统，非常强。\n\n```lua\n-- 写到 opts={} 中\nstrategies = {\n  agent = {\n    tools = {\n      [\"mcp\"] = {\n        opts = {\n          servers = {\n            -- 配置文件系统服务，让 AI 可以“看到”你的项目文件\n            [\"filesystem\"] = {\n              cmd = \"npx\",\n              args = { \"-y\", \"@modelcontextprotocol/server-filesystem\", vim.fn.getcwd() },\n            },\n          },\n        },\n      },\n    },\n  },\n},\n```\n\n重启 Neovim。如果一切顺利，恭喜你，你的编辑器已经觉醒了。虽然它还不会说话，但它已经准备好为你效劳。\n\n如果出现报错“令牌无效”，大概率是环境变量没配好，回去检查一下 `echo $DEEPSEEK_KEY` 是否有输出。\n\n---\n\n## 使用教程：掌握核心心法 🧘\n\n刚上手时，你可能会觉得它的逻辑和 Cursor 或者 Avante 不太一样，甚至有点“怪”。\n\n别急，一旦你理解它设计的**“三种模式”**，你会发现：**这才是 Vimer 真正想要的高效逻辑！它不抢夺控制权，而是作为你意志的延伸。**\n\n### 1. Chat 模式：第二大脑 🧠\n\n这是最基础的模式。按下 `\u003cleader\u003eaa`，右侧会弹出一个熟悉的对话窗口。你可以把它当成内置在 Neovim 里的 ChatGPT。\n\n逻辑和 Avante 一样：输入问题，`Ctrl+s` 提交。\n\n![cc](https://img.neotalks.org/2026/01/307abb5b791d1b1bed41ad194982c88e.png)\n\n这时候它就是一个标准的聊天机器人。如果你发现回复里的 Markdown 格式只是原始字符（比如粗体显示为 `**bold**`），你需要安装 `render-markdown.nvim` 来渲染它。配置如下：\n\n```lua\nreturn {\n  \"MeanderingProgrammer/render-markdown.nvim\",\n}\n```\n\n**但是！** 这里有个大坑。装了这个插件后，它可能会过于热情地渲染你正在写的普通 Markdown 文件，连图片链接都给你折叠起来了，像这样：\n\n![](https://img.neotalks.org/2026/01/0a3970b8ad6fe165c3ac2cd4123fa344.png)\n\n如果你也喜欢用 Nvim 写 Markdown，可以设置只针对 CodeCompanion 的 Markdown 文件开启 `render-markdown.nvim`，配置如下：\n\n```lua\nreturn {\n  \"MeanderingProgrammer/render-markdown.nvim\",\n  opts = {\n    filetypes = { \"codecompanion\" },\n  },\n  ft = { \"codecompanion\" },\n}\n```\n\n但这样设置后，图片链接会直接消失：\n\n![](https://img.neotalks.org/2026/01/5923d5856ec2cc4bbbbad7f3f07450af.gif)\n\n**解决方法**：在 `/lua/config/option.lua` 中设置 `vim.opt.conceallevel = 0`，这样你的原始 Markdown 文本就能正常显示了。\n\n### 2. Inline 模式：代码行内大修（爽点所在） ⚡️\n\n**这是我最喜欢的功能，没有之一。** 如果说 Chat 模式是咨询师，那 Inline 模式就是**更衣室里的裁缝**。\n\n它允许 AI 直接在你的代码里进行修改，**完全不需要打开侧边栏，也不需要复制粘贴。**\n\n逻辑非常 Vimer，讲究一个**“指哪打哪”**：选中文本 -\u003e 告诉 AI 怎么改 -\u003e AI 改给你看 -\u003e 你决定要不要。\n\n操作流程：\n\n1. 进入 Visual 模式选中一段代码。\n2. 按下 `\u003cleader\u003eaa`（注意这是我们之前配置的 `v` 模式映射）。\n3. 底部会出现命令行 `:'\u003c,'\u003eCodeCompanion`。\n\n![](https://img.neotalks.org/2026/01/fd4854d3736366dd78474d6f37b79ce8.png)\n\n4. 输入指令，比如 `fix`，回车。\n\n![](https://img.neotalks.org/2026/01/e566d9c195b198cfd93a761d200b7b70.png)\n\nAI 会直接生成 diff，当你确认无误后，使用快捷键 `gda` 应用更改。\n\n**即时演示：**\n\n![](https://img.neotalks.org/2026/01/d0f906d3dcac1537c79b001b9418e617.gif)\n\n此外，你还可以在输入框里使用内置的 Slash Command（斜杠命令）：\n\n![](https://img.neotalks.org/2026/01/ce1127b447d11cf766ea8ea4de2b1ec6.png)\n\n- `/commit`: 生成git提交信息(后面介绍)\n- `/explain`: 解释代码\n- `/fix`: 修复 bug报错\n- `/lsp`: 基于 LSP 报错修复\n- `/test`: 生成测试用例\n\n不过要注意，这些斜杠命令大部分会打开 Chat 窗口，而不会直接在行内修改，只有直接输入 Prompt 才会触发 Diff 修改。\n\n### 3. Agent 模式：赋予 AI 真正的“手”和“眼” 👁️✋\n\n如果只是聊天和改代码，那还不够“智能”。充其量只是个高级补全工具。\n\n**Agent 模式，才是 CodeCompanion 真正封神的杀手锏。**\n\n在 CodeCompanion 里，激活 Agent 不需要像 Cursor 那样点什么特殊的“Agent 模式”开关，你只需要在对话框里使用两个特殊符号，就能解锁无限可能：\n\n![](https://img.neotalks.org/2026/01/d672880fbfad1912cf2225b5153c7d4d.png)\n\n* **`#` (Context) —— 它的“眼睛”**：手动指定 AI 应该读取哪些信息。\n  * `#buffer`: 读取当前文件（最常用，哪怕文件有几千行）。\n  * `#files`: **跨文件感知**。模糊搜索并引用项目中的其他文件，Context 瞬间拉满。\n  * `#lsp`: **精准医疗**。读取当前光标附近的 LSP 报错与诊断信息，修复 Bug 一针见血。\n* **`@` (Tools) —— 它的“双手”**：允许 AI 调用工具执行具体操作。\n  * `@insert_edit_into_file`: **核心能力**。允许 AI 直接“拿笔”改你的代码，而不是在聊天框里废话。\n  * `@cmd_runner`: 比如让它运行 `npm run test`，然后根据报错自己修复代码。\n  * `@files`: 读取或操作项目中的物理文件。\n  * `@web_search`: 遇到不懂的库？让它自己联网去查文档！\n\n举个例子：如果你想让AI帮你把注释改成中文，就需要@insert_edit_into_file 工具的支持。\n\n![](https://img.neotalks.org/2026/01/8e212a134690c1f07153518227ac81e5.png)\n\n然后也是 gda 应用更改。\n\n这才是真正的 AI Coding —— 直接修改文件系统，而不仅仅是给你吐一堆 Markdown 让你自己复制。\n\n---\n\n## 进阶玩法 🚀\n\n### 1. 战术性切换模型：拒绝“一根筋” 🔀\n\n虽然我们在 Config 里设置了默认策略，但战场形势瞬息万变。有时候你需要 **DeepSeek R1** 的深度思考，有时候你只需要普通模型的极速秒回。\n\n不需要反复改配置文件，直接在命令行指定你想要的那个“打手”：\n\n```vim\n:CodeCompanionChat adapter=deepseek  \" 呼叫 DeepSeek 🧠\n:CodeCompanionChat adapter=yunwu     \" 呼叫云雾 ☁️\n```\n\n![](https://img.neotalks.org/2026/01/68339260d42093ac15dc58136df7630b.png)\n\n💡 **小贴士**：命令后面也可以直接加上 Slash Command (如 `/fix`, `/explain`)，这样就会直接用指定的适配器开始工作了。\n\n**⚡️ 高阶操作**：建议给这两个命令单独绑定快捷键，比如 `\u003cleader\u003ead` (DeepSeek) 和 `\u003cleader\u003eay` (Yunwu)。这样遇到难题时，一键召唤最强大脑，实现指尖上的战术切换。\n\n### 2. 自动生成 Git Commit 信息 📝\n\n直接使用斜杠命令 `/commit` 就会自动打开 `chat` 窗口，根据你当前已经 `git add` 的内容自动生成 Commit Message。\n\n![commit diff](https://img.neotalks.org/2026/01/f5605593d9f6d9051b1a28052475e3bc.png)\n\n### 3. 独家秘籍：自定义 Prompt 生成中文 Commit 🇨🇳\n\n很多时候，AI 生成的英文 Commit 虽然规范，但看着就是不亲切。\n\n我们可以自定义一个 `prompt_library` 动作，让 AI 严格按照 **Conventional Commits** 规范，帮我们写出漂亮的**中文**提交信息。\n\n在 `opts` 中添加 `prompt_library`：\n\n```lua\n-- 写到 opts={} 中\nprompt_library = {\n  [\"Git Commit (CN)\"] = {\n    strategy = \"chat\",\n    description = \"生成中文 Git 提交信息\",\n    opts = {\n      index = 5,\n      is_slash_cmd = true, -- 这样你就可以在输入框里用 /commit_cn 调用了\n      short_name = \"commit_cn\",\n      auto_submit = true,\n    },\n    prompts = {\n      {\n        role = \"user\",\n        content = function()\n          return \"请根据以下暂存代码的变动（git diff --staged），生成一个 Git 提交信息。\\n\\n\"\n            .. \"要求：\\n\"\n            .. \"1. 使用中文。\\n\"\n            .. \"2. 遵循 Conventional Commits 规范 (feat, fix, docs, style, refactor, perf, test, chore)。\\n\"\n            .. \"3. 格式为：`\u003ctype\u003e(\u003cscope\u003e): \u003csubject\u003e`。\\n\"\n            .. \"4. 只要信息本身，不要废话。\\n\\n\"\n            .. \"Diff 内容:\\n\"\n            .. vim.fn.system(\"git diff --staged\")\n        end,\n      },\n    },\n  },\n}\n```\n\n配置好后，按 `\u003cleader\u003eac` 呼出面板，或者直接在 Chat 里输入 `/commit_cn` 即可。\n\n![](https://img.neotalks.org/2026/01/e0d1ca562412936e83f82f00039265f6.png)\n![](https://img.neotalks.org/2026/01/593d4b1ba7d815a410bdc23a5090d5d1.png)\n\n假如你想添加其他的action，你也可以安装上面的配置自定义。\n\n### 4. 重要集成：BlinkCMP 🔌\n\n为了让你在 Chat 输入框里输入 `#` 和 `@` 时能丝滑地弹出自动补全，一定要集成 `blink.cmp`。\n\n```lua\n-- blinkcmp.lua 配置\n-- 写在 sources.per_filetype 中\nsources = {\n  per_filetype = {\n    codecompanion = { \"codecompanion\" }, -- 这一点非常重要！\n  },\n},\n```\n\n效果如下，没有这个补全，Agent 的体验会大打折扣：\n\n![](https://img.neotalks.org/2026/01/fd1437faef1c620a03b25f39ad972994.png)\n![](https://img.neotalks.org/2026/01/ce1127b447d11cf766ea8ea4de2b1ec6.png)\n\n### 5. 界面美化：Loading 动画 🎨\n\n假如你动手跟着我做了上面的步骤，你会发现哪哪不得劲，需要长时间才回复的答案感觉没反应。那你对了，因为默认没有加载动画！\n\n好在大佬比较多，已经有现成插件了。\n\n直接在 `codecompanion.lua` 中配置：\n\n```lua\ndependencies = {\n  \"lalitmee/codecompanion-spinners.nvim\",\n},\n\n-- 写到 opts={} 中\nextensions = {\n  spinner = {\n    -- style = \"cursor-relative\", -- 这种是跟随光标的\n    style = \"lualine\",            -- 我个人更喜欢集成在状态栏里\n    [\"cursor-relative\"] = {\n      text = \"\",\n      hl_positions = { { 0, 3 }, { 3, 6 }, { 6, 9 } },\n      interval = 100,\n      hl_group = \"Title\",\n      hl_dim_group = \"NonText\",\n    },\n  },\n},\n```\n\n然后配置你的 lualine 组件：\n\n```lua\n-- lualine.lua\nrequire(\"codecompanion._extensions.spinner.styles.lualine\").get_lualine_component(),\n```\n\n这样当你等待 AI 回复时，状态栏就会有悦动的加载提示，看着都心情好：\n\n![](https://img.neotalks.org/2026/01/2c65a6eadb30fca2ed1b59c4fd4ec0ef.png)\n\n插件提供了多种加载样式，默认的 `cursor-relative` 其实也不错，但我个人觉得集成在 Statusline 里更优雅，不遮挡视线。\n\n---\n\n## 结语：不仅是工具，更是思维的延伸 🌠\n\n写到这里，相信你已经打造出了一套**完全属于你**的 AI 编程环境。\n\n与那些“一价全包”的商业 AI 编辑器不同，CodeCompanion 秉承了 Neovim 的核心哲学：**极度自由，极度可控 🎮。** 你知道每一个请求发向了哪里，你知道每一行代码是如何被改变的。\n\n在这套配置下，AI 不再是一个强势的驾驶员，而是一个坐在副驾、随时待命、懂你心思的顶级领航员。\n\n**这，或许才是人机协作编程该有的样子。**\n\n\u003e 如果这篇配置指南帮你也打造了心仪的 AI 助手，不妨点个赞和在看 👍，让更多 Vimer 看到代码世界的另一种可能。\n\n---\n\n![](https://img.neotalks.org/640.jpg)\n\n"])</script><script>self.__next_f.push([1,"1d:T2279,"])</script><script>self.__next_f.push([1,"\n**你有没有过这种体验？**\n\n找了2小时的资源，点下载，进度条纹丝不动。\n挂了一整夜，早上起来一看——3%。\n\n我曾经用Aria2下一部4K《奥本海默》，整整3天，愣是没下完。\n\n直到我把家里那台吃灰10年的旧笔记本翻出来，装上一个东西——\n\n**10分钟，跑满带宽，下完。**\n\n![xunlei](https://img.neotalks.org/2026/01/a5f04d10688a33bc116ad9df67f7e0cf.png)\n\n从此，我实现了打工人的终极梦想：\n\n**上班摸鱼找资源 → 远程丢链接 → 回家躺床上直接看。**\n\n群晖NAS要7000块，极空间4000起步，华硕套机动辄上万。~~你要是开得起御三家年费SVIP还愿看广告，那当我没说。~~\n\n而我的成本？**一台能开机的旧电脑 + 150块迅雷会员。**\n\n今天，我把这套方案完整拆解给你。\n\n\u003e 💡 这是「旧电脑复活计划」系列第3篇。没看过前两篇也能跟着做，放心往下看。\n\n---\n\n## 先看效果：到底有多快？\n\n废话少说，直接上图：\n\n![迅雷下载](https://img.neotalks.org/2026/01/551241a13b7ffbae5976ad53bc942fab.png)\n\n**63 MB/s** 🚀\n\n千兆宽带+千兆网口，虽然没完全跑满，但稳定在这个速度已经很香了。\n\n3年前我测试的时候是真能跑满的，可能路由器该换了。\n\n**重点是：这速度，来自一台10年前的\"报废\"笔记本。**\n\n---\n\n## 这篇文章适合谁？\n\n对号入座，中一条就值得往下看：\n\n- ✅ 家里有台旧电脑/Linux设备，想让它发挥余热\n- ✅ 受够了BT/磁力龟速，想要**真正跑满带宽**的方案\n- ✅ 不想花几千上万买NAS，但想用上迅雷高速通道\n- ✅ 想实现\"上班找资源→挂家里下→回家直接看\"的workflow\n\n全中？恭喜，你和一个月前的我一样惨。\n\n但现在不一样了。\n\n---\n\n## 原理：我们到底在干什么？\n\n群晖NAS上有个迅雷套件，要配合万元设备才能用。\n\n但总有大佬不信邪——他们把套件拆开，取出核心，让它能跑在**任何Linux机器**上。\n\n这就像**把法拉利的发动机塞进五菱宏光**。外表朴素，但踩下油门那一刻，你知道这不是普通货色。\n\n它支持：\n\n- 📱 **远程下载**：有浏览器就能访问，躺床上就能下片\n- 🔗 **多协议通吃**：磁力/BT/HTTP，不挑食\n- 🚀 **迅雷高速通道**：这才是我们折腾的唯一理由\n\n![迅雷webUI](https://img.neotalks.org/2026/01/61fbd943acf7de36e3f184e826d572ad.png)\n\n\u003e 💡 **关于费用：** 迅雷SVIP搞活动一年150块左右。和动辄几千的NAS比，这点钱真不算什么。注意：SVIP和VIP是两码事，VIP≈普通用户，别被坑了。\n\n---\n\n## 两个开源方案，怎么选？\n\nGitHub上有两个项目在做这件事，性格完全不同：\n\n### 🏆 cnk3x/xunlei（稳定派）\n\n![cnk3x](https://img.neotalks.org/2026/01/c73ff4f6ef6b6ba450254fb030551697.png)\n\n1.9k Star，Go语言，**持续更新中**。\n\n从群晖官方套件提取，社区成熟，文档完善。就像丰田——不够酷，但省心。\n\n### ⚡ 0x676e67/thunder（极客派）\n\n![0x676e67](https://img.neotalks.org/2026/01/5fe965b9f716b6a01b040ee81736c4ec.png)\n\nRust写的，镜像只有40MB，内置账号密码保护。\n\n但问题是：**作者2年没更新了。**\n\n\u003e 🎯 **我的建议：** 第一次折腾选cnk3x，省心。追求极致轻量可以试试thunder。下面两种我都会演示。\n\n---\n\n## 方案一：cnk3x/xunlei 部署\n\n### 方式A：命令行安装\n\n\u003e 图方便可以直接跳到方式B用Docker。但如果你和我一样觉得Docker对网络有影响，就跟我继续折腾。\n\n#### 第一步：下载安装包\n\n先确认你的系统架构：\n\n```bash\nuname -m\n```\n\n- 输出 `x86_64` → 下载 `amd64` 版本\n- 输出 `aarch64` → 下载 `arm64` 版本\n\n![wget](https://img.neotalks.org/2026/01/af7fba9f867d56d4d741269e7830e62b.png)\n\n```bash\n# 下载\nwget https://github.com/cnk3x/xunlei/releases/download/v3.20.2/xlp-amd64.tar.gz\n\n# 解压\ntar -zxvf xlp-amd64.tar.gz\n```\n\n\u003e 💡 没有wget？先装一下：`sudo pacman -S wget`\n\n解压后得到 `xlp` 文件，看看它能干什么：\n\n```bash\nchmod +x xlp\n./xlp -h\n```\n\n![xlp help](https://img.neotalks.org/2026/01/eeb099601e1da745c7a1aa1567e2f0de.png)\n\n贴心的中文注释，谁看不明白！\n\n#### 第二步：启动服务\n\n```bash\nsudo ./xlp --dir_download /home/xinghe/xh_share\n```\n\n把路径改成你的SMB共享文件夹。\n\n![启动成功](https://img.neotalks.org/2026/01/9f02ee511b94bbed7e2d6d1687181da1.png)\n\n**启动成功！** 浏览器访问 `http://你的IP:2345`，测试下载：\n\n![测试下载](https://img.neotalks.org/2026/01/4d9b499a16d35c79c3102de24da9cedb.png)\n\n看到这速度，我内心OS：**这才对嘛！**\n\n#### 第三步：设置开机自启\n\n每次手动启动太蠢了，让它开机就跑。\n\n\u003e ⚠️ **重要：** 下面的路径必须改成你自己的，抄错一个字符会很难受。\n\n##### 确认绝对路径\n\n进入xlp所在目录，运行 `pwd` 获取完整路径。\n\n##### 创建服务文件\n\n```bash\nsudo nano /etc/systemd/system/xlp.service\n```\n\n##### 写入配置\n\n```ini\n[Unit]\nDescription=XLP Download Service\nAfter=network.target network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\n# 【改这里】xlp 文件所在目录\nWorkingDirectory=/home/xinghe\n# 【改这里】xlp 完整路径 + 下载目录\nExecStart=/home/xinghe/xlp --dir_download /home/xinghe/xh_share\nRestart=on-failure\nRestartSec=5s\n\n[Install]\nWantedBy=multi-user.target\n```\n\n##### 启用服务\n\n```bash\nsudo systemctl daemon-reload\nsudo systemctl enable xlp.service\nsudo systemctl start xlp.service\n```\n\n##### 验证状态\n\n```bash\nsudo systemctl status xlp.service\n```\n\n看到绿色 `Active: active (running)`？成功了！\n\n![success](https://img.neotalks.org/2026/01/72e13b7fe68da38bd55d3e4a88fc190f.png)\n\n看到红色 `failed`？查日志：\n\n```bash\njournalctl -u xlp.service -n 20 --no-pager\n```\n\n---\n\n### 方式B：Docker安装（懒人首选）\n\nDocker就像万能盒子——不用管里面装了什么，能跑就行。\n\n#### 先装Docker（已有跳过）\n\n```bash\nsudo pacman -S docker\nsudo systemctl start docker\nsudo systemctl enable docker\nsudo usermod -aG docker $USER\n```\n\n#### 一行命令启动\n\n```bash\ndocker run -d \\\n  --name=xunlei \\\n  -v /home/xinghe/xunlei_data:/xunlei/data \\\n  -v /home/xinghe/xh_share:/xunlei/downloads \\\n  -p 2345:2345 \\\n  --privileged \\\n  ghcr.io/cnk3x/xunlei:latest\n```\n\n**参数说明：**\n\n| 参数 | 作用 |\n|------|------|\n| `--name` | 容器名字 |\n| `-v xxx:xxx` | 目录映射，左边是真实路径，右边是容器内路径 |\n| `-p 2345:2345` | 端口映射 |\n| `--privileged` | 特权模式，迅雷需要 |\n\n![docker运行成功](https://img.neotalks.org/2026/01/15a9548c1ed93b9b484d6640c2b10f92.png)\n\n测试下载和播放：\n\n![完美运行](https://img.neotalks.org/2026/01/5ac911a125d023f27057471dca459500.png)\n\n**完美。**\n\n---\n\n## 方案二：0x676e67/thunder（极客备选）\n\n\u003e ⚠️ 这个项目**2年没更新**了。除非追求极致轻量（镜像40MB），否则**直接用方案一**。\n\nArch用户：`yay -Syu thunder-nas`，访问 `http://你的IP:5055`\n\n详细命令参考：[0x676e67/thunder](https://github.com/0x676e67/thunder)\n\n---\n\n## 两方案对比\n\n| 对比项 | cnk3x/xunlei | 0x676e67/thunder |\n|--------|--------------|------------------|\n| 安装包大小 | ~180MB | ~40MB |\n| 启动时间 | 3-5秒 | 1-2秒 |\n| 内存占用 | ~150MB | ~80MB |\n| 社区维护 | ✅ 活跃更新 | ⚠️ 2年未更新 |\n| 默认端口 | 2345 | 5055 |\n\n**下载速度呢？** 两个方案核心都是迅雷引擎，没区别。\n\n**快不快，取决于你的钱包，不取决于你选的方案。**\n\n---\n\n## 避坑指南\n\n| 问题 | 症状 | 解决方案 |\n|------|------|----------|\n| **下载失败** | GitHub拉取超时 | 挂代理或换镜像源 |\n| **目录无权限** | 容器跑着但写不了文件 | `chmod 777 /your/path` |\n| **端口打不开** | 服务正常但浏览器访问不了 | `ufw allow 2345` |\n| **扫码后设备不显示** | 登录成功但列表空 | 检查是否用了 `--net=host` |\n| **依赖缺失** | 各种报错 | 别折腾了，直接用Docker |\n\n---\n\n## 最后，我想看看你们的网速\n\n我跑到63MB/s，没跑满，怀疑是路由器太老了。\n\n**你呢？**\n\n评论区晒出你的下载速度截图，我想看看：\n\n- 谁家宽带最豪横？\n- 谁的旧电脑最争气？\n- 谁能突破100MB/s？\n\n**点赞过500，下期教你怎么让迅雷直接下到远程smb共享文件夹里。**\n\n---\n\n**觉得有用？**\n\n- 👍 点赞 → 让更多被龟速折磨的人看到\n- ⭐ 收藏 → 周末照着搞的时候找得到\n- 🔄 转发 → 你那个天天抱怨下载慢的朋友需要这个\n\n![公众号二维码](https://img.neotalks.org/640.jpg)\n\n"])</script><script>self.__next_f.push([1,"1e:T3481,"])</script><script>self.__next_f.push([1,"![nvim](https://img.neotalks.org/2026/01/937e8d0149eab51386b51e2e8d34387b.png)\n\n|                                                                                      |                                                                                   |\n| ------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------- |\n| ![codeaction](https://img.neotalks.org/2026/01/49f4686dea494928aaaafd825ed8172b.png) | ![blincmp](https://img.neotalks.org/2026/01/629e4bc16a7311266a3dadbe033c11bc.png) |\n\n\u003e \"Vim 似乎是令许多人望而生畏的编辑器——一方面你听说它能带来'生产力飞跃'，另一方面又被铺天盖地的配置教程淹没……\"\n\n## 导读\n\n在 IDE 、AI-Native IDE横行的时代，为什么还有一群人执着于那个“黑框框”？\n是为了炫技？\n或许有一点。但更深层的原因是：**掌控感**。\n\n当你手指不离键盘，行云流水地完成代码跳转、重构、复制、替换，那种“人剑合一”的快感，是鼠标点点点永远无法体会的。\n\n今天，没有枯燥的原理，直接给方案。本文不是又一篇“从入门到放弃”的劝退文，而是一份**经过 4 年实战验证**的现代化 Neovim（请别再用vim了）配置指南。\n\n跟着做，**30 分钟**，你将获得一个启动速度秒杀 VS Code、功能不输 IDE、还集成了 AI 的开发神器。\n\n你准备好“真香”了吗？\n\n---\n\n## 为什么要换 Neovim？\n\n|                                                                                      |                                                                                  |\n| ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------- |\n| ![codeaction](https://img.neotalks.org/2026/01/ba913ba2e2d8c657ae103b3c74cb0bb9.gif) | ![motion](https://img.neotalks.org/2026/01/7d8e171d32005d644e9788c80bf20d9b.gif) |\n\n不仅仅是好看。\n在此之前，让我们先打破一个误区：**Neovim ≠ 那个难用的 Vim**。\n它是 Vim 的现代化重构版本，拥有：\n\n1. **内置 LSP（语言服务器）**：代码补全和跳转跟 VS Code 一样智能。\n2. **Lua 配置**：不用学古老的 VimScript，用程序员都懂的 Lua 就能配。\n3. **极速启动**：几百个插件也能在 100ms 内启动，而你的 IDE 可能还在画 Logo。\n\n### VS Code 用户迁移对照表\n\n对于习惯了 VS Code 的朋友，这份对照表能让你秒懂：\n\n| VS Code 功能      | Neovim 等效方案/插件                                   |\n| :---------------- | :----------------------------------------------------- |\n| 多光标编辑        | `vim-visual-multi`                                     |\n| 文件搜索 (Ctrl+P) | `Telescope` 或 `snacks` (必须吹爆的神器，后文详细介绍) |\n| Git 侧边栏        | `lazygit` / `gitsigns`                                 |\n| 终端 (Ctrl+`)     | `toggleterm.nvim`                                      |\n| 智能补全          | `blink.cmp` + `Mason`                                  |\n\n---\n\n## 核心教程：30 分钟打造神器\n\n### 00 先说一个\"偷懒\"的选项\n\n如果你是那种\"我就想用，别跟我讲原理\"的实用主义者，这里有一条捷径：**LazyVim**。\n\n它是 Neovim 社区里最火的开箱即用配置框架，由 Lazy.nvim 的作者亲自打造。LSP、补全、文件树、状态栏……所有你需要的东西，人家都帮你配好了，而且审美在线。\n\n一行命令搞定：\n\n```bash\ngit clone https://github.com/LazyVim/starter ~/.config/nvim\nnvim\n```\n\n首次启动会自动拉取所有插件，泡杯咖啡的功夫，一个功能完备的现代化编辑器就到手了。\n\n**但我为什么还要往下写？**\n\n因为 LazyVim 虽好，但它是别人的\"最佳实践\"。用久了你会发现：这个快捷键不顺手、那个插件我用不上、想加个功能不知道往哪塞……\n\n所以我的建议是：\n\n- **新手**：先用 LazyVim 跑起来，感受一下\"原来 Neovim 可以这么爽\"。其官方文档把快捷键已经写得非常详细，配合 which-key 的提示，基本可以无痛开始。\n- **进阶**：在 LazyVim 基础上魔改（我就是这么干的），它的模块化设计非常友好，改起来不费劲。\n- **折腾党**：从零搭建，每一行配置都是你自己写的，出了问题也知道去哪找。\n\n不管你选哪条路，下面的内容都值得看——就算用 LazyVim，下面这些配置内容你也可以直接复制使用。\n\n---\n\n### 01 环境准备\n\n工欲善其事，必先利其器。\n首先，我们需要安装 Neovim (v0.10.0+)。\n\n**Mac 用户 (Homebrew):**\n\n```bash\nbrew install neovim git node ripgrep\n```\n\n_(注：`ripgrep` 是为了让文件搜索快到飞起)_\n\n**字体推荐：**\n想要界面好看，必须安装 **Nerd Fonts**。推荐 JetBrainsMono Nerd Font，去官网下载安装即可，否则你的图标都会显示成乱码方块。\n\n不过我更爱用consolas或者Monaco。\n\n### 02 目录结构与入口\n\nNeovim 的配置文件位于 `~/.config/nvim/init.lua`。\n为了不让配置变成一坨面条代码，我们采用模块化的结构：\n\n```text\n📂 ~/.config/nvim\n├── 📄 init.lua          \u003c-- 入口文件\n├── 📂 lua\n│   ├── 📂 config        \u003c-- 基础设置\n│   │   ├── lazy.lua     \u003c-- 插件管理器配置\n│   │   ├── options.lua  \u003c-- 也就是 vim.opt 那些设置\n│   │   └── keymaps.lua  \u003c-- 快捷键映射\n│   └── 📂 plugins       \u003c-- 插件列表（每个文件一个插件）\n```\n\n**init.lua 内容极其简单：**\n\n```lua\nrequire(\"config.options\")\nrequire(\"config.keymaps\")\nrequire(\"config.lazy\")\n```\n\n### 03 插件管理：Lazy.nvim\n\n忘掉 vim-plug 吧，**Lazy.nvim** 才是2026年的标准答案。它支持懒加载，能让你的编辑器启动速度提升10倍。\n\n![lazy.nvim](https://img.neotalks.org/2026/01/d91178af80d2a98bb5ac8128b962f303.png)\n\n在 `lua/config/lazy.lua` 中填入官方安装脚本:\n\n```lua\nlocal lazypath = vim.fn.stdpath(\"data\") .. \"/lazy/lazy.nvim\"\nif not (vim.uv or vim.loop).fs_stat(lazypath) then\n  local lazyrepo = \"https://github.com/folke/lazy.nvim.git\"\n  local out = vim.fn.system({ \"git\", \"clone\", \"--filter=blob:none\", \"--branch=stable\", lazyrepo, lazypath })\n  if vim.v.shell_error ~= 0 then\n    vim.api.nvim_echo({\n      { \"Failed to clone lazy.nvim:\\n\", \"ErrorMsg\" },\n      { out, \"WarningMsg\" },\n      { \"\\nPress any key to exit...\" },\n    }, true, {})\n    vim.fn.getchar()\n    os.exit(1)\n  end\nend\nvim.opt.rtp:prepend(lazypath)\n\n-- Make sure to setup `mapleader` and `maplocalleader` before\n-- loading lazy.nvim so that mappings are correct.\n-- This is also a good place to setup other settings (vim.opt)\nvim.g.mapleader = \" \"\n\n-- Setup lazy.nvim\nrequire(\"lazy\").setup({\n  spec = {\n    -- import your plugins\n    { import = \"plugins\" },\n  },\n  -- Configure any other settings here. See the documentation for more details.\n  -- colorscheme that will be used when installing plugins.\n  install = { colorscheme = { \"habamax\" } },\n  -- automatically check for plugin updates\n  checker = { enabled = true },\n})\n```\n\n\u003e 如果你是照抄 LazyVim 的，那不用管，直接去自定义你的插件即可。\n\n配置好后，以后安装插件只需要在 `lua/plugins` 目录下新建文件返回一个 table 即可。\n\n### 04 赋予灵魂：LSP 与代码补全\n\n这是 Neovim 超越老 Vim 的关键。如果不配置 LSP，它就只是个记事本。\n\n我们需要安装三个大哥：\n\n1. **mason-org/mason.nvim**：不管你是写 Python、Go 还是 Rust，用它一键安装对应的 Language Server。\n2. **neovim/nvim-lspconfig**：官方提供的 LSP 配置工具。\n3. **saghen/blink.cmp**：自动补全引擎，就是弹出补全建议的那个东西。（还在推荐 nvim-cmp 的教程就别看了，各方面不如 blink.cmp）\n\n**blink.cmp**\n\n![blinkcmp](https://img.neotalks.org/2026/01/b2156b448060ced4a3c86f08cf8002b6.png)\n\n配置完成后，当你敲代码时，函数定义、自动补全、错误提示会瞬间弹出。那种丝滑感，真的会让你上瘾。\n\n真别再用nvim-cmp了，很多设计并不合理，有个窗口重叠问题困扰了我很久，用各种事件监听都无效。\n\n![cmp重叠](https://img.neotalks.org/2026/01/d42460dfea324c08bf111a607e2ba478.png)\n\n我甚至去lazyvim下提了issue，但没人鸟我，似乎大家根本不受困扰。\n\n![issue](https://img.neotalks.org/2026/01/61b233b72630293cc7c7f2fd788575c2.png)\n\n我发现如果函数签名过多（尤其是 Flutter），在 VS Code 中也会存在遮挡问题。但这一点 blink.cmp 处理得很好，在帮助窗口和函数建议窗口之间，它只会选一个，而不会同时出现。\n\n![blinkcmp](https://img.neotalks.org/2026/01/164e2edbf5b389558fa51f96f462ac07.png)\n\n### 05 颜值即正义：snacks 与 Treesitter\n\n**Treesitter (语法高亮):**\n它能理解代码的语法树，提供比正则匹配更精准的高亮。\n推荐开启 `incremental_selection`（增量选择），按 `Enter` 选中当前块，再按继续扩大选中范围，改代码极快。\n\n**snacks (多功能瑞士军刀):**\n\n如果说 Telescope 是 Neovim 模糊搜索的\"标准答案\"，那 **snacks.nvim** 就是\"超纲答案\"——它不仅涵盖了 Telescope 的核心功能，还把仪表盘、通知系统、动画效果、Git 浏览器、缓冲区删除等十几个常用功能打包进了一个插件。\n\n![snacks](https://img.neotalks.org/2026/01/ccbf005957fb3bb8623010a27fb2cd21.png)\n\n对，你没看错，**一个插件顶十个**。\n\n| 快捷键        | 功能           | 对标 VS Code     |\n| :------------ | :------------- | :--------------- |\n| ` f f` | 查找文件       | Ctrl + P         |\n| ` f g` | 全局 Grep 搜索 | Ctrl + Shift + F |\n| ` f r` | 最近打开文件   | 最近文件列表     |\n| ` f b` | 切换缓冲区     | Ctrl + Tab       |\n| ` g l` | Git 日志浏览   | GitLens 历史     |\n\n最让我惊艳的是它的**流畅动画**——窗口弹出、滚动、关闭都有丝滑的过渡效果。第一次用的时候我愣了一下：\"这真的是终端编辑器？\"\n\n而且 snacks 的作者正是 Lazy.nvim 的作者 `folke`，品质保证。现在 LazyVim 官方已经把 Telescope 换成 snacks 作为默认搜索方案了。\n\n---\n\n## AI 辅助编程 🤖\n\n这是 90% 的 Neovim 教程都不会讲的内容——但在 2026 年，不讲 AI 的编辑器教程就是耍流氓。\n\n你可能会问：**用 Neovim 不就意味着放弃 Cursor 那种 AI 原生体验了吗？**\n\n答案是：**完全不用**。\n\n推荐插件：**avante.nvim** —— 它让 Neovim 秒变 Cursor。\n\n![avante](https://img.neotalks.org/2026/01/712f496ea4319d68d78950a3d7fa460a.png)\n\n### 它能做什么？\n\n| 功能           | 描述                                         | 对标            |\n| :------------- | :------------------------------------------- | :-------------- |\n| **侧边栏对话** | 像 Cursor 一样，在编辑器内直接跟 AI 聊天     | Cursor Chat     |\n| **代码生成**   | 选中代码，描述需求，AI 直接生成 diff         | Cursor Composer |\n| **内联编辑**   | 光标处直接唤起 AI 补全，无需切换窗口         | Copilot Edit    |\n| **多模型支持** | Claude、GPT-4o、Deepseek、本地 Ollama 都能接 | 灵活度拉满      |\n\n### 我的常用场景\n\n1. **写注释**：选中函数，问 AI \"帮我写个中文注释\"\n2. **重构代码**：选中一坨屎山，说 \"重构成更优雅的写法\"\n3. **解释代码**：遇到看不懂的开源代码，直接问 \"这段在干嘛\"\n4. **生成测试**：选中函数，说 \"帮我生成单元测试\"\n\n配置也很简单，只需要填入你的 API Key。如果你有 Claude 或者 Deepseek 的 API，体验比 Copilot 还丝滑（毕竟不用等 GitHub 那边抽风）。\n\n\u003e 💡 **Tip**：如果你在国内，推荐用 Deepseek API，便宜量大还快，性价比无敌。\n\n---\n\n## 常见问题 FAQ\n\n**Q: 刚开始不习惯快捷键怎么办？**\n**A:** 强迫自己用。把鼠标扔远点。第一周会很痛苦（\"学习曲线陡峭\"），但跨过那个点后，你的效率会指数级上升。可以装一个 `vim-be-good` 插件，像玩游戏一样练习快捷键。\n\n**Q: 中文输入法切换很烦？**\n**A:** 这是一个经典痛点。推荐安装 `im-select` 插件，它可以实现“退出插入模式自动切回英文”，再也不用疯狂按 Shift 了。\n\n**Q: 插件装多了会变慢吗？**\n**A:** 会，但 Lazy.nvim 能极大缓解这个问题。记得检查插件配置，把不常用的插件设为 `event = \"VeryLazy\"`。\n\n---\n\n## 结语\n\n折腾编辑器，本质上是在**磨刀**。\n有人说由俭入奢易，由奢入俭难。当你习惯了 Neovim 的高效与自由，可能真的就回不去 VS Code 了。\n\nVim 如今已演化为一种操作哲学。尽管你不必拘泥于编辑器本身，完全可以在 IDE 中用插件实现 Vim 模式，但要论极致的纯粹，原生依然无可替代。\n\n如果你对我的配置感兴趣，或者在折腾过程中遇到了坑，欢迎在评论区留言。\n我也把这套**开箱即用**的配置上传到了 GitHub，你可以直接 Clone 下来作为起点，打造属于你自己的神兵利器。\n\n![](https://img.neotalks.org/640.jpg)\n\n"])</script><script>self.__next_f.push([1,"1f:T2185,"])</script><script>self.__next_f.push([1,"## 效果展示：极速访问，丝般顺滑\n\n\u003ctable border=\"0\"\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"https://img.neotalks.org/2026/01/e22cabc83346c5304bfba282d3108fd8.gif\" \u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"https://img.neotalks.org/2026/01/e7463e2058cc03bd0638577abb6ffd67.gif\" \u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## 👋 前言：你真的需要一台昂贵的NAS吗？\n\n对大部分非影视从业者来说，专业NAS可能是一个“伪需求”。\n假如你还在犹豫买不买，或者不知道自己到底需不需要，**不妨先试试这种“零成本”自建方案！** 🎉\n\n后续配合 **迅雷 + jellyfin**，分分钟搭建一个私人影音库，完全满足日常需求！\n不需要NAS那样昂贵的磁盘阵列，不需要复杂的网络知识。日常追追剧 📺、存存照片 📷，甚至家里闲置的旧硬盘加个硬盘盒就能搞定。\n\n**⚠️ 友情提示：** 这种方案适合尝鲜，重要数据请务必做好多重备份！假如觉得仍有速度和便利性问题，那说明你可能真的需要一台NAS。\n\n---\n\n**写在前面：**\n本文演示的环境是一台**旧笔记本**，系统为 **Arch Linux**，平时保持**24小时不断电**运行（当服务器用）。\n如果你通过之前的教程（[老旧电脑不要扔！做一台自己的服务器](https://mp.weixin.qq.com/s/ARXQe0955n9_KTfzpPvyvw?token=130243119\u0026lang=zh_CN)）已经装好了系统，那么可以直接开始！\n或者你会用其他linux那直接开始是完全没问题！\n\n## 🛠️ 第一步：安装 Samba 服务\n\nNAS的核心其实就是文件共享。绝大多数NAS都在使用 **SMB协议**，它能将你电脑上的某个文件夹“广播”出去，让同一个WiFi下的手机、平板、电视都能访问。\n\n在 Linux 下，我们只需一行命令搞定它！👇\n\n![](https://img.neotalks.org/2026/01/0613ba1ea817a50dc48d4dbca416d310.png)\n\n```bash\nsudo pacman -S samba\n```\n\n*(注：不同Linux发行版安装命令略有不同，Ubuntu用户请用 `sudo apt install samba`)*\n\n---\n\n## 💾 第二步：挂载外接硬盘（可选）\n\n如果你只是想共享电脑里原本就有的文件夹，**可以直接跳过这一步**。\n但如果你想挂载一个外接的大容量硬盘，请往下看(由于本人没有外接硬盘，所以没有测试过）：\n\n1. **查看硬盘信息**：找到你的硬盘名字（比如 `/dev/sdb1`）。\n   \n   ```bash\n   lsblk\n   ```\n2. **创建“入口”**：这叫挂载点。\n   \n   ```bash\n   sudo mkdir -p /mnt/myshare\n   ```\n3. **挂载硬盘**：\n   \n   * **一次性挂载**（重启后失效，适合临时用）：\n     ```bash\n     sudo mount /dev/sdb1 /mnt/myshare\n     ```\n   * **永久挂载**（推荐 🔥）：\n     需要修改 `/etc/fstab` 文件。\n     先获取硬盘UUID：`sudo blkid`\n     然后编辑配置：`sudo nano /etc/fstab`\n     在末尾添加一行：\n     ```plaintext\n     UUID=你的-UUID-字符串  /mnt/myshare  ext4  defaults  0  2\n     ```\n\n---\n\n## ⚙️ 第三步：配置 Samba（关键！）\n\n很多教程只甩命令，不讲原理。其实关键就在于找到 **配置文件**。\n使用如下命令查找配置文件位置：\n\n```bash\nsmbd -b | grep CONFIGFILE\n```\n\n![](https://img.neotalks.org/2026/01/8bc24f2adc347887d35ec36d9f42a915.png)\n\n通常在 `/etc/samba/smb.conf`。我们直接编辑它！\n\n### 🔒 方案A：私密模式（推荐，需要密码）\n\n如果你不希望邻居蹭网时顺便看光你的照片，请用这个配置：\n\n```ini\n# --- 编辑 /etc/samba/smb.conf ---\n\n[MyHardDrive]\n   comment = My Private Drive \n   # 这里填你要共享的实际路径，用 pwd 命令查询\n   path = /home/xinghe/xh_share\n   browseable = yes\n   read only = no\n   writable = yes\n   # !!! 很重要，这里设置的用户名需要是系统里存在的\n   valid users = lxh\n   # 加上这一行 (假设 xinghe 是你平时用的那个主账号名，避免权限问题)\n   force user = xinghe\n   create mask = 0775\n   directory mask = 0775\n```\n\n### 🔓 方案B：裸奔模式（方便，无需密码）\n\n如果你觉得输密码太麻烦，且对局域网环境很放心：\n\n```ini\n[PublicShare]\n   comment = Public Drive\n   path = /home/xinghe/xh_share\n   browseable = yes\n   read only = no\n   writable = yes\n   guest ok = yes\n   force user = xinghe\n\n[global]\n   # 允许访客登录\n   map to guest = Bad User\n```\n\n---\n\n## 👤 第四步：设置访问用户（私密模式必看）\n\n如果你选了方案A，你需要给 Samba 单独设置一个密码（它和你的系统登录密码是分开的）。\n\n1. **添加用户**（如果系统里还没这个用户）：\n   \n   ```bash\n   sudo useradd lxh\n   ```\n2. **设置Samba密码**：\n   \n   ```bash\n   sudo smbpasswd -a lxh\n   ```\n   \n   *输入两次密码，这就是你手机连接时要填的密码！*\n3. **重启服务生效**：\n   \n   ```bash\n   sudo systemctl restart smb\n   ```\n4. windows下连接，直接在文件资源管理器地址栏输入 `\\\\IP地址\\MyHardDrive` 即可\n\n![](https://img.neotalks.org/2026/01/388a71a30f62a14fbb8d7d793f1c6e20.png)\n\n至此，你的所有**配置已经完成**，可以尽情使用了！\n\n---\n\n## ⚠️ 避坑指南：Windows 连不上怎么办？\n\n![](https://img.neotalks.org/2026/01/b66e0981146985a0c32b8905e1631e77.png)\n\n如果你改了密码，或者前面配置反复折腾了很多次，Windows 可能会傻傻地记住旧密码或权限设置，导致一直报错且不弹窗。\n**解决方法：**\n\n1. 打开 CMD (命令提示符)。\n2. 输入 `net use * /delete`。\n3. 按 `y` 确认。这会清除所有的共享连接缓存，让你重新输入密码。📢\n\n**后续如果修改了密码，此方法仍然适用**\n\n---\n\n## 🖥️ 进阶玩法：Windows 创建快捷访问\n\n每次输IP太麻烦了，那就把它变成“我的电脑”里的一个盘符！\n\n1. 打开“此电脑”，点击上方工具栏的 **“映射网络驱动器”**。\n   \n   ![](https://img.neotalks.org/2026/01/9c97d0724cbc3a2dfc14e6d42d175873.png)\n2. 在文件夹栏输入：`\\\\你的Linux主机IP\\共享文件夹名` (例如 `\\\\192.168.1.123\\MyHardDrive`)。\n   \n   ![](https://img.neotalks.org/2026/01/fe7e691d1d6eaa9907399eb5307b3562.png)\n3. 勾选“使用其他凭据连接”（如果是私密模式），输入刚才设置的账号 `lxh` 和密码。\n   \n   ![](https://img.neotalks.org/2026/01/c74cb8e5d0f1e80c831b20b573dd96ae.png)\n\n搞定！现在它就像你电脑自带的D盘一样好用了！✨\n\n---\n\n## 📱 手机躺平看片：iOS/Android 完美支持\n\n### 📷 访问照片 (系统自带文件App)\n\n1. 打开 iPhone 的 **“文件”** App，点击右上角三个点 -\u003e **“连接服务器”**。\n2. 输入 `smb://你的Linux主机IP`。\n3. 选择 **“注册用户”**，输入账号密码。\n4. 所有照片、文档秒开！预览毫无压力。\n\n\u003ctable border=\"0\"\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"33%\"\u003e\u003cimg src=\"https://img.neotalks.org/2026/01/4bd606e8a758a674fe781647f774fec7.jpg\"\u003e\u003c/td\u003e\n    \u003ctd width=\"33%\"\u003e\u003cimg src=\"https://img.neotalks.org/2026/01/1ff4dfdc0db5bf2887fee406640e2fa6.jpg\"\u003e\u003c/td\u003e\n    \u003ctd width=\"33%\"\u003e\u003cimg src=\"https://img.neotalks.org/2026/01/8aef43bf50a4b80510cfb4e207206424.jpg\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n### 🎬 观看视频\n\n想在被窝里看电脑上下好的电影？\n以 `vlc` 为例，选择 **“网络”** -\u003e **“SMB”**。\n\n1. **主机**：填入IP地址。\n2. **用户/密码**：填入对应信息。\n\n![](https://img.neotalks.org/2026/01/9234f83ae32c5d78f2d3799fb82e2259.PNG)\n\n点击保存，点击影片，**4K原画流畅播放**，不仅不占用手机存储，还没广告！🎥🍿\n\n假如不知道资源在哪下或者觉得vlc有点土，可以关注公众号【新青年talks】，后续会更新相关教程。\n\n你还可以选择 nPlayer 或 Infuse 等播放器，操作类似，效果一样。\n\n---\n\n## 🧠 NAS 原理 (小白可跳过)\n\n简单来说，NAS (Network Attached Storage) 就是一台**插了硬盘的微型电脑**，专门只干一件事：**为局域网内的设备提供文件存取服务**。\n\n我们今天做的，就是在Linux上开启了 **SMB服务**，让这台电脑扮演了NAS的角色。相比于群晖、威联通等成品NAS，这种方案：\n\n* ✅ **成本为0** (利用现有设备)\n* ✅ **扩展性强** (Linux系统想干啥干啥)\n* ✅ **性能更强** (PC的CPU吊打普通NAS)\n* ❌ **缺点**：费电 (台式机功耗高)、需要一点折腾能力。对于一些老笔记本，可以先AI问问大概功耗，算一算电费，不过轻度使用一般来说一个月不会超过10块钱。\n\n但作为入门体验，它绝对是最佳选择！快去试试吧！💪\n\n"])</script><script>self.__next_f.push([1,"20:T2322,"])</script><script>self.__next_f.push([1,"# 🖼️ 告别付费软件！用Python一键批量压缩图片，小白也能轻松上手\n\n\u003e 最近在做教程时发现手机拍出来的图片巨大无比（18MB），导致网站加载几分钟都看不到一张图！还浪费对象储存的空间（这可是要钱的！！）网上的找了很多压缩工具要么收费，要么有水印，要么限制数量，还有隐私安全问题。\n\n今天分享一个**完全免费、无水印、无限制**的图片批量压缩方案——只需要一个小脚本，就能让你的图片\"瘦身\"到指定大小，而且**画质损失极小**！\n\n即使你从未接触过编程，跟着这篇教程一步步来，10分钟就能搞定。\n\n---\n\n## 📋 这个工具能做什么？\n\n先来看看这个小脚本的\"超能力\"：\n\n| 功能       | 说明                             |\n| ---------- | -------------------------------- |\n| ✅ 批量处理 | 一次性处理整个文件夹的图片       |\n| ✅ 智能压缩 | 自动调整质量，尽可能保留画质     |\n| ✅ 体积控制 | 可以指定目标大小（默认500KB）    |\n| ✅ 格式兼容 | 支持 JPG、PNG、WebP 等常见格式   |\n| ✅ 自动跳过 | 已经很小的图片不会重复压缩       |\n| ✅ 原图保留 | 压缩后的图片单独保存，不覆盖原图 |\n\n**实测效果**：一张 8MB 的手机照片，压缩到 500KB 以内，肉眼几乎看不出区别！比如我的上一篇推文中，都是500K以下，但并没有很糊。\n\n---\n\n## 🛠️ 准备工作（只需做一次）\n\n### Step 1：安装 Python 环境\n\n首先需要安装python，假如你已经安装了，就跳过吧！\n\n**不过真心建议大家入门一下python，AI时代了，DeepSeek一下写个小脚本，最少多摸鱼半小时！**\n\n**Windows 用户：**\n\n1. 打开浏览器，访问 Python 官网：https://www.python.org/downloads/\n2. 点击黄色的 **Download Python 3.x.x** 按钮\n3. 运行下载的安装包\n4. ⚠️ **重要**：安装时一定要勾选 **\"Add Python to PATH\"**（如下图）\n5. 点击 \"Install Now\" 等待安装完成\n\n**Mac 用户：**\n\nMac 系统自带 Python，但为了避免后续安装库时遇到权限问题，建议用 Homebrew 安装独立的 Python。\n\n打开\"终端\"，输入：\n\n```bash\nbrew install python\n```\n\n\u003e 💡 没有 Homebrew？先访问 https://brew.sh 安装，或者直接运行：\n\u003e `/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"`\n\n---\n\n### Step 2：安装图片处理库\n\nPython 本身不能处理图片，需要安装一个叫 **Pillow** 的库（可以理解为\"插件\"）。\n\n打开命令行工具：\n\n- **Windows**：按 `Win + R`，输入 `cmd`，回车\n- **Mac**：打开\"终端\"应用（在\"应用程序\"-\"实用工具\"里）\n\n#### Windows 用户：\n\n```bash\npip install Pillow\n```\n\n#### Mac 用户（推荐使用 Homebrew）：\n\nmacOS 系统对 Python 环境有保护机制，最简单的方法是用 Homebrew 安装：\n\n```bash\n# 如果还没装 Homebrew，先安装它（复制整行运行）\n/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"\n\n# 安装 Python 和必要的库\nbrew install python python-tk\npip3 install Pillow\n```\n\n看到类似 `Successfully installed Pillow-xxx` 的提示就说明安装成功了！\n\n\u003e 💡 **为什么 Mac 要用 Homebrew？** macOS 自带的 Python 被系统保护，不能随意安装库。Homebrew 安装的 Python 是独立的，可以自由使用。`python-tk` 是用来显示文件选择窗口的\n\n---\n\n### Step 3：获取压缩脚本\n\n这就是今天的主角——一个不到100行的 Python 脚本，却能实现专业级的图片压缩效果。\n\n**获取方式**：关注公众号 **「新青年talks」**，回复 **「图片压缩」** 即可获取完整代码。\n\n直接下载即可！\n\n\u003e 📁 建议把这个文件放在一个固定的位置，比如 `D:\\Tools\\imgprocess.py`\n\n---\n\n## 🚀 开始使用（超简单！）\n\n准备工作做完后，以后每次使用只需要两步：\n\n### 方法一：双击运行（推荐新手）\n\n1. 找到你保存的 `imgprocess.py` 文件\n2. **双击**打开它(假如不行，又不愿折腾，直接看下一个方法)\n3. 会弹出一个文件夹选择窗口\n4. 选择你要压缩的图片所在的文件夹\n5. 等待处理完成，压缩后的图片会自动保存在 `optimized_results` 子文件夹中\n\n就是这么简单！处理完成后，文件夹会自动打开，你可以直接查看压缩后的图片。\n\n---\n\n### 方法二：命令行运行（Mac 推荐）\n\n如果双击没反应（可能是系统设置问题），或者 Mac 上遇到 tkinter 问题，可以用命令行直接指定文件夹：\n\n1. 打开命令行工具（cmd 或终端）\n2. 输入 `python `（注意后面有个空格）\n3. 把 `imgprocess.py` 文件**拖拽**到命令行窗口\n4. 继续输入一个空格，然后把**图片文件夹**也拖拽进去\n5. 按回车运行\n\n**示例**（Mac）：\n\n```bash\npython3 /Users/你的用户名/Desktop/imgprocess.py /Users/你的用户名/Pictures/旅行照片\n```\n\n**示例**（Windows）：\n\n```bash\npython D:\\Tools\\imgprocess.py D:\\Photos\\旅行照片\n```\n\n\u003e 💡 **小技巧**：直接拖拽文件和文件夹到终端，系统会自动填入完整路径，不用手打\n\n---\n\n## 📊 运行效果展示\n\n运行后，你会看到类似这样的输出：\n\n```\n正在处理: D:\\Photos\\旅行照片\n输出目录: D:\\Photos\\旅行照片\\optimized_results\n------------------------------\n[IMG_001.png] Compressed: 8532.4KB -\u003e 487.2KB\n[IMG_002.jpg] Compressed: 5621.8KB -\u003e 492.1KB\n[IMG_003.png] Skipped (Small enough): 312.5KB\n[IMG_004.webp] Compressed: 12045.6KB -\u003e 498.7KB\n------------------------------\n处理完成！共处理 4 张图片。\n```\n\n可以看到：\n\n- 8MB 的图片被压缩到了 487KB\n- 本来就小于 500KB 的图片会自动跳过\n- 所有格式都能处理\n\n![](https://img.neotalks.org/2026/01/44ec766fe8a7503e27b1bc0de9bbc98b.png)\n---\n\n## 🔧 进阶技巧：自定义压缩大小\n\n默认压缩到 500KB 以内，如果你想改成其他大小怎么办？\n\n打开 `imgprocess.py` 文件，找到这一行：\n\n```python\ndef smart_compress(input_path, output_path, target_size_kb=500):\n```\n\n把 `500` 改成你想要的大小（单位是 KB）就行了。比如：\n\n- 想压缩到 200KB：改成 `target_size_kb=200`\n- 想压缩到 1MB：改成 `target_size_kb=1024`\n\n---\n\n## 💡 这个脚本是怎么工作的？\n\n好奇宝宝可能想知道，这短短几十行代码是怎么实现\"智能压缩\"的？\n\n简单来说，它用了一个**二分查找**的策略：\n\n1. **先检查**：如果图片本身就小于目标大小，直接跳过\n2. **调质量**：从 90% 质量开始，逐步降低，直到文件大小达标\n3. **缩尺寸**：如果质量降到很低还是太大，就按比例缩小图片尺寸\n4. **保底线**：图片宽度不会缩到 400 像素以下，保证基本可用\n\n这就是为什么压缩后的图片画质损失很小——它会**优先保证画质**，只在必要时才缩小尺寸。\n\n\u003e 🐍 这种\"先尝试、再调整\"的思路，在编程中非常常见。如果你对 Python 感兴趣，这个小脚本是个很好的学习起点！\n\n---\n\n## ❓ 常见问题\n\n**Q：双击 .py 文件没反应？**\n\nA：可能是 Python 没有正确关联 .py 文件。用方法二（命令行）运行即可。\n\n**Q：提示 \"No module named PIL\"？**\n\nA：说明 Pillow 没装好。Windows 用户重新运行 `pip install Pillow`，Mac 用户按照上面的 Homebrew 方法重新安装。\n\n**Q：Mac 上提示 \"No module named '_tkinter'\" 错误？**\n\nA：tkinter 是用来显示文件选择窗口的库。运行 `brew install python-tk` 安装即可。如果还是不行，可以用命令行方式运行（见下面的\"方法二\"），直接指定文件夹路径，不需要弹窗选择。\n\n**Q：Mac 上处理完没有自动打开文件夹？**\n\nA：这是正常的，脚本里的自动打开功能是 Windows 专用的。手动去 `optimized_results` 文件夹查看即可。\n\n**Q：压缩后的图片都变成 JPG 了？**\n\nA：是的，这是故意的。JPG 格式的压缩率最高，能在保证画质的同时获得最小的文件体积。\n\n**Q：能处理 GIF 动图吗？**\n\nA：目前不支持，GIF 动图的压缩逻辑比较特殊，后续可能会更新。\n\n---\n\n## 📝 写在最后\n\n一个不到 100 行的 Python 脚本，就能替代那些收费的图片压缩软件，这就是编程的魅力所在。\n\nPython 被称为\"最适合新手的编程语言\"，语法简洁、功能强大，从数据分析到人工智能，从网站开发到自动化办公，几乎无所不能。\n\n如果这篇文章让你对 Python 产生了一点点兴趣，不妨从这个小脚本开始，尝试理解每一行代码的含义。编程没有想象中那么难，而且真的很有趣！\n\n---\n\n**📌 获取完整代码**：关注公众号 **「新青年talks」**，回复 **「图片压缩」**\n\n**🔄 觉得有用？** 转发给需要的朋友吧！\n\n"])</script><script>self.__next_f.push([1,"21:T2faf,"])</script><script>self.__next_f.push([1,"# 🐧 老旧电脑不要扔！做一台自己的服务器\n\n家里有老旧笔记本电脑扔了可惜，不如改成一个小型服务器！用来学习Linux、web开发等非常实用，还能搭建一些家用工具，比如：`NAS` 储存、`jellyfin` 追剧、迅雷下载，如果有公网ip，还可以搭建一些web服务，比如：`nextcloud`，`pterodactyl`等，甚至可以来一个 `v2ray` ,翻墙回家！\n\n\u003e 本教程基于官方 `archinstall` 脚本的快速安装指南\n\n---\n\n## 📋 前置准备\n\n在开始安装之前，你需要准备以下内容：\n\n### 1. 📥 下载 Arch Linux ISO 镜像\n\n- 访问 [Arch Linux 官网](https://archlinux.org/download/) 下载最新的 ISO 镜像文件\n- 推荐选择国内镜像站下载，速度更快（如清华、阿里云镜像站）\n\n### 2. 💾 制作启动 U 盘\n\n- **Windows 用户**：推荐使用 [Ventoy](https://www.ventoy.net/)\n- **Linux 用户**：可以使用 `dd` 命令或 [Etcher](https://www.balena.io/etcher/)\n- **Mac 用户**：可以使用 `dd` 命令或 [Etcher](https://www.balena.io/etcher/)\n\n### 3. ⚙️ 设置 BIOS 启动顺序\n\n- 重启电脑，按下 `F2`、`F12`、`DEL` 或 `ESC` 进入 BIOS（不同品牌按键不同）\n- 将 U 盘设置为第一启动项\n- 保存设置并退出\n\n以上如果不会、或者看不懂，建议不要折腾了，先学习一下怎么装系统。\n\n---\n\n## 🚀 安装步骤\n\n### 步骤 1️⃣：启动安装程序\n\n当你从 U 盘成功启动后，会进入 Arch Linux 的 Live 环境（临时系统环境）。假如没看到这个界面并且使用的是 ventoy，应该是启动模式选错了，可以换其他模式试试。\n\n**操作：**\n\n```bash\narchinstall\n```\n\n在终端中输入上述命令并按回车键，即可启动官方的图形化安装向导。\n\n\u003e **💡 小贴士**：`archinstall` 是 Arch Linux 官方提供的安装辅助工具，大大简化了传统的命令行安装流程。\n\n![](https://img.neotalks.org/2026/01/13d52c899c9753b77734405fe5f21d6e.jpg)\n---\n\n### 步骤 2️⃣：连接网络 🌐\n\nArch Linux 需要联网下载安装包，所以这一步非常重要！\n\n**有线网络（推荐）：**\n\n- 如果你的电脑通过网线连接路由器，系统会自动检测并连接\n\n**无线网络（WiFi）：**\n\n- 如果没有有线网络，安装脚本会提示你是否连接 WiFi（其实已经比以前方便很多了）\n- 选择 `Yes`\n- 从列表中选择你的 WiFi 网络名称\n- 输入 WiFi 密码\n- 等待连接成功\n\n\u003e **⚠️ 注意**：确保网络连接稳定，否则安装过程可能会因为下载失败而中断。\n\n![](https://img.neotalks.org/2026/01/279c36430b1e68497dda7870a5498ec5.jpg)\n---\n\n\u003e 开始配置安装之前，需要说明一下，`archinstaller` 是适配了 `vim` 的，所以查找选项的时候，可以输入 `/` 来快速定位，而不是用方向键一个个找。\n\n### 步骤 3️⃣：设置语言与键盘布局 ⌨️\n\n这一步配置系统的显示语言和键盘输入方式。\n\n**进入 `Locales` 选项，配置以下内容：**\n\n#### 🔤 Keyboard layout（键盘布局）\n\n- **大多数用户选择**：`us`（美式键盘布局，标准 QWERTY）\n- 如果你使用特殊键盘布局（如 dvorak、colemak），可以根据需要选择\n\n#### 🌍 Locale language（系统语言）\n\n- **选择**：`zh_CN.UTF-8`（简体中文）\n- 这样安装后的系统可以正确显示中文\n\n\u003e **💡 小贴士**：键盘布局影响的是你在终端中输入的按键映射，和系统显示语言是两回事！\n\n![](https://img.neotalks.org/2026/01/6994dbb10dcf8d727d378b08e2a7499f.jpg)\n---\n\n### 步骤 4️⃣：选择镜像源 🔄\n\n镜像源决定了你从哪里下载软件包，选择离你近的镜像站可以大幅提升下载速度。\n\n**操作：**\n\n1. 进入 `Mirrors` 选项\n2. 选择 `Mirror region`\n3. 选择 `China`（中国）\n\n这样系统会优先使用国内的镜像服务器（如清华、阿里云等），下载速度会快很多！\n\n![](https://img.neotalks.org/2026/01/79701c71c32e3e0cd0f4f134277640b6.jpg)\n---\n\n### 步骤 5️⃣：磁盘分区 💿\n\n这一步是将你的硬盘划分为不同的区域，用于存放系统文件。\n\n**操作：**\n\n1. 选择 `Disk configuration`\n2. 选择 `Use a best-effort default partition layout`（使用推荐的默认分区方案）\n\n**这个选项会自动帮你完成：**\n\n- ✅ 创建 EFI 引导分区（用于启动系统）\n- ✅ 创建 swap 交换分区（类似于 Windows 的虚拟内存）\n- ✅ 创建根分区（存放所有系统文件和用户数据）\n\n\u003e **👶 新手建议**：强烈推荐使用默认分区方案！除非你很清楚自己在做什么，否则手动分区可能会出错。\n\n\u003e **⚠️ 警告**：分区操作会清空硬盘数据，请确保重要文件已备份！\n\n![](https://img.neotalks.org/2026/01/5c6b1f7b4057575dc8c8ef0887cd3d98.jpg)\n---\n\n### 步骤 6️⃣：引导加载程序 🥾\n\n引导加载程序（Bootloader）是电脑开机时第一个运行的程序，它负责启动操作系统。\n\n**操作：**\n\n- 选择 `Bootloader`\n- 推荐选择 `Grub`\n\n**为什么选择 Grub？**\n\n- ✅ 最流行和稳定的引导加载程序\n- ✅ 支持多系统启动（如果你需要保留 Windows）\n- ✅ 配置简单，资料丰富\n\n\u003e **💡 其他选项**：高级用户也可以选择 `systemd-boot`，更加轻量简洁。\n\n![](https://img.neotalks.org/2026/01/5f8fd51a5b8c47e588994fc6bd9216f3.jpg)\n---\n\n### 步骤 7️⃣：创建用户账户 👤\n\n现在需要创建一个日常使用的账户, Linux 中不建议直接使用 root 超级管理员账户，一般情况下，建议密码复杂一点或者后面换密钥登陆，但是由于机器在内网，所以无所谓的。\n\n**操作：**\n\n1. 进入 `User account` 或 `Authentication` 选项\n2. 创建一个新用户（例如：`xinghe`）\n3. 设置登录密码（**请务必记住这个密码！**）\n4. 当询问 \"Start *** as a superuser (sudo)?\" 时，选择 `Yes`\n\n**选择 Yes 的作用：**\n\n- ✅ 你的用户可以使用 `sudo` 命令临时获得管理员权限\n- ✅ 可以安装软件、修改系统配置等\n- ✅ 比直接用 root 账户更安全\n\n![](https://img.neotalks.org/2026/01/55ecfc0e411be40b1d9d5adbe615b552.jpg)\n---\n\n### 步骤 8️⃣：选择系统类型 🖥️\n\n你也可以根据你的使用场景，选择不同的系统配置方案。由于今天我们是准备把它当服务器用，所以选择 `Server`。\n\n**常见选项：**\n\n- **Desktop（桌面环境）**：如果你需要图形界面（KDE、GNOME 等）\n- **Server（服务器）**：如果作为服务器使用，不需要图形界面\n- **Minimal（最小化安装）**：只安装基础系统，后续自己定制\n\n**本教程截图中选择了：**\n\n- `sshd` 服务（SSH 远程连接服务）\n\n**SSH 的作用：**\n\n✅ 方便远程管理和操作\n\n- ✅ 可以从另一台电脑远程登录这台 Arch Linux\n- ✅ 适合将 Arch 安装在服务器或旧电脑上\n- ✅ 方便远程管理和操作\n\n\u003e **💡 小贴士**：如果你是普通桌面用户，可以选择安装桌面环境，这样会有类似 Windows 的图形界面。\n\n![](https://img.neotalks.org/2026/01/ef7e898b39fc82149d6ae98f6fa04778.jpg)\n---\n\n### 步骤 9️⃣：选择 Linux 内核 🐧\n\nLinux 内核是操作系统的核心，管理硬件和软件之间的通信。\n\n**可选内核版本：**\n\n- **`linux`**（最新稳定版）：包含最新功能和硬件支持\n- **`linux-lts`**（长期支持版）：更稳定，更新较慢，推荐新手\n- **`linux-zen`**（性能优化版）：适合游戏和桌面使用\n- **`linux-hardened`**（安全加固版）：适合对安全要求高的场景\n\n**本教程推荐：**\n\n- 选择 `linux-lts`（LTS = Long Term Support 长期支持）\n\n**为什么选择 LTS 版本？**\n\n- ✅ 更加稳定可靠\n- ✅ 更新周期长，不容易出现兼容性问题\n- ✅ 适合生产环境和日常使用\n\n\u003e **🎮 游戏玩家提示**：如果你打算用 Arch 玩游戏，可以考虑 `linux-zen` 内核，性能调优更好。\n\n![](https://img.neotalks.org/2026/01/d66b8d927fe98d51cacf3bee57590be7.jpg)\n---\n\n### 步骤 🔟：设置时区 🕐\n\n时区设置影响系统的时间显示，确保选择正确的时区。\n\n**操作：**\n\n1. 进入 `Timezone` 选项\n2. 搜索并选择 `Asia/Shanghai`（上海时区，适用于中国大陆）\n\n**其他时区选择：**\n\n- 🇭🇰 香港：`Asia/Hong_Kong`\n- 🇹🇼 台湾：`Asia/Taipei`\n- 🇸🇬 新加坡：`Asia/Singapore`\n\n\u003e **💡 小贴士**：时区设置错误会导致文件时间戳、日志记录等出现时间偏差。\n\n![](https://img.neotalks.org/2026/01/1a8103699d32dc18d577b7af2f985007.jpg)\n---\n\n### 步骤 1️⃣1️⃣：开始安装 🎉\n\n所有配置都完成了！现在可以开始真正的安装了。\n\n**操作：**\n\n1. 仔细检查一遍所有配置项\n2. 确认无误后，选择菜单底部的 `Install`\n3. 按回车键确认\n\n**安装过程中会发生什么：**\n\n- 🔄 格式化并创建分区\n- 📦 下载系统必需的软件包\n- ⚙️ 安装引导加载程序\n- 🔧 配置系统设置\n\n**整个过程大约需要：**\n\n- ⏱️ 5-20 分钟（取决于网络速度和硬盘性能）\n\n**安装完成后：**\n\n- 系统会询问是否重启\n- 选择 `Reboot system`（重启系统）\n- **记得拔掉 U 盘！** 否则可能会再次进入安装界面\n\n\u003e **☕ 休息提示**：安装过程全自动，趁这个时候可以去倒杯水休息一下~\n\n![](https://img.neotalks.org/2026/01/8febde117e850cc380f4ead8dd206f37.jpg)\n---\n\n### 步骤 1️⃣2️⃣：安装后验证 ✅\n\n恭喜！Arch Linux 已经安装完成，现在来验证一下是否一切正常。\n\n**操作：**\n\n1. 🔌 拔掉 U 盘\n2. 🔄 重启电脑\n3. 插上网线（必须连接到有线网络,否则ip会经常变动，而且wifi连接不稳定）\n4. 👤 使用你创建的用户名和密码登录（例如：`xinghe`）\n5. 验证网络连接\n\n**验证网络的命令：**\n\n```bash\nip addr\n```\n\n**正常输出应该包含：**\n\n- 网卡名称（如 `enp3s0`、`eth0`、`wlp2s0` 等）\n- IP 地址（如 `192.168.1.100`）\n- 状态为 `UP`\n\n如果能看到 IP 地址，说明：\n\n- ✅ 系统安装成功\n- ✅ 网络配置正常\n- ✅ 可以开始使用 Arch Linux 了！\n\n![](https://img.neotalks.org/2026/01/7397c2ba349beb57c1ecea51c53275cc.jpg)\n---\n\n## 🎓 后续步骤\n\n### ssh连接\n\n```bash\nssh xinghe@192.168.1.100\n```\n\n现在可以把笔记本盖上，后续所有配置、服务搭建都用ssh操作，相当于没有公网的服务器一样。\n\n不过**注意**，此处有个坑，笔记本合盖后不久会自动休眠，需要先做如下设置：\n\n```bash\nsudo vi /etc/systemd/logind.conf\n```\n\n在打开的文件中，找到 #HandleLidSwitch=suspend 这一行。将 `#` 删除，并将等号后面的值修改为 `ignore`。\n\n### 📦 安装常用软件\n\n```bash\nsudo pacman -S vim git wget curl\n```\n\n### 🖼️ 安装桌面环境（可选）\n\n如果你需要图形界面：\n\n```bash\n# KDE Plasma（推荐）\nsudo pacman -S plasma kde-applications\n\n# GNOME\nsudo pacman -S gnome gnome-extra\n```\n\n### 🔧 配置 AUR 助手（可选）\n\nAUR（Arch User Repository）包含大量社区软件：\n\n```bash\nsudo pacman -S --needed base-devel git\ngit clone https://aur.archlinux.org/yay.git\ncd yay\nmakepkg -si\n```\n\n![](https://img.neotalks.org/2025/12/38b55c84b1ee870e17877e45be8b515d.png)\n\n## ❓ 常见问题 FAQ\n\n### Q: 安装过程中网络断开了怎么办？\n\n**A:** 重新运行 `archinstall` 并重新配置，不会影响已有数据。\n\n### Q: 忘记用户密码怎么办？\n\n**A:** 需要使用 Live U 盘启动，chroot 进系统重置密码（建议搜索具体教程）。\n\n### Q: 可以和 Windows 双系统吗？\n\n**A:** 可以！安装时选择不清空整个硬盘，而是选择特定分区安装即可。Grub 会自动检测 Windows 并添加到启动菜单。本教程面向简单的服务器搭建，不做双系统教程。\n\n### Q: 安装后没有图形界面怎么办？\n\n**A:** `archinstall` 默认只安装命令行系统，需要手动安装桌面环境（见上方\"后续步骤\"）。\n\n恭喜你成功安装了 Arch Linux！虽然 Arch 以\"难装\"著称，但通过 `archinstall` 工具，整个过程已经大大简化。\n\n"])</script><script>self.__next_f.push([1,"22:T4f8e,"])</script><script>self.__next_f.push([1,"## 导言\r\n建过好几次站，虽然都没有坚持下去，但还是记录一下，本次使用的是穷鬼一条龙，前半部分的非服务器操作各个平台大同小异，只是国内操作需要多一步备案。后半部分服务器操作，因人而异，我使用的是自己博客项目，部署情况完全不一样，如果是使用其他博客项目（WordPress、hexo等）自己去找他们官网教程，很快就能用上。\r\n\r\n## 购买域名\r\n\r\n直接找一些知名的域名商，国内外都有不少选择：\r\n\r\n#### 国内域名商\r\n\r\n- **阿里云（万网）**：国内最大，价格适中，需要实名认证\r\n- **腾讯云**：价格有时比阿里便宜，活动多\r\n- **华为云**：偶尔有新人优惠\r\n\r\n**优点**：支付方便（支付宝/微信），中文客服，续费提醒及时\r\n**缺点**：必须实名认证，后续建站需要备案（约 7-20 天）\r\n\r\n#### 国外域名商\r\n\r\n- **Namesilo**：价格便宜，免费隐私保护，支持支付宝 (**本教程案例**)\r\n- **Cloudflare Registrar**：按成本价出售，无溢价，但需要先托管域名到 CF\r\n- **Namecheap**：老牌商家，界面友好，首年优惠多\r\n\r\n**优点**：不需要实名，不需要备案，隐私保护好\r\n**缺点**：支付稍麻烦（信用卡/PayPal），续费价格可能比首年贵\r\n\r\n#### 注意事项\r\n\r\n1. **如果你有国内服务器或想用国内 CDN**：必须在国内买域名 + 备案\r\n2. **如果用国外服务器（如 Cloudflare、Vercel）**：推荐国外域名商，省去备案麻烦\r\n3. **域名后缀选择**：\r\n   - `.com` 最通用，但热门词可能被抢注\r\n   - `.cn` 国内域名，必须备案\r\n   - `.org` / `.net` 也不错，价格相近\r\n   - `.top` 非常便宜\r\n\r\n\r\n## Cloudflare 域名托管（可选）\r\n\r\n**如果你不想用 Cloudflare 的 CDN 和 R2 存储**，可以直接在域名服务商里做 DNS 解析，跳过本节，直接看 [使用第三方对象存储](#使用第三方对象存储可选) 部分。\r\n\r\n#### 为什么要用 Cloudflare？\r\n\r\n**优势：**\r\n- 免费的 CDN 服务（全球节点加速）\r\n- R2 对象存储基本免费（10GB 存储 + 无限流量），做个人站完全够用\r\n- 免费的 DDoS 防护、SSL 证书\r\n- 流量统计、防火墙规则等实用功能\r\n\r\n**劣势：**\r\n- 免费版在国内速度一般，号称\"减速 CDN\"（但对国外小鸡服务器还是有帮助的）\r\n- R2 存储需要绑定信用卡（国内双币卡也行，不会扣费）\r\n\r\n#### 操作流程\r\n\r\n**1. 添加域名到 Cloudflare**\r\n\r\n注册好 Cloudflare 账号后，进入控制面板，点击\"加入域\"。\r\n\r\n![](https://img.neotalks.org/2025/12/f0d8d0b57c18d1b1280c6fcdfd13f894.png)\r\n\r\n**2. 输入你的域名**\r\n\r\n![](https://img.neotalks.org/2025/12/f22ad7b97beedcfba45236bce79c2a67.png)\r\n\r\n**3. 选择免费计划**\r\n\r\n既然要白嫖，肯定选 Free 计划。\r\n\r\n![](https://img.neotalks.org/2025/12/29ce0d5e023240e04cf360df7caec350.png)\r\n\r\n**4. 添加 DNS 记录**\r\n\r\n一般情况是默认自己给你解析出现有的 DNS（如下图）如果没有，点击\"添加记录\"后，按照以下步骤添加。\r\n\r\n- **类型**：选择 `A`\r\n- **名称**：填 `@`（代表根域名）或二级域名前缀（如 `admin`）\r\n- **内容**：填入你的服务器 IP 地址\r\n- **代理状态**：**小黄云必须是橙色**（Proxied），才能启用 CDN 和防护\r\n\r\n\u003e **提示**：如果需要添加二级域名（如 `admin.yourdomain.com`），现在就可以点击\"添加记录\"，类型选 `A`，名称填 `admin`，内容填服务器 IP。\r\n\r\n![](https://img.neotalks.org/2025/12/8fa18b7ffd428055bb7aed3af235e07e.png)\r\n\r\n**5. 修改域名服务商的 NameServers**\r\n\r\nCloudflare 会给你两个 NameServer 地址（类似 `xxx.ns.cloudflare.com`），复制它们。\r\n\r\n回到你的域名服务商（以 Namesilo 为例），点击域名管理，找到 NameServers 设置，替换成 Cloudflare 提供的两个地址。\r\n\r\n![](https://img.neotalks.org/2025/12/315bcc04ddac3fc13dcc8b6ae5cd7c5a.png)\r\n\r\n**6. 删除原有 DNS 解析记录**\r\n\r\n在域名服务商的 DNS 管理页面，删除所有原有的解析记录（因为现在由 Cloudflare 全权托管）。\r\n\r\n![](https://img.neotalks.org/2025/12/e681a4c53334c49b444b62d101186606.png)\r\n\r\n**7. 等待生效**\r\n\r\n等待几分钟到几小时（通常 10 分钟内），返回 Cloudflare 后台，看到下图界面就代表托管成功。\r\n\r\n![](https://img.neotalks.org/2025/12/b1ef61f5e06792748d1c3d46cff24788.png)\r\n\r\n如果一直停留在\"等待 NameServer 更新\"页面，说明还没生效，耐心等待即可。也可能是自己设置不对。\r\n\r\n\r\n## 使用第三方对象存储（可选）\r\n\r\n#### 为什么需要对象存储？\r\n\r\n如果你的博客需要存储大量图片、视频等静态资源，直接放在服务器上会有以下问题：\r\n- 占用服务器磁盘空间，小鸡很快就满了\r\n- 消耗服务器带宽，影响网站访问速度\r\n- 备份和迁移麻烦\r\n\r\n使用对象存储可以：\r\n- 把静态资源分离出去，服务器只跑业务逻辑\r\n- 利用 CDN 加速\r\n- 按需付费，成本可控（甚至免费）\r\n\r\n#### 怎么选？\r\n\r\n| 维度 | Cloudflare R2 | 腾讯云 COS / 阿里云 OSS | Backblaze B2 |\r\n| :--- | :--- | :--- | :--- |\r\n| **适用人群** | 不想备案、面向全球、不想付流量费 | 已备案、追求国内极致速度 | 存储量巨大、极客玩家 |\r\n| **存储费用** | 10GB 免费，超出便宜 | 需买资源包（便宜） | 10GB 免费，超出极便宜 |\r\n| **流量费用** | $0（免费） | 按量计费（要注意） | 配合 CF CDN 免费 |\r\n| **国内速度** | 一般（视地区而定） | 极快 | 一般 |\r\n| **备案要求** | 不需要 | 必须 | 不需要 |\r\n\r\n**推荐方案**：\r\n- 如果你用国外服务器 + Cloudflare，直接选 **R2**，免费额度够用，流量完全免费\r\n- 如果你已经备案且用国内服务器，选 **腾讯云 COS** 或 **阿里云 OSS**，速度最快\r\n- 如果你是数据狂魔，存储量超大，可以研究 **Backblaze B2**\r\n\r\n本教程使用的 Cloudflare 需要**信用卡！！**, 可是他真的免费。\r\n\r\n#### 怎么做？\r\n\r\n以 Cloudflare R2 为例, 其他都是类似的，只需要找到你服务商对象储存的入口就行。\r\n\r\n**第 1 步：创建 R2 存储桶（Bucket）**\r\n\r\n进入 Cloudflare 控制台，左侧菜单找到 **储存和数据库**，点击 **创建储存桶**。\r\n\r\n![](https://img.neotalks.org/2025/12/09d409645ca98cb3d9627c7503eeac14.png)\r\n\r\n填写配置：\r\n- **储存桶名称**：起个名字（如 `blog-img`），只能用小写字母、数字和短横线\r\n- **位置**：默认 `Automatic` 即可，会自动根据上传位置分配\r\n\r\n点击 **Create Bucket** 完成创建。\r\n\r\n---\r\n\r\n**第 2 步：绑定自定义域名（关键步骤）**\r\n\r\nR2 自带的 `r2.dev` 链接通常很慢或被墙，博客必须用自定义域名才能正常访问。\r\n\r\n1.  进入你刚才创建的 Bucket 页面\r\n2.  点击顶部的 **Settings**（设置）标签\r\n3.  向下滑动找到 **Public access**（公开访问）区域\r\n4.  点击 **Connect Domain**（添加）\r\n5.  输入你想用的二级域名，例如 `img.yourdomain.com`  \r\n    （前提是 `yourdomain.com` 已经在 Cloudflare 解析，[参见此处](#cloudflare-域名托管可选)）\r\n6.  点击 **Connect Domain**，等待几分钟，状态变为 **Active** 即表示成功\r\n\r\n![](https://img.neotalks.org/2025/12/6382723234418ea22f61d8e181f0b941.png)\r\n\r\n绑定成功后，你的图片链接就是：`https://img.yourdomain.com/图片名.png`\r\n\r\n---\r\n\r\n**第 3 步：获取 API 密钥**\r\n\r\n要想在博客后台里面直接传图片必须创建密钥, 如果你想用 PicGo、Typora 等工具自动上传图片到 R2，那更需要了。\r\n\r\n1.  回到 R2 的主界面（列出所有 对象储存桶 的页面）\r\n2.  在右侧找到 **Manage**（管理 R2 API 令牌）\r\n\r\n    ![](https://img.neotalks.org/2025/12/5b1be2f6739cf0b68350c76210ef1ce0.png)\r\n\r\n3.  点击 **创建 API 令牌**\r\n\r\n    ![](https://img.neotalks.org/2025/12/0ac01c34b078ae8bbfd11653150b3b24.png)\r\n\r\n4.  填写配置：\r\n    -   **令牌名称**：随便填，例如 `PicGo-Write`\r\n    -   **Permissions**（权限）：一定要选 **Object Read \u0026 Write**（读写权限），否则无法上传\r\n    -   **TTL**：选 **Forever**（永久）\r\n\r\n    ![](https://img.neotalks.org/2025/12/bd88c18235c2e77c7012a7bd716f0ca2.png)\r\n\r\n5.  点击 **创建 API 令牌**\r\n\r\n6.  **【重点】** 页面会弹出密钥信息，**请立即复制保存**以下三行内容（关掉就看不到了）：\r\n    -   **Access Key ID**（访问密钥 ID）\r\n    -   **Secret Access Key**（私密访问密钥）\r\n    -   **Endpoint**（端点地址，类似于 `https://\u003c你的账号ID\u003e.r2.cloudflarestorage.com`）\r\n\r\n---\r\n\r\n**第 4 步：配置上传工具（可选）**\r\n\r\n如果你用 **PicGo**：\r\n\r\n1.  安装 PicGo 和 `picgo-plugin-s3` 插件\r\n2.  在插件配置中填入：\r\n    -   **Access Key ID** 和 **Secret Access Key**（刚才保存的）\r\n    -   **Bucket**：你的存储桶名称（如 `blog-img`）\r\n    -   **Endpoint**：刚才保存的 Endpoint 地址\r\n    -   **自定义域名**：填你绑定的域名（如 `https://img.yourdomain.com`）\r\n3.  上传测试，成功后就可以愉快地写博客了\r\n\r\n\r\n## 部署项目（Docker）\r\n\r\n\u003e **说明**：下文使用的是我自己编写的博客，如果使用的是其他现有博客，可跳过。\r\n\r\n默认已有服务器。推荐使用 **2核2G** 及以上配置的服务器，否则项目部署和后期使用都会挺痛苦的。最差也要 **1核1G**，否则以下项目恐怕是很难用 Docker 直接部署，可能需要使用 PM2。\r\n\r\n### 安装 Docker\r\n\r\n\u003e 此安装方式适用于所有 Linux 系统\r\n\r\n```bash\r\n# 下载并执行 Docker 官方安装脚本\r\ncurl -fsSL https://get.docker.com -o get-docker.sh\r\nsudo sh get-docker.sh\r\n\r\n# 启动 Docker 服务\r\nsudo systemctl start docker\r\nsudo systemctl enable docker\r\n```\r\n\r\n### 部署 MySQL\r\n\r\n\u003e 此安装方式适用于所有系统\r\n\r\n```bash\r\ndocker run -d \\\r\n  --name mysql-server \\\r\n  -p 3310:3306 \\\r\n  -v /opt/mysql/data:/var/lib/mysql \\\r\n  -v /opt/mysql/conf:/etc/mysql/conf.d \\\r\n  -e MYSQL_ROOT_PASSWORD=your_password \\\r\n  --restart=always \\\r\n  mysql:8.0\r\n```\r\n\r\n**参数详解：**\r\n\r\n- `-d`: 后台运行。\r\n- `-p 3310:3306`: 关键点，将主机的 3310 端口到容器的 3306 端口映射，这是远程连接的基础。\r\n- `-v ...`: 挂载数据卷。如果不挂载，容器删除后数据会丢失。`/opt/mysql/data`: 主机存放数据的目录（请确保该目录存在或 Docker 有权限创建）。\r\n- `-e MYSQL_ROOT_PASSWORD`: 设置 root 用户的密码。\r\n- `mysql:8.0`: 指定镜像版本（建议明确版本号，不要只用 latest）。\r\n\r\n#### 配置远程连接权限(可选)\r\n\r\n默认情况下，Docker 版的 MySQL 容器通常允许 root 用户从任何地方（`%`）连接，只要密码正确。但为了保险起见或创建新用户，请按以下步骤操作：\r\n\r\n1. **进入容器内部**\r\n\r\n   ```bash\r\n   docker exec -it mysql-server mysql -u root -p\r\n   # (输入你设置的密码)\r\n   ```\r\n\r\n2. **检查当前用户权限**\r\n\r\n   ```sql\r\n   use mysql;\r\n   select host, user, plugin from user;\r\n   ```\r\n\r\n   如果在 `root` 对应的 `host` 列看到 `%`，说明已经允许远程连接。\r\n\r\n3. **如果需要手动开启 root 远程权限（或创建新用户）**\r\n\r\n   ```sql\r\n   -- 方法 A: 修改 root 允许任意 IP 连接\r\n   update user set host = '%' where user = 'root';\r\n\r\n   -- 方法 B: 创建一个专门的远程管理员账号 (推荐)\r\n   CREATE USER 'admin'@'%' IDENTIFIED BY 'your_password';\r\n   GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;\r\n\r\n   -- 刷新权限\r\n   FLUSH PRIVILEGES;\r\n   ```\r\n\r\n### 部署 Nginx（不用 Docker，更简单，仅 Ubuntu）\r\n\r\n```bash\r\nsudo apt update\r\nsudo apt install nginx -y\r\n\r\n# 启动 Nginx\r\nsudo systemctl start nginx\r\n\r\n# 设置开机自动启动 (非常重要，防止重启服务器后服务挂掉)\r\nsudo systemctl enable nginx\r\n\r\n# 检查运行状态 (显示 active (running) 即为成功)\r\nsudo systemctl status nginx\r\n```\r\n\r\n不过真正用处需要做一些配置，具体配置见后文。\r\n\r\n\r\n### 部署后端服务 (NestJS)\r\n\r\n1. **拉取代码并配置环境**\r\n\r\n   ```bash\r\n   git clone https://github.com/NewYouthBlog/Server.git\r\n   cd Server\r\n   cp .env.example .env\r\n   ```\r\n\r\n2. **修改 `.env` 配置文件**\r\n\r\n   关键配置项如下：\r\n   - `DATABASE_URL`: 数据库连接地址（确保容器可访问，如 `mysql://root:password@mysql-server:3310/blog` 记得先去数据库内建表，假如忘了，见下文）。\r\n   - `PORT`: 应用监听端口（默认 `3001`）。\r\n   - `R2_ACCESS_KEY_ID`: Cloudflare R2 Access Key ID。\r\n   - `R2_SECRET_ACCESS_KEY`: Cloudflare R2 Secret Access Key。\r\n   - `R2_BUCKET_NAME`: 创建的存储桶名字。\r\n   - `R2_PUBLIC_DOMAIN`: 绑定的自定义域名 (用于生成返回给前端的访问链接)。\r\n\r\n   你可以修改 `prisma/seed.ts` 文件来修改种子用户名和密码。\r\n\r\n   ![](https://img.neotalks.org/2025/12/b724de08ef5138baf106719f966f2513.png)\r\n\r\n3. **启动服务**\r\n\r\n   ```bash\r\n   docker compose up -d --build\r\n   ```\r\n\r\n    其他可能用到的命令（**只能在项目目录下、和dockerfile同一目录下用**）：\r\n\r\n    ```bash\r\n    # 重启服务\r\n    docker compose restart\r\n\r\n    # 停止服务\r\n    docker compose down\r\n\r\n    # 查看日志\r\n    docker compose logs\r\n\r\n    # 进入容器\r\n    docker exec -it blog_server /bin/bash\r\n    ```\r\n\r\n4. **初始化数据库（假如你忘了提前建表）**\r\n\r\n   ```bash\r\n   # 运行数据库迁移\r\n   docker exec -it blog_server npx prisma generate\r\n\r\n   # 填充初始数据\r\n   docker exec -it blog_server node dist/prisma/seed.js\r\n   ```\r\n\r\n### 部署用户端 (Next.js)\r\n\r\n1. **拉取代码**\r\n\r\n   ```bash\r\n   git clone https://github.com/NewYouthBlog/userWeb.git\r\n   cd userWeb\r\n   cp .env.example .env\r\n   ```\r\n\r\n2. **配置环境变量**\r\n\r\n   - `NEXT_PUBLIC_BASE_URL`: 填入你的域名 (例如 `http://www.yourdomain.com`)，用于 SEO 和 API 请求。\r\n\r\n3. **启动服务**\r\n\r\n   ```bash\r\n   docker compose up -d --build\r\n   ```\r\n\r\n### 部署后台管理系统 (Vue)\r\n\r\n1. **拉取代码**\r\n\r\n   ```bash\r\n   git clone https://github.com/NewYouthBlog/adminWeb.git\r\n   cd adminWeb\r\n   ```\r\n\r\n2. **修改配置**\r\n\r\n   修改 `.env.production` 文件中的 API 地址，使其指向你的后端服务(例如 `http://www.yourdomain.com/api`)。\r\n\r\n   **注意**：\r\n   - 现阶段还没配置https，所以请使用http，不然页面无法访问，如果写的https，就继续往下操作，不要急着测试\r\n\r\n   - 关于后端服务，后面会使用nginx做反向代理，把本机的3001端口（server）映射到 `yourdomain.com/api`\r\n\r\n3. **启动服务**\r\n\r\n   ```bash\r\n   docker compose up -d --build\r\n   ```\r\n\r\n## 后续配置\r\n\r\n### 1. Nginx 二级域名配置\r\n\r\n如果你需要配置二级域名（例如 `admin.yourdomain.com` 指向后台管理页面），可以在 `/etc/nginx/conf.d/` 下新建一个配置文件，例如 `adminweb.conf`：\r\n\r\n```nginx\r\n# /etc/nginx/conf.d/adminweb.conf\r\nserver {\r\n    listen 80;\r\n    server_name admin.yourdomain.com;  # 替换为您的域名\r\n\r\n    location / {\r\n        proxy_pass http://127.0.0.1:5173; # 指向 Vue 项目的端口\r\n        proxy_set_header Host $host;\r\n        proxy_set_header X-Real-IP $remote_addr;\r\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\r\n        proxy_set_header X-Forwarded-Proto $scheme;\r\n    }\r\n}\r\n```\r\n\r\n### 2. 配置 HTTPS (推荐)\r\n\r\n使用 Cloudflare 的免费 SSL 证书，配置 HTTPS。当然还有很多免费、付费的 SSL 证书，申请方式各有不同，但服务器上的配置方式大多相同。\r\n\r\n**第一步：获取 Origin CA 证书**\r\n\r\n1. 登录 Cloudflare，进入你的域名管理界面。\r\n2. 点击左侧菜单的 **SSL/TLS** \u003e **Origin Server** (源服务器)。\r\n3. 点击 **Create Certificate** (创建证书)。\r\n   - **私钥类型**：默认 RSA 即可。\r\n   - **主机名**：默认会包含 `*.你的域名.com` 和 `你的域名.com`，保持默认即可。\r\n   - **有效期**：建议选 **15 年**（省去频繁续期的麻烦）。\r\n4. 点击 **Create** (创建) 后，你会看到 **Origin Certificate** (公钥) 和 **Private Key** (私钥)。\r\n   - **注意**：私钥只显示一次，请立即复制保存！\r\n5. 在服务器上保存证书文件：\r\n   - (确保目录 `/etc/nginx/ssl` 存在，不存在则 mkdir 创建) \r\n   - 将公钥内容保存为：`/etc/nginx/ssl/origin.pem`\r\n   - 将私钥内容保存为：`/etc/nginx/ssl/origin.key`\r\n   \r\n**第二步：强制 HTTPS 跳转**\r\n\r\n1. 进入 Cloudflare **SSL/TLS** \u003e **Edge Certificates** (边缘证书)。\r\n2. 找到 **Always Use HTTPS** (始终使用 HTTPS)。\r\n3. 将开关打开。\r\n\r\n### 3. 完整 Nginx 配置示例 (包含 HTTPS 与 安全加固)\r\n\r\n以下是一个完整的 `nginx.conf` 示例，包含了 Gzip 压缩、禁止 IP 直接访问、SSL 配置、二级域名（通过引入配置文件的方式）以及前端和 API 的反向代理。\r\n\r\n编辑主配置文件：`sudo vim /etc/nginx/nginx.conf`\r\n\r\n```nginx\r\nuser root;\r\nworker_processes auto;\r\npid /run/nginx.pid;\r\n\r\nevents {\r\n    worker_connections 768;\r\n    # multi_accept on;\r\n}\r\n\r\nhttp {\r\n    include /etc/nginx/conf.d/*.conf; # 引入前文提到的二级域名配置文件\r\n    include /etc/nginx/mime.types;\r\n    default_type application/octet-stream;\r\n\r\n    # 日志设置\r\n    access_log /var/log/nginx/access.log;\r\n    error_log /var/log/nginx/error.log;\r\n\r\n    # Gzip 压缩设置\r\n    gzip on;\r\n    gzip_min_length 1k;\r\n    gzip_buffers 4 16k;\r\n    gzip_http_version 1.1;\r\n    gzip_comp_level 6; # 建议设置为 6，平衡 CPU 和压缩率\r\n    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;\r\n    gzip_disable \"MSIE [1-6]\\.\";\r\n    gzip_vary on;\r\n\r\n    # 基础设置\r\n    sendfile on;\r\n    tcp_nopush on;\r\n    tcp_nodelay on;\r\n    keepalive_timeout 65;\r\n    types_hash_max_size 2048;\r\n    client_header_buffer_size 16k;\r\n    large_client_header_buffers 4 32k;\r\n\r\n    # SSL 全局设置\r\n    ssl_protocols TLSv1.2 TLSv1.3;\r\n    ssl_prefer_server_ciphers on;\r\n\r\n    # --- 服务器配置 ---\r\n\r\n    # 1. 禁止通过 IP 直接访问 (防止被恶意扫描)\r\n    server {\r\n        listen 80 default_server;\r\n        listen [::]:80 default_server;\r\n        server_name _;\r\n        return 403;\r\n    }\r\n\r\n    # 2. 主站点配置 (HTTP -\u003e HTTPS 通常由 Cloudflare 处理，这里配置监听即可)\r\n    # 如果使用了 Origin CA 证书，建议配置 SSL 监听\r\n    server {\r\n        listen 80;\r\n        listen 443 ssl http2;\r\n        server_name neotalks.org; # 替换为你的域名\r\n\r\n        # SSL 证书路径\r\n        ssl_certificate     /etc/nginx/ssl/origin.pem;\r\n        ssl_certificate_key /etc/nginx/ssl/origin.key;\r\n\r\n        # 前端页面 (Next.js)\r\n        location / {\r\n            proxy_pass http://localhost:3000; # 对应 Docker 端口\r\n            proxy_http_version 1.1;\r\n            proxy_set_header Host $host;\r\n            proxy_set_header X-Real-IP $remote_addr;\r\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\r\n            proxy_set_header X-Forwarded-Proto $scheme;\r\n            proxy_cache_bypass $http_upgrade;\r\n        }\r\n\r\n        # 后端 API (NestJS)\r\n        location /api/ {\r\n            proxy_pass http://127.0.0.1:3001/; # 对应 Docker 端口\r\n            proxy_set_header Host $host;\r\n            proxy_set_header X-Real-IP $remote_addr;\r\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\r\n            proxy_set_header X-NginX-Proxy true;\r\n        }\r\n    }\r\n}\r\n```\r\n\r\n配置完成后，记得测试并重启 Nginx：\r\n\r\n```bash\r\nsudo nginx -t   # 测试配置是否有语法错误\r\nsudo systemctl reload nginx # 重载配置\r\n```\r\n\r\n到此，你的网站就已经部署完成了。下面是欣赏环节。\r\n\r\n![](https://img.neotalks.org/2025/12/4a859e155235b05f8de9cf580d0224e8.png)\r\n\r\n![](https://img.neotalks.org/2025/12/0af416f3bc2b24d230d86250f900a293.png)\r\n\r\n![](https://img.neotalks.org/2025/12/a5f7e23375858295125c23ecf183616e.png)"])</script><script>self.__next_f.push([1,"c:[\"$\",\"$L18\",null,{\"data\":{\"articles\":[{\"id\":22,\"title\":\"Arch Linux 安装与美化终极指南：Hyprland\",\"status\":1,\"content\":\"$19\",\"image\":\"https://img.neotalks.org/2026/02/5782054664c31d38eab44aa4c413a50a.gif\",\"HeadImg\":\"https://img.neotalks.org/2026/02/a6a1d0531dfd3d7cc3eedf6849aa95cb.png\",\"createdAt\":\"2026-02-28T03:49:23.212Z\",\"updatedAt\":\"2026-02-28T03:49:23.212Z\",\"tags\":[{\"id\":7,\"name\":\"arch\",\"createdAt\":\"2026-01-03T11:43:48.050Z\",\"updatedAt\":\"2026-01-03T11:43:48.050Z\"},{\"id\":9,\"name\":\"极客\",\"createdAt\":\"2026-01-03T11:44:07.845Z\",\"updatedAt\":\"2026-01-03T11:44:07.845Z\"}]},{\"id\":21,\"title\":\"公网IP安全指南：用 V2Ray 实现“单端口复用”，给你的NAS和远程桌面穿上隐身衣\",\"status\":1,\"content\":\"$1a\",\"image\":\"https://img.neotalks.org/2026/02/11930194faae066907dca28046f29e7a.png\",\"HeadImg\":\"\",\"createdAt\":\"2026-02-07T02:20:23.204Z\",\"updatedAt\":\"2026-02-07T02:20:51.625Z\",\"tags\":[{\"id\":8,\"name\":\"服务器\",\"createdAt\":\"2026-01-03T11:43:57.216Z\",\"updatedAt\":\"2026-01-03T11:43:57.216Z\"},{\"id\":9,\"name\":\"极客\",\"createdAt\":\"2026-01-03T11:44:07.845Z\",\"updatedAt\":\"2026-01-03T11:44:07.845Z\"}]},{\"id\":20,\"title\":\"0成本搭建私人影视库｜告别会员费，NAS秒变追剧神器\",\"status\":1,\"content\":\"$1b\",\"image\":\"https://img.neotalks.org/2026/01/9a668590c3c646e5ff3cf83731a3aeb9.png\",\"HeadImg\":\"\",\"createdAt\":\"2026-02-03T14:58:18.827Z\",\"updatedAt\":\"2026-02-03T14:58:18.827Z\",\"tags\":[{\"id\":8,\"name\":\"服务器\",\"createdAt\":\"2026-01-03T11:43:57.216Z\",\"updatedAt\":\"2026-01-03T11:43:57.216Z\"},{\"id\":9,\"name\":\"极客\",\"createdAt\":\"2026-01-03T11:44:07.845Z\",\"updatedAt\":\"2026-01-03T11:44:07.845Z\"}]},{\"id\":19,\"title\":\"codcompanion.nvim配置教程\",\"status\":1,\"content\":\"$1c\",\"image\":\"https://img.neotalks.org/2026/01/b7be49b88ef6994bc0daf22e40374f4c.png\",\"HeadImg\":\"\",\"createdAt\":\"2026-01-18T03:28:42.516Z\",\"updatedAt\":\"2026-01-18T03:28:42.516Z\",\"tags\":[{\"id\":9,\"name\":\"极客\",\"createdAt\":\"2026-01-03T11:44:07.845Z\",\"updatedAt\":\"2026-01-03T11:44:07.845Z\"},{\"id\":10,\"name\":\"vim\",\"createdAt\":\"2026-01-12T11:35:42.682Z\",\"updatedAt\":\"2026-01-12T11:35:42.682Z\"}]},{\"id\":18,\"title\":\"旧电脑别扔！我花10分钟把它变成24小时下载机，从此告别龟速\",\"status\":1,\"content\":\"$1d\",\"image\":\"https://img.neotalks.org/2026/01/a5f04d10688a33bc116ad9df67f7e0cf.png\",\"HeadImg\":\"\",\"createdAt\":\"2026-01-16T13:57:25.428Z\",\"updatedAt\":\"2026-01-16T13:57:25.428Z\",\"tags\":[{\"id\":9,\"name\":\"极客\",\"createdAt\":\"2026-01-03T11:44:07.845Z\",\"updatedAt\":\"2026-01-03T11:44:07.845Z\"}]},{\"id\":17,\"title\":\"告别 VS Code！2026 版 NeoVim 配置全攻略：30分钟打造 AI 编程神器\",\"status\":1,\"content\":\"$1e\",\"image\":\"https://img.neotalks.org/2026/01/937e8d0149eab51386b51e2e8d34387b.png\",\"HeadImg\":\"https://img.neotalks.org/2026/01/937e8d0149eab51386b51e2e8d34387b.png\",\"createdAt\":\"2026-01-12T11:35:28.641Z\",\"updatedAt\":\"2026-01-12T11:43:52.387Z\",\"tags\":[{\"id\":9,\"name\":\"极客\",\"createdAt\":\"2026-01-03T11:44:07.845Z\",\"updatedAt\":\"2026-01-03T11:44:07.845Z\"},{\"id\":10,\"name\":\"vim\",\"createdAt\":\"2026-01-12T11:35:42.682Z\",\"updatedAt\":\"2026-01-12T11:35:42.682Z\"}]},{\"id\":16,\"title\":\"劝退！90%的人买NAS都在吃灰，这个“零成本”方案才是家庭影音的终极答案 🚀\",\"status\":1,\"content\":\"$1f\",\"image\":\"https://img.neotalks.org/2026/01/0613ba1ea817a50dc48d4dbca416d310.png\",\"HeadImg\":\"\",\"createdAt\":\"2026-01-08T14:47:24.446Z\",\"updatedAt\":\"2026-01-08T14:47:24.446Z\",\"tags\":[{\"id\":7,\"name\":\"arch\",\"createdAt\":\"2026-01-03T11:43:48.050Z\",\"updatedAt\":\"2026-01-03T11:43:48.050Z\"},{\"id\":8,\"name\":\"服务器\",\"createdAt\":\"2026-01-03T11:43:57.216Z\",\"updatedAt\":\"2026-01-03T11:43:57.216Z\"},{\"id\":9,\"name\":\"极客\",\"createdAt\":\"2026-01-03T11:44:07.845Z\",\"updatedAt\":\"2026-01-03T11:44:07.845Z\"}]},{\"id\":15,\"title\":\"告别付费软件！用Python一键批量压缩图片\",\"status\":1,\"content\":\"$20\",\"image\":\"https://img.neotalks.org/2026/01/44ec766fe8a7503e27b1bc0de9bbc98b.png\",\"HeadImg\":\"\",\"createdAt\":\"2026-01-07T11:22:18.924Z\",\"updatedAt\":\"2026-01-07T11:22:18.924Z\",\"tags\":[{\"id\":2,\"name\":\"python\",\"createdAt\":\"2025-12-24T14:53:33.617Z\",\"updatedAt\":\"2025-12-24T14:53:33.617Z\"},{\"id\":9,\"name\":\"极客\",\"createdAt\":\"2026-01-03T11:44:07.845Z\",\"updatedAt\":\"2026-01-03T11:44:07.845Z\"}]},{\"id\":13,\"title\":\"老旧电脑不要扔！做一台自己的服务器\",\"status\":1,\"content\":\"$21\",\"image\":\"https://img.neotalks.org/2026/01/13d52c899c9753b77734405fe5f21d6e.jpg\",\"HeadImg\":\"\",\"createdAt\":\"2026-01-03T11:44:54.565Z\",\"updatedAt\":\"2026-01-04T13:14:07.642Z\",\"tags\":[{\"id\":7,\"name\":\"arch\",\"createdAt\":\"2026-01-03T11:43:48.050Z\",\"updatedAt\":\"2026-01-03T11:43:48.050Z\"},{\"id\":8,\"name\":\"服务器\",\"createdAt\":\"2026-01-03T11:43:57.216Z\",\"updatedAt\":\"2026-01-03T11:43:57.216Z\"},{\"id\":9,\"name\":\"极客\",\"createdAt\":\"2026-01-03T11:44:07.845Z\",\"updatedAt\":\"2026-01-03T11:44:07.845Z\"}]},{\"id\":12,\"title\":\"自建网站全流程\",\"status\":1,\"content\":\"$22\",\"image\":\"https://img.neotalks.org/2025/12/f0d8d0b57c18d1b1280c6fcdfd13f894.png\",\"HeadImg\":\"https://img.neotalks.org/2025/12/d2b5c8dcb2966dd69fa3ff7cb1a5be17.jpg\",\"createdAt\":\"2025-12-27T11:51:29.661Z\",\"updatedAt\":\"2025-12-27T11:51:37.281Z\",\"tags\":[{\"id\":5,\"name\":\"web\",\"createdAt\":\"2025-12-27T11:50:28.624Z\",\"updatedAt\":\"2025-12-27T11:50:28.624Z\"},{\"id\":6,\"name\":\"typescript\",\"createdAt\":\"2025-12-27T11:50:38.215Z\",\"updatedAt\":\"2025-12-27T11:50:38.215Z\"}]}],\"total\":12},\"urlPrefix\":\"articles\"}]\n"])</script></body></html>