原作者:Angela
这是一个单页 Web 应用(banana.html + assets/)+ 零依赖 Node.js 后端(server/),用于在 VPS 上实现:
- 用户注册/登录(Cookie 会话)
- Admin 管理员权限(首个注册用户默认为 Admin;也可用环境变量指定)
- 图片按用户落盘:
uploads/(用户上传)、generated/(模型生成/拉取) - 收藏(预设/对话/合集)独立存储且包含图片(服务端落盘,不随历史记录清理)
- 云图片库:上传/生成图片分库浏览(侧边栏「用户图库」或顶部按钮)
- 云图片库容量:默认每个用户 1GiB(上传+生成合计),Admin 不限;云图片库弹窗/侧边栏会显示用量
v5.0:云图片库支持管理(删除单张/清空当前/清空全部)、缩略图+懒加载、打开原图预加载相邻 2 张、用户注册登录与 Admin 权限、容量/配额显示v4.9:基础 UI/交互增强与 bug 修复
banana.html:前端入口assets/:前端静态资源(styles.css、app.js)server/:Node.js 后端data/:运行时数据目录(默认会自动创建,已在.gitignore中忽略)data/users/<username>/uploads/data/users/<username>/generated/data/users/<username>/favorites/data/users/<username>/history/
- “收藏”(预设/对话/合集):永久保存,包含图片快照(不随历史清理)
- 已移除“未收藏聊天记录”的云端同步:聊天记录仅保留在当前运行会话中;需要跨设备保留请使用“保存对话到库”(收藏)
- 入口:侧边栏「用户图库」或顶部「云图片库」按钮
- 分库:
上传库 (uploads)/生成库 (generated) - 列表展示:默认显示 WebP 缩略图(点击才打开原图)
- 预加载:打开原图会自动预加载相邻 2 张(提升翻页流畅度)
- 管理:支持删除单张图片、清空当前库、清空全部(仅影响你自己的云图库,不影响已收藏内容)
- 缓存:图片通过
/files/...提供,支持ETag/304,浏览器会自动复用缓存 - 配额:普通用户
1GiB(上传+生成合计),Admin 不限;超出会提示“图库容量不足”
要求:Node.js 18+(建议 20 LTS)
- 启动后端
npm start默认监听:http://0.0.0.0:3000
- 打开页面
- 浏览器访问:
http://127.0.0.1:3000/(由后端托管banana.html和assets/)
参考:server/.env.example
PORT:服务监听端口(默认3000)NODE_ENV:production时会给 Cookie 加Secure(HTTPS 部署建议设置)BANANA_SECRET:签名密钥(不填会自动生成并写入data/secret.txt)BANANA_ADMIN_USER/BANANA_ADMIN_PASS:启动时确保该管理员账号存在(可选)
下面以「域名 + Nginx + HTTPS + systemd」为推荐部署方式。
- 购买 VPS(Ubuntu 22.04/24.04)
- 域名解析 A 记录指向 VPS 公网 IP
- 开放端口:
22、80、443
sudo apt update
sudo apt install -y nginx安装 Node.js(推荐 NodeSource 或系统包;任选其一):
方式 A:NodeSource(推荐 20 LTS)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs验证:
node -v
npm -v任选一种方式:
git clone(如果你的仓库可访问)- 或使用
scp/rsync上传整个项目目录
示例(上传到 /opt/banana):
sudo mkdir -p /opt/banana
sudo chown -R $USER:$USER /opt/banana把本地项目内容放到 /opt/banana。
cd /opt/banana
npm install --omit=dev创建环境变量文件(可选):
cp .env.example .env
nano .env至少建议设置:
NODE_ENV=productionBANANA_ADMIN_USER=admin、BANANA_ADMIN_PASS=一个强密码
说明:首个注册用户默认会成为 Admin;如果你希望固定管理员账号,使用上述环境变量更可控。
创建服务文件:
sudo nano /etc/systemd/system/banana.service填入(按需修改路径/端口/环境变量):
[Unit]
Description=Banana Web App
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/banana
ExecStart=/usr/bin/node /opt/banana/server/index.js
Restart=always
RestartSec=2
Environment=PORT=3000
Environment=NODE_ENV=production
Environment=BANANA_ADMIN_USER=admin
Environment=BANANA_ADMIN_PASS=CHANGE_ME_STRONG_PASSWORD
[Install]
WantedBy=multi-user.target启动并设置开机自启:
sudo systemctl daemon-reload
sudo systemctl enable --now banana
sudo systemctl status banana --no-pager查看日志:
sudo journalctl -u banana -f创建站点配置:
sudo nano /etc/nginx/sites-available/banana.conf示例(先用 80,后续再上 HTTPS):
server {
listen 80;
server_name your-domain.com;
client_max_body_size 50m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}启用并测试:
sudo ln -s /etc/nginx/sites-available/banana.conf /etc/nginx/sites-enabled/banana.conf
sudo nginx -t
sudo systemctl reload nginx现在可访问:http://your-domain.com
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com完成后,建议在 banana.service 里保持 NODE_ENV=production(使 Cookie 带 Secure)。
data/是核心数据目录(用户、图片、收藏、历史),请定期备份- 普通用户历史记录会自动裁剪到 50 条;收藏不会自动删除
- 若磁盘吃紧:
- 优先清理
data/users/*/generated/中不需要的文件(收藏会有自己的快照目录) - 或在业务层加“自动过期生成图”的策略(可后续继续优化)
- 优先清理
- 必须使用 HTTPS 部署(否则 Cookie 在公网环境不安全)
- 管理员密码务必设置强密码
- 不要把
data/暴露为静态目录;本项目通过/files/...且要求登录后访问
不推荐。此项目的用户系统、图片落盘、收藏/历史限制都依赖 server/ 后端。
- 默认:第一个注册用户自动成为 Admin
- 推荐:在服务环境变量中设置
BANANA_ADMIN_USER/BANANA_ADMIN_PASS
建议将“项目目录”指向仓库根目录(即包含 package.json 的目录),这样宝塔可以直接执行:
- 安装命令:
npm install --omit=dev - 启动命令:
npm start
把项目放到例如:/www/wwwroot/getbanana
目录里应包含:
package.jsonserver/index.jsbanana.htmlassets/
在宝塔 Node 项目里配置环境变量(或在项目目录创建 server/.env,注意不要提交到 Git):
PORT=3000(按你在宝塔里配置的端口/反代端口调整)NODE_ENV=production(HTTPS 下推荐)BANANA_ADMIN_USER=admin、BANANA_ADMIN_PASS=强密码(推荐)
- 项目目录:
/www/wwwroot/getbanana - 启动文件/启动命令:优先用
npm start(等价于node server/index.js) - 端口:使用环境变量
PORT控制
在宝塔里给域名配置反向代理到:
http://127.0.0.1:3000(示例)
并把上传大小限制调大(因为会上传/保存图片),例如 50MB。