[{"data":1,"prerenderedAt":1267},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fmonitoring-logging":3},{"doc":4,"prev":1233,"next":1240,"resolvedType":8,"readingMinutes":91,"audience":1244,"checklist":1248,"related":1252},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fmonitoring-logging","监控与日志","服务器监控工具、日志管理、Uptime 监控与告警配置","article",null,"infra-deployment","服务器与部署","2026-02-27","i-carbon-cloud",{"type":15,"value":16,"toc":1204},"minimark",[17,20,24,28,44,47,52,132,136,139,189,193,197,200,291,315,318,333,336,340,442,445,557,561,564,672,675,679,810,814,830,902,929,932,935,1082,1085,1112,1115,1118,1135,1138,1142,1145,1149,1152,1156,1159,1200],[18,19,6],"h1",{"id":6},[21,22,23],"p",{},"监控和日志的目标不是“装更多面板”，而是让你在出问题时能更快回答三个问题：哪里坏了、什么时候开始坏、影响范围有多大。",[25,26,27],"h2",{"id":27},"推荐落地顺序",[29,30,31,35,38,41],"ol",{},[32,33,34],"li",{},"先有最基础的 uptime 监控",[32,36,37],{},"再补关键服务日志查看方式",[32,39,40],{},"再看进程守护、重启和告警",[32,42,43],{},"最后才是仪表盘、聚合和更复杂的可观测性栈",[25,45,46],{"id":46},"系统监控",[48,49,51],"h3",{"id":50},"htop-btop","htop \u002F btop",[53,54,59],"pre",{"className":55,"code":56,"language":57,"meta":58,"style":58},"language-bash shiki shiki-themes github-light github-dark","# 安装\napt install htop -y\n# 或更现代的 btop\napt install btop -y\n\n# 运行\nhtop\nbtop\n","bash","",[60,61,62,71,89,95,107,114,120,126],"code",{"__ignoreMap":58},[63,64,67],"span",{"class":65,"line":66},"line",1,[63,68,70],{"class":69},"sJ8bj","# 安装\n",[63,72,74,78,82,85],{"class":65,"line":73},2,[63,75,77],{"class":76},"sScJk","apt",[63,79,81],{"class":80},"sZZnC"," install",[63,83,84],{"class":80}," htop",[63,86,88],{"class":87},"sj4cs"," -y\n",[63,90,92],{"class":65,"line":91},3,[63,93,94],{"class":69},"# 或更现代的 btop\n",[63,96,98,100,102,105],{"class":65,"line":97},4,[63,99,77],{"class":76},[63,101,81],{"class":80},[63,103,104],{"class":80}," btop",[63,106,88],{"class":87},[63,108,110],{"class":65,"line":109},5,[63,111,113],{"emptyLinePlaceholder":112},true,"\n",[63,115,117],{"class":65,"line":116},6,[63,118,119],{"class":69},"# 运行\n",[63,121,123],{"class":65,"line":122},7,[63,124,125],{"class":76},"htop\n",[63,127,129],{"class":65,"line":128},8,[63,130,131],{"class":76},"btop\n",[48,133,135],{"id":134},"glances","Glances",[21,137,138],{},"跨平台系统监控，支持 Web 界面。",[53,140,142],{"className":55,"code":141,"language":57,"meta":58,"style":58},"pip install glances\n\n# 终端模式\nglances\n\n# Web 模式\nglances -w\n# 访问 http:\u002F\u002Flocalhost:61208\n",[60,143,144,154,158,163,168,172,177,184],{"__ignoreMap":58},[63,145,146,149,151],{"class":65,"line":66},[63,147,148],{"class":76},"pip",[63,150,81],{"class":80},[63,152,153],{"class":80}," glances\n",[63,155,156],{"class":65,"line":73},[63,157,113],{"emptyLinePlaceholder":112},[63,159,160],{"class":65,"line":91},[63,161,162],{"class":69},"# 终端模式\n",[63,164,165],{"class":65,"line":97},[63,166,167],{"class":76},"glances\n",[63,169,170],{"class":65,"line":109},[63,171,113],{"emptyLinePlaceholder":112},[63,173,174],{"class":65,"line":116},[63,175,176],{"class":69},"# Web 模式\n",[63,178,179,181],{"class":65,"line":122},[63,180,134],{"class":76},[63,182,183],{"class":87}," -w\n",[63,185,186],{"class":65,"line":128},[63,187,188],{"class":69},"# 访问 http:\u002F\u002Flocalhost:61208\n",[25,190,192],{"id":191},"uptime-监控","Uptime 监控",[48,194,196],{"id":195},"uptime-kuma","Uptime Kuma",[21,198,199],{},"自托管的监控工具，支持 HTTP、TCP、Ping 等多种监控方式。",[53,201,205],{"className":202,"code":203,"language":204,"meta":58,"style":58},"language-yaml shiki shiki-themes github-light github-dark","# docker-compose.yml\nservices:\n  uptime-kuma:\n    image: louislam\u002Fuptime-kuma:1\n    container_name: uptime-kuma\n    restart: unless-stopped\n    ports:\n      - \"3001:3001\"\n    volumes:\n      - .\u002Fdata:\u002Fapp\u002Fdata\n","yaml",[60,206,207,212,222,229,240,250,260,267,275,283],{"__ignoreMap":58},[63,208,209],{"class":65,"line":66},[63,210,211],{"class":69},"# docker-compose.yml\n",[63,213,214,218],{"class":65,"line":73},[63,215,217],{"class":216},"s9eBZ","services",[63,219,221],{"class":220},"sVt8B",":\n",[63,223,224,227],{"class":65,"line":91},[63,225,226],{"class":216},"  uptime-kuma",[63,228,221],{"class":220},[63,230,231,234,237],{"class":65,"line":97},[63,232,233],{"class":216},"    image",[63,235,236],{"class":220},": ",[63,238,239],{"class":80},"louislam\u002Fuptime-kuma:1\n",[63,241,242,245,247],{"class":65,"line":109},[63,243,244],{"class":216},"    container_name",[63,246,236],{"class":220},[63,248,249],{"class":80},"uptime-kuma\n",[63,251,252,255,257],{"class":65,"line":116},[63,253,254],{"class":216},"    restart",[63,256,236],{"class":220},[63,258,259],{"class":80},"unless-stopped\n",[63,261,262,265],{"class":65,"line":122},[63,263,264],{"class":216},"    ports",[63,266,221],{"class":220},[63,268,269,272],{"class":65,"line":128},[63,270,271],{"class":220},"      - ",[63,273,274],{"class":80},"\"3001:3001\"\n",[63,276,278,281],{"class":65,"line":277},9,[63,279,280],{"class":216},"    volumes",[63,282,221],{"class":220},[63,284,286,288],{"class":65,"line":285},10,[63,287,271],{"class":220},[63,289,290],{"class":80},".\u002Fdata:\u002Fapp\u002Fdata\n",[53,292,294],{"className":55,"code":293,"language":57,"meta":58,"style":58},"docker compose up -d\n# 访问 http:\u002F\u002Flocalhost:3001\n",[60,295,296,310],{"__ignoreMap":58},[63,297,298,301,304,307],{"class":65,"line":66},[63,299,300],{"class":76},"docker",[63,302,303],{"class":80}," compose",[63,305,306],{"class":80}," up",[63,308,309],{"class":87}," -d\n",[63,311,312],{"class":65,"line":73},[63,313,314],{"class":69},"# 访问 http:\u002F\u002Flocalhost:3001\n",[21,316,317],{},"功能：",[319,320,321,324,327,330],"ul",{},[32,322,323],{},"HTTP\u002FHTTPS、TCP、Ping、DNS 监控",[32,325,326],{},"通知：Telegram、Discord、邮件、Webhook",[32,328,329],{},"状态页面",[32,331,332],{},"多语言支持",[25,334,335],{"id":335},"日志管理",[48,337,339],{"id":338},"journalctlsystemd","journalctl（systemd）",[53,341,343],{"className":55,"code":342,"language":57,"meta":58,"style":58},"# 查看服务日志\njournalctl -u nginx -f          # 实时跟踪\njournalctl -u nginx --since today\njournalctl -u nginx --since \"2026-02-01\" --until \"2026-02-27\"\n\n# 查看系统日志\njournalctl -p err               # 只看错误\njournalctl --disk-usage         # 日志占用空间\njournalctl --vacuum-size=500M   # 清理到 500M\n",[60,344,345,350,367,381,400,404,409,422,432],{"__ignoreMap":58},[63,346,347],{"class":65,"line":66},[63,348,349],{"class":69},"# 查看服务日志\n",[63,351,352,355,358,361,364],{"class":65,"line":73},[63,353,354],{"class":76},"journalctl",[63,356,357],{"class":87}," -u",[63,359,360],{"class":80}," nginx",[63,362,363],{"class":87}," -f",[63,365,366],{"class":69},"          # 实时跟踪\n",[63,368,369,371,373,375,378],{"class":65,"line":91},[63,370,354],{"class":76},[63,372,357],{"class":87},[63,374,360],{"class":80},[63,376,377],{"class":87}," --since",[63,379,380],{"class":80}," today\n",[63,382,383,385,387,389,391,394,397],{"class":65,"line":97},[63,384,354],{"class":76},[63,386,357],{"class":87},[63,388,360],{"class":80},[63,390,377],{"class":87},[63,392,393],{"class":80}," \"2026-02-01\"",[63,395,396],{"class":87}," --until",[63,398,399],{"class":80}," \"2026-02-27\"\n",[63,401,402],{"class":65,"line":109},[63,403,113],{"emptyLinePlaceholder":112},[63,405,406],{"class":65,"line":116},[63,407,408],{"class":69},"# 查看系统日志\n",[63,410,411,413,416,419],{"class":65,"line":122},[63,412,354],{"class":76},[63,414,415],{"class":87}," -p",[63,417,418],{"class":80}," err",[63,420,421],{"class":69},"               # 只看错误\n",[63,423,424,426,429],{"class":65,"line":128},[63,425,354],{"class":76},[63,427,428],{"class":87}," --disk-usage",[63,430,431],{"class":69},"         # 日志占用空间\n",[63,433,434,436,439],{"class":65,"line":277},[63,435,354],{"class":76},[63,437,438],{"class":87}," --vacuum-size=500M",[63,440,441],{"class":69},"   # 清理到 500M\n",[48,443,444],{"id":444},"日志文件常用操作",[53,446,448],{"className":55,"code":447,"language":57,"meta":58,"style":58},"# 实时查看\ntail -f \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\n\n# 搜索错误\ngrep -i error \u002Fvar\u002Flog\u002Fsyslog\n\n# 统计访问 IP\nawk '{print $1}' \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log | sort | uniq -c | sort -rn | head 20\n\n# 按时间过滤\nawk '\u002F27\\\u002FFeb\\\u002F2026\u002F' \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\n",[60,449,450,455,465,469,474,488,492,497,538,542,547],{"__ignoreMap":58},[63,451,452],{"class":65,"line":66},[63,453,454],{"class":69},"# 实时查看\n",[63,456,457,460,462],{"class":65,"line":73},[63,458,459],{"class":76},"tail",[63,461,363],{"class":87},[63,463,464],{"class":80}," \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\n",[63,466,467],{"class":65,"line":91},[63,468,113],{"emptyLinePlaceholder":112},[63,470,471],{"class":65,"line":97},[63,472,473],{"class":69},"# 搜索错误\n",[63,475,476,479,482,485],{"class":65,"line":109},[63,477,478],{"class":76},"grep",[63,480,481],{"class":87}," -i",[63,483,484],{"class":80}," error",[63,486,487],{"class":80}," \u002Fvar\u002Flog\u002Fsyslog\n",[63,489,490],{"class":65,"line":116},[63,491,113],{"emptyLinePlaceholder":112},[63,493,494],{"class":65,"line":122},[63,495,496],{"class":69},"# 统计访问 IP\n",[63,498,499,502,505,508,512,515,517,520,523,525,527,530,532,535],{"class":65,"line":128},[63,500,501],{"class":76},"awk",[63,503,504],{"class":80}," '{print $1}'",[63,506,507],{"class":80}," \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log",[63,509,511],{"class":510},"szBVR"," |",[63,513,514],{"class":76}," sort",[63,516,511],{"class":510},[63,518,519],{"class":76}," uniq",[63,521,522],{"class":87}," -c",[63,524,511],{"class":510},[63,526,514],{"class":76},[63,528,529],{"class":87}," -rn",[63,531,511],{"class":510},[63,533,534],{"class":76}," head",[63,536,537],{"class":87}," 20\n",[63,539,540],{"class":65,"line":277},[63,541,113],{"emptyLinePlaceholder":112},[63,543,544],{"class":65,"line":285},[63,545,546],{"class":69},"# 按时间过滤\n",[63,548,550,552,555],{"class":65,"line":549},11,[63,551,501],{"class":76},[63,553,554],{"class":80}," '\u002F27\\\u002FFeb\\\u002F2026\u002F'",[63,556,464],{"class":80},[48,558,560],{"id":559},"loki-grafana","Loki + Grafana",[21,562,563],{},"轻量级日志聚合方案。",[53,565,567],{"className":202,"code":566,"language":204,"meta":58,"style":58},"# docker-compose.yml\nservices:\n  loki:\n    image: grafana\u002Floki:latest\n    ports:\n      - \"3100:3100\"\n    volumes:\n      - .\u002Floki-data:\u002Floki\n\n  grafana:\n    image: grafana\u002Fgrafana:latest\n    ports:\n      - \"3000:3000\"\n    environment:\n      - GF_SECURITY_ADMIN_PASSWORD=admin\n",[60,568,569,573,579,586,595,601,608,614,621,625,632,641,648,656,664],{"__ignoreMap":58},[63,570,571],{"class":65,"line":66},[63,572,211],{"class":69},[63,574,575,577],{"class":65,"line":73},[63,576,217],{"class":216},[63,578,221],{"class":220},[63,580,581,584],{"class":65,"line":91},[63,582,583],{"class":216},"  loki",[63,585,221],{"class":220},[63,587,588,590,592],{"class":65,"line":97},[63,589,233],{"class":216},[63,591,236],{"class":220},[63,593,594],{"class":80},"grafana\u002Floki:latest\n",[63,596,597,599],{"class":65,"line":109},[63,598,264],{"class":216},[63,600,221],{"class":220},[63,602,603,605],{"class":65,"line":116},[63,604,271],{"class":220},[63,606,607],{"class":80},"\"3100:3100\"\n",[63,609,610,612],{"class":65,"line":122},[63,611,280],{"class":216},[63,613,221],{"class":220},[63,615,616,618],{"class":65,"line":128},[63,617,271],{"class":220},[63,619,620],{"class":80},".\u002Floki-data:\u002Floki\n",[63,622,623],{"class":65,"line":277},[63,624,113],{"emptyLinePlaceholder":112},[63,626,627,630],{"class":65,"line":285},[63,628,629],{"class":216},"  grafana",[63,631,221],{"class":220},[63,633,634,636,638],{"class":65,"line":549},[63,635,233],{"class":216},[63,637,236],{"class":220},[63,639,640],{"class":80},"grafana\u002Fgrafana:latest\n",[63,642,644,646],{"class":65,"line":643},12,[63,645,264],{"class":216},[63,647,221],{"class":220},[63,649,651,653],{"class":65,"line":650},13,[63,652,271],{"class":220},[63,654,655],{"class":80},"\"3000:3000\"\n",[63,657,659,662],{"class":65,"line":658},14,[63,660,661],{"class":216},"    environment",[63,663,221],{"class":220},[63,665,667,669],{"class":65,"line":666},15,[63,668,271],{"class":220},[63,670,671],{"class":80},"GF_SECURITY_ADMIN_PASSWORD=admin\n",[25,673,674],{"id":674},"进程管理",[48,676,678],{"id":677},"pm2nodejs","PM2（Node.js）",[53,680,682],{"className":55,"code":681,"language":57,"meta":58,"style":58},"npm install -g pm2\n\npm2 start app.js --name myapp\npm2 list                        # 查看进程\npm2 logs myapp                  # 查看日志\npm2 monit                       # 监控面板\npm2 restart myapp               # 重启\npm2 stop myapp                  # 停止\npm2 delete myapp                # 删除\n\n# 开机自启\npm2 startup\npm2 save\n",[60,683,684,697,701,718,728,741,751,763,775,787,791,796,803],{"__ignoreMap":58},[63,685,686,689,691,694],{"class":65,"line":66},[63,687,688],{"class":76},"npm",[63,690,81],{"class":80},[63,692,693],{"class":87}," -g",[63,695,696],{"class":80}," pm2\n",[63,698,699],{"class":65,"line":73},[63,700,113],{"emptyLinePlaceholder":112},[63,702,703,706,709,712,715],{"class":65,"line":91},[63,704,705],{"class":76},"pm2",[63,707,708],{"class":80}," start",[63,710,711],{"class":80}," app.js",[63,713,714],{"class":87}," --name",[63,716,717],{"class":80}," myapp\n",[63,719,720,722,725],{"class":65,"line":97},[63,721,705],{"class":76},[63,723,724],{"class":80}," list",[63,726,727],{"class":69},"                        # 查看进程\n",[63,729,730,732,735,738],{"class":65,"line":109},[63,731,705],{"class":76},[63,733,734],{"class":80}," logs",[63,736,737],{"class":80}," myapp",[63,739,740],{"class":69},"                  # 查看日志\n",[63,742,743,745,748],{"class":65,"line":116},[63,744,705],{"class":76},[63,746,747],{"class":80}," monit",[63,749,750],{"class":69},"                       # 监控面板\n",[63,752,753,755,758,760],{"class":65,"line":122},[63,754,705],{"class":76},[63,756,757],{"class":80}," restart",[63,759,737],{"class":80},[63,761,762],{"class":69},"               # 重启\n",[63,764,765,767,770,772],{"class":65,"line":128},[63,766,705],{"class":76},[63,768,769],{"class":80}," stop",[63,771,737],{"class":80},[63,773,774],{"class":69},"                  # 停止\n",[63,776,777,779,782,784],{"class":65,"line":277},[63,778,705],{"class":76},[63,780,781],{"class":80}," delete",[63,783,737],{"class":80},[63,785,786],{"class":69},"                # 删除\n",[63,788,789],{"class":65,"line":285},[63,790,113],{"emptyLinePlaceholder":112},[63,792,793],{"class":65,"line":549},[63,794,795],{"class":69},"# 开机自启\n",[63,797,798,800],{"class":65,"line":643},[63,799,705],{"class":76},[63,801,802],{"class":80}," startup\n",[63,804,805,807],{"class":65,"line":650},[63,806,705],{"class":76},[63,808,809],{"class":80}," save\n",[48,811,813],{"id":812},"supervisorpython通用","Supervisor（Python\u002F通用）",[53,815,817],{"className":55,"code":816,"language":57,"meta":58,"style":58},"apt install supervisor -y\n",[60,818,819],{"__ignoreMap":58},[63,820,821,823,825,828],{"class":65,"line":66},[63,822,77],{"class":76},[63,824,81],{"class":80},[63,826,827],{"class":80}," supervisor",[63,829,88],{"class":87},[53,831,835],{"className":832,"code":833,"language":834,"meta":58,"style":58},"language-ini shiki shiki-themes github-light github-dark","; \u002Fetc\u002Fsupervisor\u002Fconf.d\u002Fmyapp.conf\n[program:myapp]\ncommand=\u002Fusr\u002Fbin\u002Fpython3 \u002Fopt\u002Fapp\u002Fmain.py\ndirectory=\u002Fopt\u002Fapp\nuser=www-data\nautostart=true\nautorestart=true\nstdout_logfile=\u002Fvar\u002Flog\u002Fmyapp.log\nstderr_logfile=\u002Fvar\u002Flog\u002Fmyapp-error.log\n","ini",[60,836,837,842,847,855,863,871,879,886,894],{"__ignoreMap":58},[63,838,839],{"class":65,"line":66},[63,840,841],{"class":69},"; \u002Fetc\u002Fsupervisor\u002Fconf.d\u002Fmyapp.conf\n",[63,843,844],{"class":65,"line":73},[63,845,846],{"class":76},"[program:myapp]\n",[63,848,849,852],{"class":65,"line":91},[63,850,851],{"class":510},"command",[63,853,854],{"class":220},"=\u002Fusr\u002Fbin\u002Fpython3 \u002Fopt\u002Fapp\u002Fmain.py\n",[63,856,857,860],{"class":65,"line":97},[63,858,859],{"class":510},"directory",[63,861,862],{"class":220},"=\u002Fopt\u002Fapp\n",[63,864,865,868],{"class":65,"line":109},[63,866,867],{"class":510},"user",[63,869,870],{"class":220},"=www-data\n",[63,872,873,876],{"class":65,"line":116},[63,874,875],{"class":510},"autostart",[63,877,878],{"class":220},"=true\n",[63,880,881,884],{"class":65,"line":122},[63,882,883],{"class":510},"autorestart",[63,885,878],{"class":220},[63,887,888,891],{"class":65,"line":128},[63,889,890],{"class":510},"stdout_logfile",[63,892,893],{"class":220},"=\u002Fvar\u002Flog\u002Fmyapp.log\n",[63,895,896,899],{"class":65,"line":277},[63,897,898],{"class":510},"stderr_logfile",[63,900,901],{"class":220},"=\u002Fvar\u002Flog\u002Fmyapp-error.log\n",[53,903,905],{"className":55,"code":904,"language":57,"meta":58,"style":58},"supervisorctl reread\nsupervisorctl update\nsupervisorctl status\n",[60,906,907,915,922],{"__ignoreMap":58},[63,908,909,912],{"class":65,"line":66},[63,910,911],{"class":76},"supervisorctl",[63,913,914],{"class":80}," reread\n",[63,916,917,919],{"class":65,"line":73},[63,918,911],{"class":76},[63,920,921],{"class":80}," update\n",[63,923,924,926],{"class":65,"line":91},[63,925,911],{"class":76},[63,927,928],{"class":80}," status\n",[25,930,931],{"id":931},"告警",[48,933,934],{"id":934},"简单脚本告警",[53,936,938],{"className":55,"code":937,"language":57,"meta":58,"style":58},"#!\u002Fbin\u002Fbash\n# check-disk.sh\nTHRESHOLD=90\nUSAGE=$(df \u002F | tail -1 | awk '{print $5}' | tr -d '%')\n\nif [ \"$USAGE\" -gt \"$THRESHOLD\" ]; then\n  curl -s -X POST \"https:\u002F\u002Fapi.telegram.org\u002Fbot\u003CTOKEN>\u002FsendMessage\" \\\n    -d \"chat_id=\u003CCHAT_ID>&text=⚠️ 磁盘使用率 ${USAGE}%\"\nfi\n",[60,939,940,945,950,961,1007,1011,1044,1064,1077],{"__ignoreMap":58},[63,941,942],{"class":65,"line":66},[63,943,944],{"class":69},"#!\u002Fbin\u002Fbash\n",[63,946,947],{"class":65,"line":73},[63,948,949],{"class":69},"# check-disk.sh\n",[63,951,952,955,958],{"class":65,"line":91},[63,953,954],{"class":220},"THRESHOLD",[63,956,957],{"class":510},"=",[63,959,960],{"class":80},"90\n",[63,962,963,966,968,971,974,977,979,982,985,987,990,993,995,998,1001,1004],{"class":65,"line":97},[63,964,965],{"class":220},"USAGE",[63,967,957],{"class":510},[63,969,970],{"class":220},"$(",[63,972,973],{"class":76},"df",[63,975,976],{"class":80}," \u002F",[63,978,511],{"class":510},[63,980,981],{"class":76}," tail",[63,983,984],{"class":87}," -1",[63,986,511],{"class":510},[63,988,989],{"class":76}," awk",[63,991,992],{"class":80}," '{print $5}'",[63,994,511],{"class":510},[63,996,997],{"class":76}," tr",[63,999,1000],{"class":87}," -d",[63,1002,1003],{"class":80}," '%'",[63,1005,1006],{"class":220},")\n",[63,1008,1009],{"class":65,"line":109},[63,1010,113],{"emptyLinePlaceholder":112},[63,1012,1013,1016,1019,1022,1025,1027,1030,1033,1036,1038,1041],{"class":65,"line":116},[63,1014,1015],{"class":510},"if",[63,1017,1018],{"class":220}," [ ",[63,1020,1021],{"class":80},"\"",[63,1023,1024],{"class":220},"$USAGE",[63,1026,1021],{"class":80},[63,1028,1029],{"class":510}," -gt",[63,1031,1032],{"class":80}," \"",[63,1034,1035],{"class":220},"$THRESHOLD",[63,1037,1021],{"class":80},[63,1039,1040],{"class":220}," ]; ",[63,1042,1043],{"class":510},"then\n",[63,1045,1046,1049,1052,1055,1058,1061],{"class":65,"line":122},[63,1047,1048],{"class":76},"  curl",[63,1050,1051],{"class":87}," -s",[63,1053,1054],{"class":87}," -X",[63,1056,1057],{"class":80}," POST",[63,1059,1060],{"class":80}," \"https:\u002F\u002Fapi.telegram.org\u002Fbot\u003CTOKEN>\u002FsendMessage\"",[63,1062,1063],{"class":87}," \\\n",[63,1065,1066,1069,1072,1074],{"class":65,"line":128},[63,1067,1068],{"class":87},"    -d",[63,1070,1071],{"class":80}," \"chat_id=\u003CCHAT_ID>&text=⚠️ 磁盘使用率 ${",[63,1073,965],{"class":220},[63,1075,1076],{"class":80},"}%\"\n",[63,1078,1079],{"class":65,"line":277},[63,1080,1081],{"class":510},"fi\n",[21,1083,1084],{},"配合 cron 定时执行：",[53,1086,1088],{"className":55,"code":1087,"language":57,"meta":58,"style":58},"# 每小时检查一次\n0 * * * * \u002Fopt\u002Fscripts\u002Fcheck-disk.sh\n",[60,1089,1090,1095],{"__ignoreMap":58},[63,1091,1092],{"class":65,"line":66},[63,1093,1094],{"class":69},"# 每小时检查一次\n",[63,1096,1097,1100,1103,1105,1107,1109],{"class":65,"line":73},[63,1098,1099],{"class":76},"0",[63,1101,1102],{"class":87}," *",[63,1104,1102],{"class":87},[63,1106,1102],{"class":87},[63,1108,1102],{"class":87},[63,1110,1111],{"class":80}," \u002Fopt\u002Fscripts\u002Fcheck-disk.sh\n",[25,1113,1114],{"id":1114},"参考链接",[25,1116,1117],{"id":1117},"建议优先监控的内容",[319,1119,1120,1123,1126,1129,1132],{},[32,1121,1122],{},"站点是否可访问",[32,1124,1125],{},"磁盘空间",[32,1127,1128],{},"CPU \u002F 内存异常",[32,1130,1131],{},"关键进程是否退出",[32,1133,1134],{},"证书有效期",[25,1136,1137],{"id":1137},"常见问题",[48,1139,1141],{"id":1140},"有日志但不知道从哪看起","有日志，但不知道从哪看起",[21,1143,1144],{},"先看时间点，再看对应服务，再看错误级别。不要一上来全量翻几十万行日志。",[48,1146,1148],{"id":1147},"服务偶尔挂掉但平时看不出来","服务偶尔挂掉，但平时看不出来",[21,1150,1151],{},"这正是 uptime 监控和告警的价值。没有外部监控时，很多间歇性故障会被错过。",[48,1153,1155],{"id":1154},"要不要一开始就上完整-elk-loki-栈","要不要一开始就上完整 ELK \u002F Loki 栈",[21,1157,1158],{},"不建议。先把最小可用监控做起来，再看是否真的有聚合需求。",[319,1160,1161,1170,1178,1186,1193],{},[32,1162,1163,1169],{},[1164,1165,196],"a",{"href":1166,"rel":1167},"https:\u002F\u002Fgithub.com\u002Flouislam\u002Fuptime-kuma",[1168],"nofollow"," — 自托管监控",[32,1171,1172,1177],{},[1164,1173,1176],{"href":1174,"rel":1175},"https:\u002F\u002Fgrafana.com\u002F",[1168],"Grafana"," — 可视化平台",[32,1179,1180,1185],{},[1164,1181,1184],{"href":1182,"rel":1183},"https:\u002F\u002Fpm2.keymetrics.io\u002F",[1168],"PM2"," — Node.js 进程管理",[32,1187,1188,1192],{},[1164,1189,135],{"href":1190,"rel":1191},"https:\u002F\u002Fnicolargo.github.io\u002Fglances\u002F",[1168]," — 系统监控",[32,1194,1195,1199],{},[1164,1196,1198],{"href":1197},"\u002Fdocs\u002Fdocker-compose-recipes","Docker Compose 常用配置"," — 如果你准备把监控工具作为自建服务跑起来",[1201,1202,1203],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":58,"searchDepth":73,"depth":73,"links":1205},[1206,1207,1211,1214,1219,1223,1226,1227,1228],{"id":27,"depth":73,"text":27},{"id":46,"depth":73,"text":46,"children":1208},[1209,1210],{"id":50,"depth":91,"text":51},{"id":134,"depth":91,"text":135},{"id":191,"depth":73,"text":192,"children":1212},[1213],{"id":195,"depth":91,"text":196},{"id":335,"depth":73,"text":335,"children":1215},[1216,1217,1218],{"id":338,"depth":91,"text":339},{"id":444,"depth":91,"text":444},{"id":559,"depth":91,"text":560},{"id":674,"depth":73,"text":674,"children":1220},[1221,1222],{"id":677,"depth":91,"text":678},{"id":812,"depth":91,"text":813},{"id":931,"depth":73,"text":931,"children":1224},[1225],{"id":934,"depth":91,"text":934},{"id":1114,"depth":73,"text":1114},{"id":1117,"depth":73,"text":1117},{"id":1137,"depth":73,"text":1137,"children":1229},[1230,1231,1232],{"id":1140,"depth":91,"text":1141},{"id":1147,"depth":91,"text":1148},{"id":1154,"depth":91,"text":1155},{"path":1234,"title":1235,"description":1236,"docType":8,"resourceKind":9,"categoryId":1237,"categoryLabel":1238,"updatedAt":12,"publishedAt":12,"icon":1239},"\u002Fdocs\u002Fenv-variables","环境变量管理","dotenv 配置、各平台环境变量设置、.env 文件规范与安全实践","dev-environment","开发环境","i-carbon-code",{"path":1241,"title":1242,"description":1243,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fcontainer-orchestration","容器编排入门","Docker Swarm 与 Kubernetes 基础概念、常用命令与本地开发环境",[1245,1246,1247],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1249,1250,1251],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1253,1258,1262,1263],{"path":1254,"title":1255,"description":1256,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1257,"publishedAt":1257,"icon":13},"\u002Fdocs\u002Fcloudflare-pages-deploy","Cloudflare Pages 部署指南","Cloudflare Pages 项目部署、自定义域名、环境变量、重定向与 Functions","2026-02-28",{"path":1259,"title":1260,"description":1261,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1257,"publishedAt":1257,"icon":13},"\u002Fdocs\u002Fs3-storage","S3 对象存储","S3 兼容存储使用、Cloudflare R2、MinIO 自建、rclone 同步与 SDK 集成",{"path":1241,"title":1242,"description":1243,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},{"path":1264,"title":1265,"description":1266,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fci-cd-guide","CI\u002FCD 实践指南","持续集成与部署概念、GitHub Actions 进阶、自动化测试与部署策略",1776215713440]