开始使用
您需要:
- 拥有 app.yml 访问权限的 Discourse 实例
- AWS 账户
命名策略
出错的地方很多。采用对您(可能还有其他人)有意义的命名约定策略,将有助于故障排除,特别是当您配置多个 Discourse 实例时。
- IAM 用户:your-iam-user
- 策略:s3-discourse-policy-your-iam-user
- 备份存储桶:yourdomain-subdomain-backups
- 上传存储桶:yourdomain-subdomain-uploads
- 分发 CDN:cdn-yourdomain-subdomain 和 s3-yourdomain-subdomain-uploads
可选:配置过程存储桶:a-origin-config-bucket
AWS 配置
除非另有说明,否则请使用 AWS 配置页面中的默认设置。
S3 名称、名称、名称
- Discourse 实例域名:subdomain.yourdomain.tld(包括 www.yourdomain.tld 在内的 subdomain.yourdomain.tld)
- IAM 用户:yourdomain-subdomain(yourdomain-discourse、yourdomain-forum 或在根域名处:yourdomain-tld-www)
- IAM 用户策略:s3-discourse-policy-yourdomain-subdomain
- 上传存储桶:yourdomain-subdomain-uploads 注意:别忘了在 存储桶 > 权限:访问控制列表 (ACL) - 访问控制列表 (ACL) - 授权方 中将“所有人(公共访问)”设置为“读取”。
- 备份存储桶:yourdomain-subdomain-backups
- 分发 CDN:cdn-yourdomain-subdomain 和 s3-yourdomain-subdomain-uploads
- 配置过程存储桶:a-origin-config-bucket
IAM 用户
- 前往 IAM > 用户 > 选择“创建用户”
- IAM > 用户 > 创建用户 > 指定用户详细信息 > 用户详细信息 > 用户名 > 输入名称,例如 your-iam-user > 选择“下一步”
- IAM > 用户 > 创建用户 > 设置权限 > 权限选项 > 选择“直接附加策略” > 选择“创建策略” > 打开创建策略页面(或者,也可以先在“策略”中创建策略,然后在创建用户时在“权限策略”中选择它。)
- IAM > 用户 > 创建用户 > 设置权限 > 权限策略 > 按类型下拉选择器筛选 > 选择“客户托管” > 选择新创建的策略 > 选择“下一步” > 选择“创建用户”
- IAM > 用户 > your-iam-user > 安全凭证 > 访问密钥 > 选择“创建访问密钥”
- IAM > 用户 > your-iam-user > 创建访问密钥 > 访问密钥最佳实践和替代方案 > 选择“其他” > 选择“下一步”
- IAM > 用户 > your-iam-user > 创建访问密钥 > 设置描述标签 > 选择“创建访问密钥”
- IAM > 用户 > your-iam-user > 创建访问密钥 > 检索访问密钥 > 安全保存访问密钥和秘密访问密钥以供 Discourse app.yml 使用 > 选择“完成”
策略
- 使用您的 IAM 用户名和存储桶名称修改 s3-discourse-policy-your-iam-user.txt。
- 前往 IAM > 策略 > 创建策略
- IAM > 策略 > 创建策略 > 指定权限 > 策略编辑器 > 在策略编辑器中选择“JSON” > 从 s3-discourse-policy-your-iam-user.txt 复制策略并粘贴到 JSON 编辑器中(覆盖现有 JSON) > 选择“下一步”
- IAM > 策略 > 创建策略 > 审查并创建 > 策略详细信息 > 策略名称 > 输入策略名称,例如 s3-discourse-policy-your-iam-user > 选择“下一步”
- 前往 IAM 用户:4. IAM > 用户 > 创建用户以继续创建用户过程
Amazon S3 存储桶
创建并配置备份存储桶、上传存储桶以及可选但有用的配置过程存储桶。
创建备份存储桶 yourdomain-subdomain-backups
- 前往 Amazon S3 存储桶 > 选择“创建存储桶”
- Amazon S3 > 存储桶 > 创建存储桶 > 常规配置 > 确认选择“通用用途”
- Amazon S3 > 存储桶 > 创建存储桶 > 常规配置 > 存储桶名称 > 输入备份存储桶名称,例如 yourdomain-subdomain-backups
- Amazon S3 > 存储桶 > 创建存储桶 > 常规配置 > 确认选择“禁用 ACL(推荐)”
- Amazon S3 > 存储桶 > 创建存储桶 > 此存储桶的阻止公共访问设置 > 取消选择“阻止所有公共访问”,然后选择“阻止通过新的公共存储桶或访问点策略授予的公共访问”和“阻止通过任何公共存储桶或访问点策略授予的公共和跨账户访问”
- Amazon S3 > 存储桶 > 创建存储桶 > 此存储桶的阻止公共访问设置 > 关闭阻止所有公共访问可能会导致此存储桶及其中的对象变为公共 > 选择“我确认当前设置可能会导致此存储桶及其中的对象变为公共。”
- Amazon S3 > 存储桶 > 创建存储桶 > 存储桶版本控制 > 存储桶版本控制 > 选择“启用” 信息:启用“生命周期规则”需要存储桶版本控制
- Amazon S3 > 存储桶 > 创建存储桶 > 选择“创建存储桶”
生命周期规则配置
备份保留规则
- Amazon S3 > 存储桶 > 选择新创建的存储桶,例如 yourdomain-subdomain-backups
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 选择“创建生命周期规则”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 生命周期规则名称 > 输入规则名称,例如 backup retention
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 选择规则范围 > 选择“应用于存储桶中的所有对象”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 选择规则范围 > 应用于存储桶中的所有对象 > 选择“我确认此规则将应用于存储桶中的所有对象。”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 生命周期规则操作 > 选择“在存储类之间转换非当前版本的对象”、“使当前版本的对象过期”和“永久删除非当前版本的对象”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 生命周期规则操作 > 转换按请求收费 > 选择“我确认此生命周期规则将产生每次请求的转换费用。”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 在存储类之间转换非当前版本的对象 > 选择存储类转换 > 选择“Glacier 即时检索”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 在存储类之间转换非当前版本的对象 > 对象变为非当前后的天数 > 输入“1”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 使当前版本的对象过期 > 对象创建后的天数 > 输入“7”或 15 或 30 或 ???
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 永久删除非当前版本的对象 > 对象变为非当前后的天数 > 输入“91”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 确认“审查转换和过期操作”正确 > 选择“创建规则”
清理规则
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 选择“创建生命周期规则”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 生命周期规则名称 > 输入规则名称 cleanup
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 选择规则范围 > 选择“应用于存储桶中的所有对象”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 选择规则范围 > 应用于存储桶中的所有对象 > 选择“我确认此规则将应用于存储桶中的所有对象。”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 生命周期规则操作 > 选择“永久删除非当前版本的对象”和“删除过期的对象删除标记或不完整的多部分上传”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 永久删除非当前版本的对象 > 对象变为非当前后的天数 > 输入“92”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 永久删除非当前版本的对象 > 删除过期的对象删除标记或不完整的多部分上传 > 过期的对象删除标记 > 选择“删除过期的对象删除标记”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 永久删除非当前版本的对象 > 删除过期的对象删除标记或不完整的多部分上传 > 不完整的多部分上传 > 选择“删除不完整的多部分上传”
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 永久删除非当前版本的对象 > 删除过期的对象删除标记或不完整的多部分上传 > 不完整的多部分上传 > 删除不完整的多部分上传 > 天数 > 输入“3”或 ???
- Amazon S3 > 存储桶 > yourdomain-subdomain-backups > 管理 > 生命周期配置 > 确认“审查转换和过期操作”正确 > 选择“创建规则”
创建上传存储桶 yourdomain-subdomain-uploads
- 前往 Amazon S3 > 存储桶 > 选择“创建存储桶”
- Amazon S3 > 存储桶 > 创建存储桶 > 常规配置 > 确认选择“通用用途”
- Amazon S3 > 存储桶 > 创建存储桶 > 常规配置 > 存储桶名称 > 输入上传存储桶名称,例如 yourdomain-subdomain-uploads
- Amazon S3 > 存储桶 > 创建存储桶 > 常规配置 > 选择“启用 ACL”
- Amazon S3 > 存储桶 > 创建存储桶 > 此存储桶的阻止公共访问设置 > 取消选择“阻止所有公共访问”,然后选择“阻止通过新的公共存储桶或访问点策略授予的公共访问”和“阻止通过任何公共存储桶或访问点策略授予的公共和跨账户访问”
- Amazon S3 > 存储桶 > 创建存储桶 > 此存储桶的阻止公共访问设置 > 关闭阻止所有公共访问可能会导致此存储桶及其中的对象变为公共 > 选择“我确认当前设置可能会导致此存储桶及其中的对象变为公共。”
- Amazon S3 > 存储桶 > 创建存储桶 > 选择“创建存储桶”
- Amazon S3 > 存储桶 > 存储桶屏幕 > 选择新创建的存储桶,例如 yourdomain-subdomain-uploads
在完成创建分发 #2 后返回执行第 9 步 - Amazon S3 > 存储桶 > yourdomain-subdomain-uploads > 权限 > 存储桶策略 > 选择编辑 > 粘贴来自 创建分发 #2 11. CloudFront > 分发 > 分发 ID > 编辑源 > 源访问控制 > 选择“保存更改”的 JSON
- Amazon S3 > 存储桶 > yourdomain-subdomain-uploads > 权限 > 访问控制列表 (ACL) > 选择编辑 > 所有人(公共访问) > 选择“读取” > 当您向所有人或已验证用户组授权时,世界上的任何人都可以访问此存储桶中的对象。选择“我了解这些更改对我的对象和存储桶的影响。” > 选择“保存更改”
创建配置过程存储桶 a-origin-config-bucket
创建一个在分发 #1 配置过程中使用的存储桶。名称和配置并不重要,因为该存储桶仅作为初始源临时使用,将在配置过程中被删除。
1. 前往 Amazon S3 > 存储桶 > 选择“创建存储桶”
2. Amazon S3 > 存储桶 > 创建存储桶 > 常规配置 > 确认选择“通用用途”
3. Amazon S3 > 存储桶 > 创建存储桶 > 常规配置 > 存储桶名称 > 输入上传存储桶名称,例如 a-origin-config-bucket
4. 浏览配置页面并点击“创建存储桶”
CloudFront 分发
创建两个 AWS S3 CloudFront 分发。一个用于提供网站资源,另一个用于提供上传存储桶资源。
创建分发 #1
分发 #1
DISCOURSE_CDN_URL
分发名称:cdn-yourdomain-subdomain
源:subdomain.yourdomain.tld
分发域名 (Cloudfront URL):AWS-assigned.cloudfront.net
备用域名:discourse-cdn.yourdomain.tld
- 前往 CloudFront > 分发 > 选择“创建”
- CloudFront > 分发 > 创建分发 > 选择计划 > 选择“按量付费” > 选择“下一步”
- CloudFront > 分发 > 创建分发 > 开始 > 分发选项 > 分发名称 > 输入分发名称,例如 cdn-yourdomain-subdomain
- CloudFront > 分发 > 创建分发 > 开始 > 分发选项 > 描述 - 可选 > 输入“cdn-yourdomain-subdomain”(可选,但有助于可见性)
- CloudFront > 分发 > 创建分发 > 开始 > 分发选项 > 分发类型 > 确认选择“单个网站或应用” > 选择“下一步”
- CloudFront > 分发 > 创建分发 > 指定源 > 源类型 > 选择“其他” 通过其可公开解析的 URL 访问任何 AWS 或非 AWS 源。
- CloudFront > 分发 > 创建分发 > 指定源 > 源 > 自定义源 > 输入域名,例如 subdomain.yourdomain.tld
- CloudFront > 分发 > 创建分发 > 指定源 > 设置 > 缓存设置 > 选择“自定义缓存设置”
- CloudFront > 分发 > 创建分发 > 指定源 > 设置 > 缓存设置 > 缓存策略 > 从下拉列表中选择“CachingOptimized” > 选择“下一步”
- CloudFront > 分发 > 创建分发 > 启用安全 > 做出您的选择 - 对于本指南 > 选择“不启用安全保护” > 选择“下一步”
- CloudFront > 分发 > 创建分发 > 审查并创建 > 选择“创建分发”
如果使用品牌化 CDN URL → 第 12 步 - CloudFront > 分发 > 分发 ID > 备用域名 > 选择“添加域名”
- CloudFront > 分发 > 分发 ID > 备用域名 > 添加域名 > 配置域名 > 域名 > 要服务的域名 > 输入 DISCOURSE_CDN_URL,例如 discourse-cdn.yourdomain.tld > 选择“下一步”
未完成:备用域名:discourse-cdn.yourdomain.tld
创建分发 #2
分发 #2
DISCOURSE_S3_CDN_URL
分发名称:s3-yourdomain-subdomain-uploads
源:yourdomain-subdomain-uploads
分发域名 (Cloudfront URL):AWS-assigned.cloudfront.net
备用域名:s3-cdn.yourdomain.tld
- CloudFront > 分发 > 创建分发
- CloudFront > 分发 > 创建分发 > 选择计划 > 选择“按量付费” > 选择“下一步”
- CloudFront > 分发 > 创建分发 > 开始 > 分发选项 > 分发名称 > 输入分发名称,例如 s3-yourdomain-subdomain-uploads
- CloudFront > 分发 > 创建分发 > 开始 > 分发选项 > 描述 - 可选 > 输入“s3-yourdomain-subdomain-uploads”(可选,但有助于可见性)
- CloudFront > 分发 > 创建分发 > 开始 > 分发选项 > 分发类型 > 确认选择“单个网站或应用” > 选择“下一步”
- CloudFront > 分发 > 创建分发 > 指定源 > 源类型 > 确认选择“Amazon S3”
- CloudFront > 分发 > 创建分发 > 指定源 > 源 > S3 源 > 选择“浏览 S3” > 选择上传存储桶“yourdomain-subdomain-uploads” > 选择“选择” > 选择“下一步”
- CloudFront > 分发 > 创建分发 > 启用安全 > 做出您的选择 - 对于本指南 > 选择“不启用安全保护” > 选择“下一步”
- CloudFront > 分发 > 创建分发 > 审查并创建 > 确认“审查并创建”正确 > 选择“创建分发” → 新创建的分发信息页面应在 CloudFront > 分发 > 分发 ID 中打开
- CloudFront > 分发 > 分发 ID > 源 > 选择源 > 选择“编辑”
- CloudFront > 分发 > 分发 ID > 编辑源 > 源访问控制 > ! 您必须使用此策略允许 CloudFront 访问… > 选择“复制策略” > 前往 创建上传存储桶 9. Amazon S3 > 存储桶 > yourdomain-subdomain-uploads > 权限 > 存储桶策略
未完成:备用域名:s3-cdn.yourdomain.tld
Discourse 管理
截至 Discourse 版本: 2025.12.0-latest
在 Discourse 管理 UI 中进行以下更改
备份设置 /admin/backups/settings
- 最大备份数 > 输入要保留在本地的备份数量
- 备份包含上传 > 选择“在计划备份中包含上传。禁用此选项将仅备份数据库。”
S3 设置 /admin/site_settings/category/all_results?filter=S3
- S3 对所有上传使用 CDN URL > 选择“对所有上传到 S3 的文件使用 CDN URL,而不仅仅是图片。”(Discourse 默认未选中)
编辑配置 (app.yml) 无品牌 URL
编辑 app.yml,针对品牌化 URL 或无品牌 Cloudfront URL 进行以下更改。
Discourse 无品牌 URL
此配置适用于无品牌 Cloudfront 分发。您的 DISCOURSE_S3_REGION 可能不同。
DISCOURSE_CDN_URL: https://amazonassigned.cloudfront.net
S3 存储配置(无品牌)
## S3 存储配置
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: us-east-1
DISCOURSE_S3_ACCESS_KEY_ID: 密钥已模糊处理
DISCOURSE_S3_SECRET_ACCESS_KEY: 密钥已模糊处理
DISCOURSE_S3_CDN_URL: https://amazonassigned.cloudfront.net
DISCOURSE_S3_BUCKET: your-bucket-name-uploads
DISCOURSE_S3_BACKUP_BUCKET: your-bucket-name-backups
DISCOURSE_BACKUP_LOCATION: s3
Discourse 品牌化 URL
DNS 配置
如果您更喜欢使用基于 yourdomain.com 的 URL 作为 CDN,则需要进行一些 DNS 更改并调整您的 CDN URL。
提示:别忘了在各自的 CloudFront 分发的“备用域名”中添加 discourse-cdn.yourdomain.com 和 s3-cdn.yourdomain.com 作为域名。
如果您想使用域名品牌化的 CloudFront 分发,请配置 DNS。
DISCOURSE_CDN_URL
现有记录:A discourseinstance.yourdomain.com 实例 IP 注意:这是现有的 Discourse 安装 IP。
新记录: A discourse-cdn-cloudfront.yourdomain.com 实例 IP
新记录: CNAME discourse-cdn.yourdomain.com -> amazonassigned.cloudfront.net
DISCOURSE_S3_CDN_URL
新记录: CNAME s3-cdn-cloudfront.yourdomain.com -> amazonassigned.cloudfront.net
新记录: CNAME s3-cdn.yourdomain.com -> s3-cdn-cloudfront.yourdomain.com
编辑配置 (app.yml) 品牌化 URL
DNS 更改完成后,您可以编辑 app.yml 并进行以下更改。
如果您使用域 CNAME 作为 CloudFront 分发(amazonassigned.cloudfront.net),请更改 DISCOURSE_CDN_URL 和/或 DISCOURSE_S3_CDN_URL。
DISCOURSE_CDN_URL: https://discourse-cdn.yourdomain.com
S3 存储配置(品牌化)
## S3 存储配置
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: us-east-1
DISCOURSE_S3_ACCESS_KEY_ID: 密钥已模糊处理
DISCOURSE_S3_SECRET_ACCESS_KEY: 密钥已模糊处理
DISCOURSE_S3_CDN_URL: https://s3-cdn.yourdomain.com
DISCOURSE_S3_BUCKET: your-bucket-name-uploads
DISCOURSE_S3_BACKUP_BUCKET: your-bucket-name-backups
DISCOURSE_BACKUP_LOCATION: s3
其他配置编辑 (app.yml)
无论您使用哪种方法(品牌化或 Cloudfront URL),都需要下面的 after_assets_precompile 部分,以确保在后续重建期间保持更新。
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
- 您可能还有更多插件
after_assets_precompile:
- exec:
cd: $home
cmd:
- sudo -E -u discourse bundle exec rake s3:upload_assets
- sudo -E -u discourse bundle exec rake s3:expire_missing_assets
使用 ./launcher rebuild app 重建您的实例。
在 ./launcher rebuild app 成功完成后,执行以下 rake 任务。
./launcher enter app
rake posts:rebake
rake uploads:migrate_to_s3
rake posts:rebake_uncooked_posts
rake s3:upload_assets
rake s3:expire_missing_assets
如果 rake 任务顺利完成且无错误,则一切就绪。
在某些站点上,初始重建可能会因与 s3:upload_assets 相关的错误而失败。如果发生这种情况,
检查上传存储桶的“读取”设置。如果设置正确,则
注释掉或删除 after_assets_precompile 部分:
after_assets_precompile:
- exec:
cd: $home
cmd:
- sudo -E -u discourse bundle exec rake s3:upload_assets
- sudo -E -u discourse bundle exec rake s3:expire_missing_assets
然后再次运行 ./launcher rebuild app。接着运行 rake s3:upload_assets 和 rake s3:expire_missing_assets。
如果这两个 rake 任务都顺利完成且无错误,则重新添加或取消注释 after_assets_precompile 部分,再次重建并执行上述所有 rake 任务。
如果任一 rake 任务报错或重建再次失败,则您的 app.yml 和/或 AWS S3 配置和/或 DNS 记录中存在问题。祝您好运!![]()