系统:Ubuntu/Debian系统
项目:https://github.com/ceocok/fake-nodeimage
安装Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
验证安装
node -v
npm -v
上传代码到VPS
sudo mkdir -p /var/www/image-hosting-backend
cd /var/www/image-hosting-backend
wget https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/package.json
wget https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/server.js
安装依赖
npm install
使用PM2运行(推荐)
安装 PM2
sudo npm install -g pm2
启动服务
pm2 start server.js --name image-hosting
设置开机自启
pm2 startup
pm2 save
查看日志
pm2 logs image-hosting
重启服务
pm2 restart image-hosting
常用PM2命令
pm2 list # 查看所有进程
pm2 logs image-hosting # 查看日志
pm2 restart image-hosting # 重启
pm2 stop image-hosting # 停止
pm2 delete image-hosting # 删除
测试接口
测试健康检查接口
curl http://localhost:3000/api/health
如果想直接测试,先开放 3000 端口:
sudo ufw allow 3000/tcp
然后用浏览器访问:http://你的VPS-IP:3000/api/health
配置Nginx反向代理
可选
server {
listen 80;
server_name your-domain.com; # 改为您的域名
client_max_body_size 10M;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
测试配置
sudo nginx -t
重启Nginx
sudo systemctl restart nginx
安全建议
- 修改CORS配置:在
server.js中将origin: '*'改为您的前端域名 - 添加认证:对于生产环境,建议添加API密钥验证
- 限流:使用
express-rate-limit防止滥用 - 定期备份:定期备份
uploads目录
前端配置
部署完成后,在前端的设置面板中输入您的API地址:
https://your-domain.com
压缩方案
cd /var/www/image-hosting-backend
# 安装 sharp 图片处理库
npm install sharp
# 查看安装结果
npm list sharp
替换 server.js
cd /var/www/image-hosting-backend
# 备份旧版本
cp server.js server.js.backup.$(date +%Y%m%d_%H%M%S)
# 下载新版本
wget -O server-s.js https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/server-s.js
# 替换文件
mv server-s.js server.js
# 重启服务
pm2 restart image-hosting
# 查看日志
pm2 logs image-hosting
目录结构
/var/www/image-hosting-backend/
├── uploads/
│ ├── compressed/ # 压缩后的图片(对外访问)
│ │ ├── 950414abc.jpg
│ │ └── 951234xyz.webp
│ └── original/ # 原图(可选保存)
│ ├── orig_950414abc.jpg
│ └── orig_951234xyz.webp
├── server.js
├── package.json
└── file-hash-map.json
压缩配置说明
在 server.js 顶部可以修改配置:
const COMPRESSION_CONFIG = {
quality: 80, // 压缩质量 (1-100,建议 75-85)
maxWidth: 2560, // 最大宽度
maxHeight: 2560, // 最大高度
saveOriginal: false, // 是否保存原图
format: 'auto' // 输出格式: auto, jpeg, webp, png
};
🎯 功能特点
✅ 自动压缩
- 上传时自动压缩图片
- 支持 JPEG, PNG, WebP 格式
- 跳过 SVG 和 GIF(保持原样)
✅ 智能格式转换
auto: 自动选择最优格式- PNG 有透明→保持 PNG
- 其他→转 JPEG(更小)
- 支持强制转 WebP(最佳压缩比)
✅ 尺寸限制
- 超过最大尺寸自动等比缩放
- 不放大小图片
📊 压缩效果对比
| 质量设置 | 文件大小 | 视觉质量 | 推荐场景 |
|---|---|---|---|
| 90-100 | 大 | 极高 | 摄影作品 |
| 75-85 | 中 | 高 | 博客配图(推荐) |
| 60-75 | 小 | 中 | 缩略图 |
| 40-60 | 极小 | 低 | 不推荐 |
💡 推荐配置
博客配图(平衡质量和大小)
quality: 80
maxWidth: 2560
maxHeight: 2560
saveOriginal: false
format: 'auto'
极致压缩(最小体积)
quality: 75
maxWidth: 1920
maxHeight: 1920
saveOriginal: false
format: 'webp' // WebP 格式更小
高质量保存
quality: 90
maxWidth: 4096
maxHeight: 4096
saveOriginal: true // 保留原图
format: 'auto'
其他命令
清空日志
pm2 flush image-hosting
查看图片文件夹
du -sh /var/www/image-hosting-backend/uploads/compressed && \
ls /var/www/image-hosting-backend/uploads/compressed | wc -l
清除图片(慎重)
rm -f /var/www/image-hosting-backend/uploads/compressed/*
rclone同步
安装 rclone
sudo -v ; curl https://rclone.org/install.sh | sudo bash
编辑 cloudflare r2 配置
mkdir -p /root/.config/rclone/
touch /root/.config/rclone/rclone.conf
nano /root/.config/rclone/rclone.conf
配置模板
只需要修改 access_key_id、secret_access_key、endpoint 三个参数
[r2]
type = s3
provider = Cloudflare
access_key_id = 111
secret_access_key = 222
region = auto
endpoint = https://333.r2.cloudflarestorage.com
按 ctrl+x 保存,y 退出
测试是否配置正确,有文件会显示文件,空白就不显示
rclone ls r2:nodeimg # nodeimg是存储桶名称
安装依赖
sudo apt update
sudo apt install rclone inotify-tools
下载同步脚本
记得修改你的存储桶名称,其他不用改
wget -O sync.sh https://raw.githubusercontent.com/woniu336/open_shell/main/nodeimg/sync.sh
说明
# RClone 实时同步脚本
# 功能:监控本地目录变化,立即同步到远程
# 注意:这是单向同步,远程内容会被本地覆盖!
测试同步
chmod +x sync.sh
./sync.sh
然后上传一张图片,查看终端窗口变化,检查远程是否真的同步了。
按 Ctrl+C 停止脚本。
设置开机自启
- 启用 Linger
loginctl enable-linger root
- 安装服务
./sync.sh systemd_setup
- 常用命令
注意:r2是rclone.conf配置文件里的名称,nodeimg是你存储桶的名称
# 停止同步
systemctl --user stop rclone_sync.r2:nodeimg
# 启动同步
systemctl --user start rclone_sync.r2:nodeimg
# 重启同步
systemctl --user restart rclone_sync.r2:nodeimg