Skip to content

Commit

Permalink
fix: can not add env start with GITHUB_
Browse files Browse the repository at this point in the history
* by add `RIN_` prefix,now `GITHUB_CLIENT_ID` is `RIN_GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` is `RIN_GITHUB_CLIENT_SECRET`
  • Loading branch information
OXeu committed Jun 7, 2024
1 parent 6592e4d commit 0db4f71
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 46 deletions.
88 changes: 53 additions & 35 deletions docs/DEPLOY.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,23 @@
项目目前处于开发阶段,文档可能未及时更新或存在描述不清,如遇部署失败请提 [Issue](https://github.com/OXeu/Rin/issues/new?assignees=&labels=help+wanted&projects=&template=need-help.md&title=%5BHelp%5D+%E9%97%AE%E9%A2%98%E6%8F%8F%E8%BF%B0)

## 更新日志

### v0.2.0 2024-06-07 更新
* 新增 `S3_CACHE_FOLDER` 环境变量
* 环境变量加密列表与变量列表更新,仅保留必须加密的环境变量
* 加密变量现在可以通过 Github 直接配置
* Github 变量配置更新,新增必须通过 Github 配置的加密变量(S3 存储,用于 SEO 索引保存)

- 新增 `S3_CACHE_FOLDER` 环境变量
- 环境变量加密列表与变量列表更新,仅保留必须加密的环境变量
- 加密变量现在可以通过 Github 直接配置
- Github 变量配置更新,新增必须通过 Github 配置的加密变量(S3 存储,用于 SEO 索引保存)
- `GITHUB_CLIENT_ID``GITHUB_CLIENT_SECRET`现在添加了前缀`RIN_``RIN_GITHUB_CLIENT_ID`,`RIN_GITHUB_CLIENT_SECRET`),以解决 Github 变量不能以 `GITHUB_` 开头的问题,使用 Cloudflare 面板配置的 `GITHUB_CLIENT_ID``GITHUB_CLIENT_SECRET` 不受影响

## 迁移指南

无特别说明时正常的版本更新直接同步 frok 的仓库即可

### v0.2.0 迁移指南
* 由于引入 SEO 优化导致需要在 Github 中配置 S3 存储的环境变量,因此需要额外在 Github 中配置以下环境变量(明文,添加到 Variables):

- 由于引入 SEO 优化导致需要在 Github 中配置 S3 存储的环境变量,因此需要额外在 Github 中配置以下环境变量(明文,添加到 Variables):

```ini
SEO_BASE_URL=<SEO 基础地址,用于 SEO 索引,默认为 FRONTEND_URL>
SEO_CONTAINS_KEY=<SEO 索引时只索引以 SEO_BASE_URL 开头或包含SEO_CONTAINS_KEY 关键字的链接,默认为空>
Expand All @@ -24,36 +30,44 @@ S3_REGION=<S3 存储桶所在区域,如使用 Cloudflare R2 填写 auto 即可
S3_ENDPOINT=<S3 存储桶接入点地址>
S3_ACCESS_HOST=<S3 存储桶访问地址,末尾无'/'>
```

同时添加以下加密环境变量(加密,添加到 Secrets):

```ini
S3_ACCESS_KEY_ID=<你的S3AccessKeyID>
S3_SECRET_ACCESS_KEY=<你的S3SecretAccessKey>
```
以上环境变量在之前的版本中是通过 Cloudflare 面板配置的,现在需要迁移到 Github 中配置,新版本的部署 Github Action 会自动其上传到 Cloudflare,之后就不再需要在 Cloudflare 面板中配置这些环境变量了

以上环境变量在之前的版本中是通过 Cloudflare 面板配置的,现在需要迁移到 Github 中配置,新版本的部署 Github Action 会自动其上传到 Cloudflare,之后就不再需要在 Cloudflare 面板中配置这些环境变量了

## 其他文档

[环境变量列表](./ENV.md)

>[!TIP]
> [!TIP]
> 下文代码块中若出现形如 <文字> 的内容表示需要根据文字提示替换为自己的内容(`<``>`不要保留),如:
>
> ```
> bun wrangler d1 create <数据库名称>
> ```
> 表示将 <数据库名称> 替换为你喜欢的名称,这里使用 rin替换:
>
> 表示将 <数据库名称> 替换为你喜欢的名称,这里使用 rin 替换:
>
> ```
> bun wrangler d1 create rin
> ```
>
> 这就是最终的命令
打开仓库页面:https://github.com/OXeu/Rin
## Fork
## Fork
点击 Fork 按钮 fork 出一个新仓库
![1000000657](https://github.com/OXeu/Rin/assets/36541432/df3607ca-a8a9-49b8-92ce-6b348afeb13f)
## 前端
登录 [Cloudflare](https://dash.cloudflare.com) 控制台,进入 `Workers 和 Pages` 页面,点击`创建应用程序`,选择 Pages
![1000000658](https://github.com/OXeu/Rin/assets/36541432/35d4f9e3-3af3-4ec8-8060-2a352f4d51ae)
Expand All @@ -62,22 +76,24 @@ S3_SECRET_ACCESS_KEY=<你的S3SecretAccessKey>
![1000000666](https://github.com/OXeu/Rin/assets/36541432/e3b6da75-1a5f-46ec-9820-636cc5238023)
点击 `开始设置` 进入配置页面:
构建设置按照填入以下内容:
```
框架预设:无
构建命令:bun b
构建输出目录:client/dist
路径:<留空>
```
![1000000659](https://github.com/OXeu/Rin/assets/36541432/98fb3021-932b-4bfa-8118-3378f98ff628)
![1000000659](https://github.com/OXeu/Rin/assets/36541432/98fb3021-932b-4bfa-8118-3378f98ff628)
环境变量复制以下内容,根据自身情况修改变量值:
>[!IMPORTANT]
最后两行环境变量 `SKIP_DEPENDENCY_INSTALL` 和 `UNSTABLE_PRE_BUILD` 为配置 Cloudflare 使用 Bun 进行构建的参数,不要修改
> [!IMPORTANT]
> 最后两行环境变量 `SKIP_DEPENDENCY_INSTALL` 和 `UNSTABLE_PRE_BUILD` 为配置 Cloudflare 使用 Bun 进行构建的参数,不要修改
```ini
NAME=Xeu # 昵称,显示在左上角
DESCRIPTION=杂食动物 # 个人描述,显示在左上角昵称下方
Expand All @@ -87,8 +103,8 @@ PAGE_SIZE=5 # 默认分页大小,推荐 5
SKIP_DEPENDENCY_INSTALL=true
UNSTABLE_PRE_BUILD=asdf install bun latest && asdf global bun latest && bun i
```
![1000000660](https://github.com/OXeu/Rin/assets/36541432/0fe9276f-e16f-4b8a-87c5-14de582c9a3a)

![1000000660](https://github.com/OXeu/Rin/assets/36541432/0fe9276f-e16f-4b8a-87c5-14de582c9a3a)

点击`保存并部署`,等待构建部署,不出意外的话约 30s 后即可部署完成:

Expand All @@ -98,8 +114,7 @@ UNSTABLE_PRE_BUILD=asdf install bun latest && asdf global bun latest && bun i

![1000000662](https://github.com/OXeu/Rin/assets/36541432/57c61ad6-c324-48e4-a28f-a1708fd7d41a)


前端就全部部署完成啦🎉
前端就全部部署完成啦 🎉

### 故障排除

Expand Down Expand Up @@ -130,14 +145,14 @@ UNSTABLE_PRE_BUILD=asdf install bun latest && asdf global bun latest && bun i
后端部署比较繁琐,但经过几次的优化部署流程,现在已经大大简化了

### 获取用户 ID 与 API 令牌

参照 https://developers.cloudflare.com/workers/wrangler/ci-cd/ 来配置 Github Actions 所需的 Cloudflare 登录环境变量

ID 随意点击一个自己绑定的域名,进入后在右侧(需要向下滑动一段距离)可以找到`账户ID`

创建 API 令牌:点击右上角`头像` > `我的个人资料` > `API 令牌` > `创建令牌`,模板选择`编辑 Cloudflare Workers`
![1000000663](https://github.com/OXeu/Rin/assets/36541432/3a34a2ad-b993-47fe-965d-31cca4a8e92a)


创建完成后保存令牌

### 配置 Github Action
Expand All @@ -150,6 +165,7 @@ CLOUDFLARE_API_TOKEN=<你的令牌>
```

同时你可以在`Actions secrets and variables``Variables` 中创建以下变量:

```ini
DB_NAME=<数据库名称,默认rin>
WORKER_NAME=<Cloudflare Worker 名称,默认rin-server>
Expand All @@ -163,26 +179,27 @@ S3_REGION=<S3 存储桶所在区域,如使用 Cloudflare R2 填写 auto 即可
S3_ENDPOINT=<S3 存储桶接入点地址>
S3_ACCESS_HOST=<S3 存储桶访问地址,末尾无'/'>
```

> [!TIP]
> 关于 SEO 工作原理与配置请参考 [SEO 文档](./SEO.md)
完成准备工作以后即可在 Github Action 中手动触发一次 Workflow,一切正常的话很快就能部署完成

这样服务端就部署好了,但是目前仍然不能运行,我们还需要配置 Github OAuth用于登录和 S3 存储用于存储图片

这样服务端就部署好了,但是目前仍然不能运行,我们还需要配置 Github OAuth 用于登录和 S3 存储用于存储图片

> [!TIP]
> 在 v0.2.0 版本后,不再需要回到 Cloudflare 面板配置后端域名与一些敏感的环境变量,所有环境变量都可以通过 Github 创建对应的密钥来添加,如果你在更早的版本中部署过,需要将环境变量迁移到 Github 中
> ~~回到 Cloudflare 面板配置后端域名与一些敏感的环境变量~~
>
>
> ~~`设置` > `触发器` > `自定义域` 处可以自定义后端的域名,默认也有分配一个`workers.dev`的域名~~
>
>
> ~~`设置` > `变量` > `环境变量` 处编辑变量,点击添加变量,复制粘贴以下内容至变量名处即可自动添加上所有环境变量,之后再根据自己的具体配置修改变量值:~~
在 v0.2.0 版本后,以下所有环境变量都建议通过在 Github 创建对应的密钥来添加,添加方式与上文添加 `CLOUDFLARE_ACCOUNT_ID``CLOUDFLARE_API_TOKEN` 相同,以下是环境变量列表:
> 在 v0.2.0 版本后,以下所有环境变量都建议通过在 Github 创建对应的密钥来添加,添加方式与上文添加 `CLOUDFLARE_ACCOUNT_ID``CLOUDFLARE_API_TOKEN` 相同,以下是环境变量列表:
```ini
GITHUB_CLIENT_ID=<你的GithubClientID>
GITHUB_CLIENT_SECRET=<你的GithubClientSecret>
RIN_GITHUB_CLIENT_ID=<你的GithubClientID>
RIN_GITHUB_CLIENT_SECRET=<你的GithubClientSecret>
JWT_SECRET=<JWT 认证所需密钥,可为常规格式的任意密码>
S3_ACCESS_KEY_ID=<你的S3AccessKeyID>
S3_SECRET_ACCESS_KEY=<你的S3SecretAccessKey>
Expand All @@ -196,15 +213,12 @@ S3_SECRET_ACCESS_KEY=<你的S3SecretAccessKey>
https://<你的后端地址>/user/github/callback
```

这里附上我的参数
这里附上我的参数
![Github OAuth 配置](https://github.com/OXeu/Rin/assets/36541432/74ab8d16-93ca-4919-beec-4beb7a2003a6)

随后配置环境变量中 OAuth 部分



随后配置环境变量中 OAuth 部分

以下是具体的配置,`GITHUB_CLIENT_ID`填写 Github OAuth App 中的`Client ID`,`GITHUB_CLIENT_SECRET`填写在 Github OAuth App 点击 `Generate a new client secret` 后的 `Client secret`,注意每次创建后只展示一次,后续无法查看,如果不慎丢失重新生成一个新的即可
以下是具体的配置,`RIN_GITHUB_CLIENT_ID`填写 Github OAuth App 中的`Client ID`,`RIN_GITHUB_CLIENT_SECRET`填写在 Github OAuth App 点击 `Generate a new client secret` 后的 `Client secret`,注意每次创建后只展示一次,后续无法查看,如果不慎丢失重新生成一个新的即可

## 创建 R2 桶

Expand All @@ -213,25 +227,29 @@ https://<你的后端地址>/user/github/callback
Cloudflare 面板中点击 `R2` > `创建存储桶`,填写名称,选择距离自己近的位置:
![1000000665](https://github.com/OXeu/Rin/assets/36541432/17c5ad7b-8a3a-49b2-845a-8d043484aa63)


创建存储桶之后进入存储桶详情页 > `设置`,复制 S3 API 地址,去除末尾的存储桶名称后填入 `S3_ENDPOINT`,如:

```ini
S3_BUCKET=image # 桶名称
S3_REGION=auto # 地区 auto 不用修改
S3_ENDPOINT=https://8879900e5e1219fb745c9f69b086565a.r2.cloudflarestorage.com
```

然后在`公开访问`处绑定一个域名用于访问资源,绑定的域名对应于`S3_ACCESS_HOST`环境变量:

```ini
S3_ACCESS_HOST=https://image.xeu.life
```

然后创建一个 API 令牌用于访问存储桶,可参考 https://developers.cloudflare.com/r2/api/s3/tokens/ ,这里不再赘述,拿到 ID 和 TOKEN 对应于`S3_ACCESS_KEY_ID``S3_SECRET_ACCESS_KEY` 变量,填入 Workers 的环境变量中

至此后端就已经部署完成了,记得将前端的 API_URL 修改为后端的地址,与此同时,如果你需要 WebHook 通知的话,还可在后端配置环境变量`WEBHOOK_URL`为你的 Webhook 地址,在新增评论时会像目标 URL 发送一条 POST 消息,消息格式为:

```json
{
"content": "消息内容"
}
```

>[!TIP]
在所有环境变量调试完毕后可点击加密按钮加密环境变量(只保留FRONTEND_URL和S3_FOLDER),这样下次部署时加密的环境变量就不会覆盖/删除了
> [!TIP]
> 在所有环境变量调试完毕后可点击加密按钮加密环境变量(只保留 FRONTEND_URL 和 S3_FOLDER),这样下次部署时加密的环境变量就不会覆盖/删除了
4 changes: 2 additions & 2 deletions docs/ENV.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@
| 名称 | 描述 | 示例值 |
| -------------------- | --------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| GITHUB_CLIENT_ID | Github OAuth 的客户端 ID | Ux66poMrKi1k11M1Q1b2 |
| GITHUB_CLIENT_SECRET | Github OAuth 的客户端密钥 | 1234567890abcdef1234567890abcdef12345678 |
| RIN_GITHUB_CLIENT_ID | Github OAuth 的客户端 ID | Ux66poMrKi1k11M1Q1b2 |
| RIN_GITHUB_CLIENT_SECRET | Github OAuth 的客户端密钥 | 1234567890abcdef1234567890abcdef12345678 |
| JWT_SECRET | JWT 认证所需密钥,可为常规格式的任意密码 | J0sT%Ch@nge#Me1 |
| S3_ACCESS_KEY_ID | S3 存储桶访问所需的 KEY ID,使用 Cloudflare R2 时为拥有 R2 编辑权限的 API 令牌 ID | 1234567890abcdef1234567890abcd |
| S3_SECRET_ACCESS_KEY | S3 存储桶访问所需的 Secret,使用 Cloudflare R2 时为拥有 R2 编辑权限的 API 令牌 | 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef |
8 changes: 4 additions & 4 deletions scripts/migrator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ const S3_REGION = renv("S3_REGION")
const accessKeyId = env("S3_ACCESS_KEY_ID")
const secretAccessKey = env("S3_SECRET_ACCESS_KEY")
const jwtSecret = env("JWT_SECRET")
const githubClientId = env("GITHUB_CLIENT_ID")
const githubClientSecret = env("GITHUB_CLIENT_SECRET")
const githubClientId = env("RIN_GITHUB_CLIENT_ID")
const githubClientSecret = env("RIN_GITHUB_CLIENT_SECRET")

Bun.write('wrangler.toml', stripIndent(`
#:schema node_modules/wrangler/config-schema.json
Expand Down Expand Up @@ -119,8 +119,8 @@ async function putSecret(name: string, value?: string) {

await putSecret('S3_ACCESS_KEY_ID', accessKeyId)
await putSecret('S3_SECRET_ACCESS_KEY', secretAccessKey)
await putSecret('GITHUB_CLIENT_ID', githubClientId)
await putSecret('GITHUB_CLIENT_SECRET', githubClientSecret)
await putSecret('RIN_GITHUB_CLIENT_ID', githubClientId)
await putSecret('RIN_GITHUB_CLIENT_SECRET', githubClientSecret)
await putSecret('JWT_SECRET', jwtSecret)

console.log(`Put Done.`)
Expand Down
4 changes: 2 additions & 2 deletions server/.env.test
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
NODE_ENV=TEST
DB_PATH=test.db
GITHUB_CLIENT_ID=YourGithubClientID
GITHUB_CLIENT_SECRET=YourGithubClientSecret
RIN_GITHUB_CLIENT_ID=YourGithubClientID
RIN_GITHUB_CLIENT_SECRET=YourGithubClientSecret
JWT_SECRET=YourJWTSecret
FRONTEND_URL=http://localhost:5173
S3_BUCKET=YourBucketName
Expand Down
2 changes: 2 additions & 0 deletions server/src/db/db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import { drizzle } from 'drizzle-orm/d1';

export interface Env {
DB: D1Database;
RIN_GITHUB_CLIENT_ID: string;
RIN_GITHUB_CLIENT_SECRET: string;
GITHUB_CLIENT_ID: string;
GITHUB_CLIENT_SECRET: string;
JWT_SECRET: string;
Expand Down
6 changes: 3 additions & 3 deletions server/src/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ import jwt from "./utils/jwt";

const anyUser = async (db: DB) => (await db.query.users.findMany())?.length > 0
export const setup = (db: DB, env: Env) => {
let gh_client_id = env.GITHUB_CLIENT_ID;
let gh_client_secret = env.GITHUB_CLIENT_SECRET;
let gh_client_id = env.RIN_GITHUB_CLIENT_ID || env.GITHUB_CLIENT_ID;
let gh_client_secret = env.RIN_GITHUB_CLIENT_SECRET || env.GITHUB_CLIENT_SECRET;
let jwt_secret = env.JWT_SECRET;

if (!gh_client_id || !gh_client_secret) {
throw new Error('Please set GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET');
throw new Error('Please set RIN_GITHUB_CLIENT_ID and RIN_GITHUB_CLIENT_SECRET');
}
if (!jwt_secret) {
throw new Error('Please set JWT_SECRET');
Expand Down

0 comments on commit 0db4f71

Please sign in to comment.