简单的Web云存储解决方案bewCloud

简介

什么是 bewCloud ?

bewCloud 是一个简化版的自托管云存储解决方案,作为 NextcloudownCloud 的替代品,使用 TypeScriptDeno 构建,基于 Fresh 框架。该平台旨在为用户提供简单易用的文件存储和共享功能。

主要特点

  1. 自托管:用户可以在自己的服务器上安装和运行 bewCloud,确保数据隐私和安全。
  2. 简化的用户界面:提供直观的文件管理和共享界面,易于使用。
  3. Docker 支持:通过 DockerDocker Compose 进行快速部署,简化设置过程。
  4. 灵活的文件共享:支持通过符号链接实现文件共享,灵活性高。
  5. 开源:遵循 AGPL-3.0 许可证,允许用户自由使用和修改代码。

应用场景

  • 个人云存储:用户可以建立自己的云存储服务,管理和备份个人文件。
  • 小型团队协作:适合小型企业或团队使用,便于文件共享和协作。
  • 开发者使用:开发者可以在本地环境中使用 bewCloud 进行测试和开发。

bewCloud 提供了一种轻量级的方式来实现云存储功能,非常适合希望自托管解决方案的用户和小型团队。

安装

在群晖上以 Docker 方式安装。

本文写作时, latest 版本对应为 v1.5.6

采用 docker-compose 安装,

env.txt

将下面的内容保存为 env.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
PORT=8000
BASE_URL="http://192.168.0.197:8562"

POSTGRESQL_HOST="postgresql" # docker container name or external hostname/IP
POSTGRESQL_USER="postgres"
POSTGRESQL_PASSWORD="fake"
POSTGRESQL_DBNAME="bewcloud"
POSTGRESQL_PORT=5432
POSTGRESQL_CAFILE=""

JWT_SECRET="fake"
PASSWORD_SALT="fake"

BREVO_API_KEY="fake"

CONFIG_ALLOW_SIGNUPS="false"
CONFIG_ENABLED_APPS="news,notes,photos,expenses" # dashboard and files cannot be disabled
CONFIG_FILES_ROOT_PATH="data-files"
CONFIG_ENABLE_EMAILS="false" # if true, email verification will be required for signups (using Brevo)
CONFIG_ENABLE_FOREVER_SIGNUP="true" # if true, all signups become active for 100 years
# CONFIG_ALLOWED_COOKIE_DOMAINS="example.com,example.net" # can be set to allow more than the BASE_URL's domain for session cookies
# CONFIG_SKIP_COOKIE_DOMAIN_SECURITY="true" # if true, the cookie domain will not be strictly set and checked against. This skipping slightly reduces security, but is usually necessary for reverse proxies like Cloudflare Tunnel.

# CUSTOM_TITLE=""
# CUSTOM_DESCRIPTION=""
HELP_EMAIL="help@bewcloud.com" # if empty, "need help" sections will be disabled
变量名 (Variable Name) 示例值 (Example Value) 描述 (Description)
网络与基础 URL (Network & Base URL)
PORT 8000 应用程序(后端服务)监听的容器端口号。
BASE_URL "http://192.168.0.197:8562" 应用程序可公开访问的基础 URL。用于生成绝对链接、API 端点、重定向等。请确保这是用户和前端访问后端的正确地址。
数据库 (PostgreSQL)
POSTGRESQL_HOST "postgresql" PostgreSQL 数据库服务器的主机名或 IP 地址。在 Docker 环境中,这通常是 PostgreSQL 服务(容器)的名称。
POSTGRESQL_USER "postgres" 用于连接 PostgreSQL 数据库的用户名。
POSTGRESQL_PASSWORD "fake" 用于连接 PostgreSQL 数据库的密码。 极其重要:请使用强密码替换 "fake",并确保安全。
POSTGRESQL_DBNAME "bewcloud" 要连接的 PostgreSQL 数据库的名称。
POSTGRESQL_PORT 5432 PostgreSQL 数据库服务器监听的端口号。5432 是 PostgreSQL 的默认端口。
POSTGRESQL_CAFILE "" (空字符串) (可选) 指向 CA 证书文件的路径,用于验证数据库服务器的 SSL 证书。如果为空或未设置,可能不进行 SSL 验证或使用系统默认设置。
安全与认证 (Security & Auth)
JWT_SECRET "fake" 用于签发和验证 JSON Web Tokens (JWT) 的密钥。JWT 通常用于用户会话管理和 API 认证。极其重要:必须是一个长而随机的、保密的字符串。请替换 "fake"
PASSWORD_SALT "fake" 用于密码哈希的盐值 (Salt)。在哈希用户密码前添加此盐值,以增加安全性,防止彩虹表攻击。极其重要:必须是一个保密的字符串。请替换 "fake"
邮件服务 (Email Service)
BREVO_API_KEY "fake" Brevo (原 Sendinblue) 服务的 API 密钥。如果 CONFIG_ENABLE_EMAILS 设置为 true,则需要此密钥来发送邮件(如注册验证邮件)。请保密。请替换 "fake"
应用配置 (Application Configuration)
CONFIG_ALLOW_SIGNUPS "false" 是否允许新用户注册账户。"true" 允许注册,"false" 禁止注册。
CONFIG_ENABLED_APPS "news,notes,photos,expenses" 以逗号分隔的、要启用的可选应用程序模块列表。根据注释,dashboardfiles 模块是核心功能,不能被禁用。这里启用了新闻、笔记、照片和费用模块。
CONFIG_FILES_ROOT_PATH "data-files" 用户上传文件存储的根目录路径。这通常是相对于应用程序工作目录或存储卷的路径。
CONFIG_ENABLE_EMAILS "false" 是否启用邮件功能。如果设置为 "true",通常会启用如注册时的邮箱验证等功能,并且需要配置邮件服务(如此处的 BREVO_API_KEY)。
CONFIG_ENABLE_FOREVER_SIGNUP "true" 如果设置为 "true",新注册的用户账户将被设置为一个非常长的有效期(示例中提到的是 100 年),实际上等同于永久有效。
CONFIG_ALLOWED_COOKIE_DOMAINS (可选) 以逗号分隔的域名列表。除了 BASE_URL 的域名外,还允许在这些域名下设置和读取会话 Cookie。用于多域名访问同一个应用实例的场景。
CONFIG_SKIP_COOKIE_DOMAIN_SECURITY (可选) 如果设置为 "true",则放宽对 Cookie 域名的严格检查。这可能在某些反向代理设置(如 Cloudflare Tunnel)下是必需的,但会略微降低安全性。
自定义与帮助 (Customization & Help)
CUSTOM_TITLE (可选) 自定义应用程序的标题,会显示在浏览器标签页或 UI 界面中。如果未设置,将使用默认标题。
CUSTOM_DESCRIPTION (可选) 自定义应用程序的描述信息,可能用于 HTML meta 标签等。
HELP_EMAIL "help@bewcloud.com" 显示在应用程序“需要帮助”或支持相关区域的联系邮箱地址。如果留空,这些帮助部分可能会被禁用或隐藏。

特别需要说明的是:

  1. 理论上只要修改 BASE_URL即可,其中 IP 为群晖主机的 IP,端口为容器对外暴露的本地端口;

  2. 即使禁用了注册 (CONFIG_ALLOW_SIGNUPS=“false”),第一个注册的用户,也会正常工作,并成为管理员;

docker-compose.yml

将下面的内容保存为 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
services:
website:
image: ghcr.io/bewcloud/bewcloud:latest
container_name: bewcloud-web
restart: always
mem_limit: '256m'
ports:
- 8562:8000
volumes:
- ./files:/app/data-files
env_file: env.txt
depends_on:
- postgresql

postgresql:
image: postgres:15
container_name: bewcloud-db
restart: on-failure
ulimits:
memlock:
soft: -1
hard: -1
mem_limit: '256m'
volumes:
- ./data:/var/lib/postgresql/data
# ports:
# - 5432:5432
environment:
- POSTGRES_USER=${POSTGRESQL_USER}
- POSTGRES_PASSWORD=${POSTGRESQL_PASSWORD}
- POSTGRES_DB=${POSTGRESQL_DBNAME}

然后依次执行下面的命令,千万不要遗漏了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 新建文件夹 bewcloud 和 子目录
mkdir -p /volume1/docker/bewcloud/{data,files}

# 进入 bewcloud 目录
cd /volume1/docker/bewcloud

# 解决容器中上传文件时的权限相关问题
chown -R 1993:1993 files

# 将 docker-compose.yml 和 env.txt 放入当前目录

# 一键启动
docker-compose --env-file env.txt up -d

# 初始化/更新数据库(仅在第一次和任何更新时执行)
docker-compose --env-file env.txt run --rm website bash -c "cd /app && make migrate-db"

关键说明

这里有两个关键步骤,需要单独说明一下

目录权限

如果没有执行下面这个命令

1
2
# 解决容器中上传文件时的权限相关问题
chown -R 1993:1993 files

在打开 Files 时会报错,因为 1993DenoDocker 镜像的默认用户 ID

而正常应该是这样的

数据库初始化

别忘了第一次运行需要初始化数据库

1
2
# 初始化/更新数据库(仅在第一次和任何更新时执行)
docker-compose --env-file env.txt run --rm website bash -c "cd /app && make migrate-db"

否则注册用户时会报错

PostgresError: relation "bewcloud_users" does not exist

而初始化之后就不会有问题了

运行

在浏览器中输入 http://群晖IP:8562 就能看到注册界面

第一次,需要点 signup 先注册账号

登录成功之后的主界面

News

支持 feeds 订阅

还是以老苏的博客为例,https://laosu.tech/atom.xml

添加成功后

View articles 查看文章

Files

bewCloud 不止有网页版,还支持 WebDAV

不过 WebDAVRaiDrive 测试并没有成功,从 issues#32 看,作者似乎并未实现完整的 WebDAV 协议,因此可能有些客户端可以,有些则不行

客户端

bewCloud 官方提供桌面和移动客户端

  • 桌面同步客户端:使用 Tauri 通过 Rust 构建,支持 WindowsmacOSLinux 平台

  • 移动版客户端:使用 Flutter 通过 Dart 构建,支持 iOSAndroid

其他

bewCloud 除了前面介绍的新闻(News),和文件(Files)外,还支持照片(Photos)和 笔记(Notes

甚至还包括了预算和费用 (Budgets & Expenses

只是现在的货币还不支持 RMB

参考文档

bewcloud/bewcloud: A simpler alternative to Nextcloud and ownCloud, built with TypeScript and Deno using Fresh. 🦕 🍋
地址:https://github.com/bewcloud/bewcloud

bewcloud/bewcloud-desktop: Desktop Sync client for bewCloud built with Rust using Tauri. 😎 ♾️
地址:https://github.com/bewcloud/bewcloud-desktop

bewcloud/bewcloud-mobile: Mobile client for bewCloud built with Dart using Flutter. 🏎️💨
地址:https://github.com/bewcloud/bewcloud-mobile

bewCloud is a modern and simpler alternative to Nextcloud and ownCloud written in TypeScript
地址:https://bewcloud.com/