配置Github

打开项目的Github,Fork项目。

点击 settings - Secrets and variables - Actions,准备添加 Repository secrets,接下来我们一共要添加三个secrets。

配置Cloudflare ID

打开Cloudflare,在浏览器地址栏中复制你的account id
image.png
回到github页面,点击New repository secret,名称写CLOUDFLARE_ACCOUNT_ID,值就写刚才复制的id。

配置Cloudflare API

打开Cloudflare API,选择编辑Worker的模板,然后给它再添加D1的编辑权限,再创建api令牌,回到github页面添加为CLOUDFLARE_API_TOKEN。
image.png

添加D1数据库

去Cloudflare中创建一个D1数据库,并复制他的id
image.png
回到github,添加为D1_DATABASE_ID。

至此在github上的配置就完毕了,点击上方的Actions选项卡,选到Build工作流点运行即可。

建表

打开刚才创建的数据库,点Explore Data,然后在Query窗口中分别粘贴并运行以下sql建表语句(定义在sql/schema.sql中),一次只执行一条:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY NOT NULL,
name TEXT,
avatar_color TEXT,
email TEXT NOT NULL UNIQUE,
email_verified BOOLEAN NOT NULL DEFAULT 0,
master_password_hash TEXT NOT NULL,
master_password_hint TEXT,
password_salt TEXT, -- Salt for server-side PBKDF2 hashing (NULL for legacy users pending migration)
key TEXT NOT NULL, -- The encrypted symmetric key
private_key TEXT NOT NULL, -- encrypted asymmetric private_key
public_key TEXT NOT NULL, -- asymmetric public_key
kdf_type INTEGER NOT NULL DEFAULT 0, -- 0 for PBKDF2, 1 for Argon2id
kdf_iterations INTEGER NOT NULL DEFAULT 600000,
kdf_memory INTEGER, -- Argon2 memory parameter in MB (15-1024), NULL for PBKDF2
kdf_parallelism INTEGER, -- Argon2 parallelism parameter (1-16), NULL for PBKDF2
security_stamp TEXT,
totp_recover TEXT, -- Recovery code for 2FA
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE IF NOT EXISTS ciphers (
id TEXT PRIMARY KEY NOT NULL,
user_id TEXT,
organization_id TEXT,
type INTEGER NOT NULL,
data TEXT NOT NULL, -- JSON blob of all encrypted fields (name, notes, login, etc.)
favorite BOOLEAN NOT NULL DEFAULT 0,
folder_id TEXT,
deleted_at TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (folder_id) REFERENCES folders(id) ON DELETE SET NULL
);
1
2
3
4
5
6
7
8
CREATE TABLE IF NOT EXISTS folders (
id TEXT PRIMARY KEY NOT NULL,
user_id TEXT NOT NULL,
name TEXT NOT NULL, -- Encrypted folder name
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE IF NOT EXISTS attachments (
id TEXT PRIMARY KEY NOT NULL,
cipher_id TEXT NOT NULL,
file_name TEXT NOT NULL,
file_size INTEGER NOT NULL,
akey TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
organization_id TEXT,
FOREIGN KEY (cipher_id) REFERENCES ciphers(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_attachments_cipher ON attachments(cipher_id);
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE IF NOT EXISTS attachments_pending (
id TEXT PRIMARY KEY NOT NULL,
cipher_id TEXT NOT NULL,
file_name TEXT NOT NULL,
file_size INTEGER NOT NULL,
akey TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
organization_id TEXT,
FOREIGN KEY (cipher_id) REFERENCES ciphers(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_attachments_pending_cipher ON attachments_pending(cipher_id);
CREATE INDEX IF NOT EXISTS idx_attachments_pending_created_at ON attachments_pending(created_at);
1
2
3
4
5
6
7
8
9
10
CREATE TABLE IF NOT EXISTS twofactor (
uuid TEXT PRIMARY KEY NOT NULL,
user_uuid TEXT NOT NULL,
atype INTEGER NOT NULL,
enabled INTEGER NOT NULL DEFAULT 1,
data TEXT NOT NULL, -- JSON data specific to the 2FA type (e.g., TOTP secret)
last_used INTEGER NOT NULL DEFAULT 0, -- Unix timestamp or TOTP time step
FOREIGN KEY (user_uuid) REFERENCES users(id) ON DELETE CASCADE,
UNIQUE(user_uuid, atype)
);

配置环境变量

当github的Action执行完毕后,你就能在CF的Workers中找到刚才创建的 warden-worker了,进入这个Worker的设置页面,在变量和机密栏添加以下三个密钥:

名称 说明
ALLOWED_EMAILS 允许注册的完整邮箱,用,分隔
JWT_SECRET 随机长字符串
JWT_REFRESH_SECRET 随机长字符串

可选环境变量

  • IMPORT_BATCH_SIZE:用于控制导入密码库时,每次批操作的数据条数,默认为30,设为0代表一次批操作导入所有数据(不推荐);如果你需要导入的库特别大,可以适当调大这个值。
  • TRASH_AUTO_DELETE_DAYS:配置回收站中的项目多少天后会被清理,默认为30,设为0代表永不清理。
  • DISABLE_USER_REGISTRATION:用于控制是否表明服务器不支持注册,默认为true,设为false可以让客户端显示注册按钮;该选项不影响实际注册功能。
  • AUTHENTICATOR_DISABLE_TIME_DRIFT:控制是否允许TOTP的时间±1偏移,默认为true。
  • ATTACHMENT_MAX_BYTES:单个附件的大小限制,单位字节,默认不限制,填104857600则代表100MB。
  • ATTACHMENT_TOTAL_LIMIT_KB:单个用户的总附件大小限制,单位KB,默认不限制,填1048576代表1GB。
  • ATTACHMENT_TTL_SECS:附件的上传下载链接的有效时间,默认五分钟。

然后在域和路由中添加一个路由,区域选择你的域名,路由写你分给这个Worker的子域名 + /(如bitwarden.example.com/)。

最后别忘记去给这个子域名添加一条dns记录。
如果你想优选IP,那就不开小黄云,把它CNAME到一个优选过的域名。
要是不想优选,那就打开小黄云,目标随便填。