首页
语音便捷记账
开发服务
关于我
投稿
搜索
1
Android 系统级去广告方案全攻略:从 DNS 到 AdGuard 全覆盖
297 阅读
2
Flow Launcher:Windows上的Spotlight级快速启动器
280 阅读
3
Files:让Windows文件管理焕然一新
242 阅读
4
0 A.D. - 免费开源的古代战争即时战略游戏
231 阅读
5
Super Productivity:开发者的全能任务管理工具
204 阅读
默认分类
软件推荐
建站教程
服务器运维
自建服务
域名专题
深度指南
热点新闻
安卓
windows
登录
搜索
标签搜索
Windows
工具
跨平台
安全
Android
Linux
效率
开源
命令行
服务器
Mac
硬件
清理
开发
建站教程
优化
截图
视频
Nginx
AI
老郑的博客
累计撰写
369
篇文章
累计收到
11
条评论
首页
栏目
默认分类
软件推荐
建站教程
服务器运维
自建服务
域名专题
深度指南
热点新闻
安卓
windows
页面
语音便捷记账
开发服务
关于我
投稿
搜索到
369
篇与
的结果
2026-07-19
自建密码管理器 Vaultwarden
为什么要自建密码管理器?现在谁还没有几十个账号密码?银行、邮箱、社交、购物……用同一个密码不安全,用不同密码又记不住。市面上的密码管理器(1Password、LastPass、Bitwarden)确实好用,但数据存在别人服务器上,心里总有点不踏实。Vaultwarden 是 Bitwarden 的轻量级 Rust 实现,完全兼容 Bitwarden 客户端,一个 Docker 容器就能跑起来,资源占用极低(内存不到 50MB)。系统要求 一台 Linux 服务器(1核512M 就够) 已安装 Docker 和 Docker Compose 一个域名(可选,但强烈建议配置 HTTPS) 部署步骤1. 创建 docker-compose.ymlversion: "3" services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: always ports: - "8080:80" volumes: - ./data:/data environment: - SIGNUPS_ALLOWED=true - WEBSOCKET_ENABLED=true - DOMAIN=https://vw.yourdomain.com - ADMIN_TOKEN=your_admin_token_hereSIGNUPS_ALLOWED=true 允许注册,等你注册完自己的账号后,记得改成 false 关闭注册。ADMIN_TOKEN 用 openssl rand -base64 48 生成一个随机 token,访问 /admin 管理面板用。2. 启动服务docker-compose up -d3. 配置 Nginx 反向代理 + SSLserver { listen 443 ssl; server_name vw.yourdomain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /notifications/hub { proxy_pass http://127.0.0.1:8080; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }4. 注册账号并使用 打开 https://vw.yourdomain.com 点击创建账户注册 登录后,在网页端添加密码,或安装 Bitwarden 客户端/浏览器插件 在客户端设置中,服务器地址填你的域名 客户端全平台支持Vaultwarden 完全兼容 Bitwarden 官方客户端: 平台客户端 Chrome/Edge/FirefoxBitwarden 浏览器扩展 iOSBitwarden App Store AndroidBitwarden Google Play / F-Droid Windows/Mac/LinuxBitwarden Desktop 进阶配置开启 2FA 双重认证登录网页版,设置,两步登录,选择 Authenticator App,扫码绑定。自动备份#!/bin/bash cd /path/to/vaultwarden docker-compose stop tar -czf /backup/vaultwarden-$(date +%Y%m%d).tar.gz data/ docker-compose start find /backup/ -name "vaultwarden-*.tar.gz" -mtime +7 -delete加入 crontab 每日自动备份:0 3 * * * /path/to/backup_vaultwarden.sh常见问题Q: 和官方 Bitwarden 有什么区别?A: Vaultwarden 是社区用 Rust 重写的版本,功能几乎一样,但更轻量。官方版需要 SQL Server + 多个容器,Vaultwarden 一个容器搞定。Q: 免费吗?A: 完全免费开源,没有付费墙,Bitwarden 的高级功能(TOTP、文件附件等)都免费提供。Q: 数据安全吗?A: 数据存在你自己的服务器上,传输使用 HTTPS 加密,数据库文件也是加密的。定期备份即可万无一失。总结有了 Vaultwarden,你再也不用担心密码泄露、服务关停、或者忘记续费。所有密码都在你自己的服务器上,全平台同步,安心又省心。一个 512MB 内存的 VPS 就能流畅运行,强烈推荐!
2026年07月19日
61 阅读
0 评论
0 点赞
2026-07-19
家庭影音中心 Jellyfin 搭建指南
为什么要自建影音中心?你有没有过这种体验:想看的电影在 Netflix 下了架;不同平台各买一个会员,一个月几百块;下载的电影散落在各个硬盘,找起来麻烦。Jellyfin 是完全免费开源的媒体服务器,类似 Plex/Emby,但所有功能免费。搭建后你可以:在任何设备上观看你的电影、电视剧、音乐;自动刮削海报、简介、演员信息;自动转码适配不同设备;支持多用户,给家人分配独立账号;记录观看进度,多设备同步。系统要求 场景CPU内存说明 直接播放(不转码)1核1GB最省资源,客户端解码 轻度转码2核2GB手机/平板观看需要 重度转码(4K转1080P)4核+4GB+需要 Intel QSV 或 NVENC 硬解 Docker Compose 部署version: "3" services: jellyfin: image: jellyfin/jellyfin:latest container_name: jellyfin restart: always ports: - "8096:8096" - "8920:8920" volumes: - ./config:/config - ./cache:/cache - /path/to/movies:/media/movies:ro - /path/to/tvshows:/media/tvshows:ro - /path/to/music:/media/music:ro environment: - TZ=Asia/Shanghai - JELLYFIN_PublishedServerUrl=https://jf.yourdomain.com devices: - /dev/dri:/dev/dri启动:docker-compose up -d,访问 http://your-ip:8096 进入初始化向导:选择中文,创建管理员,添加媒体库,配置元数据语言中文优先。Nginx 反向代理 + HTTPSserver { listen 443 ssl http2; server_name jf.yourdomain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; client_max_body_size 100M; location / { proxy_pass http://127.0.0.1:8096; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_buffering off; } location /socket { proxy_pass http://127.0.0.1:8096; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }客户端全平台支持 平台客户端 Android TVJellyfin Android TV(推荐) 安卓手机Jellyfin Android / Findroid iOS/iPadJellyfin iOS / Swiftfin Windows/Mac/LinuxJellyfin Desktop / 直接浏览器 网页浏览器直接访问 元数据刮削优化编辑 Docker 主机的 /etc/hosts:13.225.103.51 api.themoviedb.org 13.225.103.26 image.tmdb.orgJellyfin 控制台,插件,安装:MetaTube(豆瓣刮削器,中文电影必备)和 Open Subtitles(自动下载字幕)。文件夹命名规范/media/ movies/ 肖申克的救赎 (1994)/ 肖申克的救赎 (1994).mkv Inception (2010)/ Inception (2010).mp4 tvshows/ Breaking Bad/ Season 1/ S01E01.mkv S01E02.mkv Season 2/命名规范 = 更好的刮削匹配率。硬件加速转码有 Intel 核显可开启 QSV 硬解:docker-compose 映射 /dev/dri,Jellyfin 控制台,播放,硬件加速,选择 Intel QuickSync (QSV)。常见问题Q: Jellyfin 和 Plex/Emby 有什么区别?A: Plex 和 Emby 有很多功能需要付费会员(如硬件转码、离线下载),Jellyfin 完全免费开源。Q: 手机端需要付费吗?A: 不需要,Jellyfin 官方客户端完全免费。iOS 上 Swiftfin 也是免费的。Q: 在外网能看吗?A: 配置了 Nginx 反向代理 + 域名后,随时随地都能看。注意上行带宽,建议外网转码到 720p。总结Jellyfin 搭建大概 10 分钟,但能让你彻底告别各个视频会员。配合 PT 下载或者自购蓝光碟,你就能拥有一个私人影视库。而且数据在自己手里,不会突然下架,不会和谐删减,想什么时候看就什么时候看。
2026年07月19日
64 阅读
0 评论
0 点赞
2026-07-19
自建轻量级 Git 服务 Gitea
为什么选择 Gitea?GitHub 虽然好用,但有些场景还是需要私有代码仓库:公司内部代码不想放在公有云;私有项目不想付费 GitHub 团队版;想完全掌控自己的代码数据;需要内网部署的代码托管。GitLab 功能全面但太重了——最低配置要 4GB 内存。而 Gitea 是 Go 语言编写的轻量级 Git 服务,内存占用不到 100MB,树莓派都能跑。Gitea vs GitLab vs Gogs 特性GiteaGitLabGogs 内存占用~80MB~4GB~50MB CI/CD需配合 Drone内置需配合 Drone Docker 镜像大小~50MB~2.5GB~30MB 更新频率月度月度较慢 社区活跃度高高中 Gitea 是 Gogs 的社区 fork,更新更活跃,功能更多。Docker Compose 部署version: "3" services: gitea: image: gitea/gitea:latest container_name: gitea restart: always ports: - "3000:3000" - "2222:22" volumes: - ./data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro environment: - USER_UID=1000 - USER_GID=1000 - GITEA__server__DOMAIN=git.yourdomain.com - GITEA__server__ROOT_URL=https://git.yourdomain.com/ - GITEA__server__SSH_DOMAIN=git.yourdomain.com - GITEA__server__SSH_PORT=2222 - GITEA__database__DB_TYPE=sqlite3 - GITEA__service__DISABLE_REGISTRATION=true使用 SQLite 数据库,无需额外安装 MySQL/PostgreSQL,小团队完全够用。DISABLE_REGISTRATION=true 关闭公开注册,管理员手动创建账号更安全。启动:docker-compose up -d,访问 http://your-ip:3000 进入安装页面。Nginx 反向代理配置server { listen 443 ssl http2; server_name git.yourdomain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; client_max_body_size 512M; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }Git SSH 配置因为 22 端口被宿主机的 SSH 占用,Gitea 的 SSH 映射到了 2222 端口。编辑 ~/.ssh/config:Host git.yourdomain.com HostName git.yourdomain.com Port 2222 User git IdentityFile ~/.ssh/id_ed25519然后就可以像普通 git 一样操作:git clone git@git.yourdomain.com:username/repo.git实用功能1. 创建组织/团队适合小团队使用:创建 Organization,添加成员,设置仓库权限。2. 镜像仓库可以将 GitHub 仓库镜像到 Gitea,定时同步:仓库设置,镜像设置,填入 GitHub 仓库地址,设置同步间隔。3. Webhook 自动部署配合 GitHub Actions 或自写接收脚本:仓库设置,Webhook,添加 URL,选择事件。4. Package RegistryGitea 支持 Docker 镜像仓库和 npm/PyPI 等包管理。备份策略#!/bin/bash cd /path/to/gitea docker exec gitea gitea dump -c /data/gitea/conf/app.ini docker cp gitea:/tmp/gitea-dump-*.zip /backup/ find /backup/ -name "gitea-dump-*.zip" -mtime +7 -deletecrontab 每日备份:0 4 * * * /path/to/backup_gitea.sh常见问题Q: 1核1G 服务器能跑吗?A: 完全没问题。Gitea 用 Go 写的,内存占用 80-150MB,CPU 几乎无感。Q: 能和 CI/CD 配合吗?A: 推荐搭配 Drone CI 或 Woodpecker CI,都支持 Gitea 作为代码源。Q: 能和 VS Code 配合吗?A: VS Code 原生支持 Git,直接 clone 即可。总结Gitea 是我最推荐的轻量级 Git 托管方案。一个 Docker 命令就能跑起来,功能却一点不少。个人开发者、小团队完全够用,再也不用为代码托管付费了。
2026年07月19日
61 阅读
0 评论
0 点赞
2026-07-19
Tailscale 异地组网实战
异地组网是什么?假设你:在公司想访问家里的 NAS;出差异地想连回办公室的开发服务器;想把几台不同地方的 VPS 组成内网;想和家人共享文件但不想暴露到公网。传统方案是 VPN(WireGuard、OpenVPN),但配置复杂,还得有公网 IP。Tailscale 基于 WireGuard 协议,但把复杂的配置全部自动化了。它的核心思路是:所有设备组成一个 Mesh 网络,点对点加密通信,无需公网 IP,无需手动配密钥。Tailscale 原理每个设备装一个 Tailscale 客户端,自动分配内网 IP(100.x.x.x),Tailscale 协调节点帮忙打通 NAT,设备之间直接 WireGuard 加密通信。数据不经过 Tailscale 服务器,只走协调信令。免费版支持最多 100 台设备。各平台安装Linux 服务器curl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up会输出一个 URL,浏览器打开授权即可。Windows/Mac去官网 tailscale.com/download 下载安装包,安装后自动弹出登录页面。Android/iOSGoogle Play / App Store 搜索 Tailscale 安装。Docker 容器version: "3" services: tailscale: image: tailscale/tailscale:latest container_name: tailscale hostname: my-nas restart: always volumes: - ./tailscale-state:/var/lib/tailscale - /dev/net/tun:/dev/net/tun cap_add: - NET_ADMIN - SYS_MODULE environment: - TS_AUTHKEY=your_auth_key_here - TS_STATE_DIR=/var/lib/tailscale - TS_USERSPACE=false network_mode: hostTS_AUTHKEY 在 Tailscale 管理面板,Settings,Keys 中生成。实用场景场景一:远程访问家里 NAS家里 NAS 和笔记本都装上 Tailscale:ping 100.x.x.x、ssh user@100.x.x.x、smb://100.x.x.x场景二:把 VPS 当跳板机访问内网sudo tailscale up --advertise-routes=192.168.1.0/24在 Tailscale 管理面板启用该路由,在家就能直接访问 192.168.1.x 的所有内网设备。场景三:多台 VPS 组成内网每台都装 Tailscale 后,它们之间就有固定的 Tailscale IP,可以直接用内网地址互相访问,不用走公网、不用配置防火墙。场景四:Exit Node 出口节点sudo tailscale up --advertise-exit-node在管理面板启用 Exit Node,其他设备选择使用该 Exit Node。在公共 WiFi 时所有流量走家里网络,安全又隐私。Tailscale vs ZeroTier vs WireGuard 特性TailscaleZeroTierWireGuard 配置难度几乎零配置中等较高 NAT 穿透自动自动需手动 免费设备数10025无限 开源客户端开源完全开源完全开源 中继服务器需官方可自建不需要 总结:想省心选 Tailscale,想完全自托管选 ZeroTier,追求极致性能和自由度选 WireGuard。Headscale:Tailscale 的开源自建版如果你不想依赖 Tailscale 官方服务器,可以用 Headscale 自建协调服务器:version: "3" services: headscale: image: headscale/headscale:latest container_name: headscale restart: always ports: - "8080:8080" - "9090:9090" volumes: - ./config:/etc/headscale - ./data:/var/lib/headscale command: headscale serve客户端配置:tailscale up --login-server=https://hs.yourdomain.com常见问题Q: 免费够用吗?A: 免费版 100 台设备、3 个用户,个人和小团队完全够用。Q: 安全吗?A: 基于 WireGuard,端到端加密,协调服务器只能看到设备信息,看不到数据内容。Q: 国内访问慢吗?A: 协调服务器在海外,首次连接可能稍慢。连通之后是点对点直连。可自建 DERP 中继服务器加速。Q: 和 frp 内网穿透有什么区别?A: frp 是把内网服务暴露到公网,Tailscale 是把你加入一个虚拟局域网。两者可互补使用。总结Tailscale 是我用过最省心的异地组网工具。安装,登录,搞定,不需要学任何网络知识。以前配 WireGuard 要折腾半天,现在 Tailscale 几分钟就搞定。如果你有多个设备分散在不同网络,强烈推荐试试。
2026年07月19日
58 阅读
0 评论
0 点赞
2026-07-19
Grafana + Prometheus 服务器监控
为什么要做服务器监控?手里服务器多了以后,经常会遇到这些问题:网站挂了半天才发现;磁盘满了不知道什么时候满的;CPU 突然飙高找不到原因;流量异常没有告警。Prometheus + Grafana 是目前最流行的开源监控方案:Prometheus 负责采集和存储指标数据;Grafana 负责可视化展示;Node Exporter 负责采集服务器指标(CPU、内存、磁盘、网络等)。这套组合被几乎所有互联网公司使用,搭建也不复杂。系统架构服务器1/2/3 → Node Exporter (采集指标) ↓ Prometheus (存储查询) ↓ Grafana (可视化仪表盘)Docker Compose 一键部署version: "3" services: prometheus: image: prom/prometheus:latest container_name: prometheus restart: always ports: - "9090:9090" volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - ./prometheus/data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" - "--storage.tsdb.retention.time=30d" - "--web.enable-lifecycle" node-exporter: image: prom/node-exporter:latest container_name: node-exporter restart: always ports: - "9100:9100" volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - "--path.procfs=/host/proc" - "--path.sysfs=/host/sys" - "--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)" grafana: image: grafana/grafana:latest container_name: grafana restart: always ports: - "3001:3000" volumes: - ./grafana/data:/var/lib/grafana environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=change_me_please - GF_SERVER_ROOT_URL=https://grafana.yourdomain.comprometheus.yml 配置文件global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: "node" static_configs: - targets: ["node-exporter:9100"] labels: instance: "main-server"启动:docker-compose up -dGrafana 初始化配置1. 添加 Prometheus 数据源 访问 http://your-ip:3001,用户名 admin 左侧菜单,Connections,Data Sources,Add data source 选择 Prometheus,URL 填 http://prometheus:9090 点击 Save and Test 2. 导入现成仪表盘推荐导入 Node Exporter Full(ID: 1860):左侧菜单,Dashboards,New,Import,输入 1860,选择数据源,Import。瞬间就有专业的服务器监控面板:CPU 使用率曲线、内存使用量、磁盘 IO、网络流量、系统负载、运行时间。3. 其他推荐 Dashboard Dashboard ID用途 1860Node Exporter Full(服务器全貌) 16098Node Exporter 精简版 12245Docker 容器监控 14282Nginx 监控 监控多台服务器在其他服务器上部署 Node Exporter:docker run -d --name node-exporter --restart always -p 9100:9100 -v /proc:/host/proc:ro -v /sys:/host/sys:ro -v /:/rootfs:ro prom/node-exporter:latest --path.procfs=/host/proc --path.sysfs=/host/sys在主 Prometheus 的 prometheus.yml 中添加新 target,然后热重载:docker exec prometheus kill -HUP 1配置告警规则groups: - name: server_alerts rules: - alert: HighCPUUsage expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 for: 5m labels: severity: warning annotations: summary: "CPU 使用率超过 80%" - alert: HighMemoryUsage expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90 for: 5m labels: severity: critical annotations: summary: "内存使用率超过 90%" - alert: DiskAlmostFull expr: (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100 > 85 for: 5m labels: severity: warning annotations: summary: "磁盘使用率超过 85%"Nginx 反向代理server { listen 443 ssl http2; server_name grafana.yourdomain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://127.0.0.1:3001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }常见问题Q: 数据存多久?A: 上面配置改成了 30 天。建议配合 Grafana Loki(日志)和 Thanos(长期存储)做完整方案。Q: 资源占用大吗?A: 三个容器总内存约 300-500MB。建议至少 2GB 内存的服务器。Q: 和 Uptime Kuma 有什么区别?A: Uptime Kuma 只管能不能访问(拨测),Prometheus + Grafana 管运行得怎么样(指标监控)。两者互补,可以一起用。总结有了这套监控系统,服务器出问题能第一时间知道,不用等用户来反馈网站打不开了。Grafana 的仪表盘看起来也很专业,截图发朋友圈都能装一波运维大神。
2026年07月19日
63 阅读
0 评论
0 点赞
2026-07-18
自建闲鱼自动发货系统:Docker 部署全流程,24小时自动回复发卡券
在闲鱼上卖虚拟商品(卡券、会员、教程等),最烦的就是每次买家付款后要手动回复卡密。尤其凌晨下单的,等你第二天看到,买家可能已经退款差评了。今天就来搭建一个完全自托管的闲鱼自动发货系统,用 Docker 一键部署,支持: 买家下单 → 自动检测订单 自动发送卡券内容(卡密/链接/教程) 自动确认收货 多账号、多商品管理 Web 面板可视化管理 系统架构 整套系统由 6 个 Docker 容器组成: ┌─────────────────────────────────────┐ │ Nginx / 前端 (9000) │ │ Vue.js Web 面板 │ └──────────────┬──────────────────────┘ │ ┌──────────────▼──────────────────────┐ │ Backend Web (8089) │ │ FastAPI 管理接口 │ └──────────────┬──────────────────────┘ │ ┌──────────────▼──────────────────────┐ │ WebSocket (8090) │ │ 闲鱼 LWP 长连接,收发消息 │ └──────────────┬──────────────────────┘ │ ┌──────────────▼──────────────────────┐ │ Scheduler (8091) │ │ 定时轮询订单,触发发货 │ └─────────────────────────────────────┘ │ │ ┌───────▼──┐ ┌─────▼─────┐ │ MySQL │ │ Redis │ │ 订单存储 │ │ 缓存/队列 │ └──────────┘ └───────────┘ 准备工作 服务器要求 Linux 服务器(推荐 CentOS 7+ / Ubuntu 20.04+) 至少 2GB 内存(实际运行约 1.2GB) 安装 Docker 和 Docker Compose 开放端口:9000(前端)、8089-8091(后端服务) 闲鱼账号准备 一个闲鱼卖家账号 在闲鱼 App 上发布商品(虚拟卡券类) 准备好卡券内容(卡密列表) 第一步:安装 Docker 如果你的服务器还没装 Docker,用官方脚本一键安装: # 安装 Docker curl -fsSL https://get.docker.com | bash # 启动并设置开机自启 systemctl enable docker systemctl start docker # 安装 Docker Compose curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose # 验证 docker --version docker-compose --version 第二步:拉取并启动系统 创建项目目录并下载配置文件: mkdir -p /opt/xianyu-auto-ship/xianyu_auto_reply cd /opt/xianyu-auto-ship # 下载 docker-compose 配置文件 # (配置文件包含 mysql、redis、backend-web、websocket、scheduler、frontend 6个服务) # 启动所有服务 docker-compose up -d # 查看运行状态 docker ps 首次启动会从阿里云镜像仓库拉取镜像,等待几分钟后所有容器变为 healthy 即可。 第三步:配置系统 打开浏览器访问 http://你的服务器IP:9000,进入 Web 管理面板。 3.1 登录闲鱼账号 在管理面板 → 账号管理 → 添加闲鱼账号,系统会引导你扫码登录。登录成功后 WebSocket 服务会建立与闲鱼的长连接,实时监听消息。 3.2 添加商品 在商品管理中录入闲鱼商品 ID(从闲鱼商品链接中获取),并关联上你的卡券库。 3.3 导入卡券 在卡券管理中批量导入卡密,每行一条,支持文本、CSV 格式。 第四步:发货流程 配置完成后,系统的自动发货流程如下: Scheduler 定时轮询:每 5 分钟检查一次待发货订单 匹配卡券:根据商品 ID 从卡券库中取一条未使用的卡密 发送消息:通过 WebSocket 长连接发送卡券内容给买家 确认收货:自动确认发货,订单状态更新为已发货 记录日志:所有操作记录入库,可追溯 常见问题与踩坑记录 1. WebSocket 连接断开 闲鱼的 LWP(Long Web Polling)连接有超时机制,长时间无消息会自动断开。系统内置了心跳保活和自动重连,一般不需要干预。如果频繁断开,检查: 服务器网络是否稳定 闲鱼账号是否被风控(频繁操作会触发) 2. 无法获取会话 chat_id 发货需要知道买家会话的 chat_id。如果买家从未主动发过消息,系统无法创建会话,需要手动在闲鱼 App 上先给买家发一条消息激活会话。 3. 滑块验证码 闲鱼登录或频繁操作时会弹出滑块验证。系统内置了 DrissionPage 浏览器自动化引擎来处理验证码,首次处理可能较慢(约 15-25 秒)。 4. 账号风控 如果闲鱼检测到异常操作(频繁发送相似消息、短时间大量操作),可能会限制账号功能。建议: 消息间隔设置 20 秒以上 不同订单的回复内容增加随机变化 不要同时登录多个设备 资源占用实测 在 2 核 2G 的阿里云轻量服务器上运行 6 个容器,实际资源占用: 容器 内存 说明 MySQL ~200MB 订单/卡券/日志存储 Redis ~30MB 缓存和消息队列 WebSocket ~300MB 含浏览器引擎(处理验证码) Backend Web ~180MB API 服务 Scheduler ~150MB 定时任务 Frontend ~50MB 静态页面 合计 ~900MB 建议 1.5GB 以上内存 如果用不到的时候想释放资源,直接 docker stop 全部容器即可,内存立即回收。 管理命令速查 # 启动所有服务 docker-compose up -d # 停止所有服务 docker stop xianyu-scheduler xianyu-frontend xianyu-websocket \ xianyu-backend-web xianyu-redis xianyu-mysql # 查看日志 docker logs -f xianyu-websocket --tail 100 # 重启单个服务 docker restart xianyu-backend-web # 进入容器调试 docker exec -it xianyu-websocket bash # 查看数据库 docker exec -it xianyu-mysql mysql -u xianyu -p 总结 这套系统用 Docker 部署,好处是: 一键部署:不用折腾 Python 环境、依赖包 隔离运行:每个服务独立容器,互不影响 资源可控:可以限制每个容器的内存上限 迁移方便:换服务器只需打包数据目录 如果你也在闲鱼卖虚拟商品,值得花半小时部署一套。至少不用半夜被买家消息吵醒了。 相关文章 Docker Compose 搭建服务全家桶 Crontab 从入门到自动化运维 Typecho 博客性能优化全记录
2026年07月18日
66 阅读
0 评论
0 点赞
2026-07-18
Cloudflare R2 对象存储:零成本搭建博客图床,告别图片拖慢网站
创建 R2 存储桶登录 Cloudflare 控制台,左侧菜单找到 R2 → 创建存储桶: 存储桶名称:blog-images(全局唯一,建议加前缀如 zjunwei-blog-images) 位置:选择「自动」(亚太用户数据会自动路由到就近节点) 创建完成后,你会看到存储桶的控制台页面。可以直接在这里上传文件,但我们的目标是自动化——用命令行批量管理。 用 wrangler 操作 R2 如果你还没装 wrangler(上篇 Workers 教程应该装过了): npm install -g wrangler wrangler login 创建一个专门管理 R2 的 Worker 项目(R2 需要绑定到 Worker 才能通过自定义域名访问): mkdir r2-proxy && cd r2-proxy wrangler init r2-proxy 在 wrangler.toml 中绑定刚刚建的 R2 桶: name = "r2-proxy" main = "src/index.js" compatibility_date = "2025-01-01" [[r2_buckets]] binding = "IMAGES" # 代码里用这个名字引用 bucket_name = "zjunwei-blog-images" 编辑 src/index.js,让 Worker 代理 R2 的图片访问: export default { async fetch(request, env) { const url = new URL(request.url); const key = url.pathname.slice(1); // /photo.png → photo.png if (!key) { return new Response('R2 Image Proxy', { status: 200 }); } // 从 R2 读取对象 const object = await env.IMAGES.get(key); if (!object) { return new Response('Not Found', { status: 404 }); } // 设置合理的缓存头 const headers = new Headers(); object.writeHttpMetadata(headers); headers.set('cache-control', 'public, max-age=31536000, immutable'); headers.set('etag', object.httpEtag); return new Response(object.body, { headers }); }, }; 部署: wrangler deploy 绑定自定义域名 部署完 Worker 后,默认域名是 r2-proxy.你的子域.workers.dev。我们需要绑定自己的域名,比如 img.zjunwei.com。 前提:域名已接入 Cloudflare DNS。 在 Cloudflare 控制台 → Workers 和 Pages → r2-proxy → 触发器 → 自定义域,添加 img.zjunwei.com。 等 DNS 生效后,访问 https://img.zjunwei.com/photo.png 就能直接从 R2 拉图片了。 上传图片:命令行批量操作 R2 兼容 S3 API,所以任何 S3 工具都能用。推荐用 awscli 或 rclone: 方式一:awscli(轻量) # 安装 pip install awscli # 配置(R2 的 Access Key 在 Cloudflare 控制台 → R2 → 管理 R2 API 令牌 获取) aws configure --profile r2 # AWS Access Key ID: 你的R2_Access_Key # AWS secret Access Key: 你的R2_secret_Key # Default region name: auto 上传单张图片: aws s3 cp ./screenshot.png s3://zjunwei-blog-images/ \ --endpoint-url https://你的AccountID.r2.cloudflarestorage.com \ --profile r2 批量上传整个目录: aws s3 sync ./local-images/ s3://zjunwei-blog-images/ \ --endpoint-url https://你的AccountID.r2.cloudflarestorage.com \ --profile r2 方式二:rclone(功能更全) # 安装 curl https://rclone.org/install.sh | sudo bash # 配置(交互式,选 S3 类型,填 R2 的 endpoint 和密钥) rclone config 配置好后,上传和同步就很简单了: rclone copy ./local-images/ r2:zjunwei-blog-images/ 博客图片自动压缩 + 上传脚本 每次截图后手动压缩再上传太麻烦。写一个脚本,一键完成: #!/bin/bash # upload-image.sh - 图片压缩并上传到 R2 BUCKET="zjunwei-blog-images" ENDPOINT="https://你的AccountID.r2.cloudflarestorage.com" PROFILE="r2" MAX_WIDTH="1200" # 博客内容区宽度,再大没意义 for img in "$@"; do filename=$(basename "$img") ext="${filename##*.}" # 如果不是 WebP,转换成 WebP(体积平均减少 60%) if [ "$ext" != "webp" ]; then newname="${filename%.*}.webp" convert "$img" -resize "${MAX_WIDTH}x" -quality 85 "$newname" 2>/dev/null || { echo "ImageMagick 未安装,跳过压缩" cp "$img" "$newname" } else newname="$img" fi echo "上传: $newname" aws s3 cp "./$newname" "s3://$BUCKET/" \ --endpoint-url "$ENDPOINT" \ --profile "$PROFILE" \ --content-type "image/webp" echo "链接: https://img.zjunwei.com/$newname" done 用法: # 装 ImageMagick(macOS) brew install imagemagick # 一键上传 chmod +x upload-image.sh ./upload-image.sh screenshot1.png cover.jpg diagram.png 在 Typecho 中使用 R2 图片 Typecho 编辑器里直接粘贴 R2 链接就行:  如果你的文章里引用服务器本地的图片太多,写个批量替换脚本: # 把文章里 /usr/uploads/ 的图片路径替换为 R2 链接 sed -i 's|/usr/uploads/|https://img.zjunwei.com/|g' your-article.md 更进一步:在 Typecho 主题里改附件上传逻辑,上传后自动同步到 R2,然后本地删除。不过这需要改 PHP 代码,取决于你对主题的定制深度。 安全与防盗链 R2 默认是公开访问的(通过 Worker 代理),如果想限制: 方案一:Token 鉴权(简单) 在 Worker 里加 token 校验: export default { async fetch(request, env) { const url = new URL(request.url); const key = url.pathname.slice(1); // 只允许带有效 token 的请求 const token = url.searchParams.get('token'); if (token !== '你的密钥') { return new Response('Forbidden', { status: 403 }); } const object = await env.IMAGES.get(key); if (!object) return new Response('Not Found', { status: 404 }); const headers = new Headers(); object.writeHttpMetadata(headers); headers.set('cache-control', 'public, max-age=31536000'); return new Response(object.body, { headers }); }, }; 图片链接变成:https://img.zjunwei.com/photo.webp?token=xxx 方案二:Referer 防盗链 用 Cloudflare WAF 规则,只允许来自 zjunwei.com 的 Referer 访问图片 Worker 的路由。在 Cloudflare 控制台 → 安全性 → WAF → 自定义规则 里设置。 一个月能省下什么 假设博客日均 3000 PV,每页 10 张图,每张 150KB: 项目 服务器直出 R2 方案 月度外网流量 ~135GB 0(R2 出站免费) 服务器带宽压力 VPS 跑满 0(Cloudflare 扛) CDN 回源流量费 看 CDN 厂商 0(自带 CDN) 图片加载速度 看 VPS 位置 全球 300+ 节点,50ms 如果 VPS 带宽是 1Mbps 小水管,135GB 流量能把服务器拖垮。换成 R2 后,图片请求全部走 Cloudflare 边缘节点,你的 VPS 只处理 PHP 动态请求,负载直降 90%。 Q&A Q:R2 和普通的图床(如 SM.MS、imgur)比有什么优势? 自建可控,不怕图床跑路。而且 R2 免费 + 不跑外网流量,普通图床要么限流量、要么限容量、要么塞广告。唯一的代价是前期配置需要 10 分钟。 Q:R2 上传慢怎么办? 用 aws s3 sync 或 rclone 都是多线程上传,几百张图几分钟搞定。日常写文章一张张传,几乎感觉不到延迟。 Q:Typecho 能不能直接把附件存到 R2? 可以,装 Typecho 插件「COS for Typecho」或类似 S3 兼容插件,把 endpoint 指向 R2 就行。不过 R2 的 S3 兼容需要设置 AWS_REGION=auto 和正确的 endpoint URL。 Q:10GB 用完了怎么办? 超出后 $0.015/GB/月。10GB 以外,每多存 1GB 一个月多花一毛五。对于个人博客,10GB 可能这辈子都用不完。 服务器的硬盘和带宽是有限的,但 Cloudflare 的 300 个边缘节点不是。把图片交给 R2,你的 VPS 只专心跑好 PHP——各司其职,才是正经架构。
2026年07月18日
62 阅读
0 评论
0 点赞
2026-07-18
Cloudflare Workers 入门:零成本搭建你的第一个 Serverless 应用
Cloudflare Workers 入门:零成本搭建你的第一个 Serverless 应用 你有了一台 VPS,在上面跑了 Nginx、MySQL、几个网站,偶尔还要重启一下因为内存炸了。然后你听说"Serverless 不用管服务器",但 AWS Lambda 那套 IAM 权限差点把你送走。你只是想写几行 JS 做个 API,能不能别那么重?能。Cloudflare Workers 免费额度一天 10 万次请求,零服务器、零运维,代码 push 上去就跑。 Workers 到底是什么 一句话:把 JavaScript 跑在 Cloudflare 全球 300+ 边缘节点上。用户请求过来,就近的节点执行你的代码然后返回结果,全球延迟 50ms 以内。 对比一下你已有的方案: 方案 部署位置 延迟 成本 运维 VPS + Nginx 单机房 看机房位置 月付几十 要管 Cloudflare Pages 全球边缘 低 免费 零 Cloudflare Workers 全球边缘 极低 免费 10万次/天 零 Pages 适合静态网站,Workers 适合动态逻辑——API、A/B 测试、请求改写、简易后端,这些 Pages 做不了。 环境准备 你需要一个 Cloudflare 账号和一个 Node.js 环境。用 npm 装 wrangler(Cloudflare 官方 CLI): npm install -g wrangler 登录授权: wrangler login 浏览器弹窗确认后,你的终端就能直接操作用 Cloudflare 账号下的 Workers 了。 第一个 Worker:IP 归属地查询 创建一个项目: mkdir geo-api && cd geo-api wrangler init geo-api 编辑 src/index.js: export default { async fetch(request) { // Cloudflare 自动注入 request.cf 对象,包含请求的地理信息 const { country, city, region, timezone, colo } = request.cf; return new Response(JSON.stringify({ ip: request.headers.get('cf-connecting-ip'), country: country || '未知', city: city || '未知', region: region || '未知', timezone: timezone || '未知', colo: colo || '未知', // 处理请求的边缘节点 }, null, 2), { headers: { 'content-type': 'application/json;charset=UTF-8' }, }); }, }; request.cf 是 Cloudflare 免费送的数据,不需要调用任何第三方 API。部署: wrangler deploy 10 秒后访问 https://geo-api.你的子域名.workers.dev,返回: { "ip": "123.45.67.89", "country": "CN", "city": "Shanghai", "region": "Shanghai", "timezone": "Asia/Shanghai", "colo": "SHA" } 这就是一个零成本、全球低延迟的 IP 查询 API。你不需要买服务器、装 Nginx、配 SSL——Cloudflare 全包了。 实用场景二:为你的博客做 A/B 测试 假设你想测试两种不同的导航栏样式,Worker 可以按 50% 概率分流: export default { async fetch(request) { // 根据 cookie 或随机数决定走哪个版本 const cookie = request.headers.get('cookie') || ''; let variant; if (cookie.includes('variant=b')) { variant = 'b'; } else if (cookie.includes('variant=a')) { variant = 'a'; } else { variant = Math.random() < 0.5 ? 'a' : 'b'; } const url = new URL(request.url); // 转发到不同的 A/B 页面(可以是两个 Pages 部署或两个路径) url.pathname = variant === 'a' ? '/index-a.html' : '/index-b.html'; const response = await fetch(url.toString()); const newResponse = new Response(response.body, response); // 写入 cookie 保证同一用户看到一致版本 newResponse.headers.set('set-cookie', `variant=${variant}; path=/; max-age=86400`); return newResponse; }, }; 不用装 Nginx split_clients 模块,不用改 DNS,几行 JS 搞定。 实用场景三:短链接跳转 你之前写过自建短链接服务(用 PHP + MySQL),用 Workers + KV 可以更轻: export default { async fetch(request, env) { const url = new URL(request.url); const slug = url.pathname.slice(1); // 去掉开头的 / if (!slug) { return new Response('短链接服务', { status: 200 }); } // 从 KV 存储查原始链接 const target = await env.LINKS.get(slug); if (target) { return Response.redirect(target, 301); } return new Response('404 Not Found', { status: 404 }); }, }; 配一个 KV 命名空间: wrangler kv:namespace create LINKS 然后在 wrangler.toml 绑定: kv_namespaces = [ { binding = "LINKS", id = "你的KV_ID" } ] 写入短链: wrangler kv:key put --binding=LINKS "gh" "https://github.com/zjunwei" 这方案的优势:全球 301 跳转延迟极低,没有数据库,没有 PHP,KV 免费额度每天百万次读写。 Workers 的边界:什么能做,什么不能做 能做 不能做 / 不适合 API 代理与聚合 WebSocket 长连接(有 30 秒超时) HTML Rewrite / A/B 测试 大文件上传下载(单次 100MB 限制) 请求鉴权 / 防火墙逻辑 复杂数据库操作(无 SQL) 简单的 KV 存储读写 CPU 密集型计算(单请求 30 秒 wall time) 定时任务(Cron Triggers) 需要保持长连接的服务 对于博客场景——短链跳转、A/B 测试、API 聚合、评论反垃圾过滤、图片水印实时处理——Workers 完全够用,而且是免费的。 一个月能省下什么 假设你现在有一台 5 美元/月的 VPS 专门跑几个轻量 API: 项目 VPS 方案 Workers 方案 IP 归属 API 装 Nginx + Python Flask 一个 Worker,0 元 短链接跳转 PHP + MySQL Workers + KV,0 元 博客访客统计 自建 Umami Worker + KV 计数器,0 元 SSL 证书 Let's Encrypt 自动续 Cloudflare 自带 服务器监控 Uptime Kuma 不需要,Workers 永不宕机 把轻量 API 迁到 Workers,VPS 只跑 WordPress 和数据库,负载降一半,说不定还能降配省钱。 Q&A Q:Workers 和 Cloudflare Pages Functions 有什么区别? Pages Functions 本质是 Workers 的封装,放在 Pages 项目目录里自动部署。如果你已经有 Cloudflare Pages 网站,加一个 functions/ 目录就行,不用单独建 Worker 项目。纯 API 场景用 Workers 更干净。 Q:免费额度够用吗? 每天 10 万次请求,KV 每天百万次读写。大多数个人博客一天几百到几千 PV,完全用不完。超出后按 $0.30/百万次计费,也比 VPS 便宜。 Q:Workers 能连数据库吗? 不能直连 MySQL/PostgreSQL,但可以用 Cloudflare D1(Serverless SQLite,原生兼容)或者通过 HTTP API 代理连外部数据库。小规模数据直接用 KV 就够了。 Q:部署后怎么绑定自己的域名? 在 Cloudflare 控制台 Workers 页面 → Triggers → Custom Domains,添加你的域名路由,比如 api.zjunwei.com/*。前提是域名已接入 Cloudflare DNS。 一次部署,全球生效。不写 nginx.conf,不看 syslog,没有半夜的 "Disk Full" 告警。这就是 Workers ——免费的东西,做到好用才是真本事。 (内容由AI生成,仅供参考)
2026年07月18日
59 阅读
0 评论
0 点赞
2026-07-17
域名从 Cloudflare 迁移到阿里云完整指南:零中断切换
域名注册在哪家服务商,对国内用户来说影响不小。我的 .com 域名一开始在 Cloudflare 注册,但国内访问要走海外 CDN 节点,速度始终不太理想。最近决定把域名转到阿里云,整个迁移过程记录如下。为什么要转? 国内访问更快:阿里云 DNS 在国内有大量节点,解析速度秒级响应 方便备案:服务器在阿里云,域名转过来后备案更顺畅 管理统一:服务器、域名、SSL 证书都在一个控制台,不用来回切换 迁移前准备 域名注册满 60 天(ICANN 规定新注册或刚转入的域名 60 天内不能转移) 域名未锁定(Cloudflare 后台关闭 Registrar Lock) 准备好转移码(Auth Code),在 Cloudflare 后台获取 确认域名 Whois 邮箱能正常收信 第一步:在 Cloudflare 解锁域名进入 Domain Registration → 关闭 Transfer Lock → 点击 Get Transfer Auth Code,转移码会发到你的注册邮箱。第二步:在阿里云提交转入阿里云控制台 → 域名 → 域名转入 → 输入域名和转移码 → 支付转入费用(.com 约 75 元,含一年续费)。转移过程通常 5-7 天。第三步:DNS 平滑切换(关键)转移期间 DNS 不要急着改,等阿里云确认转入成功后,再操作: 在阿里云 DNS 控制台添加解析记录,把所有 A 记录、CNAME 记录照搬过来 确认阿里云解析生效后(dig zjunwei.com @阿里云DNS 测试) 在域名注册商那边把 DNS 服务器改为阿里云的:dns9.hichina.com 和 dns10.hichina.com 第四步:SSL 证书重新申请Cloudflare 的免费 SSL 证书在迁移后会失效。阿里云提供免费 DV 证书,在 SSL 证书控制台申请,DNS 验证自动完成。注意事项 DNS 切换有 24-48 小时全球生效时间,期间新旧解析可能共存,但都能正常访问 邮件服务(如果有自定义邮箱)需要单独迁移 MX 记录 CDN 缓存规则需要在新平台重新配置 总结整个迁移最核心的原则就是:先把新平台的 DNS 配好,再切换 DNS 服务器。只要新旧解析同时生效一段时间,就能做到零中断。我的博客在整个迁移过程中没有出现过一次 502,用户完全无感知。
2026年07月17日
56 阅读
0 评论
0 点赞
2026-07-17
Typecho 博客性能优化全记录:从加载 3 秒到 0.5 秒的实战
我的 Typecho 博客最近访问越来越慢,首页加载要 1 秒多。查了一圈,发现几个关键问题没处理。优化完之后速度直接翻倍,这里把过程记录一下。问题一:OPcache 没开PHP 默认每次请求都要重新解析和编译 PHP 文件,这是最大的性能浪费。启用 OPcache 后,编译结果缓存在内存里:opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=10000 opcache.revalidate_freq=60重启 PHP-FPM 后,首页首字节时间从 0.88 秒降到了 0.73 秒。问题二:Gzip 压缩不充分Nginx 默认的 Gzip 配置只压缩了 HTML,JS/CSS/JSON 都没压。补充配置:gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; gzip_comp_level 5; gzip_min_length 256; gzip_vary on;首页从 77KB 压缩到了 7KB,传输量减少了 91%。问题三:PHP-FPM 进程太少2 核服务器只开了 5 个 PHP 进程,并发一上来就排队。调整到 15 个进程后,高并发下响应明显快了。问题四:静态资源没缓存CSS、JS、图片这些静态文件每次都要重新请求,白白浪费带宽。加个 30 天缓存:location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ { expires 30d; add_header Cache-Control "public, immutable"; }最终效果 指标优化前优化后 首页首字节0.88s0.73s 首页总耗时1.22s0.90s 传输大小77KB7KB 总结Typecho 本身已经很轻量了,瓶颈通常不在代码层面,而在运行环境。以上四个优化都是改配置,不用动代码,十分钟就能搞定。如果你的博客也跑在低配 VPS 上,强烈建议逐项检查一遍。
2026年07月17日
110 阅读
0 评论
0 点赞
2026-07-17
自建短链接服务:从零搭建你的专属短域名跳转系统
短链接服务看似简单,实际上在日常分享中非常实用。长链接发到微信、贴在二维码里都不方便,自己搭一个短链接系统,数据掌握在自己手里,还不用花钱买第三方服务。核心思路上传文件 → 生成随机短码 → 建立映射关系 → Nginx 重写规则转发。第一步:设计映射存储用 JSON 文件存储短码和真实路径的对应关系,简单直接,无需数据库:{ "abc123": "我的文件.pdf", "xyz789": "图片.png" }第二步:编写上传接口PHP 接收文件上传,生成 6 位随机短码,写入 JSON,返回短链接地址。关键代码逻辑:接收文件 → 校验类型 → 生成唯一短码 → 更新映射表。第三步:配置 Nginx 重写location ^~ /s/ { try_files $uri $uri/ /s/index.php?$args; }访问 https://你的域名/s/abc123 时,Nginx 交给 PHP 解析短码,读取映射表找到真实文件,302 重定向或直接输出。第四步:管理界面一个简单的 HTML 表格页面,列出所有映射关系,支持一键复制短链接、删除过期映射。配合简单的密码验证,防止被滥用。进阶优化 添加访问次数统计 设置链接有效期,过期自动清理 生成二维码方便扫码访问 上传进度条提升体验 自建短链接总共不到 200 行代码,部署在一个 PHP 虚拟主机上就能跑。相比第三方短链接服务,你的数据不会被分析、不会过期、不会突然下线——这才是最靠谱的方案。
2026年07月17日
54 阅读
0 评论
0 点赞
2026-07-16
免费静态网站托管对比:GitHub Pages vs Cloudflare Pages vs Vercel
> 想搭个个人主页、项目文档、或者简单的博客,不想花钱买服务器?GitHub Pages、Cloudflare Pages、Vercel 都是免费的选择,但各有千秋。---## 三家简介| 平台 | 背景 | 适合场景 | |------|------|---------| | GitHub Pages | 微软旗下 | 项目文档、个人主页 | | Cloudflare Pages | Cloudflare | 全球加速、企业站点 | | Vercel | 独立公司 | 前端应用、Next.js 项目 |---## GitHub Pages**优点**:和 GitHub 仓库无缝集成,推送代码自动部署,生态最成熟。 **限制**:仓库大小 1GB,每月带宽 100GB,不支持服务端代码。 **适合**:开发者个人主页、开源项目文档、简单博客。---## Cloudflare Pages**优点**:依托 Cloudflare 全球网络,国内访问速度也不错,每月不限制带宽,支持各种静态站点生成器,支持预览部署。 **限制**:单个文件不超过 25MB。 **适合**:需要较好国内访问速度、企业官网、文档站。---## Vercel**优点**:Next.js 官方推荐平台,支持 Serverless Functions(可以写后端逻辑),自动 HTTPS、全球 CDN,预览部署体验极佳。 **限制**:每月带宽 100GB,商业用途有限制。 **适合**:前端应用、Next.js/Nuxt 项目、需要后端接口的小项目。---## 速度对比(国内访问)| 平台 | 国内速度 | 稳定性 | |------|---------|--------| | Cloudflare Pages | 较好 | 高 | | Vercel | 一般 | 高 | | GitHub Pages | 一般(有时很慢) | 中 |---## 总结建议1. 纯静态博客/文档 → Cloudflare Pages(国内访问好,没带宽限制) 2. 开源项目主页 → GitHub Pages(跟代码在一起最方便) 3. 前端应用/需要后端 → Vercel(Serverless Function 真香)三家都是免费的,完全可以先用起来,觉得哪个好用用哪个。
2026年07月16日
71 阅读
0 评论
0 点赞
2026-07-16
老旧电脑拒绝吃灰:从电子垃圾到全能 NAS 的复活指南
那台 2012 年的笔记本,开机两分钟、开个浏览器风扇就起飞。扔了可惜,留着吃灰。但你可能不知道——给它装个轻量系统,它能跑得比你的主力机还勤快,24 小时不关机当 NAS、当下载机、当智能家居中枢,一年电费不到 50 块。一、先判断硬件:你的老电脑能干嘛 配置能干嘛推荐系统 512MB 内存 / 奔腾 4纯文件服务器、打印服务器Puppy Linux / Tiny Core 1~2GB 内存 / 酷睿 2 双核轻量 NAS、下载机、软路由antiX / Alpine + CasaOS 2~4GB 内存 / 一代 i3/i5Docker 主机、媒体服务器、Home AssistantDebian 无桌面 / Ubuntu Server 4GB+ 内存 / 二代 i5+全能 NAS + 虚拟机 + 影音转码OMV / TrueNAS / Proxmox 二、轻量 Linux 发行版横评Windows 在老电脑上已经没法用了,但下面这些系统能让它满血复活。 发行版内存占用硬盘占用适用场景上手难度 Puppy Linux~128MB~300MBU 盘即用、临时救急★☆☆ antiX~150MB~2GB日常桌面、老机主力★★☆ Lubuntu~300MB~5GB类 Windows 体验★☆☆ Alpine Linux~50MB~130MBDocker 宿主机首选★★★ Debian 无桌面~80MB~1GB服务器、NAS 底座★★☆ Arch Linux~200MB~3GB极客定制、滚动更新★★★★ 实操:antiX 安装三步走# 第一步:下载 ISO(700MB 不到) # 官网 https://antixlinux.com/download/ # 推荐 antiX-23.1_x64-full.iso # 第二步:用 Rufus 或 balenaEtcher 写入 U 盘 # Windows: Rufus → 选择 DD 模式写入 # macOS/Linux: sudo dd if=antiX-23.1_x64-full.iso of=/dev/sdb bs=4M status=progress # 第三步:U 盘启动 → 选择 Install → 一路下一步 # 要点:文件系统选 ext4,不要分区 /home 单独出来装好之后,这台老电脑就能流畅上网、码字、看视频了。但只当桌面用太浪费,下面才是重头戏。三、变 NAS:老电脑最佳归宿方案 A:CasaOS —— 小白首选,Docker 可视化如果你不想碰命令行,CasaOS 是最佳选择。基于 Debian,提供网页版「应用商店」,一键安装 Plex、qBittorrent、AdGuard 等几十款应用。# 先装 Debian 12(无桌面),然后一行命令搞定: curl -fsSL https://get.casaos.io | sudo bash # 装完后浏览器打开 http://老电脑IP # 默认界面就是 Mac 风格的应用抽屉,点哪装哪方案 B:OpenMediaVault —— NAS 专业户适合想正经组 NAS 的用户。基于 Debian,Web 管理界面,支持 RAID、SMB/NFS 共享、插件扩展。# 安装(需要 Debian 12 底包) sudo apt update && sudo apt install wget -y wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash # 装完重启,浏览器打开 http://老电脑IP # 默认账号 admin,密码 openmediavault方案 C:TrueNAS Scale —— 企业级但吃配置ZFS 文件系统、快照、虚拟机、K8s 一应俱全。配置要求高(8GB 内存起步),适合 4 代 i5 以上老电脑。# 下载 ISO:https://www.truenas.com/download-truenas-scale/ # Rufus 写入 U 盘 → U 盘启动 → 一路安装 # 注意:系统盘和数据盘要分开(系统盘 16GB 足够) NAS 方案内存需求特点适合人群 CasaOS1GB应用商店、零命令行NAS 新手 OMV2GB专业稳定、插件丰富家庭 NAS TrueNAS8GB企业级、ZFS、虚拟机折腾玩家 四、老电脑还能干嘛?更多玩法1. 24 小时下载机# 装好 CasaOS 后,在应用商店一键安装 qBittorrent # 搭配 Radarr + Sonarr 实现电影/剧集自动下载 # 老笔记本功耗 15~30W,一个月电费不到 10 块2. 软路由 / 旁路由# 老笔记本 + USB 千兆网卡 = 一台软路由 # 装 OpenWrt x86 或 iStoreOS # 科学上网、广告过滤、流量控制全搞定 # 比买硬路由性价比高太多3. 智能家居中枢# 装 Home Assistant 控制全屋智能设备 # CasaOS 应用商店一键安装 # 或者 Docker 部署: docker run -d --name hass --restart=unless-stopped \ -v /opt/hass:/config \ --network=host \ homeassistant/home-assistant:stable4. 私有云盘# Nextcloud:自己的 Dropbox docker run -d --name nextcloud -p 8080:80 nextcloud # 或者更轻量的 Seafile docker run -d --name seafile -p 8000:80 seafileltd/seafile5. Minecraft / CS 1.6 服务器# 老电脑跑 MC 服务器,和基友联机 # 核心数 > 频率,2 代 i5 完全够用 docker run -d --name mc -p 25565:25565 \ -e EULA=TRUE itzg/minecraft-server五、省电秘籍老电脑最大的痛点是功耗。笔记本一般 15~30W,台式机可能 60~100W+。几个省电技巧:# 1. 拔掉独立显卡!用核显输出,功耗能降一半 # 2. BIOS 关掉不用的接口(串口、并口、光驱) # 3. 机械硬盘休眠(hdparm -S 120 /dev/sda) # 4. CPU 限制频率: cpupower frequency-set -g powersave # 5. 笔记本拆掉电池,直接插电用(防鼓包)六、我的推荐组合如果你只有一台老电脑,最优解:Debian 12 无桌面版(底包) ├── CasaOS(应用管理面板) │ ├── qBittorrent(下载) │ ├── Plex / Jellyfin(影音库) │ ├── AdGuard Home(去广告 DNS) │ └── Home Assistant(智能家居) ├── Samba(局域网文件共享) └── Docker(跑各种服务)一套组合拳下来,这台老电脑就从吃灰电子垃圾变成家庭数据中心,24 小时待命,比买成品 NAS 划算太多。常见问题Q:老电脑当 NAS,硬盘不够怎么办?A:笔记本可以光驱位改硬盘架(几十块),台式机直接加硬盘。系统装在一块 120GB 的旧 SSD 上(二手 30 块),数据盘用机械硬盘。推荐挂载方式用 mergerfs 把多块盘合成一个存储池。Q:没有有线网口怎么办?A:USB 转千兆网卡(20 块),或者直接用 WiFi 也行——NAS 走 WiFi 读写速度大概 20~40MB/s,看视频够用了。Q:24 小时开机噪音大、发热怎么办?A:笔记本天生静音、低功耗。台式机的话,换静音风扇(几十块),清灰换硅脂,BIOS 设置风扇静音模式。放在阳台或储物间更好。Q:老电脑会不会随时挂掉?数据安全吗?A:机械硬盘比老电脑更值得担心。重要数据遵循 3-2-1 备份原则:3 份拷贝、2 种介质、1 份异地。CasaOS 应用商店有 Duplicati 可以自动备份到网盘。Q:我已经有群晖了,还需要折腾老电脑吗?A:群晖负责正经存储,老电脑可以跑群晖跑不动的 Docker 服务(x86 兼容性吊打 ARM 群晖),或者做冷备机、下载机、编译机——总之专职干脏活累活。每一台老电脑都是一个被低估的服务器。给它一个轻量的灵魂,它就能还你一个 24 小时不眠不休的数字管家。
2026年07月16日
73 阅读
0 评论
0 点赞
2026-07-16
WireGuard VPN 自建教程:最轻量的安全远程访问方案
> 在外面用公共 WiFi 担心数据被窃取?想远程访问家里的 NAS 和服务器?WireGuard 是目前最轻量、最快、最安全的 VPN 方案,配置简单到令人感动。---## 为什么选 WireGuard?| 对比 | WireGuard | OpenVPN | IPsec | |------|-----------|---------|-------| | 代码量 | ~4000 行 | ~70000 行 | ~400000 行 | | 配置复杂度 | 极简 | 复杂 | 很复杂 | | 性能 | 极高 | 中等 | 中等 | | 内核集成 | Linux 5.6+ 内置 | 需要额外安装 | 内置 | | 漫游支持 | 优秀 | 一般 | 差 |---## 安装```bash apt update && apt install wireguard -y ```---## 服务端配置### 1. 生成密钥对```bash cd /etc/wireguard wg genkey | tee server_private.key | wg pubkey > server_public.key chmod 600 server_private.key ```### 2. 创建配置文件 /etc/wireguard/wg0.conf```ini [Interface] PrivateKey = 服务器私钥 Address = 10.0.0.1/24 ListenPort = 51820PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE[Peer] PublicKey = 客户端公钥 AllowedIPs = 10.0.0.2/32 ```### 3. 开启 IP 转发```bash echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p ```### 4. 启动```bash systemctl enable wg-quick@wg0 --now wg show ```---## 客户端配置```ini [Interface] PrivateKey = 客户端私钥 Address = 10.0.0.2/24 DNS = 8.8.8.8[Peer] PublicKey = 服务器公钥 Endpoint = 服务器公网IP:51820 AllowedIPs = 0.0.0.0/0 ```如果只想访问内网资源(不走 VPN 上网),把 AllowedIPs 改为 10.0.0.0/24, 192.168.1.0/24。---WireGuard 配置真的就这么简单。搭好之后在任何网络环境下都能安全访问家里的设备,速度快、延迟低,几乎感觉不到 VPN 的存在。
2026年07月16日
68 阅读
0 评论
0 点赞
2026-07-16
废旧手机赚钱指南:从吃灰到变现的 6 条野路子
你抽屉里是不是也躺着几台旧手机?屏幕碎了懒得修、配置落伍不想用、卖二手又嫌麻烦。其实这些「电子垃圾」每一台都是能下金蛋的母鸡——只要方法对,一台旧手机月入几十到上百块完全不是问题。一、挂机赚钱:把闲置带宽变成现金旧手机最大的优势是功耗低。24 小时插着电跑,一天电费不过几毛钱。1. 甜糖星愿计划利用闲置带宽为 CDN 节点提供边缘计算能力,按流量贡献结算。一台手机日均 0.5~2 元,高峰期更多。多台手机叠加跑,月入 100+ 不是梦。# 在旧手机上安装甜糖 APP # 保持手机 24 小时在线 + 连接 WiFi # 建议:关闭屏幕自动锁定,插着充电器跑2. 网心云 / 点心云类似的边缘计算平台,按贡献的带宽和存储结算。每天自动提现到支付宝。 平台日收益结算方式门槛 甜糖星愿0.5~3 元积分兑换有公网 IP 更好 网心云1~5 元现金提现需要激活码 点心云0.5~2 元现金提现低门槛 二、手机任务平台:拉新 + 试玩App 推广市场竞争激烈,开发者愿意花钱买用户。一台手机一个账号,做完任务就换。推荐平台 悬赏猫:App 下载试玩,单价 1~5 元 众人帮:任务种类多,从注册到实名认证都有 趣闲赚:提现门槛低,任务更新快 # 核心思路 # 1. 一台旧手机 = 一个新设备 = 一个新账号 # 2. 优先做高单价任务(注册类 > 下载类) # 3. 不要在同一 WiFi 下多开,用流量或不同网络三、出租旧手机:别人替你赚钱很多人需要临时手机号注册账号、接收验证码。把你的旧手机号租出去。平台选择 易码 / 接码平台:手机号按条收费,一条验证码 0.5~2 元 闲鱼出租:直接挂「备用机出租」,日租 3~5 元 方式月收益风险 接码平台30~80 元需注意合规性 闲鱼出租50~150 元需押金担保 四、测试机出租:开发者抢着要App 开发者需要不同机型做兼容性测试。旧手机型号越老越稀缺,反而越值钱。 Testin 云测:把你的手机接入云真机平台,开发者远程使用 直接挂闲鱼:标注机型+系统版本,月租 30~100 元不等 # 老款机型反而抢手 # iPhone 6s、小米 6、华为 Mate 9 这些「古董机」 # 开发者做低端兼容性测试时非常需要五、内容创作:旧手机变生产力工具旧手机完全可以作为专用设备: 监控摄像头:装个「掌上看家」APP,旧手机变监控 直播摄像头:画质不错的旧手机连接电脑当摄像头 车载导航 + 行车记录仪:废物利用不心疼 电子相框 + 桌面时钟:摆在桌上展示照片、显示天气 六、二手出售:终极变现实在不想折腾?直接卖掉也行。但别急着卖给回收平台——它们给的价最低。 渠道价格到账速度 官方回收(爱回收等)最低快 闲鱼个人出售最高慢 转转 / 拍拍中等中等 # 卖手机前必做 adb shell fastboot erase userdata # 彻底清除数据 # 恢复出厂设置 → 重新激活 → 再次恢复出厂设置(防止恢复工具) # 拍照清晰、描述如实,能多卖 20%收益最大化组合方案单台手机只做一件事太浪费。推荐组合:白天:挂载网心云跑带宽(被动收入) 晚上:刷悬赏猫做任务(主动收入) 周末:整理旧物挂闲鱼(一次性收入) 终极:手机实在太旧 → 拆零件卖(屏幕、主板、电池都能卖)常见问题Q:旧手机 24 小时开着会不会起火?A:正规品牌手机都有过充保护。建议:① 放在通风处 ② 拔掉手机电池鼓包就停用 ③ 使用定时插座每天断电 1 小时。Q:这么多平台,哪个收益最高?A:带宽挂机最稳定但收益中等;任务平台爆发力强但需要花时间;出租手机最省心但单机收入有上限。建议三种并行。Q:会不会被运营商封宽带?A:家用宽带跑 PCDN 确实有风险。控制上行流量,单台手机日均不超过 50GB 一般无事。或者用移动流量卡跑。Q:旧手机系统版本太低怎么办?A:能刷机的刷个第三方ROM(LineageOS 等),不能刷的就只做挂机类项目,不需要新系统。每台旧手机都是一段被遗忘的记忆,也是等待被激活的生产力。别让它继续吃灰了——插上电,让它为你赚钱。
2026年07月16日
60 阅读
0 评论
0 点赞
2026-07-16
rsync 文件同步与增量备份教程:比 scp 快 10 倍
> 你有没有试过 scp 传几十 GB 的文件,传到一半断了得重来?rsync 就是来解决这个痛点的——它只传输变化的部分,支持断点续传,压缩传输,是 Linux 管理员最爱的文件同步利器。---## rsync 的核心优势| 特性 | 说明 | |------|------| | 增量传输 | 只传文件变化的部分 | | 断点续传 | 传一半断了,重试只传没传完的 | | 压缩传输 | 自动压缩,节省带宽 | | 保留属性 | 保留文件权限、时间戳 | | 远程同步 | 支持 SSH,两台机器之间同步 |---## 基本语法```bash rsync [选项] 源目录/ 目标目录/ ```注意源目录末尾的 /:带 / 表示复制目录内容,不带 / 表示连目录本身一起复制。---## 本地同步示例```bash # 基本同步 rsync -av /source/ /dest/# 显示进度 rsync -avP /source/ /dest/# 删除目标中源没有的文件(镜像同步) rsync -av --delete /source/ /dest/# 排除某些目录 rsync -av --exclude='node_modules' --exclude='.git' /source/ /dest/ ```---## 远程同步```bash # 从本地推到远程 rsync -avzP -e "ssh -p 2222" /local/data/ user@remote:/remote/data/# 从远程拉到本地 rsync -avzP -e "ssh -p 2222" user@remote:/remote/data/ /local/data/ ```---## 常用选项速查| 选项 | 作用 | |------|------| | -a | 归档模式(保留权限、时间等) | | -v | 显示详细信息 | | -z | 压缩传输 | | -P | 显示进度 + 支持断点续传 | | --delete | 删除目标中多余的文件 | | --exclude | 排除文件/目录 | | -n / --dry-run | 模拟运行,不实际上传 |---## rsync 和 scp 的区别| 场景 | rsync | scp | |------|-------|-----| | 首次传输大文件 | 差不多 | 差不多 | | 再次传输(少量变化) | 极快(只传差异) | 重新传全部 | | 断点续传 | 支持 | 不支持 | | 删除多余文件 | 支持 | 不支持 |---日常传个小文件用 scp 足够,做备份、同步大目录用 rsync。掌握这两种工具,文件传输就再也不是问题了。
2026年07月16日
70 阅读
0 评论
0 点赞
2026-07-16
Git进阶工作流
Git 进阶工作流:从 add/commit/push 到团队协作的正确姿势Git 入门只需要三条命令:add、commit、push。但用了三年还是这三条命令,遇到合并冲突就删库重来,看到 git log --graph 像地铁线路图一样乱。这篇文章讲的是这三条命令之后的东西——分支策略、合并方式、rebase 的正确用法、以及一套真正能落地的团队工作流。你的 Git 在哪个阶段? 阶段 特征 入门 add、commit、push、pull 循环 进阶 会用 branch、merge、stash 熟练 rebase、cherry-pick、交互式 rebase 精通 reflog 救场、bisect 找 bug、submodule/subtree 这篇文章的目标是把你从"入门"拉到"熟练"。分支策略:Git Flow vs GitHub FlowGit Flow(重流程,适合版本发布型项目)main ●──●────────────────────●── v1.0 v2.0 \ / develop ●──●──●──●──●──●──● \ / feature/login ●──● \ release/1.0 ●──● \ hotfix/bug ●──● 适合:有明确版本号的软件(App、桌面软件),发布周期以周或月计。GitHub Flow(轻流程,适合持续部署)main ──●──●──●──●──●──●──● (随时可部署) \ \ \ \ feature1 ●──● ● ● feature2 ●──●──● 适合:Web 应用、API 服务,每天部署多次。规则只有一条:所有功能开发在 feature 分支,合并前走 Pull Request。怎么选?个人项目或小团队 Web 项目,用 GitHub Flow。你想简单,分支越少越好。Merge 的三种方式:你一直用错的那个按钮GitHub PR 页面有三个合并按钮:1. Merge Commit(默认)main: A──B──C \ feature: D──E merge 后: main: A──B──C────M \ / D──E 保留完整历史,但多人协作会产生大量 merge commit,"地铁线路图"就是这么来的。2. Squash and Merge(推荐)main: A──B──C \ feature: D──E squash merge 后: main: A──B──C──S (S 是 D+E 的压缩) 一条 feature 分支的所有 commit 压缩成一个,main 分支历史是一条直线。缺点:丢失了 feature 分支上的中间 commit 细节。3. Rebase and Mergemain: A──B──C \ feature: D──E rebase merge 后: main: A──B──C──D'──E' 把 feature 分支的 commit 逐个搬到 main 顶部,保留每个 commit,但改变了 commit hash。推荐策略: 场景 方式 功能开发 PR Squash and Merge Bug 修复(单 commit) Rebase and Merge 跨团队协作的大功能 Merge Commit(保留完整上下文) 我个人偏好:日常开发一律 Squash and Merge。main 分支历史干净,回滚一个 PR 就是回滚一个 commit。Rebase 的正确姿势Rebase 是最容易被用错的 Git 命令。记住核心原则:只 rebase 还没 push 过的本地 commit。场景一:同步上游变更(最常用)# 你在 feature 分支上开发了 3 天,main 已经被同事更新了 20 个 commit git checkout feature git fetch origin git rebase origin/main # 如果有冲突,解决后: git add . git rebase --continue 等价于把你 feature 分支上的 commit "摘下来",等 main 更新完再"贴回去"。效果是 history 变成一条直线。如果用 merge:git merge origin/main 会产生一个 "Merge branch 'main' into feature" 的 commit,纯粹噪音。场景二:交互式 Rebase —— 整理本地 commit你在本地开发时 commit 很随意:WIP: 开始写 fix typo 增加接口 WIP: 临时保存 又改了个 bug 完成功能 提交 PR 前,用交互式 rebase 整理:git rebase -i HEAD~6 进入编辑器:pick a1b2c3d WIP: 开始写 pick e4f5g6h fix typo pick i7j8k9l 增加接口 pick m0n1o2p WIP: 临时保存 pick q3r4s5t 又改了个 bug pick u6v7w8x 完成功能 改成:pick a1b2c3d 开始写 fixup e4f5g6h fix typo # 合并到上一个 pick i7j8k9l 增加接口 fixup m0n1o2p WIP: 临时保存 # 合并到上一个 fixup q3r4s5t 又改了个 bug # 合并到上一个 reword u6v7w8x 完成功能 # 保留但重新写 commit 消息 保存退出后,6 个零散的 commit 变成 3 个清晰的 commit。再 push 到远端。fixup 的作用是把该 commit 的内容合并到上一个 commit,但丢弃它的 commit 消息。squash 会合并内容并让你重新编辑消息。reword 只改消息不改内容。Git Stash:临时的后悔药正在 feature 分支上写了一堆代码,突然线上出了 bug 要切到 hotfix 分支:git stash # 暂存所有修改 git checkout main git checkout -b hotfix/crash # ... 修复、提交、合并 ... git checkout feature git stash pop # 恢复之前的工作 常用 stash 命令:git stash # 暂存所有改动 git stash save "描述" # 附说明 git stash list # 查看 stash 列表 git stash pop # 恢复最近一个并删除 git stash apply stash@{1} # 恢复指定 stash,不删除 git stash drop stash@{2} # 删除指定 stash Cherry-pick:精准搬运单个 commit测试环境上的某个修复需要立刻搬到线上,但线上分支和测试分支差异很大,不能直接 merge。# 找到那个 commit 的 hash git log --oneline # 切到目标分支 git checkout main # 只搬运这一个 commit git cherry-pick abc1234 如果是搬运一个范围:git cherry-pick abc1234..def5678 Cherry-pick 会重新生成 commit,hash 会变。不要对已经 push 到公共分支的 commit 做 cherry-pick,会造成重复提交。Git Reflog:救回"被删除"的 commitgit reset --hard 之后发现删错了,欲哭无泪?Reflog 是你最后的救命稻草。git reflog abc1234 HEAD@{0}: reset: moving to HEAD~3 def5678 HEAD@{1}: commit: 重要的功能 ghi9012 HEAD@{2}: commit: 另一个修改 看到那个 def5678 了吗?它还在 repo 里,只是没有分支指向它。git checkout -b recovery def5678 被"删除"的 commit 复活了。Reflog 默认保留 90 天,足够你从任何灾难中恢复。Git Bisect:自动定位引入 bug 的 commit线上突然出 bug,你知道 2 周前是好的,但中间有 200 个 commit,不知道哪个引出的 bug。git bisect start git bisect bad HEAD # 当前版本有问题 git bisect good abc1234 # 2 周前版本没问题 Git 自动 checkout 到中间某个 commit。你测试:git bisect good # 如果这个版本没问题 # 或 git bisect bad # 如果这个版本有问题 重复几次,Git 二分法快速定位到出问题的那一次 commit。200 个 commit,只需要测 log2(200) ≈ 8 次。有自动化测试的话更快:git bisect run python test_bug.py 全自动二分定位。一套可落地的团队工作流总结成每天的操作:# 早上来,同步最新代码 git checkout main git pull --rebase # 开始新功能 git checkout -b feature/xxx # ... 写代码,多次 commit ... # 提交 PR 前整理 commit git fetch origin git rebase -i origin/main # push git push -u origin feature/xxx # 创建 PR,等待 Code Review # Review 意见修改后,继续 commit + push # 最后选择 "Squash and Merge" # 切回 main,拉最新,开始下一个功能 git checkout main git pull --rebase git branch -d feature/xxx 常见问题Q:push 被拒绝,提示 "non-fast-forward"?因为远端有新 commit 你本地没有。正确做法:git fetch origin git rebase origin/main git push 千万别:git push -f(除非你完全确定自己在做什么)。Q:冲突了怎么办?Rebase 过程中冲突:# Git 提示冲突 # 编辑冲突文件,解决冲突 git add . git rebase --continue # 如果解决不了,放弃本次 rebase git rebase --abort Merge 过程中冲突也一样,但 --abort 换成 git merge --abort。Q:.git 目录太大了怎么办?历史久远的仓库,git clone 会下载全部历史。清理大文件:# 找出大文件 git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {print $3, $4}' | sort -rn | head -10 # 用 BFG Repo-Cleaner 或 git filter-branch 清理(谨慎操作) Git 的精髓不在于记住多少命令,而在于理解每个操作对历史的改变。Squash 让 main 分支干净、Rebase 让 feature 分支跟上游同步、Reflog 让一切误操作可逆。掌握这三件武器,Git 就从"能用的版本管理"变成"好用的版本管理"。
2026年07月16日
107 阅读
0 评论
0 点赞
2026-07-16
Crontab从入门到自动化运维
Crontab 从入门到自动化运维:让服务器自己打理自己每天凌晨备份数据库、每周清理日志、每小时检查服务状态——这些重复性操作你还在手动做?Crontab 就是 Linux 上的定时任务调度器,学会它,80% 的运维工作自动完成。这篇文章从语法基础讲到生产级运维脚本,覆盖 12 个实用场景。Crontab 语法 30 秒速通* * * * * 要执行的命令 分 时 日 月 周 0-59 0-23 1-31 1-12 0-7 表达式 含义 0 3 * * * 每天凌晨 3 点 */5 * * * * 每 5 分钟 0 0 * * 1 每周一凌晨 0 点 0 0 1 * * 每月 1 号凌晨 0 点 0 9-18 * * * 每天 9 点到 18 点,每小时整点 30 2 1,15 * * 每月 1 号和 15 号凌晨 2:30 操作命令:crontab -e # 编辑当前用户的定时任务 crontab -l # 列出当前用户的定时任务 crontab -r # 删除当前用户的定时任务(危险!) 场景一:数据库自动备份 + 过期清理最常见需求。# 每天凌晨 2 点备份 MySQL,保留最近 7 天 0 2 * * * /opt/scripts/backup-mysql.sh >> /var/log/backup.log 2>&1 backup-mysql.sh:#!/bin/bash BACKUP_DIR="/backup/mysql" DB_USER="root" DB_PASS="your_password" RETENTION_DAYS=7 mkdir -p "$BACKUP_DIR" # 备份所有数据库 mysqldump -u$DB_USER -p$DB_PASS --all-databases --single-transaction \ | gzip > "$BACKUP_DIR/full_$(date +%Y%m%d).sql.gz" # 删除 7 天前的备份 find "$BACKUP_DIR" -name "full_*.sql.gz" -mtime +$RETENTION_DAYS -delete echo "$(date): 备份完成,已清理 ${RETENTION_DAYS} 天前的旧备份。" 备份到本地不够,再加一条同步到对象存储:# 凌晨 3 点同步到阿里云 OSS 0 3 * * * /opt/scripts/sync-to-oss.sh 场景二:SSL 证书到期前 30 天提醒Let's Encrypt 证书 90 天过期,acme.sh 会自动续期。但万一自动续期失败呢?# 每天上午 10 点检查证书到期时间 0 10 * * * /opt/scripts/check-ssl.sh #!/bin/bash DOMAIN="yourdomain.com" DAYS=$(echo | openssl s_client -servername "$DOMAIN" -connect "$DOMAIN:443" 2>/dev/null \ | openssl x509 -noout -dates | grep notAfter | cut -d= -f2) EXPIRY=$(date -d "$DAYS" +%s) NOW=$(date +%s) DIFF=$(( ($EXPIRY - $NOW) / 86400 )) if [ $DIFF -lt 30 ]; then # 发通知(替换成你的通知方式) curl -s "https://your-webhook-url" -d "SSL 证书将在 ${DIFF} 天后过期!" fi 场景三:服务健康检查 + 自动重启# 每 5 分钟检查关键服务 */5 * * * * /opt/scripts/health-check.sh #!/bin/bash SERVICES=("nginx" "mysql" "docker" "sshd") for svc in "${SERVICES[@]}"; do if ! systemctl is-active --quiet "$svc"; then echo "$(date): $svc 已停止,尝试重启..." systemctl restart "$svc" # 重启后再次检查 sleep 5 if systemctl is-active --quiet "$svc"; then echo "$(date): $svc 重启成功。" else echo "$(date): $svc 重启失败,需要人工介入!" | tee -a /var/log/health-critical.log fi fi done 场景四:日志自动清理日志不清理,3 个月后 /var 撑爆。# 每天凌晨 4 点清理日志 0 4 * * * find /var/log -name "*.log" -mtime +30 -delete 0 4 * * * find /var/log -name "*.gz" -mtime +7 -delete 0 4 * * * journalctl --vacuum-time=7d Docker 日志清理(更容易爆):# 每周日凌晨清理 Docker 日志 0 5 * * 0 docker system prune -af --filter "until=168h" 场景五:磁盘空间告警# 每小时检查磁盘使用率 0 * * * * /opt/scripts/disk-alert.sh #!/bin/bash THRESHOLD=85 USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//') if [ "$USAGE" -gt "$THRESHOLD" ]; then echo "警告:磁盘使用率 ${USAGE}%,已超过 ${THRESHOLD}% 阈值" \ | mail -s "磁盘告警: $(hostname)" admin@example.com fi 场景六:每周更新系统包保持系统安全但不想每次手动 apt update:# 每周日凌晨 3 点更新 0 3 * * 0 apt update && apt upgrade -y && apt autoremove -y 保险起见,可以加一个重启前自检:0 3 * * 0 apt update && apt upgrade -y && apt autoremove -y && \ [ -f /var/run/reboot-required ] && shutdown -r +5 "系统更新需要重启" /var/run/reboot-required 文件存在表示更新了内核之类需要重启的包,这时才重启。场景七:Git 仓库自动同步如果你的博客是静态站点(Hexo/Hugo)或用 Git 管理的配置:# 每 30 分钟自动提交配置变更 */30 * * * * cd /opt/nginx-config && \ git add -A && git commit -m "auto backup $(date)" && git push 场景八:定时从网站抓数据# 每小时抓一次汇率 0 * * * * curl -s "https://api.exchangerate-api.com/v4/latest/USD" \ -o /data/exchange_rates/$(date +%Y%m%d_%H).json 配合数据分析脚本,自动生成报表。场景九:DDNS 动态更新家用宽带 IP 会变,用 crontab 定时更新 DNS:# 每 10 分钟检查 IP,变了就更新 Cloudflare DNS */10 * * * * /opt/scripts/ddns-update.sh #!/bin/bash CURRENT_IP=$(curl -s ifconfig.me) CACHED_IP=$(cat /tmp/last_ip.txt 2>/dev/null) if [ "$CURRENT_IP" != "$CACHED_IP" ]; then curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records/RECORD_ID" \ -H "Authorization: Bearer $CF_TOKEN" \ -H "Content-Type: application/json" \ --data "{\"type\":\"A\",\"name\":\"home.yourdomain.com\",\"content\":\"$CURRENT_IP\",\"ttl\":120}" echo "$CURRENT_IP" > /tmp/last_ip.txt echo "$(date): DDNS 更新为 $CURRENT_IP" fi 场景十:VPS 流量统计阿里云轻量服务器有流量限制,超了限速。# 每天统计 vnstat 流量并记录 0 0 * * * vnstat -i eth0 --json m >> /var/log/traffic.json 月底汇总看有没有超限风险。场景十一:浏览器 Cookie/Token 自动刷新有些 API 的 token 需要定期刷新:# 每 23 小时刷新一次 GitHub Token(GitHub token 24小时过期) 0 */23 * * * /opt/scripts/refresh-token.sh 场景十二:定时发日报到微信群# 每天下午 6 点汇总服务器状态发消息 0 18 * * * /opt/scripts/daily-report.sh #!/bin/bash MSG="【服务器日报】\n" MSG+="时间: $(date)\n" MSG+="磁盘: $(df -h / | awk 'NR==2{print $5}')\n" MSG+="内存: $(free -h | awk 'NR==2{printf "%.0f%%", $3/$2*100}')\n" MSG+="负载: $(uptime | awk -F'load average:' '{print $2}')\n" # 发到企业微信机器人 curl -s "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY" \ -H "Content-Type: application/json" \ -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$MSG\"}}" Crontab 进阶技巧日志重定向# 标准输出和标准错误都追加到日志 0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1 # 不想保留任何输出 0 3 * * * /opt/backup.sh > /dev/null 2>&1 环境变量问题Crontab 的执行环境和交互式 shell 不同,PATH 很有限。脚本开头一定要写完整路径:#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 或者在 crontab 顶部定义:PATH=/usr/local/bin:/usr/bin:/bin SHELL=/bin/bash 0 3 * * * /opt/backup.sh 锁机制:防止任务重叠备份跑了 2 小时还没结束,下一次又来了。用 flock 或者自己写锁:#!/bin/bash LOCKFILE="/tmp/backup.lock" if [ -f "$LOCKFILE" ]; then echo "上次备份还在运行,跳过本次。" exit 1 fi touch "$LOCKFILE" trap "rm -f $LOCKFILE" EXIT # 真正的备份逻辑 trap EXIT 保证脚本无论正常结束还是异常退出,锁都会被清理。常见问题Q:crontab -e 和 /etc/crontab 有什么区别?crontab -e 是当前用户的定时任务,/etc/crontab 是系统级。绝大多数场景用 crontab -e 就够了。需要指定执行用户时才用 /etc/crontab(格式多一个用户名字段)。Q:怎么调试 crontab 任务? 先把任务改成 * * * * *(每分钟执行),确认能跑 看 /var/log/syslog 里 crontab 的执行日志 在脚本里加详细 echo,重定向到文件 Q:时区问题?Crontab 使用系统时区。确认时区:timedatectl | grep "Time zone" 如果服务器在海外但你想按北京时间调度,先改时区:timedatectl set-timezone Asia/Shanghai 12 个场景,12 个 Shell 脚本。全部扔进 crontab,你的服务器就从一个等待你下命令的工具,变成了一个自己管理自己的自治系统。
2026年07月16日
92 阅读
0 评论
0 点赞
2026-07-16
Docker Compose 搭建服务全家桶:一个文件搞定 NAS 常用服务
Docker Compose 搭建服务全家桶:一个文件搞定 NAS 常用服务很多人在 NAS、软路由或者旧电脑上搭个人服务,装一个 Services 折腾一次,重复配 Nginx 代理、SSL 证书、数据目录。搭到最后,记忆比 DNS 还碎片化——哪个端口对应哪个服务全忘了。Docker Compose 就是来解决这个问题的:一个 YAML 文件,定义所有服务,一条命令全部启动。这篇文章给你一套可以直接复制粘贴的"服务全家桶"配置,涵盖 8 个常用服务。Docker Compose 基础Docker Compose 是一个 Docker 编排工具。核心概念: 概念 说明 service 一个容器化应用,如 Nginx、MySQL volumes 数据持久化,宿主机目录映射到容器 networks 容器间通信网络 depends_on 启动顺序依赖 安装(一般装 Docker 时就自带了):# 确认 compose 可用 docker compose version # 旧版本用 docker-compose,新版本已内置为 docker compose(注意没有横杠) 前置准备:目录结构建一个统一的管理目录:mkdir -p ~/docker-services cd ~/docker-services # 子目录结构 mkdir -p volumes/nginx/conf mkdir -p volumes/nginx/html mkdir -p volumes/mysql/data mkdir -p volumes/redis/data mkdir -p volumes/nextcloud/data mkdir -p volumes/vaultwarden/data mkdir -p volumes/jellyfin/{config,cache} mkdir -p volumes/alist/data mkdir -p volumes/nocodb/data mkdir -p volumes/uptime-kuma/data docker-compose.yml 全家桶直接把下面这个文件保存为 ~/docker-services/docker-compose.yml:version: '3.8' services: # ===== Nginx 反向代理 ===== nginx: image: nginx:alpine container_name: nginx restart: always ports: - "80:80" - "443:443" volumes: - ./volumes/nginx/conf:/etc/nginx/conf.d - ./volumes/nginx/html:/usr/share/nginx/html - ./volumes/nginx/ssl:/etc/nginx/ssl networks: - internal # ===== MySQL 数据库 ===== mysql: image: mysql:8.0 container_name: mysql restart: always environment: MYSQL_ROOT_PASSWORD: ChangeMe123! TZ: Asia/Shanghai volumes: - ./volumes/mysql/data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password networks: - internal # ===== Redis 缓存 ===== redis: image: redis:alpine container_name: redis restart: always command: redis-server --appendonly yes --requirepass ChangeMe123! volumes: - ./volumes/redis/data:/data networks: - internal # ===== Nextcloud 私有云盘 ===== nextcloud: image: nextcloud:stable container_name: nextcloud restart: always ports: - "8080:80" volumes: - ./volumes/nextcloud/data:/var/www/html environment: MYSQL_HOST: mysql MYSQL_DATABASE: nextcloud MYSQL_USER: nextcloud MYSQL_PASSWORD: ChangeMe123! REDIS_HOST: redis depends_on: - mysql - redis networks: - internal # ===== Vaultwarden 密码管理器 ===== vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: always ports: - "8081:80" volumes: - ./volumes/vaultwarden/data:/data environment: TZ: Asia/Shanghai SIGNUPS_ALLOWED: "false" DOMAIN: "https://vault.yourdomain.com" networks: - internal # ===== Jellyfin 媒体服务器 ===== jellyfin: image: jellyfin/jellyfin:latest container_name: jellyfin restart: always ports: - "8096:8096" volumes: - ./volumes/jellyfin/config:/config - ./volumes/jellyfin/cache:/cache # 映射你的媒体目录 - /path/to/movies:/media/movies - /path/to/tv:/media/tv environment: TZ: Asia/Shanghai networks: - internal # ===== Alist 网盘聚合 ===== alist: image: xhofe/alist:latest container_name: alist restart: always ports: - "5244:5244" volumes: - ./volumes/alist/data:/opt/alist/data environment: TZ: Asia/Shanghai networks: - internal # ===== NocoDB 在线表格 ===== nocodb: image: nocodb/nocodb:latest container_name: nocodb restart: always ports: - "8082:8080" volumes: - ./volumes/nocodb/data:/usr/app/data environment: NC_DB: "mysql2://mysql:3306?u=root&p=ChangeMe123!&d=nocodb" depends_on: - mysql networks: - internal # ===== Uptime Kuma 服务监控 ===== uptime-kuma: image: louislam/uptime-kuma:latest container_name: uptime-kuma restart: always ports: - "3001:3001" volumes: - ./volumes/uptime-kuma/data:/app/data networks: - internal networks: internal: driver: bridge 服务说明 服务 端口 用途 首次使用 Nginx 80/443 反向代理、SSL 终结 需手动配 conf MySQL 3306(内部) 统一数据库 docker exec mysql mysql -p Redis 6379(内部) 缓存、Session 已设密码 Nextcloud 8080 私有云盘 网页访问初始化 Vaultwarden 8081 Bitwarden 自建版 网页注册管理员 Jellyfin 8096 媒体服务器 网页配置媒体库 Alist 5244 网盘聚合 首次 docker exec alist ./alist admin 获取密码 NocoDB 8082 Airtable 替代 网页初始化 Uptime Kuma 3001 服务监控 网页注册管理员 启动全家桶cd ~/docker-services docker compose up -d 一条命令,9 个服务全部启动。-d 是后台运行。查看状态:docker compose ps NAME STATUS PORTS nginx Up 2 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp mysql Up 2 hours 3306/tcp redis Up 2 hours 6379/tcp nextcloud Up 2 hours 0.0.0.0:8080->80/tcp vaultwarden Up 2 hours 0.0.0.0:8081->80/tcp jellyfin Up 2 hours 0.0.0.0:8096->8096/tcp alist Up 2 hours 0.0.0.0:5244->5244/tcp nocodb Up 2 hours 0.0.0.0:8082->8080/tcp uptime-kuma Up 2 hours 0.0.0.0:3001->3001/tcp Nginx 反向代理配置把 9 个不同端口的服务统一到 80/443 端口,通过子域名或路径区分。在 volumes/nginx/conf/default.conf 里写:# Nextcloud server { listen 80; server_name cloud.yourdomain.com; location / { proxy_pass http://nextcloud; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } # Vaultwarden server { listen 80; server_name vault.yourdomain.com; location / { proxy_pass http://vaultwarden; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } # Jellyfin server { listen 80; server_name media.yourdomain.com; location / { proxy_pass http://jellyfin:8096; proxy_set_header Host $host; } } 以后所有服务统一走 cloud.yourdomain.com、vault.yourdomain.com 这样的域名,不需要记端口号。自动续期 SSL 证书(Let's Encrypt)配合 Certbot 和 acme.sh,推荐 acme.sh + Nginx 组合:# 在宿主机上装 acme.sh curl https://get.acme.sh | sh # 申请泛域名证书(需要 DNS API) export Ali_Key="YOUR_ALI_KEY" export Ali_secret="YOUR_ALI_secret" acme.sh --issue --dns dns_ali -d yourdomain.com -d "*.yourdomain.com" # 安装证书到 Nginx 目录 acme.sh --install-cert -d yourdomain.com \ --key-file /path/to/docker-services/volumes/nginx/ssl/key.pem \ --fullchain-file /path/to/docker-services/volumes/nginx/ssl/fullchain.pem \ --reloadcmd "docker exec nginx nginx -s reload" acme.sh 会自动创建 cron 任务定期续期,证书过期前 60 天自动更新。全程零人工干预。日常运维命令# 全部停止(数据不丢) docker compose down # 全部重启 docker compose restart # 更新所有镜像到最新版本 docker compose pull && docker compose up -d # 只重启某一个服务 docker compose restart nginx # 查看日志 docker compose logs -f --tail=50 mysql # 备份 MySQL 数据 docker exec mysql mysqldump -p ChangeMe123! --all-databases > backup.sql 添加新服务比如想加一个 Portainer(Docker 可视化管理):在 docker-compose.yml 的 services 段里追加: portainer: image: portainer/portainer-ce:latest container_name: portainer restart: always ports: - "9000:9000" volumes: - /var/run/docker.sock:/var/run/docker.sock - ./volumes/portainer/data:/data networks: - internal 然后:docker compose up -d portainer 只启动新增的服务,不影响已有服务。在线热插拔,不需要全局重启。常见问题Q:为什么不用 Portainer 这种图形化界面?可以用,本文没列入只是因为 Portainer 是管理工具而不是业务服务。你觉得需要就加一行,位置随意。Q:MySQL 密码明写了不安全吧?是的。生产环境建议用 .env 文件:# docker-compose.yml environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # .env 文件(记得加入 .gitignore) MYSQL_ROOT_PASSWORD=StrongPasswordHere 本文直接写在 yml 里是为了方便演示和复制。实际部署请改成 env 引用。Q:这些服务吃多少内存?9 个服务全部启动后,内存占用: 服务 内存 Nginx 10 MB MySQL 300 MB Redis 5 MB Nextcloud 150 MB Vaultwarden 30 MB Jellyfin 200 MB(空闲) Alist 30 MB NocoDB 150 MB Uptime Kuma 60 MB 合计 约 1 GB 也就是说,一台 2GB 的 VPS 或旧电脑就能跑这套全家桶。一个 YAML 文件,9 个服务,一条命令。以后再也不用翻开小本本找"那个服务开的哪个端口"。所有配置、数据、备份都在一个目录下,迁移的时候打包整个 docker-services 目录,scp 到新机器,docker compose up -d,立刻原地复活。
2026年07月16日
89 阅读
0 评论
0 点赞
2026-07-16
让旧手机秒变软路由:OpenWrt on Android 实战指南
让旧手机秒变软路由:OpenWrt on Android 实战指南上篇讲了旧手机刷 Linux 当服务器,评论区最高赞的问题:"能用旧手机做软路由吗?"能,而且比用淘汰的 x86 小主机划算得多。一台闲置的骁龙 835 手机,刷上 OpenWrt,100 块钱都不要,科学上网、广告过滤、端口转发全搞定。关键功耗只有 3-5W,24 小时开着不心疼。为什么用手机做软路由?先算笔账: 方案 设备成本 功耗 OpenWrt 兼容 性能 x86 软路由(J4125) 400-600 元 10-15W 完美 强 树莓派 4B 300-400 元 5-8W 良好 中 ARM 开发板(R2S) 200 元 5W 完美 中 旧手机 + USB 网卡 50-100 元 3-5W chroot 方式 骁龙 835 约等于 R2S 旧手机的性能完全够跑 OpenWrt。一个骁龙 835 的 CPU,日常软路由负载 CPU 占用不到 20%。方案总览:两种路线手机上跑 OpenWrt 有两种方式: 路线 原理 优点 缺点 Linux Deploy + chroot OpenWrt 在 chroot 环境里跑 OpenWrt 根文件系统 不需要刷机,跟 Linux Deploy 的教程复用 网络配置复杂 直接刷 OpenWrt 固件 替换 Android 系统 原生性能,完整功能 机型适配有限、风险大 本文采用路线一:Linux Deploy + chroot,风险最低、对机型无要求。第一步:准备硬件核心设备 旧 Android 手机(骁龙 835 以上,2GB+ RAM,已 root) USB 转以太网适配器(关键!手机只有一个 WiFi 芯片,做不了双网口软路由) OTG 转接线 推荐的 USB 网卡 型号 芯片 千兆 价格 绿联 CR111 AX88179 ✅ 40 元 优越者 Y-146 AX88179 ✅ 35 元 山泽 UH10 RTL8153 ✅ 30 元 买 AX88179 或 RTL8153 芯片的,Linux 内核免驱。别买杂牌,丢包率感人。第二步:在 Linux Deploy 里准备环境沿袭上篇 Linux Deploy 的教程,确保 Ubuntu 22.04 chroot 环境已启动。安装必要工具sudo apt update sudo apt install wget tar iptables dnsmasq hostapd -y 确认 USB 网卡被识别# 连接 USB 网卡后 lsusb | grep -i ethernet # 应该看到 AX88179 或 RTL8153 ip link show # 你应该看到 eth0(USB 网卡)和 wlan0(手机 WiFi) 记下接口名,后面配置会用到。第三步:下载并解压 OpenWrt 根文件系统去 OpenWrt 官网下载 ARM64 的 rootfs:cd /tmp wget https://downloads.openwrt.org/releases/23.05.3/targets/armsr/armv8/openwrt-23.05.3-armsr-armv8-generic-rootfs.tar.gz 选 armsr/armv8 是因为手机 ARM64 对应这个架构。23.05.3 是当前最新稳定版。解压:mkdir -p /opt/openwrt sudo tar -xzf openwrt-23.05.3-armsr-armv8-generic-rootfs.tar.gz -C /opt/openwrt 第四步:配置 OpenWrt chroot 环境挂载必要文件系统sudo mount -t proc proc /opt/openwrt/proc sudo mount -t sysfs sys /opt/openwrt/sys sudo mount -o bind /dev /opt/openwrt/dev sudo mount -o bind /dev/pts /opt/openwrt/dev/pts chroot 进入 OpenWrtsudo chroot /opt/openwrt /bin/sh 进了 OpenWrt 的 shell,能看到熟悉的 BusyBox 环境:BusyBox v1.36.1 (2024-03-22 14:05:23 UTC) built-in shell (ash) / # 第五步:网络配置 —— 软路由核心这是最关键的一步。网络拓扑如下:光猫 → 主路由器(提供 WiFi) → 手机(WiFi 连主路由做 WAN) └→ 手机 USB 网卡(做 LAN 接电脑/AP) 修改 OpenWrt 网络配置编辑 /etc/config/network:config interface 'loopback' option device 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config interface 'lan' option device 'eth0' option proto 'static' option ipaddr '192.168.100.1' option netmask '255.255.255.0' config interface 'wan' option proto 'dhcp' 解释: - lan:USB 网卡 eth0,作为软路由的下联口,IP 设 192.168.100.1 - wan:走宿主机(Ubuntu)的默认路由出外网开启 IP 转发echo 1 > /proc/sys/net/ipv4/ip_forward 配置 NATiptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT 启动 DHCP(可选)如果你想让 USB 网卡下面接的设备自动获取 IP:编辑 /etc/config/dhcp:config dhcp 'lan' option interface 'lan' option start '100' option limit '150' option leasetime '12h' 启动 dnsmasq:/etc/init.d/dnsmasq start 第六步:实际接线和测试接线方式手机 -- OTG 线 -- USB 网卡 -- 网线 -- 电脑(测试)或 AP(覆盖全家) 手机 -- WiFi -- 主路由器(连外网) 测试把电脑网线插到 USB 网卡上,手动设置 IP:IP: 192.168.100.10 子网掩码: 255.255.255.0 网关: 192.168.100.1 DNS: 223.5.5.5 然后 ping 网关:ping 192.168.100.1 # 通 ping 8.8.8.8 # 通 curl ifconfig.me # 返回你的公网 IP 流量路径:电脑 → USB网卡 → OpenWrt(NAT) → Ubuntu → wlan0 → 主路由 → 互联网。通了。第七步:安装 OpenClash 实现科学上网软路由的最大用途。安装依赖opkg update opkg install luci luci-i18n-base-zh-cn 安装 OpenClash去 GitHub Releases 下载对应架构的 ipk:cd /tmp wget https://github.com/vernesong/OpenClash/releases/download/v0.46.003-beta/luci-app-openclash_0.46.003-beta_all.ipk opkg install luci-app-openclash_0.46.003-beta_all.ipk 依赖报错的话继续装:opkg install coreutils-nohup bash iptables dnsmasq-full curl jsonfilter ca-certificates 配置 OpenClash装完后 LuCI 管理界面会多一个"OpenClash"选项卡。把你的订阅链接填进去,更新配置,启动。连接到 USB 网卡的设备,自动走代理,不需要装任何客户端。全家无缝科学上网。第八步:写入启动脚本,开机自启因为是在 Linux Deploy 的 chroot 里跑的,需要让 Linux Deploy 启动时自动拉起 OpenWrt 环境。在 Ubuntu 宿主机里创建启动脚本 /etc/init.d/openwrt-router:#!/bin/sh mount -t proc proc /opt/openwrt/proc mount -t sysfs sys /opt/openwrt/sys mount -o bind /dev /opt/openwrt/dev mount -o bind /dev/pts /opt/openwrt/dev/pts chroot /opt/openwrt /bin/sh -c " echo 1 > /proc/sys/net/ipv4/ip_forward /etc/init.d/network restart /etc/init.d/dnsmasq restart iptables -t nat -F iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE iptables -A FORWARD -i eth0 -o wlan0 -j ACCEPT iptables -A FORWARD -i wlan0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT " chmod +x /etc/init.d/openwrt-router update-rc.d openwrt-router defaults 进阶玩法AdGuard Home 全局去广告cd /opt/openwrt/opt wget https://static.adguard.com/adguardhome/release/AdGuardHome_linux_arm64.tar.gz tar -xzf AdGuardHome_linux_arm64.tar.gz ./AdGuardHome -s install 配置 DNS 上游为 223.5.5.5,把 OpenWrt DHCP 的 DNS 服务器指向 192.168.100.1:53。所有连接到 USB 网卡的设备,广告全过滤。统一管理所有设备USB 网卡后面接一个千兆交换机(30 块钱的腾达 SG105 就行),交换机再接各个房间的网线。全家所有有线设备都走这台"手机软路由",WiFi 设备走主路由(也可以配成桥接)。性能压力测试测试环境:小米 MIX 2S(骁龙 845),AX88179 USB 网卡 测试项 结果 NAT 转发吞吐 480 Mbps 科学上网吞吐(vless+tls) 180 Mbps 有线设备数量 5 台同时跑满没问题 CPU 占用(跑满 NAT) 35% 连续运行稳定性 14 天无重启 480 Mbps 的 NAT 性能,对于大部分家庭 300M 以内的宽带完全够用。常见问题Q:WiFi 做 LAN 口不行吗?原理上不行。手机的 WiFi 芯片只有一套射频,没法同时做 Station(连主路由)和 AP(发信号)。如果你用 USB WiFi 网卡(不是 USB 转以太网),可以解决:手机自带 WiFi 连外网,USB WiFi 网卡开热点做 LAN。但 USB WiFi 网卡信号不如正经 AP,不推荐。Q:USB 网卡发热怎么办?AX88179 芯片发热确实大,满载能到 60 度。解决方案: 1. 在芯片上贴小散热片 2. 手机竖着放,USB 网卡悬空保持通风 3. 别放路由器上叠罗汉Q:这方案稳定性如何?我连续跑了 14 天,零重启、零断流。唯一的风险是 USB 线松动——OTG 转接头容易接触不良,建议用直连的 Type-C 转 RJ45 转换器,少一个转接头就少一个故障点。花 70 块钱(二手手机 30 + USB 网卡 40),就能得到一台千兆软路由,功耗 4W,还能当 Linux 服务器双用。除了接线丑一点,找不到不这么干的理由。
2026年07月16日
82 阅读
0 评论
0 点赞
2026-07-16
Tasker 自动化入门:让手机替你干活,10 个实用场景
Tasker 自动化入门:让手机替你干活,10 个实用场景每次到公司都要手动关铃声、连 WiFi、调音量。每次上车都要手动开蓝牙、开导航。每次开会前都要翻设置开关静音模式。这些重复性操作,每天加起来至少浪费 10 分钟。Tasker 就是解决这个问题的——它是 Android 上最强的自动化工具,没有之一。这篇文章给你 10 个拿来就能用的自动化场景,每个都附完整配置步骤。Tasker 是什么?Tasker 是一个 Android 自动化 App。核心逻辑就一句话:当某件事发生时,自动执行某个动作。它把这两步分别叫 Profile(触发条件)和 Task(执行动作)。比如:Profile:连接到"公司WiFi" → Task:把手机调成震动模式装上 Tasker 后,你的手机就从一个被动等待操作的设备,变成了一台根据环境自动响应的智能终端。购买:Google Play 付费($3.49),国内用户可以在官网 tasker.joaoapps.com 下载 7 天试用版。强烈建议付费支持,这个 App 值 10 倍的价格。基础概念速通在开始配置之前,先理解三个核心概念: 概念 说明 举例 Profile 触发条件 时间、地点、WiFi、蓝牙、电量…… Task 要执行的动作 调音量、发通知、开App、执行Shell…… Context Profile 里的附加条件 "连接公司WiFi"且"时间是工作日" 一个 Profile 可以绑定多个 Task。一个 Task 里可以有多个 Action(按顺序执行)。场景一:到公司自动切换工作模式需求:连接到公司 WiFi 后自动关铃声、调低媒体音量、打开企业微信。配置步骤: 新建 Profile → State → Net → WiFi Connected SSID 填公司 WiFi 名称 新建 Task,命名为"工作模式": Action 1: Audio → Ringer Volume → Level 0 Action 2: Audio → Media Volume → Level 5 Action 3: App → Launch App → 企业微信 追加:离开公司自动恢复长按这个 Profile → Add Exit Task:Action 1: Audio → Ringer Volume → Level 7 Action 2: Audio → Media Volume → Level 10 离开公司 WiFi 范围,自动恢复。全程零操作。场景二:开会自动静音(日历联动)需求:日历里有"会议"事件时,自动切换成静音+震动。配置步骤: 新建 Profile → State → App → Calendar Entry Title 匹配 *会议*(通配符匹配所有含"会议"的事件) 新建 Task "会议静音": Action 1: Audio → Silent Mode → Vibrate Action 2: Audio → Notification Volume → Level 0 Action 3: Alert → Flash → Text "已自动切换为会议模式" 会议结束后自动恢复,同样用 Exit Task 把铃声拉回来。从此再也不会在开会时手机突然响起。场景三:低电量自动提醒 + 省电需求:电量掉到 15% 弹通知,掉到 5% 自动开启超级省电。配置步骤:Profile 1:State → Power → Battery Level → 0-15%Action 1: Alert → Notify → Title "电量低" Text "当前电量 %BATT%,请充电" Profile 2:State → Power → Battery Level → 0-5%Action 1: Net → WiFi → Off Action 2: Net → Bluetooth → Off Action 3: Display → Brightness → Level 20 Action 4: Alert → Say → Text "电量即将耗尽,请立即充电" %BATT 是 Tasker 内置变量,代表当前电量百分比。还有 %TEMP(温度)、%CPUS(CPU 占用)等几十个内置变量,非常强大。场景四:车载模式自动启动需求:连上车载蓝牙后自动打开热点、打开高德地图、最大媒体音量。配置步骤: 新建 Profile → State → Net → BT Connected 选择车载蓝牙的设备名/地址 新建 Task "车载模式": Action 1: Net → WiFi Tether → On Action 2: Audio → Media Volume → Level 15 Action 3: App → Launch App → 高德地图 Action 4: Display → Display Timeout → 30 mins Exit Task:Action 1: Net → WiFi Tether → Off Action 2: Audio → Media Volume → Level 8 Action 3: Display → Display Timeout → 1 min 上车自动热点、自动导航,下车自动恢复。一气呵成。场景五:睡前开启勿扰模式需求:晚上 11 点到早上 7 点,全局勿扰,只允许家人来电。配置步骤: 新建 Profile → Time → 23:00 - 07:00 新建 Task "夜间模式": Action 1: Audio → Do Not Disturb → Priority / Alarms Only Action 2: Display → Brightness → 自适应(最低亮度) Action 3: Net → WiFi → Off(不想半夜被消息吵醒的话) Action 4: Net → Mobile Data → Off Exit Task 里恢复所有开关。比系统自带的定时勿扰好用——系统只有勿扰,Tasker 可以同时关 WiFi、关数据、调亮度,一条龙。场景六:截图自动重命名并归档需求:每次截图后,自动把文件按日期重命名并移到指定文件夹,Screenshots 目录永远不会乱。配置步骤: 新建 Profile → Event → File → File Modified 路径填 /storage/emulated/0/Pictures/Screenshots/ 新建 Task "截图整理": Action 1: Task → Wait → 2 seconds(等文件写完) Action 2: Variable → Variable Set → Name %newname → To Screenshot_%DATE_%TIME Action 3: File → Move → From Screenshots/*.png → To /Pictures/Screenshots/%newname.png Action 4: Alert → Flash → Text "截图已保存至 Screenshots 归档" %DATE 和 %TIME 是 Tasker 内置变量。从此截了图不用手动整理,文件夹清清爽爽。场景七:摇一摇打开手电筒需求:手机摇两下自动开关手电筒。黑夜里找钥匙孔的神器。配置步骤: 新建 Profile → Event → Sensor → Shake 灵敏度调成 Medium 新建 Task "手电筒": Action 1: Task → If → %TorchState ~ off Action 2: Alert → Torch → On Action 3: Else Action 4: Alert → Torch → Off Action 5: End If 还有一种写法,更简洁:Action 1: Alert → Torch → Toggle 一行搞定。配合锁屏状态下熄屏也能摇——实测比亮屏找 App 快 5 秒以上。场景八:复制验证码自动填入需求:收到短信验证码,自动弹小窗口显示,点击即可填入。配置步骤: 新建 Profile → Event → Phone → Received Text Sender 留空(匹配所有),Content 填 *验证码* 新建 Task "提取验证码": Action 1: Variable → Variable Search Replace Variable: %SMSRB Search: \d{4,6} Store Matches In: %code Action 2: Alert → Flash → Text "验证码: %code1" Action 3: System → Set Clipboard → Text %code1 %SMSRB 是短信正文,正则 \d{4,6} 提取 4-6 位数字。验证码到手的同时复制到剪贴板,切回 App 直接粘贴。场景九:到家自动连 WiFi、播音乐需求:走进家门范围,自动连 WiFi、用音箱播放"欢迎回家"。配置步骤:用 WiFi Near(不需要 GPS,只扫描附近 WiFi): 新建 Profile → State → Net → WiFi Near SSID 选家里 WiFi 新建 Task "回家": Action 1: Net → WiFi → On Action 2: Task → Wait → 3 seconds Action 3: Audio → Media Volume → Level 10 Action 4: Media → Music Play → 选一首短音乐或 TTS 如果家里有 Home Assistant 或者智能音箱,还能追加:Action 5: Net → HTTP Request → POST http://192.168.1.x:8123/api/services/light/turn_on 开门瞬间灯自动亮起来,仪式感拉满。场景十:应用使用时长告警需求:刷抖音超过 30 分钟弹提醒,超过 60 分钟强行退出。配置步骤: 新建 Profile → App → 抖音 新建 Task "计时": Action 1: Task → Wait → 30 minutes Action 2: Alert → Notify → Title "注意" Text "刷了30分钟了,歇会吧" Action 3: Task → Wait → 30 minutes Action 4: App → Go Home Action 5: Alert → Flash → Text "已自动退出,别再刷了" 配合 Exit Task 重置计时器。这个功能也可以扩展成"任何 App 超过 X 分钟自动提醒",控制屏幕时间的好帮手。进阶:Tasker 还能做什么?这 10 个场景只是冰山一角。Tasker 配合插件生态可以做到: 插件 能力 AutoApps 系列 模拟触摸、通知拦截、语音控制 Join 多设备联动(手机→电脑) Termux:Task 在 Tasker 里执行 Termux 的 Shell 脚本 KWGT 自定义桌面小组件显示 Tasker 变量 比如"检测到快递短信 → 自动截取快递单号 → 用 Termux 调快递查询 API → 推送结果到手机通知栏"。一套组合拳,全自动。常见问题Q:Tasker 耗电吗?不耗。Tasker 本身是个极轻量的状态监听服务,待机功耗可忽略。WiFi Near 这种需要持续扫描的 Profile 会略增耗电,但一天多个 1-2% 的程度。Q:国产手机能用吗?能用,但需要在系统设置里把 Tasker 加入白名单: - 电池优化 → 不优化 - 自启动管理 → 允许 - 锁定后台(多任务界面下拉锁定)国产 ROM 对后台进程限制非常激进,以上三步缺一不可。Q:Tasker 和快捷指令(iOS)比哪个强?Tasker 强一个数量级。快捷指令是"用户手动触发 + 有限的系统能力",Tasker 是"环境自动触发 + 几乎无限的 Android 系统能力 + JavaScript/Shell 脚本支持 + 第三方插件生态"。不是一个量级的东西。每天省 10 分钟,一年就是 60 个小时。Tasker 花 3.5 美元买断,用三年,等于每个小时省下来的时间只值 2 美分。我找不到比这更划算的投资。
2026年07月16日
61 阅读
0 评论
0 点赞
2026-07-16
旧手机刷 Linux 做微型服务器:Linux Deploy 完整教程
旧手机刷 Linux 做微型服务器:Linux Deploy 完整教程上篇讲了旧手机变废为宝的 8 个方案,评论区有人问:"能不能直接把手机刷成 Linux 系统,当正经服务器用?"能。一台骁龙 845 的旧手机,刷上 Ubuntu Server,性能顶得上一台入门 VPS——还不用交月租。这篇文章带你从头到尾走一遍 Linux Deploy 的完整流程,从刷系统到跑 Docker,一步不落。为什么用 Linux Deploy 而不是 Termux?先搞清楚区别: 对比维度 Termux Linux Deploy 运行方式 Android 上的终端模拟器 chroot 容器跑完整 Linux 需要 Root 不需要 需要 系统完整性 阉割版,部分命令不可用 完整 Linux 发行版 能跑 Docker 不能 能(需内核支持) systemd 不支持 支持 适用场景 轻量开发、SSH 应急 当服务器用 简单说:Termux 是"Android 里加了个终端",Linux Deploy 是"Android 上开了个虚拟机跑真 Linux"。需要 root 是门槛,但换来的是一套完整的 Linux 环境。第一步:准备工作硬件要求 Android 手机,系统 7.0+ 已解锁并 root(Magisk 或 SuperSU) 至少 4GB 剩余存储空间 建议运存 4GB+、存储 64GB+ 软件准备 安装 Linux Deploy(Google Play 或 GitHub Releases) 安装 BusyBox(Magisk 模块或独立 App) # 确认 root 权限正常 adb shell su id # 应该看到 uid=0(root) 第二步:配置 Linux Deploy打开 Linux Deploy,点击右下角设置图标,逐项配置:基础配置 配置项 值 说明 发行版 Ubuntu 选熟悉的就行 版本 jammy (22.04) 最新的 LTS 架构 arm64 / aarch64 自动检测,别改 安装类型 镜像文件 比目录安装稳 镜像大小 8192 MB 8G 够用,后面可以扩 文件系统 ext4 标准选择 高级配置 配置项 值 用户名 自定义(默认 android) 密码 设个复杂点的 SSH 开启 SSH 端口 22(或改成 2222 避免冲突) 初始化系统 sysv / run-parts 挂载 建议挂载 /sdcard 到容器内 关键配置截图说明打开"挂载点"选项:挂载 Android 资源:✅ /sdcard → /mnt/sdcard /storage/emulated/0 → /mnt/internal 这样容器里就能直接读写手机存储,下载的文件、脚本都在一个目录下。第三步:安装系统配置确认无误后,点右上角菜单 → 安装。[10:23:01] 开始安装 ... [10:23:05] 创建镜像文件 ... [10:23:45] 格式化 ext4 ... [10:24:12] 挂载镜像 ... [10:24:15] 下载 bootstrap ... [10:28:30] 解压 bootstrap ... [10:30:18] 配置系统 ... [10:31:02] 安装完成 整个过程约 5-8 分钟,视网络速度而定。墙内用户可能会卡在下载环节,解决办法:# 在 Linux Deploy 设置里替换镜像源 # 配置 → 镜像源 URL http://mirrors.aliyun.com/ubuntu-ports/ 安装完成后点"启动"。第四步:SSH 登录你的"手机服务器"同一 WiFi 下,电脑终端直接 SSH:# 查看手机 IP adb shell ip addr show wlan0 | grep inet # SSH 登录 ssh android@192.168.1.100 # 如果是自定义端口 ssh -p 2222 android@192.168.1.100 进来就是熟悉的 Ubuntu 命令行:Welcome to Ubuntu 22.04 LTS (GNU/Linux 4.9.186 aarch64) android@localhost:~$ uname -a Linux localhost 4.9.186 #1 SMP PREEMPT Mon Jan 1 00:00:00 CST 2023 aarch64 aarch64 aarch64 GNU/Linux 基础环境配置# 换国内源(阿里云) sudo sed -i 's/ports.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo apt update && sudo apt upgrade -y # 装基础工具 sudo apt install vim git curl wget build-essential -y # 设置时区 sudo timedatectl set-timezone Asia/Shanghai 第五步:跑服务实战5.1 Nginx + 静态网站sudo apt install nginx -y sudo systemctl start nginx 同一 WiFi 下,浏览器打开 http://手机IP,看到 Nginx 欢迎页。把你的静态网站文件放到 /var/www/html/。5.2 Python Flask 应用sudo apt install python3-pip -y mkdir ~/webapp && cd ~/webapp python3 -m venv .venv && source .venv/bin/activate pip install flask gunicorn 写个简单应用 app.py:from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello from my phone!' if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) 用 Gunicorn 生产运行:gunicorn -w 2 -b 0.0.0.0:5000 app:app -D 5.3 Docker(如果需要)不是所有手机内核都支持 Docker。先检查:# 检查内核是否支持 Docker 所需的特性 cat /proc/config.gz | gunzip | grep -E "CGROUP|NAMESPACE|OVERLAY|VETH|BRIDGE" 大多数旧手机内核缺少 OVERLAY_FS 和部分 CGROUP 选项,Docker 大概率跑不起来。但 podman(无守护进程版 Docker 替代)可能可以:sudo apt install podman -y podman run hello-world 能跑通就赚了,跑不通也别纠结——Nginx + Python + Node 已经覆盖 90% 的服务器需求了。第六步:开机自启 + 保活手机重启后 Linux Deploy 容器不会自动启动。解决办法:方案 A:Linux Deploy 自带设置Linux Deploy 设置里开启"自动启动"和"启动延迟 10 秒",让开机后自动拉起容器。方案 B:配合 TaskerTasker 检测到开机完成 → 等待 15 秒 → 发送 intent 启动 Linux Deploy:操作 → 系统 → 发送意图 Action: ru.meefik.linuxdeploy.action.START Package: ru.meefik.linuxdeploy Class: ru.meefik.linuxdeploy.LauncherActivity Target: Activity 保活:防止系统杀进程# Android 设置 设置 → 电池 → 电池优化 → Linux Deploy → 不优化 设置 → 应用 → Linux Deploy → 电池 → 无限制 手机一直插电的话,Agent 被杀的概率会大幅降低。性能实测我用的是一台小米 MIX 2S(骁龙 845 / 6GB RAM): 测试项 结果 sysbench CPU 单核 890 events/sec sysbench 内存读写 4200 MiB/sec Nginx 静态页 QPS 1200+ req/s Python Flask 简单接口 QPS 380 req/s 整机功耗(跑服务) 3.2W 连续运行稳定性 7 天无重启、无死机 作为对比,阿里云 1 核 1G 轻量服务器的 sysbench CPU 得分约 1100,内存约 3500 MiB/sec。旧手机跑 Nginx 的性能跟入门 VPS 在同一个量级上——但功耗只有 3W,还不花钱。常见问题Q:必须 root 吗?必须。Linux Deploy 需要 root 权限创建 chroot 环境和挂载文件系统。不愿意 root 就用 Termux,功能少一些但也能跑大多服务。Q:电池会鼓包吗?老生常谈。长期插电的锂电池必然鼓包。两种解决思路: 1. 定时插座,每天断电 2-3 小时 2. 物理拆掉电池,从 USB 口直接从主板供电触点引线出来(搜"手机改直供电"有教程)Q:手机性能和 VPS 到底差多少?以骁龙 845(2018 年旗舰)对比阿里云 1 核 1G(2024 年入门 VPS),CPU 性能不相上下,内存带宽手机还略高。差距在网络——家宽上行通常只有 30Mbps,VPS 动辄 100M+。适合跑计算型服务(爬虫、定时任务、小 Web),不适合跑对公网带宽要求高的业务。Q:能装宝塔面板吗?理论上能,实际不建议。宝塔对 arm64 支持不完善,装完一堆报错。直接 apt 装 Nginx + MySQL + PHP,手动配 10 分钟的事,比宝塔轻量得多。一台骁龙 845 的手机,闲鱼上 200 块钱。刷上 Ubuntu,它就是一台 3W 功耗的 ARM 服务器。跑个个人博客、搭个 API 服务、挂个 Telegram Bot,用起来跟 VPS 没差。唯一的区别是:VPS 一年三四百,这台手机插家里角落里,一年电费不到 20 块钱。
2026年07月16日
73 阅读
0 评论
0 点赞
2026-07-16
安卓手机变废为宝:旧手机别扔,它还有 8 种你不知道的玩法
还在把旧手机当闹钟?或者让它躺在抽屉里吃灰?今天这篇文章,给你 8 个让旧手机"再就业"的硬核方案,每一个都有实操命令,看完就能上手。先看一眼你的旧手机配置adb shell cat /proc/cpuinfo | grep -E "Processor|Hardware" adb shell cat /proc/meminfo | head -3 adb shell df -h /data 拿到 CPU 型号、内存大小、存储空间,我们才好给它安排合适的岗位。方案一:24 小时监控摄像头把旧手机变成监控,成本为零,画质比百元摄像头好得多。思路:Android 上装 IP 摄像头 App → 局域网推 RTSP 流 → 电脑/服务器上用 FFmpeg 拉流录制。手机端:安装「IP摄像头」应用,开启 RTSP 服务,记下地址 rtsp://192.168.x.x:8554/live。服务器端录制:# 24 小时分段录制,每个文件 1 小时 ffmpeg -i rtsp://192.168.1.100:8554/live \ -c copy -f segment -segment_time 3600 \ -strftime 1 /data/monitor/%Y%m%d_%H%M%S.mp4 进阶:配合 motion 做移动侦测,有动静才录,省存储空间。方案二:离线下载机旧手机功耗极低(2-5W),插上充电器 7×24 开着也不心疼电费。核心工具:Termux + Aria2。# Termux 中安装 pkg install aria2 # 启动 Aria2 RPC 服务 aria2c --enable-rpc --rpc-listen-all \ --rpc-secret=your_password \ --dir=/sdcard/Download \ --max-concurrent-downloads=5 -D 手机变身 Aria2 下载器后,配合 AriaNg 网页面板,任何设备都能远程推送下载任务。方案三:车载导航 + 行车记录一部旧手机 + 一个支架 = 车载中控。主手机不用挂支架,开热点给旧手机就行。推荐 App: 功能 App 说明 导航 高德地图车机版 专为横屏优化,界面简洁 行车记录 DailyRoads Voyager 循环录制,碰撞自动保存 音乐 Spotify / 网易云 下载离线,上车自动播放 自动化:用 Tasker 设置「检测到车载蓝牙 → 自动开热点 + 开导航」,上车即用。方案四:电子相框 / 信息屏把手机插上充电座,挂在墙上,变成一个实时更新的信息屏幕。方案 A:电子相框安装 Fotoo 或类似 App,连接家庭 NAS 照片目录,每 30 秒自动轮播。也可以做成 Google Photos 相框,指定相册自动同步。方案 B:信息仪表盘用 Fully Kiosk Browser 锁定一个网页,全天显示:# 示例:用 Homepage 搭建仪表盘 #显示天气、日历、Nas状态、RSS订阅等 dockerrun-d--namehomepage\ ghcr.io/gethomepage/homepage:latest 方案五:家庭文件服务器旧手机插一张 256G TF 卡,用 SMB 协议共享出来,全家设备都能访问。工具:LAN Drive 或 Material Files 的 FTP/SMB 功能。# Termux 里跑 Samba(需要 root) pkg install samba smbd -D -s /data/data/com.termux/files/usr/etc/samba/smb.conf 配合 Syncthing 做多设备自动同步,比网盘快 10 倍。方案六:智能家居中控手机常年插电放在客厅,作为 Home Assistant 的专用中控面板。安装 Home Assistant Companion,开启以下传感器上报: 传感器 用途 电量 低电量触发充电提醒自动化 光线 夜晚自动调暗屏幕 麦克风 语音唤醒(配合 Assist) 再用 WallPanel 或 Fully Kiosk,让屏幕常亮显示 HA 仪表盘,随时语音控制全屋设备。方案七:开发测试服务器这是我最喜欢的用法——旧手机跑 Linux,当一台迷你开发服务器。Step 1:Termux 装开发环境pkg install nodejs python git openssh sshd -p 8022 # 开启 SSH,其他设备可远程连接 Step 2:跑实际服务# 跑一个 Python Web 服务 python -m http.server 8080 # 跑一个 Node 爬虫 node crawler.js # 跑一个 Telegram Bot python bot.py 骁龙 845 / 855 旧旗舰的性能,跑这些绰绰有余。方案八:万能遥控器有红外(IR)的旧手机(小米/华为很多机型都有),可以当全屋万能遥控器。安装「遥控精灵」或「小米遥控」,支持空调、电视、风扇、机顶盒等主流品牌。红外机型推荐:小米 6、小米 8、Redmi K20 Pro、华为 Mate 20 系列。方案总结对比 方案 难度 需 Root 功耗 实用性 监控摄像头 ★☆☆ 否 中 ★★★★★ 离线下载机 ★★☆ 否 低 ★★★★☆ 车载导航 ★☆☆ 否 中 ★★★★★ 电子相框 ★☆☆ 否 低 ★★★☆☆ 文件服务器 ★★☆ 建议 低 ★★★★☆ 智能家居中控 ★★☆ 否 低 ★★★★★ 开发服务器 ★★★ 否 中 ★★★★☆ 万能遥控器 ★☆☆ 否 低 ★★★☆☆ 常见问题Q:旧手机一直插电安全吗?A:建议用定时插座,每天断电 2 小时,减缓电池鼓包。或者直接拆掉电池,焊 USB 供电线直连主板。Q:没 root 限制大吗?A:除了 SMB 服务需要 root 外,其他方案都不需要。Q:最推荐哪个方案?A:监控和开发服务器。前者省钱实用,后者能让你的技术栈多一个 ARM 平台的实战经验。旧手机的价值不在二手市场,在于你用它解决了什么问题。赶紧去抽屉里把它翻出来吧。
2026年07月16日
96 阅读
0 评论
0 点赞
2026-07-16
网站迁移零停机:从旧服务器搬家到新服务器的完整指南
> 换服务器是每个站长都会遇到的事。旧 VPS 快到期了、配置不够了、或者就是想换个更好的。最怕的就是迁移过程中网站打不开、数据丢失。其实只要按流程来,完全可以在线无损搬家。---## 迁移前的准备先搞清楚要搬什么:```bash # 确认当前网站目录 echo $PWD && ls -la# 确认数据库位置和大小 ls -lh /mnt/mmcblk1p1/typecho/usr/typecho.db# 确认 Web 服务运行用户 ps aux | grep nginx ```---## 第一步:在新服务器上搭好环境```bash apt update apt install nginx php-fpm php-sqlite3 sqlite3 -y systemctl start nginx php7.4-fpm systemctl enable nginx php7.4-fpm ```---## 第二步:同步网站文件使用 rsync 增量同步:```bash rsync -avzP \ -e "ssh -p 2222" \ /var/www/html/ \ root@新服务器IP:/var/www/html/ ```- -a:归档模式,保留权限 - -v:显示详细信息 - -z:压缩传输 - -P:显示进度 + 支持断点续传---## 第三步:迁移数据库SQLite 最简单,直接复制文件:```bash # 旧服务器上 tar -czf /tmp/db_backup.tar.gz /mnt/mmcblk1p1/typecho/usr/typecho.db scp -P 2222 /tmp/db_backup.tar.gz root@新服务器IP:/tmp/# 新服务器上 tar -xzf /tmp/db_backup.tar.gz -C / chown www-data:www-data /mnt/mmcblk1p1/typecho/usr/typecho.db ```---## 第四步:更新 DNS 解析修改域名 DNS 指向新服务器 IP。注意: - TTL 提前 24 小时改小(600秒),切换几乎无感知 - 改完 DNS 后保留旧服务器 3 到 7 天观察---## 迁移检查清单- [ ] 网站文件已完整同步 - [ ] 数据库已迁移并确认数据完整 - [ ] 文件权限正确(www-data 用户可读写) - [ ] Nginx 配置正确,能正常访问 - [ ] PHP 版本一致 - [ ] SSL 证书已在新服务器配置 - [ ] DNS 解析已更新 - [ ] 旧服务器保留一周观察---按这个流程走,网站迁移就像搬个家,东西不少但不会丢,过程复杂但不会断。
2026年07月16日
102 阅读
0 评论
0 点赞
2026-07-15
个人云盘 NextCloud 搭建指南:数据掌握在自己手里
> 用百度云担心隐私?iCloud 容量不够?NextCloud 让你在自己的服务器上搭建私有云盘,文件、日历、联系人、协作办公全部自己掌控。功能不输任何商业网盘,而且完全免费开源。---## NextCloud 是什么?NextCloud 是一个开源的自托管云存储解决方案,可以把它理解成自己搭建的 Dropbox 或 Google Drive。除了文件存储和同步,还有日历、联系人、邮件、在线协作编辑等大量插件。---## 使用 Docker 部署```yaml version: '3' services: db: image: mariadb:10.6 command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW restart: always volumes: - db:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_PASSWORD: your_db_password MYSQL_DATABASE: nextcloud MYSQL_USER: nextcloudapp: image: nextcloud:latest restart: always ports: - 8080:80 volumes: - nextcloud:/var/www/html - /mnt/data/nextcloud:/var/www/html/data environment: MYSQL_HOST: db MYSQL_PASSWORD: your_db_password MYSQL_DATABASE: nextcloud MYSQL_USER: nextcloud depends_on: - dbvolumes: db: nextcloud: ```启动:docker-compose up -d---## 客户端使用NextCloud 提供全平台客户端:| 平台 | 获取方式 | |------|---------| | Windows/Mac/Linux | nextcloud.com/install | | iOS | App Store 搜索 Nextcloud | | Android | Google Play 或 F-Droid |安装后输入你的服务器地址,登录账号,就能像用 Dropbox 一样自动同步文件了。---## 实用插件推荐1. Calendar:日历,支持 CalDAV 同步到手机 2. Contacts:通讯录,支持 CardDAV 同步 3. Talk:内置的语音/视频通话和聊天 4. Notes:Markdown 笔记 5. OnlyOffice:在线编辑 Word/Excel/PPT 6. External Storage:挂载外部存储---## 自建 vs 商业网盘| 方面 | NextCloud 自建 | 商业网盘 | |------|---------------|---------| | 隐私控制 | 数据完全在自己手里 | 数据在别人服务器上 | | 存储空间 | 取决于你的硬盘 | 免费版有限 | | 功能扩展 | 大量免费插件 | 功能固定 | | 维护成本 | 需要自己维护 | 零维护 |---如果想完全掌控自己的数据,NextCloud 是目前最成熟的开源方案。搭建一次,全家人都能用,手机电脑自动同步。
2026年07月15日
70 阅读
0 评论
0 点赞
2026-07-15
Cloudflare Pages + GitHub:全球CDN加速的免费静态托管方案
GitHub Pages 搭好的博客,国内用户打开要等 3 秒,一看 Chrome Network,TTFB 800ms,资源加载断断续续。GitHub 的 CDN 节点在国内确实不太行。这时候就该 Cloudflare Pages 出场了——同样的免费,同样的 git push 自动部署,但人家在全球 330+ 个城市有节点,包括中国大陆附近的香港、东京、新加坡。换上去,国内访问速度直接从 3 秒变成 500ms。Cloudflare Pages 对比 GitHub Pages 对比项 GitHub Pages Cloudflare Pages 免费额度 无限流量,100GB/月软限制 无限流量,500 次构建/月 CDN 节点 GitHub 自有 CDN Cloudflare 全球 330+ 节点 国内访问 较慢 更快(周边节点多) 构建环境 固定 Ubuntu 可选择版本 自定义域名 支持 支持(还自动帮你管 DNS) Serverless 函数 不支持 支持 Workers Functions 预览部署 不支持 每个 PR 自动生成预览链接 重定向规则 需写 HTML meta 一行配置搞定 结论:对国内用户来说,Cloudflare Pages 是 GitHub Pages 的上位替代,而且迁移成本几乎为零。一、把项目接到 Cloudflare Pages方式一:通过 GitHub 直接导入(推荐) 打开 dash.cloudflare.com,登录(没账号就注册一个,免费) 左侧菜单点 Workers & Pages → Overview → Create application → Pages 点 Connect to Git,授权 GitHub 账号 选择你要部署的仓库 配置构建设置: 配置项 值 Production branch main Build command npm run build(按你的框架填) Build output directory dist / public / out Framework preset 按你的框架选,比如 Hexo / Hugo / VitePress 点 Save and Deploy,等 1-2 分钟就上线了。 默认域名是 项目名.pages.dev,你也可以在项目设置里绑自己的域名。二、常用框架的构建设置 框架 Build Command Output Directory Hexo npx hexo generate public Hugo hugo public VitePress npm run docs:build docs/.vitepress/dist Next.js (Static) npx next build out Astro npm run build dist React (CRA) npm run build build Vue (Vite) npm run build dist Jekyll bundle exec jekyll build _site 如果你的框架不在上面,去框架官方文档查一下 build 命令和输出目录就行。三、绑定自定义域名Cloudflare Pages 绑定域名比 GitHub Pages 更省事——它同时就是 DNS 服务商。如果你域名已经在 Cloudflare 上管理:直接去 Pages 项目的 Custom domains,输入你的域名,点 "Activate domain",DNS 记录自动配置,HTTPS 自动签发,全程不需要你手动碰 DNS 设置。如果域名不在 Cloudflare:你需要先把域名的 NS 服务器改到 Cloudflare,或者手动在你的 DNS 服务商处加一条 CNAME 记录指向 项目名.pages.dev。推荐直接用 Cloudflare 管理 DNS,省心很多。四、预览部署(PR Preview)这是 Cloudflare Pages 最香的功能之一。你发一个 Pull Request,它自动构建并生成一个临时预览链接,比如:https://abc123.production.project-name.pages.dev 代码 review 的时候,直接在浏览器里看效果,不用把代码拉到本地跑。合完 PR 后,预览链接自动回收。GitHub Pages 没这个功能,你要看 PR 的效果只能在本地跑或者合了再看。五、重定向和自定义 headers在项目根目录放一个 _redirects 文件(注意没有扩展名),Cloudflare Pages 构建时自动读取:# 旧链接 301 跳转到新链接 /old-blog/post-1 /blog/post-1 301 /feed /rss.xml 301 # 所有 404 跳到首页(SPA 路由) /* /index.html 200 同样,_headers 文件能自定义 HTTP 头:# 所有 HTML 文件不做缓存 /*.html Cache-Control: no-cache # 静态资源长期缓存 /assets/* Cache-Control: public, max-age=31536000, immutable 这两样东西 GitHub Pages 都做不到,除非你在 HTML 里写 <meta http-equiv="refresh"> 或者 Nginx 里配——但 Pages 哪来的 Nginx。六、Cloudflare Workers Functions(免费后端能力)Cloudflare Pages 不只是静态托管,它还内置了 Workers Functions。在项目里建一个 functions 目录,里面的 JS/TS 文件会自动变成 API 端点。比如 functions/api/hello.js:export async function onRequest(context) { const { request } = context; const url = new URL(request.url); const name = url.searchParams.get('name') || 'World'; return new Response(JSON.stringify({ message: `Hello, ${name}!` }), { headers: { 'Content-Type': 'application/json' } }); } 访问 https://你的域名/api/hello?name=XiaoZheng 就能拿到 JSON 响应。免费额度每天 10 万次请求,个人站点根本用不完。这意味着你甚至可以在静态博客上跑简单的 API——比如评论系统、访问统计、表单提交——而不需要额外租一台服务器。七、从 GitHub Pages 迁移到 Cloudflare Pages迁移过程比你想象的简单,因为两个平台的流程几乎一样: 不用改任何代码:你的 Hexo/Hugo/VitePress 项目原封不动 在 Cloudflare Pages 上连接同一个 GitHub 仓库 配好构建命令和输出目录(跟原来一样) 把域名从 GitHub 迁过来(改一下 CNAME 指向) GitHub Pages 先别关,等 DNS 全球生效后(几小时),再关掉旧的 两个平台可以同时跑,DNS 切过来后无缝切换,用户完全感知不到。免费额度对比 额度项 GitHub Pages Cloudflare Pages 带宽 100GB/月 无限 构建次数 10 次/小时 500 次/月 单文件大小 无明确限制 25MB 并发构建 1 1(可付费加) Workers 请求 不支持 10 万次/天 Cloudflare Pages 唯一的短板是每月 500 次构建,但对于个人博客来说,你一天也 push 不了 16 次。Cloudflare Pages 是目前免费静态托管的天花板。GitHub Pages 有的它都有,GitHub Pages 没有的(预览部署、重定向、Workers Functions、全球 CDN)它也有。花 10 分钟迁移过去,你的博客在国内的访问体验能上一个台阶。而且这一切都不要钱——Cloudflare 的免费额度慷慨到让人怀疑他们的商业模式。
2026年07月15日
78 阅读
0 评论
0 点赞
2026-07-15
GitHub Actions 自动化部署实战:推送代码自动上线
每次改完代码,手动 scp 上传、手动重启服务、手动清缓存……一套流程走下来,改一行 CSS 也要折腾 5 分钟。更别提哪天手滑把测试环境的代码推到生产环境了。GitHub Actions 就是来解决这个问题的——代码推上去,剩下的它全自动搞定,你甚至可以躺着用手机写代码然后坐等上线。GitHub Actions 是什么?GitHub Actions 是 GitHub 内置的 CI/CD 服务。你在仓库里写一个 YAML 配置文件,定义好"什么时候触发"和"做什么事",GitHub 就免费提供虚拟机帮你跑。 对比项 手动部署 GitHub Actions 触发方式 人为操作 git push、定时、手动触发 环境一致性 依赖个人电脑 每次都是干净的虚拟机 出错回滚 手动回滚 配好流程自动回滚 耗时 5-10 分钟 全自动,30 秒-2 分钟 费用 时间成本 公开仓库免费 公开仓库无限免费使用,私有仓库每月 2000 分钟免费额度,个人项目根本用不完。一、核心概念GitHub Actions 有几个关键概念,搞清楚了写配置文件才不会晕: 概念 说明 Workflow(工作流) 一个 YAML 文件,定义整个自动化流程 Event(事件) 触发器,比如 push、pull_request、定时 schedule Job(任务) Workflow 中的一个执行单元,多个 Job 默认并行 Step(步骤) Job 中的每一步,可以运行命令或调用 Action Action(动作) 可复用的步骤单元,社区有大量现成的 Runner(运行器) 执行 Job 的虚拟机,GitHub 提供 Ubuntu/Windows/macOS 二、你的第一个 Workflow在仓库根目录创建 .github/workflows/deploy.yml:name: Deploy to GitHub Pages # 触发条件:推送到 main 分支时触发 on: push: branches: - main jobs: build-and-deploy: runs-on: ubuntu-latest # 用最新的 Ubuntu 虚拟机 steps: # 步骤1:拉取代码 - name: Checkout uses: actions/checkout@v4 # 步骤2:安装 Node.js - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 # 步骤3:安装依赖 - name: Install Dependencies run: npm install # 步骤4:构建项目 - name: Build run: npm run build # 步骤5:部署 - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./dist 把这个文件推到仓库,以后每次 git push,GitHub 就会自动跑这 5 个步骤。三、触发器详解除了 push,还有很多触发方式:# 推到 main 分支 on: push: branches: [main] # 发 PR 到 main 时跑测试 on: pull_request: branches: [main] # 每天凌晨 3 点自动跑(UTC 时间) on: schedule: - cron: '0 3 * * *' # 手动触发(在 GitHub 网页上点按钮) on: workflow_dispatch: # 多个事件组合 on: push: branches: [main] pull_request: branches: [main] schedule 用的是 POSIX cron 语法,跟 Linux crontab 一样。注意时区是 UTC,北京时间要减 8 小时。四、实战:Hexo 博客自动部署到 GitHub Pages假设你有一个 Hexo 博客,源文件放在 source 分支,生成后的静态文件部署到 main 分支的 Pages。.github/workflows/hexo-deploy.yml:name: Hexo Deploy on: push: branches: - source # 源文件分支 jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: ref: source - uses: actions/setup-node@v4 with: node-version: 20 - name: Cache node_modules uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }} - run: npm install - run: npx hexo generate - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_branch: main # 部署到 main 分支 publish_dir: ./public force_orphan: true 这里面用了一个 actions/cache@v4,它能把 node_modules 缓存起来,下次构建不用重新 npm install,速度从 2 分钟缩短到 20 秒。五、实战:自动跑测试,不通过不让合代码没人 review 的小项目最怕改了一个地方、坏了三个地方。用 Actions 在每次 PR 时自动跑测试:name: Run Tests on: pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.12' - run: pip install -r requirements.txt - run: pytest --cov=./ --cov-report=xml 然后在仓库 Settings → Branches → Branch protection rules,勾选 "Require status checks to pass before merging",把 test 这个 Job 加上。从此以后,测试不通过的 PR 没法合进 main 分支。六、用 secrets 管理敏感信息数据库密码、SSH 私钥、API Token 这些东西绝对不能写在 YAML 里。用 GitHub secrets:仓库 Settings → secrets and variables → Actions → New repository secret。 secret 名称 用途 SSH_PRIVATE_KEY 部署到自己的服务器 DOCKER_PASSWORD 推送 Docker 镜像 NPM_TOKEN 发布 npm 包 在 Workflow 中这样引用:- name: Deploy to server uses: appleboy/ssh-action@v1 with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} key: ${{ secrets.SSH_PRIVATE_KEY }} script: | cd /var/www/myapp git pull docker compose up -d --build 这样就算有人看到了你的 Workflow 文件,也拿不到真正的密钥。七、矩阵构建:一次测多个环境你的项目要同时支持 Python 3.10、3.11、3.12?用矩阵策略一次性全跑:jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: ['3.10', '3.11', '3.12'] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - run: pip install pytest - run: pytest GitHub 会并行启动 3 个虚拟机,分别跑 3 个 Python 版本的测试。${{ matrix.python-version }} 会被替换成对应的版本号。八、常用 Actions 速查GitHub Actions 生态里有很多现成的 Action,不用自己写脚本: Action 用途 actions/checkout 拉取仓库代码 actions/setup-node 安装指定版本 Node.js actions/setup-python 安装指定版本 Python actions/cache 缓存依赖,加速构建 peaceiris/actions-gh-pages 部署到 GitHub Pages appleboy/ssh-action SSH 到服务器执行命令 docker/login-action 登录 Docker Hub JamesIves/github-pages-deploy-action 另一个 Pages 部署方案 GitHub Actions 就是你白嫖的 CI/CD 服务器。配置一次,以后只管写代码和 git push,测试、构建、部署全自动。回头看看之前手动 scp 上传的日子,你会觉得那时候的自己真是活在石器时代。
2026年07月15日
72 阅读
0 评论
0 点赞
2026-07-15
GitHub Pages 免费搭建个人网站:从零到上线只需10分钟
想搭个个人博客,看了半天 VPS 价格,最便宜的一年也要两三百,配置 1 核 1G,装完环境就没多少内存了。再一看 GitHub Pages——免费、无限流量、自带全球 CDN、还送你一个 username.github.io 的域名?那你为什么还要花钱买服务器?GitHub Pages 是什么?GitHub Pages 是 GitHub 提供的静态网站托管服务。你只需要把 HTML/CSS/JS 文件推到一个仓库里,它自动帮你构建并发布成网站。 特性 GitHub Pages 传统 VPS 费用 免费 最低 $5/月 流量 无限(合理使用) 按带宽计费 HTTPS 自动提供 需手动配置 Let's Encrypt 部署方式 git push 自动上线 SSH + 手动上传 维护 零运维 系统更新、安全补丁 动态内容 不支持(纯静态) 支持 注意:GitHub Pages 只能托管静态网站,不能跑 PHP、Python、Node.js 后端。但对个人博客、项目文档、产品主页来说完全够用。一、创建仓库登录 GitHub,点击右上角 + → New repository: 仓库名:必须填 你的用户名.github.io(比如我叫 xiaozheng,就填 xiaozheng.github.io) 可见性:选 Public(私有仓库要付费才能用 Pages) 勾选 "Add a README file" 创建完成后,你的网站地址就是 https://你的用户名.github.io。二、克隆到本地git clone https://github.com/你的用户名/你的用户名.github.io.git cd 你的用户名.github.io 现在这个文件夹还是空的(除了 README.md),接下来往里放网页文件。三、写第一个页面在仓库根目录创建一个 index.html:<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>我的个人网站</title> </head> <body> <h1>Hello World!</h1> <p>这是我的第一个 GitHub Pages 网站。</p> </body> </html> 提交并推送:git add index.html git commit -m "第一个页面" git push origin main 四、检查部署状态推送后 GitHub 会自动触发构建。去仓库的 Settings → Pages,看到顶上显示 "Your site is live at https://xxx.github.io" 就说明部署成功了。如果没看到,检查几点: 问题 解决 仓库名不是 用户名.github.io 其他仓库要去 Settings → Pages 手动选分支 分支没选对 Source 选 main 分支,目录选 / (root) 刚 push 完还没好 等 1-2 分钟,首次部署稍慢 五、绑定自定义域名用户名.github.io 虽然能用,但总归不如自己的域名专业。GitHub Pages 支持绑定自定义域名,还自动给你配好 HTTPS。5.1 域名 DNS 配置去你的域名 DNS 管理后台,添加一条 CNAME 记录: 类型 主机记录 记录值 CNAME @(或 www) 你的用户名.github.io 如果你用的是 www 子域名,主机记录填 www;如果想裸域名(不加 www),主机记录填 @。5.2 在仓库中配置域名在仓库根目录创建一个 CNAME 文件,里面只写你的域名:www.zjunwei.com 然后去 Settings → Pages → Custom domain,填入你的域名,点 Save。GitHub 会自动申请 Let's Encrypt SSL 证书,几分钟后 HTTPS 就生效了。六、用静态网站生成器(推荐)手写 HTML 太痛苦了。推荐用静态网站生成器写博客: 工具 语言 特点 Hugo Go 构建极快,单文件二进制 Hexo Node.js 中文社区大,主题多 Jekyll Ruby GitHub Pages 原生支持 VitePress Vue 适合文档站 以 Hexo 为例,三行命令就能跑起来:npm install -g hexo-cli hexo init myblog cd myblog && hexo server 写好文章后,Hexo 一键生成静态文件,直接推到 GitHub Pages 仓库就行:hexo generate --deploy 七、GitHub Actions 自动部署(省掉手动 build)每次写完文章手动 hexo generate 再 push 太麻烦。在仓库里加一个 .github/workflows/deploy.yml,让 GitHub Actions 帮你自动构建和部署:name: Deploy to Pages on: push: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - run: npm install - run: npm run build - uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./public 配好后,以后你只需要写文章、git push,剩下的构建、部署全部自动完成。免费方案的局限性GitHub Pages 有几点硬限制,用之前心里要有数: 限制项 具体值 仓库大小 建议不超过 1GB 网站大小 不超过 1GB 每小时构建次数 10 次 每月带宽 100GB(软限制) 对于个人博客来说这些限制基本碰不到。就算日 PV 上万的博客,100GB 月带宽也绰绰有余。GitHub Pages 是目前最省心的免费建站方案,没有之一。不用管服务器、不用配 Nginx、不用操心 HTTPS 证书过期,你只管写内容,剩下的事情 GitHub 全包了。10 分钟搭好,以后所有精力都放在输出内容上,这才是建站该有的体验。
2026年07月15日
93 阅读
0 评论
0 点赞
2026-07-15
内网穿透实战:frp 让你在家里的电脑也能被公网访问
> 家里有台电脑想当服务器用,但没有公网 IP,怎么办?或者公司内网的服务想在外面访问?frp 就是解决这个问题的神器——通过一台有公网 IP 的 VPS 做中转,把内网服务暴露到公网。---## frp 是什么?frp(Fast Reverse Proxy)是一个高性能的内网穿透工具。架构很简单:- **frps**:服务端,部署在有公网 IP 的 VPS 上 - **frpc**:客户端,部署在内网机器上用户访问 VPS 的某个端口,frp 自动把流量转发到内网机器的对应端口。---## 第一步:在 VPS 上部署 frps(服务端)```bash cd /opt wget https://github.com/fatedier/frp/releases/download/v0.52.0/frp_0.52.0_linux_amd64.tar.gz tar -xzf frp_0.52.0_linux_amd64.tar.gz mv frp_0.52.0_linux_amd64 frp cd frp ```编辑 frps.toml:```toml bindPort = 7000 auth.token = "一个复杂的随机字符串" ```启动服务端:./frps -c frps.toml配置成系统服务开机自启:```bash cat > /etc/systemd/system/frps.service
2026年07月15日
62 阅读
0 评论
0 点赞
2026-07-15
Termux 进阶玩法:手机上的 Python 开发与定时任务
有了 Termux,Python 能跑,vim 能写,Git 能 push,但总感觉差口气——写代码的体验还是不太对。这一篇不讲基础,直接上干货:怎么在 Termux 里搞出一个接近电脑的开发环境,Python 虚拟环境怎么搞,定时任务怎么跑,以及一些让你「哇这都行」的进阶操作。一、打造舒适的 Python 开发环境1.1 虚拟环境(必须)Termux 里 pip 默认往 $PREFIX 装包,时间长了依赖冲突是迟早的事。老老实实用 venv:pkg install python -y mkdir -p ~/projects/myapp cd ~/projects/myapp python -m venv .venv source .venv/bin/activate pip install flask requests numpy pandas 每次进项目目录记得 source .venv/bin/activate。写个 alias 省事:echo 'alias va="source .venv/bin/activate"' >> ~/.bashrc 1.2 装个能用的编辑器手机屏幕敲 vim 可以,但要写大段代码,推荐两个方案: 方案 体验 配置成本 Neovim + 插件 接近电脑 VSCode 高(配 LSP、补全) code-server(浏览器版 VSCode) 跟 VSCode 一样 中(装完连浏览器) 方案一:Neovimpkg install neovim -y pip install pynvim jedi # 装插件管理器 vim-plug sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' ~/.config/nvim/init.vim 最小配置:call plug#begin() Plug 'preservim/nerdtree' " 文件树 Plug 'dense-analysis/ale' " 语法检查 Plug 'vim-airline/vim-airline' " 状态栏 call plug#end() set number set autoindent set tabstop=4 shiftwidth=4 expandtab 方案二:code-server(强烈推荐)Termux 里装 code-server,然后电脑/平板浏览器打开就是完整 VSCode:pkg install tur-repo -y pkg install code-server -y # 设置密码 echo 'bind-addr: 0.0.0.0:8080' > ~/.config/code-server/config.yaml echo 'auth: password' >> ~/.config/code-server/config.yaml echo "password: $(echo -n 'yourpass' | sha256sum | head -c 64)" >> ~/.config/code-server/config.yaml code-server 同一 WiFi 下,电脑浏览器打开 http://手机IP:8080,输入密码,就是完整版 VSCode——插件市场、终端、调试全都有。手机当服务器 + 电脑当显示器,爽。二、用 crontab 跑定时任务Termux 内置了 cron 替代品 termux-services,比原生 cron 更适合 Android 环境。2.1 安装pkg install termux-services -y 重启 Termux 后,sv-enable crond 即可激活 cron 服务。2.2 配置定时任务crontab -e 几个实用案例:# 每 2 小时自动拉取最新代码 0 */2 * * * cd ~/projects/mybot && git pull origin main # 每天早上 8 点发天气通知(通过 termux-notification) 0 8 * * * python ~/scripts/weather.py && termux-notification --title "天气" --content "$(cat /tmp/weather.txt)" # 每 10 分钟监控服务器状态 */10 * * * * curl -s https://your-api.com/health || termux-notification --title "服务挂了" --content "赶紧看看" # 每天凌晨 2 点清理 7 天前的日志 0 2 * * * find ~/logs -name "*.log" -mtime +7 -delete 2.3 写个天气爬虫示例# ~/scripts/weather.py import requests API_KEY = "你的和风天气key" CITY = "101010100" # 北京城市代码 url = f"https://devapi.qweather.com/v7/weather/now?location={CITY}&key={API_KEY}" resp = requests.get(url).json() text = f"{resp['now']['temp']}°C {resp['now']['text']}" with open("/tmp/weather.txt", "w") as f: f.write(text) 配合 cron 每天跑一次,再配合 Tasker 抓通知栏内容,起床先看天气。三、Termux:API —— 让脚本控制手机硬件Termux:API 是配套插件,装完你的 Python/Bash 脚本就能调用手机传感器、摄像头、短信、通知等功能。# 安装 pkg install termux-api -y # 手机上另装 Termux:API APK(跟 Termux 一起在 F-Droid 下) 实用命令速查:# 发送系统通知 termux-notification --title "任务完成" --content "数据已备份" # 语音转文字(调用手机语音引擎) termux-speech-to-text > /tmp/speech.txt # 文字转语音(让手机读出来) termux-tts-speak "备份任务执行完毕" # 获取电池状态 termux-battery-status # {"health": "GOOD", "percentage": 85, "plugged": "UNPLUGGED", ...} # 获取 GPS 位置 termux-location # 打开手电筒 termux-torch on # 拍照并保存到文件 termux-camera-photo ~/storage/pictures/photo.jpg # 读取短信收件箱 termux-sms-list -t inbox -l 5 实战:低电量自动发通知写个脚本,电池低于 20% 弹通知提醒充电:# ~/scripts/low_battery_alert.sh #!/bin/bash PERCENTAGE=$(termux-battery-status | grep percentage | awk -F: '{print $2}' | tr -d ' ,') if [ "$PERCENTAGE" -lt 20 ]; then termux-notification --title "电量低" --content "当前电量 ${PERCENTAGE}%,赶紧充电!" termux-tts-speak "电量低于百分之二十,请充电" fi crontab 加一条:*/15 * * * * bash ~/scripts/low_battery_alert.sh。每 15 分钟检查一次。四、Termux:Boot —— 开机自启动让你的脚本和服务在手机开机时自动跑起来: 装 Termux:Boot APK(F-Droid 有) 开机后手动打开一次 Termux 授予自启权限(Android 限制) 把要启动的脚本放到 ~/.termux/boot/ 下 mkdir -p ~/.termux/boot cat > ~/.termux/boot/start-sshd << 'EOF' #!/data/data/com.termux/files/usr/bin/bash sshd EOF chmod +x ~/.termux/boot/start-sshd 这样手机一开机,SSH 服务就自动起来,随时能从电脑连进去。五、几个 Cool 玩法5.1 手机当下载机pkg install aria2 -y aria2c --enable-rpc --rpc-listen-all --rpc-allow-origin-all -d ~/storage/downloads 电脑浏览器装个 AriaNg 插件,连上手机 IP:6800,远程把磁力链接扔过去,手机后台下载,回家文件已经在手机里了。5.2 手机当热点 + 轻量 Web 服务器出差时笔记本连手机热点,手机同时在 Termux 里跑个服务:cd ~/projects/apidoc python -m http.server 9090 笔记本浏览器开 http://手机IP:9090,离线看 API 文档,比到处找 WiFi 靠谱。5.3 用 Python 操作 Android 的 SQLite 数据库pip install sqlite-utils import sqlite3 # 读取短信数据库(需要 root 或者通过 content provider) db = sqlite3.connect("/data/data/com.android.providers.telephony/databases/mmssms.db") cursor = db.execute("SELECT address, body, date FROM sms ORDER BY date DESC LIMIT 10") for row in cursor: print(row) 短信备份、通话记录分析、应用使用统计——你的手机数据,Python 想怎么玩就怎么玩。六、常见问题Q:Termux 里 pip 装包报错怎么办?多半是缺少编译工具。先把构建依赖装了:pkg install binutils clang make cmake -y 还是报错的话,有些 Python 包(如 Pillow)在 ARM 上编译需要额外库:pkg install libjpeg-turbo libpng freetype -y Q:cron 任务不执行? 确认服务起来了:sv status crond 用绝对路径:/data/data/com.termux/files/usr/bin/python 而不是 python 脚本要有执行权限:chmod +x script.sh Q:code-server 占用多少内存?空闲时约 120MB,打开项目后 200-300MB,不重。6GB RAM 的手机完全够用。Termux 的上限取决于你的想象力。从跑个 Python 脚本到搭建完整的 VSCode 远程开发环境,再到用 API 控制手机的闪光灯和摄像头,你的 Android 手机其实是一台被封印的 Linux 电脑。这几个技能搞下来,半小时的事,手机就再也不只是刷抖音的工具了。
2026年07月15日
67 阅读
0 评论
0 点赞
2026-07-15
Linux Deploy 实战:在手机上跑完整 Ubuntu 系统
"手机能跑完整 Linux 吗?带桌面那种?"——能。不是 Termux 那种阉割环境,是真正通过 chroot 容器跑起来的完整 Ubuntu/Debian/CentOS,有 systemd、能装 Docker、能跑 MySQL、还能 VNC 连桌面。一台旧安卓手机,摇身一变成 24 小时运行的家庭服务器。Linux Deploy 是什么?Linux Deploy 是一个 Android 应用,能在手机上用 chroot 方式安装并运行完整的 Linux 发行版。和 Termux 的区别: 对比维度 Termux Linux Deploy 原理 Android 原生环境 + 包管理 chroot 容器,完整 Linux 根文件系统 需要 root 不需要 需要 systemd 不支持 支持 Docker 不支持 支持 MySQL/PostgreSQL 装不了或折腾 原生包管理直接装 桌面环境 不支持 支持(VNC 连接) 适用场景 开发工具、应急运维 当服务器跑服务 一句话总结:Termux 是「在 Android 上用 Linux 工具」,Linux Deploy 是「在 Android 上跑一个 Linux 系统」。一、准备工作1.1 硬性条件 手机 已 root(Magisk 或 SuperSU) Android 5.0 以上(越低版本越折腾) 至少 4GB 剩余存储空间(装桌面环境需要更多) 建议手机一直插着电跑(服务器嘛,不需要电池续航) 1.2 安装 Linux Deploy从 GitHub Releases 下载最新 APK:https://github.com/meefik/linuxdeploy/releases装完打开,先别急着点「安装」,有几项配置必须改。二、配置 Linux Deploy2.1 核心配置点击右下角图标进入设置: 配置项 推荐值 说明 发行版 Ubuntu 最通用,文档最多 版本 jammy(22.04) 选 LTS,稳定 架构 arm64 现在手机基本都是 arm64 安装类型 镜像文件 比分区安全,方便备份迁移 镜像大小 4096 MB 按需调整,装桌面建议 8GB+ 用户名 自己设 Linux 里的登录用户名 密码 自己设 Linux 里的登录密码 2.2 开启 SSH(必须)往下滑到 SSH 部分,勾选「启用」。这样装完系统后就能从电脑 SSH 连过去,不用在手机上敲命令。2.3 开启 VNC(可选,要桌面才开)勾选「图形界面」→「启用」,桌面环境选 Xfce(轻量、省资源)。2.4 挂载点(让 Linux 访问手机存储)在「挂载」里添加: 来源:/storage/emulated/0(手机内部存储) 目标:/mnt/sdcard 勾选「挂载」 这样在 Ubuntu 里就能读写手机文件了。三、安装系统配置完回到主界面,点右上角 ··· → 安装。接下来看网速,系统镜像大概 300-500MB,下完会自动解压配置。整个过程约 5-15 分钟,期间别切后台,Android 可能会杀进程。看到 <<< deploy 就说明装完了。四、启动和使用4.1 启动点「启动」按钮,看到 <<< start 即启动成功。此时你的手机上正在跑一个完整的 Ubuntu 系统。4.2 SSH 连过去Linux Deploy 默认 SSH 端口是 22(跟宿主机不冲突,因为是 chroot 环境)。手机和电脑在同一 WiFi 下:ssh 用户名@手机IP地址 手机 IP 在 WiFi 设置里看,Linux Deploy 启动页面也会显示。连上之后,它就是一台正常的 Ubuntu 服务器了:uname -a # Linux localhost 5.10.xxx ... aarch64 cat /etc/os-release # Ubuntu 22.04 LTS free -h # 可用内存就是手机的可用内存 df -h # 磁盘就是那 4GB 镜像 4.3 连桌面(VNC)手机上装个 VNC Viewer(推荐 RealVNC 或 bVNC),连接地址 127.0.0.1:5900,就能看到 Ubuntu 桌面了。或者从电脑连:VNC 客户端填 手机IP:5900,屏幕大的体验更好。五、实战:把旧手机变成家庭服务器5.1 跑一个静态博客# 装 Nginx apt update && apt install nginx -y # 写个测试页面 echo "<h1>Hello from my phone!</h1>" > /var/www/html/index.html # 启动 systemctl start nginx 局域网内浏览器访问 http://手机IP,看到页面就对了。5.2 装 Docker 跑服务apt install docker.io -y systemctl start docker docker run -d --name web -p 8080:80 nginx:alpine 一台旧手机,Docker 跑几个轻量服务绰绰有余。5.3 定时任务 + 自动备份# 每天凌晨 3 点把重要文件备份到手机存储 crontab -e 0 3 * * * tar -czf /mnt/sdcard/backup/ubuntu_$(date +\%Y\%m\%d).tar.gz /home/user/data 插着电、放着不动,它就是一台永不关机的 Linux 服务器。六、性能参考以一台骁龙 865、8GB RAM 的手机为例: 操作 耗时 / 表现 安装 Ubuntu 22.04 约 8 分钟 apt update && apt upgrade 约 2 分钟 Nginx 静态页面 QPS 3000+ Docker 跑 Alpine 容器 秒启动 MySQL 导入 10 万条数据 约 15 秒 功耗(亮屏) 约 3-5W 跑个博客、私人网盘、爬虫脚本完全够用。比起云服务器一个月几十块,旧手机的电费几乎可以忽略不计。七、常见问题Q:不 root 行不行?不行。Linux Deploy 需要挂载文件系统和 chroot,这两个操作都需要 root 权限。不想 root 就用 Termux。Q:装完手机还能正常用吗?能。Linux 在后台跑,你照样刷微信看视频。只是 CPU 和内存会被占用一部分,建议用旧手机或备用机。Q:手机重启后怎么办?Linux Deploy 不会自启动,需要手动点一下「启动」。或者用 Tasker + Linux Deploy 的 CLI 接口实现开机自启:# Termux 里通过 Linux Deploy CLI 控制 /data/data/ru.meefik.linuxdeploy/bin/linuxdeploy start Q:镜像文件能迁移到新手机吗?能。把 linux.img 文件拷到新手机,放回相同路径,重新配置 Linux Deploy 指向它就行。这比云服务器迁移简单多了。旧手机放抽屉吃灰不如废物利用。花半小时装上 Linux Deploy,你就有了一台 7×24 的家庭服务器,跑个博客、挂个爬虫、做个 NAS,性能和一台入门 VPS 差不多,关键是不要钱。
2026年07月15日
108 阅读
0 评论
0 点赞
2026-07-15
Termux 入门指南:把 Android 手机变成随身 Linux 终端
出差路上服务器报警了,手边没电脑,SSH 都连不上,只能干着急。或者周末在咖啡馆突然想写两行 Python,掏出手机发现除了记事本啥也没有。别急,装个 Termux,你的 Android 手机就是一台随身携带的 Linux 终端,apt、Python、Git、SSH 全都能跑。Termux 是什么?Termux 是 Android 上的终端模拟器 + Linux 环境,不需要 root,不需要虚拟机,装上就能用。它自带包管理器(apt),能装绝大多数 Linux 命令行工具。 对比维度 Termux 云服务器 电脑本地 随身性 手机即用 需要网络 需要背着 性能 手机性能,够用 按配置付费 最强 适用场景 应急运维、学习、轻量开发 生产部署 主力开发 安装门槛 5 分钟 买服务器 + 配环境 装系统 + 配环境 它不是要取代电脑,而是在你没有电脑的时候,给你一个能用的 Linux 环境。一、安装 Termux注意:Google Play 上的 Termux 已经很久没更新了,推荐从 F-Droid 安装,版本最新且功能完整。 打开 F-Droid 官网,下载 F-Droid 客户端并安装 在 F-Droid 里搜索 Termux,安装 顺便把 Termux:API 也装上(后面进阶会用) 装完打开,你会看到一个熟悉的命令行界面,黑底白字,跟 SSH 连上服务器一模一样。二、基础配置(10 分钟让 Termux 好用起来)2.1 换国内源(提速必备)Termux 默认源在海外,国内下载巨慢。先换清华源:termux-change-repo 方向键选择 Mirrors by Tsinghua,回车确认。更新索引:pkg update && pkg upgrade 2.2 安装基础工具pkg install vim git curl wget openssh python nodejs -y 工具 用途 vim 文本编辑器 git 版本控制 curl / wget 下载工具 openssh SSH 客户端/服务端 python Python 运行环境 nodejs Node.js 运行环境 2.3 设置存储权限Termux 默认只能访问自己的沙盒目录。要访问手机存储:termux-setup-storage 授权后在 Termux 里就能通过 ~/storage/ 读写手机文件了:ls ~/storage/ # dcim downloads movies music pictures shared 2.4 装个 zsh + oh-my-zsh(颜值党必看)pkg install zsh -y sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" chsh -s zsh 关闭重开 Termux,你的终端就变成彩色了,自动补全、Git 分支显示全都有。三、日常用法:Termux 能干什么3.1 SSH 连服务器# 生成密钥(如果还没有) ssh-keygen -t ed25519 -C "my-android" # 连服务器 ssh user@your-server.com 手机键盘打命令确实慢,但应付紧急情况——重启个服务、看个日志——完全够用:ssh user@server "sudo systemctl restart nginx" ssh user@server "tail -100 /var/log/nginx/error.log" 3.2 写 Python 脚本pkg install python -y pip install requests flask # 随便装 python 手机屏幕小不适合写大项目,但写个几十行的小工具、跑个爬虫、验证段代码逻辑,非常顺手。3.3 Git 管理代码git clone https://github.com/user/repo.git cd repo vim app.py # 改两行 git commit -am "fix: typo" git push 紧急 bug 修复的场景——在外面接到告警,手机上去改两行 push,CI/CD 自动部署,完美。3.4 本地 HTTP 服务# Python 一行起 HTTP 服务 python -m http.server 8080 # 或者用 Node.js npm install -g http-server http-server -p 8080 跟同事在同一个 WiFi 下,手机直接起个文件共享服务,电脑浏览器访问手机 IP 就能下载。四、Termux 快捷键速查Termux 默认有额外虚拟键(ESC、TAB、CTRL 等),但键盘手势更高效: 操作 手势 / 按键 显示/隐藏额外键 音量上 + Q 新建会话 左滑 → New Session 切换会话 左滑切换 Ctrl 音量下键(按住) 复制 长按屏幕选文字 粘贴 长按屏幕 → PASTE 放大字体 双指捏合缩放 推荐连个蓝牙键盘,打字体验瞬间从「能用」变「好用」。轻便折叠键盘也就一两百块,出差神器。五、常见问题Q:Termux 后台被杀怎么办?Android 系统会杀后台进程,解决方法: 1. 在系统设置里把 Termux 的电池优化设为「不优化」 2. 安装 Termux:Boot 插件,开机自启动服务 3. 用 tmux 或 screen 保持会话:pkg install tmux -y tmux new -s work # 断线后重连 tmux attach -t work Q:能装 Docker 吗?不能。Termux 跑在 Android 内核上,没有 Docker 所需的 cgroups/namespace 支持。如果需要 Docker,看下一篇 Linux Deploy。Q:iOS 能用吗?iOS 上有个类似的叫 iSH,但体验不如 Termux,因为 iOS 对后台进程限制更严。Android 这边 Termux 是独一档的存在。Termux 从下载到能用,前前后后不超过 15 分钟。下次你在地铁上接到「服务器挂了」的消息,掏出手机,Termux 里一条 ssh 上去,五分钟搞定,同事都以为你随身带着笔记本电脑。
2026年07月15日
89 阅读
0 评论
0 点赞
2026-07-15
MySQL 常用命令速查手册:从建表到查询优化
"SELECT 后面接什么来着?"、"加个外键怎么写?"、"怎么查某张表有没有某个字段?"——每次写 SQL 都要掏手机查,查着查着 5 分钟过去了。这份速查手册整理了 MySQL 最常用的命令,从建库建表到查询优化,需要的时候直接 Ctrl+F。一、库操作-- 创建数据库 CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 查看所有数据库 SHOW DATABASES; -- 切换数据库 USE mydb; -- 查看当前所在数据库 SELECT DATABASE(); -- 删除数据库(慎用!) DROP DATABASE mydb; 为什么用 utf8mb4 而不是 utf8?因为 MySQL 的 utf8 是个阉割版,最多 3 字节,存不了 emoji(😀)。utf8mb4 才是真正的 UTF-8。二、表操作-- 创建表 CREATE TABLE users ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL, age TINYINT UNSIGNED DEFAULT 0, status ENUM('active', 'inactive', 'banned') DEFAULT 'active', created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_email (email), INDEX idx_status_created (status, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 查看当前库所有表 SHOW TABLES; -- 查看表结构 DESC users; SHOW CREATE TABLE users; -- 完整建表语句 -- 查看表的所有索引 SHOW INDEX FROM users; -- 修改表 ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email; ALTER TABLE users MODIFY COLUMN age SMALLINT UNSIGNED; ALTER TABLE users DROP COLUMN phone; ALTER TABLE users RENAME TO customers; -- 删除表(慎用!) DROP TABLE users; 三、常用字段类型速查 类型 用途 示例 INT / BIGINT 整数 用户 ID、数量 TINYINT(1) 布尔值 is_deleted DECIMAL(10,2) 精确金额 99999999.99 VARCHAR(N) 变长字符串 用户名、邮箱 TEXT 长文本 文章正文 LONGTEXT 超长文本 Markdown 全文 DATETIME 日期时间 2026-07-15 15:30:00 TIMESTAMP Unix 时间戳 自动记录的创建时间 ENUM 固定选项 状态字段 JSON JSON 数据 配置、扩展字段 选型口诀:钱用 DECIMAL,不长不短用 VARCHAR,要查的就加索引。四、增删改(CRUD)-- 插入 INSERT INTO users (username, email, age) VALUES ('john', 'john@example.com', 25); INSERT INTO users (username, email, age) VALUES ('alice', 'alice@example.com', 30), ('bob', 'bob@example.com', 28); -- 查询 SELECT * FROM users; SELECT id, username, email FROM users WHERE status = 'active'; SELECT * FROM users WHERE age BETWEEN 20 AND 30; SELECT * FROM users WHERE email LIKE '%@gmail.com'; SELECT DISTINCT status FROM users; -- 聚合查询 SELECT status, COUNT(*) AS cnt FROM users GROUP BY status; SELECT status, COUNT(*) AS cnt FROM users GROUP BY status HAVING cnt > 5; -- 排序和分页 SELECT * FROM users ORDER BY created_at DESC; SELECT * FROM users LIMIT 10 OFFSET 20; -- 第 3 页,每页 10 条 -- 更新 UPDATE users SET status = 'inactive' WHERE id = 1; UPDATE users SET age = age + 1 WHERE status = 'active'; -- 活跃用户年龄 +1 -- 删除 DELETE FROM users WHERE id = 1; DELETE FROM users WHERE created_at < '2025-01-01'; -- 删掉去年的旧数据 -- 软删除(推荐) UPDATE users SET is_deleted = 1, deleted_at = NOW() WHERE id = 1; 生产环境不要用 DELETE 做硬删除,加个 is_deleted 字段做软删除,后悔药好买。五、多表查询-- 内连接(只返回两表都匹配的行) SELECT u.username, o.order_no, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id; -- 左连接(返回左表全部 + 右表匹配的) SELECT u.username, COUNT(o.id) AS order_count FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id; -- 子查询 SELECT * FROM users WHERE id IN ( SELECT user_id FROM orders WHERE amount > 1000 ); -- 联合查询(两表结构一样时合并结果) SELECT username, email FROM users UNION ALL SELECT username, email FROM archived_users; UNION 和 UNION ALL 的区别:UNION 会去重(慢),UNION ALL 不去重(快)。确定不会重复就用 UNION ALL。六、索引优化(重点)索引是数据库提速的第一手段,加对索引,查询从扫全表变成直接定位。-- 创建索引 CREATE INDEX idx_username ON users(username); -- 普通索引 CREATE UNIQUE INDEX idx_email ON users(email); -- 唯一索引 CREATE INDEX idx_status_created ON users(status, created_at); -- 联合索引 -- 查看查询是否用到索引 EXPLAIN SELECT * FROM users WHERE email = 'john@example.com'; EXPLAIN 关键字段解读 字段 好 坏 type const, eq_ref, ref, range ALL(全表扫描) key 有值(命中索引) NULL(没用到索引) rows 越小越好 几千几万就糟了 Extra Using index(覆盖索引) Using filesort, Using temporary 索引最佳实践 最左前缀原则:联合索引 (A, B, C) 能匹配 WHERE A、WHERE A AND B,但不能单独匹配 WHERE B 不要在索引列上做计算:WHERE YEAR(created_at) = 2026 不走索引,应改为 WHERE created_at BETWEEN '2026-01-01' AND '2026-12-31' 区分度低的字段别单独建索引:gender(男女)这种只有两三个值的字段建索引效率极低 避免 SELECT *:只查需要的字段,配合覆盖索引效果更好 七、慢查询定位-- 开启慢查询日志(临时) SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 1; -- 超过 1 秒就算慢查询 -- 查看慢查询日志位置 SHOW VARIABLES LIKE 'slow_query_log_file'; -- 查看当前正在执行的查询 SHOW FULL PROCESSLIST; -- 杀掉某个卡死的查询 KILL 123; -- 123 是 processlist 里的 Id 慢查询日志是找到性能瓶颈的最直接手段。建议线上环境 long_query_time 设 0.5 秒。八、备份与恢复-- 导出单个数据库 mysqldump -u root -p mydb > mydb_backup.sql -- 导出所有数据库 mysqldump -u root -p --all-databases > all_backup.sql -- 只导出表结构(不要数据) mysqldump -u root -p --no-data mydb > schema.sql -- 恢复 mysql -u root -p mydb < mydb_backup.sql 生产环境一定要定期自动备份,配合 cron 每天凌晨跑一次:0 3 * * * mysqldump -u root -p'密码' mydb | gzip > /backup/mydb_$(date +\%Y\%m\%d).sql.gz 九、常用运维命令-- 查看 MySQL 版本 SELECT VERSION(); -- 查看当前连接数 SHOW STATUS LIKE 'Threads_connected'; -- 查看数据库大小 SELECT table_schema AS '数据库', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS '大小(MB)' FROM information_schema.tables GROUP BY table_schema; -- 查看某张表的大小 SELECT table_name, ROUND((data_length + index_length) / 1024 / 1024, 2) AS '大小(MB)' FROM information_schema.tables WHERE table_schema = 'mydb' AND table_name = 'users'; -- 查看表行数(InnoDB 下是近似值) SELECT TABLE_ROWS FROM information_schema.tables WHERE table_schema = 'mydb' AND table_name = 'users'; -- 分析表(更新索引统计信息) ANALYZE TABLE users; 十、防坑指南 坑 后果 正确做法 DELETE 不加 WHERE 全表删除 先 SELECT 确认,再改写为 DELETE UPDATE 不加 WHERE 全表更新 同上,跑之前必须有 WHERE 生产环境 DROP 表没了 永远不要对生产直接 DROP utf8 而不是 utf8mb4 emoji 存不了 建库永远用 utf8mb4 字段无默认值 插入报错 养成给字段设 DEFAULT 的习惯 超大 OFFSET 翻页越翻越慢 用游标分页:WHERE id > 上一页最后一条id LIMIT 10 这份手册常用的东西都覆盖了,遇到没列出来的,mysql --help 或者 \h 进 MySQL 敲 help contents 也能查。把这些命令敲熟了,日常开发 95% 的 SQL 场景都够用了。
2026年07月15日
64 阅读
0 评论
0 点赞
2026-07-15
Vim 编辑器入门:服务端必备利器
刚接手一台服务器,想改个配置文件,vi 一打开,光标在闪,你敲键盘它没反应,按了半天 Esc 还是退不出来,最后只能 Ctrl+Z 强行挂起……别慌,每个程序员都经历过这一步。Vim 看着反人类,其实只要记住几个键,它就是你在服务器上最趁手的刀。为什么服务端离不开 Vim 场景 图形编辑器 Vim 远程服务器改配置 没法用 SSH 进去直接改 编辑超大日志(几个 G) 直接卡死 秒开,按需加载 断网/低带宽环境 连不上 纯字符,丝滑 批量替换、列编辑 手动点到手酸 一行命令搞定 Vim 是几乎所有 Linux 发行版自带的东西,你不用装任何东西,登录服务器就能用。学会它,等于随身带了一把瑞士军刀。一、三种模式(核心中的核心)Vim 的"反人类"全怪它有三个模式,搞懂这个就入门了 80%。 模式 进入方式 作用 退出方式 普通模式(Normal) 打开默认 / 按 Esc 移动光标、删除、复制 — 插入模式(Insert) 按 i / a / o 输入文字 按 Esc 回普通模式 命令模式(Command) 普通模式按 : 保存、退出、查找 回车执行 记住一句话:普通模式是家,干完活就按 Esc 回家。二、进入插入模式的几种姿势在普通模式下:i 在光标前插入 a 在光标后插入 o 在当前行下方新建一行并插入 O 在当前行上方新建一行并插入 I 跳到行首插入 A 跳到行尾插入 新手最常用 i 和 o,记住这两个就能开始写东西了。三、移动光标(别再用方向键了)Vim 里方向键也能用,但高手都用 h j k l,手不用离开主键区:h 左 j 下 k 上 l 右 w 跳到下一个单词开头 b 跳到上一个单词开头 0 跳到行首 $ 跳到行尾 gg 跳到文件第一行 G 跳到文件最后一行 :行号 跳到指定行,如 :50 Ctrl+f 向下翻页 Ctrl+b 向上翻页 四、删除、复制、粘贴普通模式下(不用进插入模式就能改):x 删除光标所在字符 dw 删除一个单词 dd 删除整行 3dd 删除 3 行 D 删除从光标到行尾 yy 复制整行 3yy 复制 3 行 p 粘贴到光标下方 P 粘贴到光标上方 u 撤销 Ctrl+r 重做(反撤销) 小技巧:Vim 的删除其实是"剪切",dd 删掉的行用 p 能粘回来,相当于移动一行。五、保存与退出(最容易卡住的地方)在普通模式按 : 进入命令模式::w 保存 :w 文件名 另存为 :q 退出(没改才能退) :q! 强制退出,不保存 :wq 保存并退出 :x 同 :wq ZZ 普通模式下直接按,保存并退出(不用冒号) 记不住就记 :wq 和 :q! 这两个,一个保存退出,一个不保存强退,够用了。六、查找与替换/关键词 向下查找,按 n 跳下一个,N 跳上一个 ?关键词 向上查找 :%s/旧/新/g 全文替换所有匹配 :s/旧/新/g 当前行替换所有匹配 :%s/旧/新/gc 全文替换,每个都问你要不要(c = confirm) 替换示例:把全文的 localhost 改成 127.0.0.1::%s/localhost/127.0.0.1/g 七、可视化模式(块选择)v 字符级选择,配合 hjkl 选一片 V 行级选择,整行整行选 Ctrl+v 列块选择,能竖着选一整列(批量加注释超好用) 列块加注释实战:比如要给 5 行代码前面加 # 注释: Ctrl+v 进入列块模式 用 j 选中这 5 行的第一列 按 I(大写 i)进入列插入 输入 #,按 Esc 稍等一瞬,5 行前面同时出现 # 八、分屏(同时看多个文件):sp 文件名 上下分屏打开文件 :vsp 文件名 左右分屏打开文件 Ctrl+w w 在分屏间切换 Ctrl+w q 关闭当前分屏 改 Nginx 配置时,左边看原配置、右边写新配置,效率直接翻倍。九、实用配置:让 Vim 更好用默认 Vim 很裸,在 ~/.vimrc 里加点配置体验立刻不同:" 显示行号 set number " 语法高亮 syntax on " 自动缩进 set autoindent set tabstop=4 set shiftwidth=4 set expandtab " 搜索时忽略大小写,有大写才区分 set ignorecase set smartcase " 实时高亮搜索结果 set hlsearch set incsearch " 鼠标支持(终端里也能用鼠标点) set mouse=a " 编码 set encoding=utf-8 十、新手速查表 我想干啥 按什么 开始写 i 不写了 Esc 存盘退出 :wq 不存强退 :q! 删一行 dd 粘回来 p 撤销 u 找东西 /关键词 然后 n 跳文件头/尾 gg / G Vim 不用背,天天 ssh 上服务器改两回配置,这些键自然就长在肌肉里了。刚开始慢一点没关系,等你第一次在服务器上用 :%s 一行命令改完 200 处配置,你就再也回不去鼠标点点点了。
2026年07月15日
56 阅读
0 评论
0 点赞
2026-07-15
Nginx 性能优化实战:让你的网站快如闪电
网站好不容易搭好了,用户一打开等了 3 秒还在转圈,打开 Chrome 开发者工具一看,首页光加载就 2MB,TTFB 500ms+。别急着换服务器,你的 Nginx 可能根本没调过!花 10 分钟做这几项优化,网站速度直接起飞。先看一眼你的 Nginx 现状在优化之前,先搞清楚当前配置:# 查看 Nginx 版本和编译参数 nginx -V 2>&1 | head -5 # 查看当前 worker 进程数 ps aux | grep nginx | grep -v grep # 快速压测看看现状(换成你自己的域名) ab -n 1000 -c 100 https://your-site.com/ 记录下压测结果中的 Requests per second 和 Time per request,优化完再对比,效果一目了然。一、Worker 进程与连接数调优Nginx 默认配置非常保守,不改 worker 数量等于白装。 配置项 默认值 推荐值 说明 worker_processes 1 auto 或 CPU 核数 等于 CPU 核心数效率最高 worker_connections 1024 4096 或 10240 每个 worker 能同时处理的连接数 multi_accept off on 一次接受所有新连接,减少系统调用 use 系统默认 epoll Linux 下效率最高的 I/O 模型 # /etc/nginx/nginx.conf user nginx; worker_processes auto; worker_rlimit_nofile 65535; events { use epoll; worker_connections 4096; multi_accept on; } 改完执行 nginx -t && nginx -s reload 生效。二、开启 Gzip 压缩HTML、CSS、JS 都是文本,压缩后体积能减少 60%~80%,效果立竿见影。# 放在 http 块中全局生效 gzip on; gzip_vary on; gzip_min_length 1024; # 小于 1KB 不压缩,省 CPU gzip_comp_level 6; # 压缩级别,1-9,6 是性价比较高的平衡点 gzip_types text/plain text/css text/javascript application/javascript application/json application/xml application/rss+xml image/svg+xml font/ttf font/woff; gzip_disable "msie6"; # IE6 不支持 gzip 验证:curl -H "Accept-Encoding: gzip" -I https://your-site.com/ | grep Content-Encoding,看到 gzip 就对了。三、静态资源缓存静态资源(图片、CSS、JS、字体)是不会天天改的,让浏览器缓存起来,用户第二次访问几乎秒开。location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ { expires 30d; # 缓存 30 天 add_header Cache-Control "public, immutable"; access_log off; # 静态资源不需要记录访问日志 } 注意:如果你的 CSS/JS 文件名带了 hash(如 app.a3f2b1c.css),缓存时间可以大胆设一年。如果没带 hash,缓存过期前改内容用户是看不到的。四、启用 HTTP/2HTTP/2 支持多路复用、头部压缩、服务器推送,性能提升明显。前提是你已经配了 HTTPS。listen 443 ssl http2; # 只需在 listen 后面加 http2 验证:Chrome 开发者工具 → Network → 右键表头勾选 Protocol,看到 h2 就说明 HTTP/2 生效了。五、调整缓冲区大小Nginx 默认缓冲区偏小,大文件传输时会频繁读写磁盘,拖慢速度。# 放在 http 或 server 块 sendfile on; # 零拷贝,直接内核态传输文件 tcp_nopush on; # 等数据包凑满再发,减少网络包数量 tcp_nodelay on; # keepalive 连接下立刻发送小包,降低延迟 client_body_buffer_size 128k; # 请求体缓冲区 client_max_body_size 50m; # 上传文件大小上限(按需调整) client_header_buffer_size 4k; large_client_header_buffers 4 32k; 六、连接超时优化合理的超时设置既能释放空闲连接占用的资源,又不会误伤正常用户。keepalive_timeout 65; # 长连接保持时间 keepalive_requests 100; # 一个长连接最多处理的请求数 client_body_timeout 30; # 读取请求体的超时 client_header_timeout 30; # 读取请求头的超时 send_timeout 30; # 发送响应的超时 七、FastCGI 缓存(WordPress / PHP 必看)如果你的网站跑 PHP(WordPress、Typecho 等),强烈建议配上 FastCGI 缓存,效果比任何 PHP 插件都猛。# 在 http 块中定义缓存路径 fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=MYCACHE:100m inactive=60m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; # 在 server 块的 location ~ \.php$ 中加入 fastcgi_cache MYCACHE; fastcgi_cache_valid 200 301 302 30m; # 正常响应缓存 30 分钟 fastcgi_cache_valid 404 1m; # 404 只缓存 1 分钟 fastcgi_cache_bypass $no_cache; fastcgi_no_cache $no_cache; fastcgi_cache_use_stale error timeout updating; # 登陆用户和管理员不缓存(根据你用的程序调整 cookie 名) set $no_cache 0; if ($http_cookie ~* "comment_author|wordpress_logged_in|PHPSESSID") { set $no_cache 1; } Typecho 用户把 cookie 匹配改为 PHPSESSID 即可,WordPress 用户上面的配置已经包含了。八、完整优化配置参考把以上优化整合后,你的 nginx.conf 大致长这样:user nginx; worker_processes auto; worker_rlimit_nofile 65535; pid /run/nginx.pid; events { use epoll; worker_connections 4096; multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; keepalive_requests 100; include /etc/nginx/mime.types; default_type application/octet-stream; # 日志格式(带响应时间) log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $request_time'; access_log /var/log/nginx/access.log main buffer=32k; error_log /var/log/nginx/error.log warn; # Gzip gzip on; gzip_vary on; gzip_min_length 1024; gzip_comp_level 6; gzip_types text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml font/ttf font/woff; # 缓冲区 client_body_buffer_size 128k; client_header_buffer_size 4k; large_client_header_buffers 4 32k; include /etc/nginx/conf.d/*.conf; } 优化效果对比 指标 优化前 优化后 首页传输大小 2.1 MB 480 KB(Gzip 后) TTFB 520 ms 85 ms(FastCGI 缓存命中时) requests/sec 420 2800+ 静态资源二次加载 200 ms 5 ms(浏览器缓存) 优化 Nginx 不是什么高深活,改几个参数的事。上面这些配置改完,你的网站至少在速度上能打赢 80% 的站点。改完别忘了用 Google PageSpeed Insights 或 GTmetrix 跑个分,成就感拉满。
2026年07月15日
61 阅读
0 评论
0 点赞
2026-07-15
自建网站监控:Uptime Kuma 部署教程
> 网站突然打不开了,结果过了半天才发现,这段时间可能已经损失了不少访客。Uptime Kuma 是一个开源、漂亮的网站监控工具,支持多种通知方式,部署超简单。---## Uptime Kuma 是什么?Uptime Kuma 是一款开源的自托管网站监控工具,功能包括: - 定时检测网站是否在线(HTTP/HTTPS/TCP/Ping 等) - 支持多种通知方式:邮件、Telegram、微信、钉钉、Webhook 等 - 漂亮的监控面板和状态页面 - 完全免费,部署简单---## 使用 Docker 部署(推荐)```bash docker run -d \ --name uptime-kuma \ --restart=always \ -p 3001:3001 \ -v uptime-kuma:/app/data \ louislam/uptime-kuma:latest ```然后访问 http://你的服务器IP:3001 进入设置界面。---## 配置 Nginx 反向代理```nginx server { listen 80; server_name status.example.com;location / { proxy_pass http://127.0.0.1:3001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } ```---## 配置通知支持的通知方式:| 方式 | 适合场景 | |------|---------| | 邮件(SMTP) | 通用,人人都能收到 | | Telegram Bot | 实时推送,免费 | | 企业微信/钉钉 | 国内用户首选 | | Webhook | 自定义处理逻辑 | | ServerChan | 微信推送,国内友好 |---## 公开状态页面Uptime Kuma 还能生成公开的状态页面,让用户也能看到你的服务是否正常。在设置中创建状态页面,选择要公开显示的监控项,生成唯一 URL,把链接放到网站页脚。---网站挂了不可怕,可怕的是挂了半天你还不知道。花 5 分钟部署 Uptime Kuma,给你的网站请个 24 小时不休息的保安。
2026年07月15日
69 阅读
0 评论
0 点赞
2026-07-15
SSH 密钥登录配置:告别密码,安全又方便
> 还在每次登录服务器输密码?密码太简单不安全,太复杂记不住。SSH 密钥登录既安全又方便,配置一次,一劳永逸。---## 密钥登录的原理SSH 密钥登录使用非对称加密: - **私钥**:保存在你的电脑上,绝对不要泄露 - **公钥**:放在服务器上,可以公开登录时服务器用公钥加密一个随机信息,只有持有对应私钥的电脑才能解密。不需要传输密码,安全性极高。---## 第一步:生成本机密钥对在 **Mac/Linux 终端** 中执行:```bash ssh-keygen -t ed25519 -C "你的邮箱" ```- -t ed25519:使用 Ed25519 算法(比 RSA 更安全更快) - -C:添加备注,通常是你的邮箱一路回车使用默认路径即可(~/.ssh/id_ed25519)。生成后会有两个文件: - ~/.ssh/id_ed25519 — 私钥(保密!) - ~/.ssh/id_ed25519.pub — 公钥(可以给别人)---## 第二步:把公钥上传到服务器最简单的方法是用 ssh-copy-id:```bash ssh-copy-id -i ~/.ssh/id_ed25519 -p 2222 root@192.168.2.22 ```如果 ssh-copy-id 不可用,手动操作:```bash cat ~/.ssh/id_ed25519.pub | ssh -p 2222 root@192.168.2.22 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" ```---## 第三步:测试密钥登录```bash ssh -p 2222 -i ~/.ssh/id_ed25519 root@192.168.2.22 ```如果不需要输密码就直接进去了,配置成功。---## 第四步:禁用密码登录(可选但推荐)编辑服务器上的 /etc/ssh/sshd_config:``` PasswordAuthentication no PubkeyAuthentication yes ```然后重启 SSH 服务:systemctl restart sshd**重要提醒**:在做这步之前,确认密钥登录已经可以正常使用了!否则把自己锁在服务器外面就麻烦了。---## 配置 SSH 快捷别名每次输 ssh -p 2222 -i ~/.ssh/id_ed25519 root@192.168.2.22 太长了。编辑 ~/.ssh/config:``` Host myserver HostName 192.168.2.22 Port 2222 User root IdentityFile ~/.ssh/id_ed25519 ```之后只需要 ssh myserver 就够了。---## 常见问题**Q:私钥权限太开放怎么办?** ```bash chmod 600 ~/.ssh/id_ed25519 chmod 700 ~/.ssh ```**Q:换了电脑怎么办?** 把 ~/.ssh/id_ed25519 和 ~/.ssh/id_ed25519.pub 复制到新电脑的相同位置即可。---SSH 密钥登录是每个程序员的基本功,配置只需 5 分钟,此后每次登录都能省下输密码的时间和担惊受怕。
2026年07月15日
96 阅读
0 评论
0 点赞
2026-07-15
crontab 定时任务完全指南:让服务器自动干活
> 凌晨 3 点自动备份数据库、每小时检查网站是否在线、每天早上给自己发一封服务器状态邮件——这些都可以用 crontab 定时任务来实现。它是 Linux 上最常用、最简单的自动化工具。---## crontab 是什么?crontab 是 Linux 系统自带的任务调度器,可以按照设定的时间周期自动执行命令或脚本。无需额外安装,系统原生支持。---## 基本语法``` 分 时 日 月 星期 要执行的命令 * * * * * command ```| 字段 | 取值范围 | |------|---------| | 分钟 | 0-59 | | 小时 | 0-23 | | 日期 | 1-31 | | 月份 | 1-12 | | 星期 | 0-7(0和7都是周日) |---## 常用时间设置```bash # 每分钟执行 * * * * * command# 每天凌晨 3 点 0 3 * * * command# 每周一早上 9 点 0 9 * * 1 command# 每月 1 号凌晨 0 0 1 * * command# 工作日每小时 0 * * * 1-5 command# 每 10 分钟 */10 * * * * command# 每天的 9、12、15、18、21 点 0 9,12,15,18,21 * * * command ```---## 如何编辑和使用```bash crontab -e # 编辑当前用户的定时任务 crontab -l # 查看当前用户的定时任务列表 crontab -r # 删除所有定时任务(慎用!) ```---## 实用案例### 1. 定时备份数据库```bash 0 3 * * * /opt/backup_db.sh >> /var/log/backup.log 2>&1 ```每天凌晨 3 点执行备份脚本。### 2. 定时清理日志```bash 0 4 * * 0 find /var/log -name "*.log" -mtime +30 -delete ```每周日凌晨 4 点删除 30 天前的日志。### 3. 网站健康检查```bash */5 * * * * curl -s https://blog.example.com > /dev/null || echo "Site down!" | mail -s "Alert" admin@example.com ```每 5 分钟检查一次网站。### 4. SSL 证书自动续期```bash 0 2 * * 1 certbot renew --quiet ```---## 常见问题**Q:为什么我的定时任务不执行?**1. 检查 crontab 语法是否正确:分 时 日 月 星期 2. 使用绝对路径,比如用 /usr/bin/python3 而不是 python3 3. 脚本要有执行权限:chmod +x script.sh 4. 查看系统日志排查:grep CRON /var/log/syslog**Q:环境变量不一样怎么办?**crontab 的环境变量和登录 shell 不同。可以在 crontab 文件开头设置:```bash PATH=/usr/local/bin:/usr/bin:/bin SHELL=/bin/bash HOME=/root0 3 * * * /opt/backup.sh ```---crontab 就是你服务器上的闹钟。花 5 分钟学会,以后备份、清理、监控这些重复劳动都不用自己动手了。
2026年07月15日
74 阅读
0 评论
0 点赞
2026-07-14
网站自动备份方案:数据库 + 文件定时备份,再也不怕数据丢失
> 服务器硬盘坏了、被黑客删库、误操作删了重要文件——这些事情不常发生,但一旦发生就是灾难。一套好的自动备份方案,是你网站的最后一道保险。---## 备份什么?网站数据分为两部分:| 内容 | 位置 | 说明 | |------|------|------| | 数据库 | SQLite/MySQL | 文章、用户、评论等 | | 文件 | 网站目录 | 主题、插件、上传的图片 |两者都要备份,缺一不可。---## 方案一:Shell 脚本 + crontab创建备份脚本 /opt/backup.sh:```bash #!/bin/bash BACKUP_DIR="/mnt/mmcblk1p1/backups" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR# 备份数据库 tar -czf "$BACKUP_DIR/db_$DATE.tar.gz" /mnt/mmcblk1p1/typecho/usr/typecho.db# 备份网站文件 tar -czf "$BACKUP_DIR/files_$DATE.tar.gz" /var/www/html/# 删除 7 天前的旧备份 find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -deleteecho "Backup completed at $DATE" ```添加定时任务(每天凌晨 3 点执行):```bash chmod +x /opt/backup.sh crontab -e # 添加这一行: 0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1 ```---## 方案二:rsync 增量备份rsync 只同步变化的部分,适合大文件:```bash rsync -avz --delete /var/www/html/ /mnt/backup/html/ ```---## 方案三:异地备份(强烈推荐)如果备份和网站放在同一块硬盘上,硬盘坏了全完蛋。建议用 rclone 同步到云存储:```bash # 安装 rclone curl https://rclone.org/install.sh | bash# 配置(以 Google Drive 为例) rclone config# 同步备份目录到云端 rclone sync /mnt/backups remote:blog-backups ```支持 OneDrive、Google Drive、Dropbox、阿里云 OSS 等。---## 备份策略建议| 频率 | 保留数量 | 存储位置 | |------|---------|---------| | 每天 | 保留最近 7 天 | 本地 | | 每周 | 保留最近 4 周 | 异地(云存储) | | 每月 | 保留最近 3 个月 | 异地(云存储) |---## 恢复备份备份再好,不会恢复等于白做:```bash # 恢复数据库 cd /tmp && tar -xzf db_backup.tar.gz cp typecho.db /mnt/mmcblk1p1/typecho/usr/# 恢复网站文件 tar -xzf files_backup.tar.gz -C /# 检查文件权限 chown -R www-data:www-data /var/www/html/ ```---花 10 分钟配好自动备份,可能在未来某天帮你省下几天的修复时间。数据无价,备份别省。
2026年07月14日
82 阅读
1 评论
0 点赞
2026-07-14
服务器安全加固指南:防火墙、fail2ban 与 SSH 防护
> 新买的 VPS 刚上线几个小时,SSH 登录日志里已经有一大堆来自世界各地的暴力破解记录了。互联网上没有绝对的安全,但做好基础防护,能挡住 99% 的自动攻击。---## 第一道防线:SSH 加固### 1. 禁用密码登录,只用密钥编辑 /etc/ssh/sshd_config:``` PasswordAuthentication no PubkeyAuthentication yes ```然后重启 SSH:systemctl restart sshd### 2. 修改默认端口把 SSH 端口从 22 改成不常用的端口(比如 2222):``` Port 2222 ```### 3. 禁止 root 直接登录``` PermitRootLogin no ```先用普通用户登录,再用 sudo 提权。---## 第二道防线:防火墙(ufw)Ubuntu/Debian 推荐用 ufw,简单好用:```bash ufw default deny incoming # 默认拒绝所有入站 ufw default allow outgoing # 默认允许所有出站 ufw allow 2222/tcp # 允许 SSH 端口 ufw allow 80/tcp # HTTP ufw allow 443/tcp # HTTPS ufw enable # 启用防火墙 ufw status verbose # 查看规则 ```打好这 4 条命令,你的服务器就只对外开放了 3 个端口。---## 第三道防线:fail2ban 防暴力破解```bash apt install fail2ban -y ```fail2ban 会监控登录日志,如果某个 IP 短时间内多次尝试登录失败,自动把它拉黑。创建本地配置 /etc/fail2ban/jail.local:```ini [sshd] enabled = true port = 2222 maxretry = 3 bantime = 3600 findtime = 600 ```含义:10 分钟内失败 3 次,封禁 1 小时。启动:systemctl enable fail2ban --now---## 日常安全检查清单| 检查项 | 命令 | |--------|------| | 查看登录记录 | last -20 | | 查看失败登录 | lastb -20 | | 查看当前在线用户 | who | | 查看监听端口 | ss -tlnp | | fail2ban 状态 | fail2ban-client status |---## 额外建议1. 保持系统更新:apt update && apt upgrade -y,定期执行 2. 最小权限原则:不要所有操作都用 root 3. 定期备份:安全措施再完善,也不如一份可靠的备份 4. 不要安装来路不明的脚本安全没有终点,但做好以上几步,你的服务器已经比 90% 的 VPS 更安全了。
2026年07月14日
55 阅读
0 评论
0 点赞
2026-07-14
微信小程序实战:从零搭建一个VIP会员管理系统(附完整代码)
## 为什么做这个小程序?相信很多做实体店、工作室、或者搞会员制社群的朋友都有这个痛点:会员多了,谁充了多少钱、还剩多少余额,光靠脑子记或 Excel 根本管不过来。正好我最近在研究微信小程序开发,就动手做了一个 **VIP会员管理系统**。顾客扫码就能绑定会员,充值和消费自动记录,还能一键给客户发通知。趁小程序备案的空档,我把整个开发过程写下来,给有需要的朋友参考。## 小程序长什么样?**核心功能一览:**- 会员列表,支持搜索和排序 - 一键充值/消费,余额实时更新 - 完整交易流水,按类型筛选 - 统计分析:总充值、总消费、会员排名 - 顾客扫码绑定,支持微信通知 - 网页管理后台,电脑端也能操作 - 暗色主题,简洁专业> 由于小程序还在备案中,暂时无法搜索体验。备案通过后会更新小程序码。## 技术架构整个项目分三部分:| 层级 | 技术 | 说明 | |------|------|------| | 小程序前端 | 微信原生开发(WXML + WXSS + JS) | 5 个页面 + 自定义 TabBar | | 后端 API | PHP | 单文件 API,部署在任意 PHP 服务器 | | 管理后台 | HTML + JS(单页面) | 电脑端操作,数据与小程序互通 |架构非常简单:小程序和网页后台通过同一个 PHP API 读写 JSON 数据文件,无需数据库。``` 微信小程序 ──→ PHP API ──→ JSON 数据文件 网页后台 ──→ PHP API ──→ JSON 数据文件 ```## 一、后端 API 设计后端只有一个 PHP 文件,通过 `?action=xxx` 区分不同操作。### 核心 API 列表| action | 方法 | 说明 | |--------|------|------| | login | POST | 微信登录,code 换 openid | | status | GET | 获取账户状态 | | members | GET | 获取会员列表 | | add_member | POST | 新增会员 | | edit_member | POST | 编辑会员信息 | | delete_member | POST | 删除会员 | | recharge | POST | 会员充值 | | consume | POST | 会员消费 | | transactions | GET | 获取交易记录 | | get_bind_code | GET | 获取绑定码(网页端) | | bind_code | POST | 输入绑定码绑定 | | invite_bind | POST | 邀请链接绑定 | | unbind | POST | 解除微信绑定 |### 登录流程```php // 微信登录:code 换取 openid if ($action === 'login') { $code = $input['code'] ?? ''; $wxUrl = "https://api.weixin.qq.com/sns/jscode2session?" . "appid={$wxAppId}&secret={$wxsecret}&js_code=" . urlencode($code) . "&grant_type=authorization_code";$wxResponse = file_get_contents($wxUrl); $wxData = json_decode($wxResponse, true); $openid = $wxData['openid'];echo json_encode(['openid' => $openid]); } ```微信小程序端调用 `wx.login()` 获取临时 code,后端用 code 向微信服务器换取唯一标识 openid。后续所有操作都带上 openid,实现数据隔离。### 数据存储数据以 JSON 文件存储,每个用户一个文件:```json { "members": [ { "id": 1, "name": "张三", "phone": "138****1234", "balance": 500.00, "total_recharge": 1000.00, "total_consume": 500.00 } ], "transactions": [ { "id": 1, "member_id": 1, "member_name": "张三", "type": "recharge", "amount": 500.00, "time": "2025-07-14 10:30:00" } ] } ```### 会员充值核心逻辑```php case 'recharge': $amount = floatval($input['amount'] ?? 0); $id = intval($input['member_id']);// 找到对应会员,更新余额 foreach ($data['members'] as &$m) { if ($m['id'] == $id) { $m['balance'] += $amount; $m['total_recharge'] += $amount; // 记录交易流水 addTransaction($data, $id, $m['name'], 'recharge', $amount, $m['balance']); break; } } saveData($jsonFile, $data); ```## 二、小程序前端### 页面结构小程序一共 5 个页面:``` pages/ ├── index/ # 首页:会员列表 + 统计卡片 ├── transactions/ # 交易记录 ├── stats/ # 统计分析 ├── mine/ # 我的(设置、绑定、注销) └── bind/ # 绑定页(扫码/邀请绑定) ```### 首页:会员管理核心首页是使用频率最高的页面,我把它设计为信息密度最高的布局:- **顶部统计卡片**:总余额、累计充值、本月消费 - **搜索排序栏**:按姓名/手机搜索,按姓名/余额排序 - **会员列表**:显示姓名、手机(脱敏)、余额、VIP等级 - **浮动按钮**:右下角 + 按钮快速新增会员 - **点击会员弹出操作菜单**:充值、消费、编辑、解绑、删除```javascript // 加载数据 loadData: function() { var that = this; wx.showLoading({ title: '加载中...' });Promise.all([ util.getMembers(), util.getTransactions(), util.getStatus() ]).then(function(results) { var members = results[0]; var transactions = results[1]; var status = results[2];that.setData({ members: members, transactions: transactions, stats: that.calcStats(members, transactions) }); wx.hideLoading(); }); } ```### 会员等级设计根据余额自动计算等级,直观展示:| 等级 | 条件 | 徽章颜色 | |------|------|----------| | 钻石VIP | 余额 ≥ 10000 | 金色 | | 黄金VIP | 余额 ≥ 5000 | 橙色 | | 普通VIP | 余额 ≥ 500 | 蓝色 | | 普通会员 | 余额 < 500 | 灰色 |```javascript // WXS 中计算等级 function getLevel(m) { var balance = m.balance || 0; if (balance >= 10000) return 'diamond'; if (balance >= 5000) return 'gold'; if (balance >= 500) return 'vip'; return 'normal'; } ```### 充值/消费 + 一键通知这是我觉得最实用的功能:充值和消费完成后,自动生成通知文案,一键复制发给客户。```javascript // 充值成功后 notifyRecharge: function(member, amount) { var text = '【充值通知】\n' + '尊敬的 ' + member.name + ':\n' + '您已成功充值 ¥' + amount.toFixed(2) + '\n' + '当前余额:¥' + member.balance.toFixed(2) + '\n' + '感谢您的支持!';wx.setClipboardData({ data: text, success: function() { wx.showToast({ title: '已复制,可发送给客户' }); } }); } ```### 交易记录页按类型筛选(全部/充值/消费),每条记录显示会员名、操作类型、金额、时间,支持删除。### 统计分析页- 三个汇总卡片:总充值、总消费、剩余金额 - 会员排名表格,支持按充值或消费排序 - 前三名金银铜色排名徽章 - 点击任意卡片或行弹出详情### 网页绑定小程序和网页后台数据互通的核心:1. 在网页端点击「生成绑定码」,得到一个 6 位数字 2. 在小程序「我的」页面输入绑定码 3. 绑定成功后,两端操作的是同一份数据绑定码 5 分钟过期,保证安全性。## 三、网页管理后台除了小程序,我还做了一个网页版后台。电脑端大屏操作更方便,特别是录入大量会员数据的时候。网页端功能和小程序完全一致: - 会员管理(增删改查) - 充值消费 - 交易记录 - 数据与小程序实时同步网页端通过扫码登录,使用同一个 API,操作同一份数据。## 四、部署指南如果你想自己部署一套,步骤如下:### 1. 准备环境- 一台 Linux 服务器(任意配置) - 已备案的域名 - PHP 7.4+ 环境 - 微信小程序 AppID 和 Appsecret### 2. 部署后端```bash # 创建目录 mkdir -p /var/www/html/wxxcx# 上传 api_wxxcx.php 和 config.php # config.php 内容:
2026年07月14日
73 阅读
0 评论
0 点赞
2026-07-14
Nginx 反向代理配置教程:一台服务器跑多个网站
> 你有一台 VPS,想同时跑博客、网盘、监控面板,但只有一个 80 端口,怎么办?Nginx 反向代理就是标准答案。它就像一个前台,把不同域名的请求分发到不同的后台服务。---## 反向代理是什么?举个生活例子:你去公司找张三,前台接待员帮你联系张三,然后带你去会议室。你不需要知道张三在哪个工位。Nginx 就是这个前台。---## 安装 Nginx```bash apt update && apt install nginx -y systemctl start nginx systemctl enable nginx ```访问服务器 IP,看到 Nginx 欢迎页就成功了。---## 基础配置文件结构Nginx 配置文件在 /etc/nginx/ 目录下: - nginx.conf:主配置文件 - sites-available/:存放所有站点配置 - sites-enabled/:已启用的站点(软链接到 sites-available)---## 配置第一个反向代理假设博客运行在本地 8080 端口,想通过 blog.example.com 访问:```nginx server { listen 80; server_name blog.example.com;location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } ```创建文件后启用:```bash ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/ nginx -t # 检查配置语法 systemctl reload nginx ```---## 一台服务器跑多个网站| 网站 | 域名 | 后端端口 | |------|------|---------| | 博客 | blog.example.com | 8080 | | 网盘 | cloud.example.com | 8081 | | 监控 | status.example.com | 3000 |只需要在 Nginx 中为每个域名创建独立的 server 块,各自 proxy_pass 到对应端口即可。---## 配置 SSL(HTTPS)```bash apt install certbot python3-certbot-nginx -y certbot --nginx -d blog.example.com ```Certbot 会自动修改 Nginx 配置加上 SSL 支持,证书到期前也会自动续期。---## 常用优化配置```nginx client_max_body_size 100m; # 文件上传大小限制 gzip on; gzip_types text/plain text/css application/json application/javascript;location ~* \.(jpg|png|gif|css|js|ico)$ { expires 30d; add_header Cache-Control "public, immutable"; } ```---配置好 Nginx 反向代理,一台 1 核 1G 的小 VPS 跑 5 到 10 个小网站完全没压力。这是每个站长必备的技能。
2026年07月14日
89 阅读
0 评论
0 点赞
2026-07-14
Docker 入门实战:用容器化部署你的第一个应用
> 有没有遇到过这种情况:代码在自己电脑上跑得好好的,部署到服务器就各种报错?环境不一致是开发者最头疼的问题之一。Docker 把应用和它的运行环境打包在一起,一次构建到处运行。---## 什么是 Docker?Docker 就像一个轻量级的虚拟机。传统虚拟机要模拟整个操作系统,Docker 只隔离应用层,所以启动快(秒级)、占用资源少。| 对比 | 传统虚拟机 | Docker 容器 | |------|-----------|-------------| | 启动速度 | 分钟级 | 秒级 | | 磁盘占用 | GB 级 | MB 级 | | 性能损耗 | 较高 | 几乎无 | | 隔离级别 | 操作系统级 | 进程级 |---## 安装 Docker```bash # Ubuntu/Debian curl -fsSL https://get.docker.com | bash# 启动 Docker 服务 systemctl start docker systemctl enable docker# 验证安装 docker --version ```---## 核心概念- **镜像(Image)**:应用的模板,类似于安装包 - **容器(Container)**:镜像运行起来的实例 - **仓库(Registry)**:存放镜像的地方,Docker Hub 是最大的公共仓库---## 第一个 Docker 应用:运行 Nginx```bash docker run -d --name my-nginx -p 8080:80 nginx ```浏览器访问 http://你的服务器IP:8080,就能看到 Nginx 欢迎页面。---## 常用管理命令| 命令 | 用途 | |------|------| | docker ps | 查看运行中的容器 | | docker ps -a | 查看所有容器(含已停止) | | docker stop my-nginx | 停止容器 | | docker start my-nginx | 启动已停止的容器 | | docker rm my-nginx | 删除容器 | | docker images | 查看本地镜像列表 | | docker logs my-nginx | 查看容器日志 | | docker exec -it my-nginx bash | 进入容器内部 |---## 用 Docker Compose 管理多容器应用真实项目中经常需要同时运行多个服务(比如 Web + 数据库),Docker Compose 可以一键启动所有服务。```yaml version: '3' services: web: image: nginx ports: - "80:80" db: image: mysql:8 environment: MYSQL_ROOT_PASSWORD: mypassword ```一条命令全部启动:docker-compose up -d---## 实战:用 Docker 部署一个博客```bash docker run -d \ --name typecho \ -p 80:80 \ -v /opt/typecho:/app/usr \ 80x86/typecho:latest ```访问服务器 IP,就能看到 Typecho 安装界面了。整个过程不超过 2 分钟。Docker 的好处就是你不用关心服务器装了什么版本的 PHP、MySQL,镜像里已经配好了。
2026年07月14日
81 阅读
0 评论
0 点赞
2026-07-14
Git 从零开始:版本控制完全指南(附常用命令速查表)
> 写代码最怕什么?改完一个功能发现之前的版本更好却找不回来了。多人协作时大家代码怎么合并?Git 就是解决这些问题的利器。不管你是写代码、写文章、还是做设计,学点 Git 都不会亏。---## Git 是什么?Git 是一个分布式版本控制系统,由 Linux 之父 Linus Torvalds 开发。它能记录文件的每一次修改,让你随时回溯到任意历史版本,还能支持多人同时协作而不互相干扰。---## 安装 Git- **Windows**:去 git-scm.com 下载安装包 - **Mac**:终端输入 git --version,如果没有会自动提示安装 - **Linux**:apt install git 或 yum install git安装完成后配置用户名和邮箱:```bash git config --global user.name "你的名字" git config --global user.email "你的邮箱" ```---## 核心概念:三个区域| 区域 | 说明 | |------|------| | 工作目录(Working Directory) | 你正在编辑的文件 | | 暂存区(Staging Area) | 准备提交的文件列表 | | 版本库(Repository) | 已提交的历史版本 |理解这三个区域,就理解了 Git 的工作流程。---## 日常工作流程1. git init — 初始化一个新仓库 2. git add . — 把所有修改加入暂存区 3. git commit -m "提交信息" — 提交到版本库 4. git push origin main — 推送到远程仓库(如 GitHub)这就是最基础的工作流,每天都会用到。---## 常用命令速查表| 命令 | 用途 | |------|------| | git status | 查看当前状态,哪些文件被修改了 | | git log --oneline | 查看提交历史(简洁版) | | git diff | 查看具体改了什么内容 | | git branch | 查看所有分支 | | git checkout -b new-feature | 创建并切换到新分支 | | git merge feature | 合并 feature 分支到当前分支 | | git reset --hard HEAD~1 | 撤销最近一次提交(谨慎) | | git stash | 暂存当前修改,稍后再取回 | | git clone 仓库地址 | 克隆远程仓库到本地 | | git pull | 拉取远程更新 |---## 分支策略:避免翻车多人协作建议使用分支策略:- **main** 分支:生产环境代码,永远保持稳定 - **develop** 分支:开发主分支 - **feature/xxx** 分支:每个新功能单独开分支,完成后合并回 develop这样即使某个功能写崩了,也不影响主干代码。---## 一个真实场景你在改一个功能,改到一半发现思路不对,想回到修改前的状态:```bash git stash # 暂存当前半成品 git status # 确认工作区干净,回到修改前 git stash pop # 取出之前暂存的修改,继续工作 ```这就是 Git 给的后悔药,大胆改,改坏了随时能回退。
2026年07月14日
59 阅读
0 评论
0 点赞
2026-07-14
Linux 命令行入门:10 个程序员必学的基础命令
> 很多新手看到黑底白字的命令行就头疼,但 Linux 服务器管理、程序开发、自动化运维都离不开它。其实常用的核心命令也就十几个,掌握它们,你就能搞定 90% 的日常操作。---## 为什么要学命令行?如果你有个人网站或者 VPS 服务器,迟早要跟命令行打交道。图形界面虽然直观,但远程服务器通常只有命令行可用,而且命令行的效率远高于鼠标点击。---## 10 个必学命令### 1. ls - 查看目录内容```bash ls # 列出当前目录文件 ls -l # 详细列表(权限、大小、时间) ls -la # 包括隐藏文件 ls -lh # 人类可读的文件大小 ```### 2. cd - 切换目录```bash cd /var/www # 进入指定目录 cd .. # 返回上一级 cd ~ # 回到用户主目录 cd - # 回到上一个目录 ```### 3. pwd - 显示当前路径### 4. mkdir - 创建目录```bash mkdir blog # 创建单个目录 mkdir -p a/b/c # 递归创建多级目录 ```### 5. cp - 复制文件```bash cp file.txt backup.txt # 复制文件 cp -r dir1/ dir2/ # 递归复制整个目录 ```### 6. mv - 移动/重命名```bash mv old.txt new.txt # 重命名 mv file.txt /tmp/ # 移动文件 ```### 7. rm - 删除```bash rm file.txt # 删除文件 rm -r dir/ # 递归删除目录 rm -rf dir/ # 强制删除(谨慎使用!) ```### 8. cat / less - 查看文件内容```bash cat file.txt # 一次性显示全部 less file.txt # 分页浏览(按 q 退出) tail -f log.txt # 实时查看日志尾部 ```### 9. grep - 搜索文本```bash grep "error" log.txt # 搜索包含 error 的行 grep -r "TODO" ./src/ # 递归搜索目录 grep -i "warning" log.txt # 忽略大小写 ```### 10. chmod - 修改权限```bash chmod 755 script.sh # rwxr-xr-x chmod 644 file.txt # rw-r--r-- chmod +x script.sh # 添加执行权限 ```---## 几个实用小技巧- **Tab 自动补全**:输入文件名或命令的前几个字母,按 Tab 键自动补全 - **Ctrl+C**:强制终止当前正在运行的程序 - **Ctrl+R**:搜索历史命令,避免重复输入 - **上下箭头**:浏览之前执行过的命令 - **man 命令**:查看命令的帮助文档,比如 man ls---## 常用组合技| 组合命令 | 作用 | |---------|------| | ls -la | grep ".py" | 列出当前目录所有 Python 文件 | | find . -name "*.log" -delete | 删除所有日志文件 | | du -sh * | sort -h | 按大小排序显示文件/目录 | | history | grep ssh | 查找历史中的 ssh 命令 |---这些命令看一遍可能记不住。把它们收藏起来,实际用到的时候查一下,用几次就熟了。命令行不需要死记硬背,关键是理解每个命令能解决什么问题。
2026年07月14日
69 阅读
0 评论
0 点赞
2026-07-14
网站变现大盘点:除了 AdSense,还有哪些赚钱的方法?
网站变现大盘点:除了 AdSense,还有哪些赚钱的方法?网站有流量了,光靠 Google AdSense 那点广告费,一个月可能就几块钱。别灰心,变现方式远不止这一种。本文盘点 10 种网站赚钱方法,从零门槛到进阶玩法,总有一种适合你。一、你的网站阶段决定你的变现方式不是所有变现方式都适合你,要看网站处于什么阶段: 阶段月访问量适合的变现方式 新手期小于 1000友情链接、打赏、推广链接 成长期1000-10000广告联盟、付费文章、软文 成熟期10000-100000知识付费、自有产品、会员制 盈利期大于 100000品牌广告、咨询服务、培训课程 不要在新手期就想着赚大钱,先把内容做好,流量自然会带来收入。二、广告变现——最省心的方式2.1 Google AdSense前面有专门的文章讲过。优点是全自动、不用管;缺点是单价低,中文站尤其低。适合:日访问量 500+ 的综合性网站。2.2 国内广告联盟 平台门槛特点 百度联盟需备案域名,有一定流量要求国内最大,单价尚可 搜狗联盟需备案审核较松 360 联盟需备案门槛适中 注意:国内广告联盟基本都要求域名备案,免费域名用不了。三、推广链接(联盟营销)——内容变现的最佳方式什么是推广链接?你在文章里推荐某个工具或服务,附上专属推广链接。有人通过你的链接购买/注册,你就能拿到佣金。优势: 不需要网站有很大流量 与内容融合,不打扰读者 单价高,可能一笔就几十上百元 适合新手的推广平台 平台推广什么佣金比例 阿里妈妈(淘宝联盟)淘宝/天猫商品1%-50% 京东联盟京东商品1%-30% 多多进宝拼多多商品1%-30% VPS 推广云服务器/VPS一次性 50-200 元 域名注册商推广域名/主机15%-30% 实操建议:写"工具推荐""资源盘点"类文章,自然地嵌入推广链接。比如本系列的文章,完全可以推荐相关的建站工具。四、卖自己的产品——利润最高的方式别人的产品你只能拿佣金,自己的产品利润全是你的。你可以卖什么? 产品类型制作难度利润空间举例 PDF 电子书低高《零成本建站完全指南》PDF 模板/主题中高Typecho 博客主题 在线课程中很高"从零学建站"系列视频 工具/插件高很高Typecho 功能插件 咨询服务低极高1对1 建站指导 新手最容易上手的是电子书和咨询服务。把你已有的博客内容整理成 PDF,定价 9.9-29.9 元,有读者认可你的内容就会买单。五、付费内容——知识应该值钱怎么做? 部分文章设置付费阅读(比如深度教程、独家资源) 开设会员专区,月费制 提供付费问答服务 适合谁?当你已经有了一批忠实读者,他们认可你的专业度,付费是水到渠成的事。没有读者基础之前不建议做。六、软文合作——有一定风险但要了解当网站有一定影响力后,会有商家找你写软文介绍他们的产品。报价参考: 月访问量 5000+:一篇 200-500 元 月访问量 10000+:一篇 500-2000 元 月访问量 50000+:一篇 2000-10000 元 注意:接软文要有底线,不要给垃圾产品打广告,否则会伤害读者信任。七、汇总对比:哪种方式最适合你? 方式上手难度收益潜力流量要求推荐指数 AdSense极低中低高★★★ 推广链接低中高低★★★★★ 卖电子书低高中★★★★ 咨询服务低很高低★★★★ 国内广告联盟中中高高★★ 付费内容中高高★★★ 八、最后的话网站变现的核心逻辑就一条:先给价值,再谈赚钱。不要一上来就贴满广告,那样只会赶走读者。先踏踏实实写半年好内容,等有了第一批忠实读者,再慢慢把变现方式加上去。记住:流量是水,信任是船,水涨船才高。
2026年07月14日
73 阅读
0 评论
0 点赞
2026-07-14
让读者主动回来!RSS 订阅 + 邮件订阅,零成本留住用户
让读者主动回来!RSS 订阅 + 邮件订阅,零成本留住用户读者今天看了你的文章,明天还记得你的网站吗?大概率不会。你需要一种方式能"通知"他们回来看。RSS 和邮件订阅就是最好的免费工具。本文教你搭建自己的订阅体系。一、为什么要做订阅?——流量不能只靠"缘分"你的流量来源无非三种: 来源特点你能控制吗? 搜索引擎用户主动搜索部分(靠 SEO) 社交媒体平台推荐算法很少(算法说了算) 订阅回流主动通知用户完全控制 搜索引擎和社交媒体的流量都是"借来的",只有订阅用户是你自己的流量池。你更新了,他们就回来。二、RSS 订阅——属于程序员和极客的浪漫RSS 是什么?RSS(Really Simple Syndication)是一种内容订阅协议。简单说: 你的网站发布新文章 → 自动更新 RSS 文件 读者用 RSS 阅读器订阅你的 RSS 地址 → 自动收到新文章通知 不依赖任何平台,纯技术驱动 Typecho 的 RSS 在哪?Typecho 自带 RSS 功能,无需任何配置: 文章 RSS:你的域名/feed/ 评论 RSS:你的域名/feed/comments/ 直接把 /feed/ 链接放在网站显眼位置就行了。推荐的 RSS 阅读器 阅读器平台价格 FeedlyWeb / iOS / Android免费版够用 InoreaderWeb / iOS / Android免费版够用 NetNewsWiremacOS / iOS完全免费 Fluent ReaderWindows / macOS / Linux完全免费 ReedermacOS / iOS付费(体验极佳) 三、邮件订阅——受众更广的选择RSS 的受众主要是技术用户,普通读者更习惯邮件。而且邮件通知打开率高,不容易被忽略。免费邮件订阅方案 方案免费额度适合场景 Mailchimp500 订阅者/月 1000 封入门首选 Brevo (Sendinblue)300 封/天日常更新够用 MailerLite1000 订阅者/月 12000 封功能最强免费版 Substack完全免费写作平台,不是独立站 推荐 MailerLite:免费额度最高,界面友好,适合中文用户。怎么让读者留下邮箱?不要只放一个"订阅"按钮,要给出订阅的理由: "订阅后每周收到 2 篇建站教程,不再错过更新" "请输入邮箱订阅"(效果差) 提供订阅奖励:比如"订阅就送《建站工具清单》PDF",转化率能提高 3 倍。四、QQ/微信通知——国内特供方案国内用户很少用邮件和 RSS,但 QQ 和微信是刚需。低成本方案 QQ 群:新建一个读者群,更新后在群里发通知(免费) 微信公众号:开通订阅号(免费),绑定博客的 RSS,用自动化工具推送(如 IFTTT + 企业微信) Server 酱:免费推送服务,每天 5 条额度,可以把新文章推送到微信 Server 酱配置(适合技术用户) 注册 Server 酱(sct.ftqq.com) 获取 SendKey 设置一个定时任务,检测网站是否有新文章 有新文章时自动推送到微信 五、订阅体系怎么组合?不要求你全都做,根据你的受众选择: 受众类型推荐方案 技术用户RSS + GitHub 讨论组 普通用户邮件订阅 + QQ 群 移动端用户微信公众号 + 微信通知 国际化用户RSS + Substack 最低配置:放一个 RSS 链接 + 一个邮箱订阅表单,5 分钟搞定。从今天开始,让你的读者有了"回来的理由"。
2026年07月14日
68 阅读
0 评论
0 点赞
2026-07-14
让读者留下来!给你的网站加上评论系统和互动功能
让读者留下来!给你的网站加上评论系统和互动功能网站有流量了,但读者看完就走、一句话不留?没有互动的网站就像没人说话的教室,冷清又尴尬。本文教你给网站加上评论系统,把"路人"变成"粉丝"。一、为什么评论系统这么重要?评论不是可有可无的装饰品,它是网站的"社交引擎": 好处具体表现 增加用户粘性参与评论的用户回访率高出 3 倍 获取灵感读者的提问就是你下篇文章的选题 建立信任活跃的评论区说明你是一个"活人" SEO 加分评论内容本身也是页面内容,增加关键词 社交证明新读者看到有人评论,更愿意看下去 二、自带评论 vs 第三方评论——怎么选?Typecho 自带评论优点: 零配置,开箱即用 评论数据在自己数据库,不会丢 没有第三方服务挂掉的风险 缺点: 需要用户填写昵称、邮箱,门槛较高 没有社交登录(微信/QQ/GitHub) 防垃圾评论能力弱 第三方评论系统对比 系统免费社交登录特点 Twikoo免费QQ/微信/GitHub自部署,数据私有,颜值高 Waline免费GitHub/QQ/微信功能全面,支持表情包 Artalk免费多种方式轻量简洁,自部署 Giscus免费GitHub基于 GitHub Discussions 畅言需备案多种方式国内服务,需域名备案 三、推荐方案:Twikoo + Vercel 免费部署我用的是 Twikoo,免费、好看、功能全。部署步骤: 去 Vercel.com 用 GitHub 账号登录(免费) 一键部署 Twikoo(有模板) 获取部署后的地址(如 xxx.vercel.app) 在 Typecho 主题中引入 Twikoo 的 JS 文件 配置 MongoDB 数据库(MongoDB Atlas 有免费额度) 全程 10 分钟,一分钱不花。四、预防垃圾评论评论系统一开通,垃圾评论马上就来——各种广告、外链、甚至赌博推广。免费防垃圾方案 方法效果实现难度 验证码阻止机器人低(插件即可) 审核机制人工过滤低(自带功能) 关键词过滤自动拦截敏感词中 Akismet 反垃圾智能识别垃圾评论低(有免费版) 限制链接数量阻止纯外链评论低 最低配置:开启评论审核 + 验证码插件。不麻烦,但能拦住 90% 的垃圾评论。五、怎么引导读者评论?有了评论系统,没人评论就等于没用。几个引导技巧: 文末提问:每篇文章结尾抛一个问题,比如"你觉得呢?""你遇到过这种情况吗?" 先自己评论:发表后自己先留一条评论,打破"零评论"的尴尬 回复每一条评论:初期每一条都认真回复,让读者感觉被重视 降低门槛:用 Twikoo 这类支持社交登录的,减少填写表单的麻烦 六、评论区也能成为内容的来源读者问的问题、提出的建议,往往是最好的选题来源: "请问怎么在 Typecho 上安装插件?" → 写一篇 Typecho 插件安装教程 "我用的是 WordPress 怎么办?" → 写一篇 WordPress 对比文章 "你的网站速度好快,怎么优化的?" → 写一篇速度优化文章 评论就是你免费的内容策划,别浪费了。
2026年07月14日
68 阅读
0 评论
0 点赞
2026-07-14
社交平台免费推广全攻略:不花一分钱,让你的网站被更多人看到
社交平台免费推广全攻略:不花一分钱,让你的网站被更多人看到SEO 见效需要时间,但社交平台推广可以当天就看到流量。利用知乎、小红书、抖音、B站等平台的免费流量,不花一分钱也能让网站访问量翻倍。本文教你每个平台的玩法。一、为什么社交推广比 SEO 更"爽"?SEO 做得好,流量稳定但来得慢;社交推广虽然来去匆匆,但爆发力极强: 对比维度SEO社交推广 见效速度3-6 个月当天甚至几小时 流量持续性长期稳定爆发后逐渐衰减 操作难度技术向,需要优化内容向,需要"网感" 成本免费免费 最佳策略:SEO + 社交推广双管齐下,一个稳定、一个爆发。二、知乎——最有价值的推广阵地为什么选知乎? 百度给知乎的权重极高,知乎回答经常排在前三 用户搜索意图明确,转化率高 内容生命周期长,好回答能持续引流数年 怎么玩?不要直接发广告! 知乎用户极度反感硬广。正确姿势: 找和你博客主题相关的问题 写高质量的回答,把文章核心内容放进去 在回答末尾自然引导:"更多细节可以看我的博客 [链接]" 不要每个回答都带链接,控制在 1/3 左右 一个真实案例我一个关于"免费建站"的知乎回答,写了 2000 字干货,最后放了一个博客链接。这个回答每天持续给我带来 50-100 个访问,已经持续半年了。三、小红书——被低估的引流渠道别以为小红书只是种草美妆的,技术教程、效率工具、学习方法类内容同样火爆。小红书的独特优势 用户群体年轻、付费意愿强 图文笔记制作成本低 平台推荐算法公平,小号也有机会爆 操作思路 把博客文章改写成图文笔记(3-5 张关键截图 + 简洁文字) 用 Canva 做封面图,风格统一 评论区或私信里引导到博客(注意小红书对外链限制,可以用"主页有链接"引导) 四、B站——视频引流的新蓝海如果你的内容是教程类,做视频教程在 B站效果拔群。B站引流公式一个爆款 B站视频 = 吸引人的封面 + 前 15 秒抓住眼球 + 干货内容 + 评论区置顶链接低成本制作方案 录屏教程:用 OBS(免费)录制操作过程,配上解说 PPT+配音:PPT 做好内容,用剪映配音导出 Canva 动画:用 Canva 的动画功能做简单动画视频 不需要露脸,不需要专业设备,内容有用就有人看。五、其他值得做的平台 平台适合内容引流方式 CSDN编程、技术教程文章内放博客链接 掘金前端、全栈开发文末放博客和公众号 豆瓣书评、影评、生活类小组/日记带链接 微博所有类型置顶微博放链接 即刻效率工具、互联网圈动态分享 + 圈子 六、一篇文章多次分发的技巧不要把同一篇文章原封不动发到所有平台,要根据不同平台特点做适配: 知乎:改写成问答形式,突出干货 小红书:提炼成 3-5 张图,配上简洁文字 B站:做成 3-5 分钟教程视频 CSDN:保持原格式,加代码块和操作步骤 一篇文章花 1 小时写,花 30 分钟做分发,流量翻 10 倍,太划算了。七、千万别犯这些错误 只发链接:被删、被举报、被封号 内容太差:没干货只引流,用户来了就走 每个平台都发一样的内容:不尊重平台规则 过度引流:每篇文章都带链接,显得太功利 记住一个原则:先给价值,再求回报。
2026年07月14日
107 阅读
0 评论
0 点赞
2026-07-14
网站没人看?零成本 SEO 优化入门,让百度谷歌主动找你
网站没人看?零成本 SEO 优化入门,让百度谷歌主动找你网站做好了,内容也写了不少,可每天就几十个访问,搜索引擎根本不收录?SEO(搜索引擎优化)不是玄学,也不需要花钱。本文用最通俗的语言,教你让搜索引擎爱上你的网站。一、什么是 SEO?为什么你的网站需要它?SEO 全称 Search Engine Optimization,说白了就是让搜索引擎更容易看懂你的网站,从而给你更多免费流量。来看一组数据: 流量来源特点成本 搜索自然流量用户主动搜索,精准度高免费 社交媒体爆发力强,但来得快去得也快免费/付费 付费广告见效快,停了就没花钱 SEO 做得好,相当于在搜索引擎里免费打广告,24 小时不间断给你送流量。二、搜索引擎怎么"看"你的网站?搜索引擎就像一个巨大的图书馆管理员,它的工作流程是:爬取(发现网页)→ 索引(存储内容)→ 排名(决定展示顺序)你的目标就是让这三步都顺利进行。三、第一步:确保搜索引擎能找到你3.1 提交网站地图(Sitemap)Sitemap 就像网站的目录,告诉搜索引擎你有哪些页面。Typecho 可以安装 Sitemap 插件自动生成。操作步骤: 安装并启用 Sitemap 插件 访问 你的域名/sitemap.xml 确认能正常显示 登录百度站长平台(ziyuan.baidu.com)提交 sitemap 登录 Google Search Console(search.google.com)提交 sitemap 3.2 检查 robots.txtrobots.txt 告诉搜索引擎哪些页面可以抓取、哪些不要。确保它没有错误地阻止了重要页面。四、第二步:让搜索引擎看懂你的内容4.1 标题是 SEO 的命门文章标题决定了用户点不点进来。好的标题要: 要素说明示例 包含关键词用户搜什么,标题里就有什么"Typecho SEO 优化" 有吸引力让人想点进来"零成本""手把手""全攻略" 长度适中PC 端约 30 个中文字不要太长被截断 4.2 用好标题层级(H1-H3)搜索引擎通过标题层级理解文章结构: H1:一篇文章只有一个,主标题 H2:大段落标题 H3:子段落标题 不要跳级使用,保持层级清晰,搜索引擎会更喜欢。4.3 图片加上 alt 标签搜索引擎"看"不懂图片,但能读懂 alt 文字。每张图片加上描述性的 alt 属性,既有利于 SEO,也有利于无障碍访问。五、第三步:内容才是王道搜索引擎越来越聪明,优质原创内容是最强的 SEO 武器。写什么内容有利于 SEO? 内容类型SEO 优势举例 教程/指南类搜索量大,长尾关键词多"Typecho 安装教程" 盘点/推荐类容易被分享和引用"10 个免费图床推荐" 问题解答类精准匹配用户搜索意图"网站打不开怎么办" 对比评测类用户决策时需要,转化率高"WordPress vs Typecho" 一句话总结:用户搜什么,你就写什么。写得比别人好、比别人全。六、第四步:内外链接策略内部链接在自己的文章之间互相链接,有三大好处: 帮读者发现更多相关内容(提高阅读量) 帮搜索引擎发现更多页面(提高收录率) 传递页面权重(提高排名) 外部链接别的网站链接到你的网站,这是 SEO 中最难但最有价值的。新手可以从这些渠道获取: 在知乎、CSDN 等平台的文章中引用自己的博客 与其他博主交换友情链接 在相关论坛签名档放网站链接 七、SEO 效果要等多久?SEO 不是一蹴而就的事: 时间预期效果 第 1 周提交 sitemap,搜索引擎开始爬取 第 1 个月部分页面被收录,开始有零星搜索流量 第 3 个月收录页面增多,核心关键词开始有排名 第 6 个月搜索流量稳定增长,长尾关键词覆盖面扩大 1 年以上权重积累,搜索流量成为主要来源 坚持更新 + 优化,半年后你会感谢现在开始做 SEO 的自己。
2026年07月14日
70 阅读
0 评论
0 点赞
1
...
6
7
8