# 配置 AWS 的 Amazon S3 用于存储和 Cloudfront 用于 CDN

**URL:** <https://meta.discourse.org/t/configuring-awss-amazon-s3-for-storage-and-cloudfront-for-cdns/392369>\
**Category:** Sysadmins\
**Tags:** cdn, s3\
**Created:** [2025年十二月30日 03:58 UTC](https://meta.discourse.org/t/configuring-awss-amazon-s3-for-storage-and-cloudfront-for-cdns/392369 "2025-12-30T03:58:29Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![philh](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/philh/32/532740_2.png) [@philh](https://meta.discourse.org/u/philh)\
**Post date:** [2025年十二月30日 03:58 UTC](https://meta.discourse.org/t/configuring-awss-amazon-s3-for-storage-and-cloudfront-for-cdns/392369/1 "2025-12-30T03:58:30Z")

</div>

## [开始使用](#heading--getting-started)

您需要：

1. 拥有 app.yml 访问权限的 Discourse 实例
2. AWS 账户

## [命名策略](#naming-strategy)

出错的地方很多。采用对您（可能还有其他人）有意义的命名约定策略，将有助于故障排除，特别是当您配置多个 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-configuration)

除非另有说明，否则请使用 AWS 配置页面中的默认设置。

## [S3 名称、名称、名称](#s3-names)

- 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-users)

1. 前往 IAM \> 用户 \> 选择“[创建用户](https://us-east-1.console.aws.amazon.com/iam/home?region=us-east-1#/users/create)”
2. IAM \> 用户 \> 创建用户 \> 指定用户详细信息 \> 用户详细信息 \> 用户名 \> 输入名称，例如 your-iam-user \> 选择“下一步”
3. IAM \> 用户 \> 创建用户 \> 设置权限 \> 权限选项 \> 选择“直接附加策略” \> 选择“创建策略” \> 打开创建策略页面（或者，也可以先在“策略”中创建策略，然后在创建用户时在“权限策略”中选择它。）
4. IAM \> 用户 \> 创建用户 \> 设置权限 \> 权限策略 \> 按类型下拉选择器筛选 \> 选择“客户托管” \> 选择新创建的策略 \> 选择“下一步” \> 选择“创建用户”
5. IAM \> 用户 \> your-iam-user \> 安全凭证 \> 访问密钥 \> 选择“创建访问密钥”
6. IAM \> 用户 \> your-iam-user \> 创建访问密钥 \> 访问密钥最佳实践和替代方案 \> 选择“其他” \> 选择“下一步”
7. IAM \> 用户 \> your-iam-user \> 创建访问密钥 \> 设置描述标签 \> 选择“创建访问密钥”
8. IAM \> 用户 \> your-iam-user \> 创建访问密钥 \> 检索访问密钥 \> 安全保存访问密钥和秘密访问密钥以供 Discourse app.yml 使用 \> 选择“完成”

## [策略](#policies)

1. 使用您的 IAM 用户名和存储桶名称修改 [s3-discourse-policy-your-iam-user.txt](https://meta.discourse.org/uploads/short-url/QbbJlSJfCOCxNO1tKn6L9tNlrN.txt)。
2. 前往 IAM \> 策略 \> [创建策略](https://us-east-1.console.aws.amazon.com/iam/home?region=us-east-1#/policies/create)
3. IAM \> 策略 \> 创建策略 \> 指定权限 \> 策略编辑器 \> 在策略编辑器中选择“JSON” \> 从 s3-discourse-policy-your-iam-user.txt 复制策略并粘贴到 JSON 编辑器中（覆盖现有 JSON） \> 选择“下一步”
4. IAM \> 策略 \> 创建策略 \> 审查并创建 \> 策略详细信息 \> 策略名称 \> 输入策略名称，例如 s3-discourse-policy-your-iam-user \> 选择“下一步”
5. 前往 IAM 用户：4. IAM \> 用户 \> 创建用户以继续创建用户过程

## [Amazon S3 存储桶](#s3-buckets)

创建并配置备份存储桶、上传存储桶以及可选但有用的配置过程存储桶。

### [创建备份存储桶](#create-backups-bucket) `yourdomain-subdomain-backups`

1. 前往 Amazon S3 [存储桶](https://us-east-1.console.aws.amazon.com/s3/buckets?region=us-east-1) \> 选择“[创建存储桶](https://us-east-1.console.aws.amazon.com/s3/bucket/create?region=us-east-1)”
2. Amazon S3 \> 存储桶 \> 创建存储桶 \> 常规配置 \> 确认选择“通用用途”
3. Amazon S3 \> 存储桶 \> 创建存储桶 \> 常规配置 \> 存储桶名称 \> 输入备份存储桶名称，例如 yourdomain-subdomain-backups
4. Amazon S3 \> 存储桶 \> 创建存储桶 \> 常规配置 \> 确认选择“禁用 ACL（推荐）”
5. Amazon S3 \> 存储桶 \> 创建存储桶 \> 此存储桶的阻止公共访问设置 \> 取消选择“阻止所有公共访问”，然后选择“阻止通过新的公共存储桶或访问点策略授予的公共访问”和“阻止通过任何公共存储桶或访问点策略授予的公共和跨账户访问”
6. Amazon S3 \> 存储桶 \> 创建存储桶 \> 此存储桶的阻止公共访问设置 \> 关闭阻止所有公共访问可能会导致此存储桶及其中的对象变为公共 \> 选择“我确认当前设置可能会导致此存储桶及其中的对象变为公共。”
7. Amazon S3 \> 存储桶 \> 创建存储桶 \> 存储桶版本控制 \> 存储桶版本控制 \> 选择“启用” **信息：启用“生命周期规则”需要存储桶版本控制**
8. Amazon S3 \> 存储桶 \> 创建存储桶 \> 选择“创建存储桶”

### [生命周期规则配置](#lifecycle-rules-config)

**备份保留规则**

1. Amazon S3 \> 存储桶 \> 选择新创建的存储桶，例如 yourdomain-subdomain-backups
2. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 选择“创建生命周期规则”
3. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 生命周期规则名称 \> 输入规则名称，例如 backup retention
4. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 选择规则范围 \> 选择“应用于存储桶中的所有对象”
5. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 选择规则范围 \> 应用于存储桶中的所有对象 \> 选择“我确认此规则将应用于存储桶中的所有对象。”
6. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 生命周期规则操作 \> 选择“在存储类之间转换非当前版本的对象”、“使当前版本的对象过期”和“永久删除非当前版本的对象”
7. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 生命周期规则操作 \> 转换按请求收费 \> 选择“我确认此生命周期规则将产生每次请求的转换费用。”
8. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 在存储类之间转换非当前版本的对象 \> 选择存储类转换 \> 选择“Glacier 即时检索”
9. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 在存储类之间转换非当前版本的对象 \> 对象变为非当前后的天数 \> 输入“1”
10. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 使当前版本的对象过期 \> 对象创建后的天数 \> 输入“7”或 15 或 30 或 ???
11. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 永久删除非当前版本的对象 \> 对象变为非当前后的天数 \> 输入“91”
12. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 确认“审查转换和过期操作”正确 \> 选择“创建规则”

**清理规则**

1. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 选择“创建生命周期规则”
2. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 生命周期规则名称 \> 输入规则名称 cleanup
3. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 选择规则范围 \> 选择“应用于存储桶中的所有对象”
4. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 选择规则范围 \> 应用于存储桶中的所有对象 \> 选择“我确认此规则将应用于存储桶中的所有对象。”
5. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 生命周期规则操作 \> 选择“永久删除非当前版本的对象”和“删除过期的对象删除标记或不完整的多部分上传”
6. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 永久删除非当前版本的对象 \> 对象变为非当前后的天数 \> 输入“92”
7. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 永久删除非当前版本的对象 \> 删除过期的对象删除标记或不完整的多部分上传 \> 过期的对象删除标记 \> 选择“删除过期的对象删除标记”
8. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 永久删除非当前版本的对象 \> 删除过期的对象删除标记或不完整的多部分上传 \> 不完整的多部分上传 \> 选择“删除不完整的多部分上传”
9. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 永久删除非当前版本的对象 \> 删除过期的对象删除标记或不完整的多部分上传 \> 不完整的多部分上传 \> 删除不完整的多部分上传 \> 天数 \> 输入“3”或 ???
10. Amazon S3 \> 存储桶 \> yourdomain-subdomain-backups \> 管理 \> 生命周期配置 \> 确认“审查转换和过期操作”正确 \> 选择“创建规则”

### [创建上传存储桶](#create-uploads-bucket) `yourdomain-subdomain-uploads`

1. 前往 Amazon S3 \> [存储桶](https://us-east-1.console.aws.amazon.com/s3/buckets?region=us-east-1) \> 选择“[创建存储桶](https://us-east-1.console.aws.amazon.com/s3/bucket/create?region=us-east-1)”
2. Amazon S3 \> 存储桶 \> 创建存储桶 \> 常规配置 \> 确认选择“通用用途”
3. Amazon S3 \> 存储桶 \> 创建存储桶 \> 常规配置 \> 存储桶名称 \> 输入上传存储桶名称，例如 yourdomain-subdomain-uploads
4. Amazon S3 \> 存储桶 \> 创建存储桶 \> 常规配置 \> 选择“启用 ACL”
5. Amazon S3 \> 存储桶 \> 创建存储桶 \> 此存储桶的阻止公共访问设置 \> 取消选择“阻止所有公共访问”，然后选择“阻止通过新的公共存储桶或访问点策略授予的公共访问”和“阻止通过任何公共存储桶或访问点策略授予的公共和跨账户访问”
6. Amazon S3 \> 存储桶 \> 创建存储桶 \> 此存储桶的阻止公共访问设置 \> 关闭阻止所有公共访问可能会导致此存储桶及其中的对象变为公共 \> 选择“我确认当前设置可能会导致此存储桶及其中的对象变为公共。”
7. Amazon S3 \> 存储桶 \> 创建存储桶 \> 选择“创建存储桶”
8. Amazon S3 \> 存储桶 \> 存储桶屏幕 \> 选择新创建的存储桶，例如 yourdomain-subdomain-uploads  
**在完成创建分发 #2 后返回执行第 9 步**
9. Amazon S3 \> 存储桶 \> yourdomain-subdomain-uploads \> 权限 \> 存储桶策略 \> 选择编辑 \> 粘贴来自 [创建分发 #2](#create-distribution-#2) 11. CloudFront \> 分发 \> 分发 ID \> 编辑源 \> 源访问控制 \> 选择“保存更改”的 JSON
10. Amazon S3 \> 存储桶 \> yourdomain-subdomain-uploads \> 权限 \> 访问控制列表 (ACL) \> 选择编辑 \> 所有人（公共访问） \> 选择“读取” \> 当您向所有人或已验证用户组授权时，世界上的任何人都可以访问此存储桶中的对象。选择“我了解这些更改对我的对象和存储桶的影响。” \> 选择“保存更改”

[创建配置过程存储桶](#create-config-process-bucket) `a-origin-config-bucket`  
创建一个在分发 #1 配置过程中使用的存储桶。名称和配置并不重要，因为该存储桶仅作为初始源临时使用，将在配置过程中被删除。  
1. 前往 Amazon S3 \> [存储桶](https://us-east-1.console.aws.amazon.com/s3/buckets?region=us-east-1) \> 选择“[创建存储桶](https://us-east-%5Bs%5D1.console.aws.amazon.com/s3/bucket/create?region=us-east-1)”  
2. Amazon S3 \> 存储桶 \> 创建存储桶 \> 常规配置 \> 确认选择“通用用途”  
3. Amazon S3 \> 存储桶 \> 创建存储桶 \> 常规配置 \> 存储桶名称 \> 输入上传存储桶名称，例如 a-origin-config-bucket  
4. 浏览配置页面并点击“创建存储桶”

## [CloudFront 分发](#cloudFront-distributions)

创建两个 AWS S3 CloudFront 分发。一个用于提供网站资源，另一个用于提供上传存储桶资源。

### [创建分发 #1](#create-distribution-#1)

```plaintext
  分发 #1
    DISCOURSE_CDN_URL
      分发名称：cdn-yourdomain-subdomain
      源：subdomain.yourdomain.tld
      分发域名 (Cloudfront URL)：AWS-assigned.cloudfront.net
      备用域名：discourse-cdn.yourdomain.tld

```

1. 前往 CloudFront \> [分发](https://us-east-1.console.aws.amazon.com/cloudfront/v4/home?region=us-east-1#/distributions) \> 选择“[创建](https://us-east-1.console.aws.amazon.com/cloudfront/v4/home?region=us-east-1#/distributions/create)”
2. CloudFront \> 分发 \> 创建分发 \> 选择计划 \> 选择“按量付费” \> 选择“下一步”
3. CloudFront \> 分发 \> 创建分发 \> 开始 \> 分发选项 \> 分发名称 \> 输入分发名称，例如 cdn-yourdomain-subdomain
4. CloudFront \> 分发 \> 创建分发 \> 开始 \> 分发选项 \> 描述 - 可选 \> 输入“cdn-yourdomain-subdomain”（可选，但有助于可见性）
5. CloudFront \> 分发 \> 创建分发 \> 开始 \> 分发选项 \> 分发类型 \> 确认选择“单个网站或应用” \> 选择“下一步”
6. CloudFront \> 分发 \> 创建分发 \> 指定源 \> 源类型 \> 选择“其他” _通过其可公开解析的 URL 访问任何 AWS 或非 AWS 源。_
7. CloudFront \> 分发 \> 创建分发 \> 指定源 \> 源 \> 自定义源 \> 输入域名，例如 subdomain.yourdomain.tld
8. CloudFront \> 分发 \> 创建分发 \> 指定源 \> 设置 \> 缓存设置 \> 选择“自定义缓存设置”
9. CloudFront \> 分发 \> 创建分发 \> 指定源 \> 设置 \> 缓存设置 \> 缓存策略 \> 从下拉列表中选择“CachingOptimized” \> 选择“下一步”
10. CloudFront \> 分发 \> 创建分发 \> 启用安全 \> 做出您的选择 - 对于本指南 \> 选择“不启用安全保护” \> 选择“下一步”
11. CloudFront \> 分发 \> 创建分发 \> 审查并创建 \> 选择“创建分发”  
**如果使用品牌化 CDN URL** → 第 12 步
12. CloudFront \> 分发 \> 分发 ID \> 备用域名 \> 选择“添加域名”
13. CloudFront \> 分发 \> 分发 ID \> 备用域名 \> 添加域名 \> 配置域名 \> 域名 \> 要服务的域名 \> 输入 DISCOURSE\_CDN\_URL，例如 discourse-cdn.yourdomain.tld \> 选择“下一步”

> 未完成：备用域名：discourse-cdn.yourdomain.tld

### [创建分发 #2](#create-distribution-#2)

```plaintext
  分发 #2
    DISCOURSE_S3_CDN_URL
      分发名称：s3-yourdomain-subdomain-uploads
      源：yourdomain-subdomain-uploads
      分发域名 (Cloudfront URL)：AWS-assigned.cloudfront.net
      备用域名：s3-cdn.yourdomain.tld

```

1. CloudFront \> 分发 \> [创建分发](https://us-east-1.console.aws.amazon.com/s3/bucket/create?region=us-east-1)
2. CloudFront \> 分发 \> 创建分发 \> 选择计划 \> 选择“按量付费” \> 选择“下一步”
3. CloudFront \> 分发 \> 创建分发 \> 开始 \> 分发选项 \> 分发名称 \> 输入分发名称，例如 s3-yourdomain-subdomain-uploads
4. CloudFront \> 分发 \> 创建分发 \> 开始 \> 分发选项 \> 描述 - 可选 \> 输入“s3-yourdomain-subdomain-uploads”（可选，但有助于可见性）
5. CloudFront \> 分发 \> 创建分发 \> 开始 \> 分发选项 \> 分发类型 \> 确认选择“单个网站或应用” \> 选择“下一步”
6. CloudFront \> 分发 \> 创建分发 \> 指定源 \> 源类型 \> 确认选择“Amazon S3”
7. CloudFront \> 分发 \> 创建分发 \> 指定源 \> 源 \> S3 源 \> 选择“浏览 S3” \> 选择上传存储桶“yourdomain-subdomain-uploads” \> 选择“选择” \> 选择“下一步”
8. CloudFront \> 分发 \> 创建分发 \> 启用安全 \> 做出您的选择 - 对于本指南 \> 选择“不启用安全保护” \> 选择“下一步”
9. CloudFront \> 分发 \> 创建分发 \> 审查并创建 \> 确认“审查并创建”正确 \> 选择“创建分发” → 新创建的分发信息页面应在 CloudFront \> 分发 \> 分发 ID 中打开
10. CloudFront \> 分发 \> 分发 ID \> 源 \> 选择源 \> 选择“编辑”
11. CloudFront \> 分发 \> 分发 ID \> 编辑源 \> 源访问控制 \> ! _您必须使用此策略允许 CloudFront 访问_… \> 选择“复制策略” \> 前往 [创建上传存储桶](#create-uploads-bucket) 9. Amazon S3 \> 存储桶 \> yourdomain-subdomain-uploads \> 权限 \> 存储桶策略

> 未完成：备用域名：s3-cdn.yourdomain.tld

## [Discourse 管理](#discourse-admin)

**截至 Discourse 版本：** 2025.12.0-latest

在 Discourse [管理 UI](https://discourseinstance.yourdomain.com/admin/) 中进行以下更改

**备份设置** /admin/backups/settings

1. 最大备份数 \> 输入要保留在本地的备份数量
2. 备份包含上传 \> 选择“在计划备份中包含上传。禁用此选项将仅备份数据库。”

**S3 设置** /admin/site\_settings/category/all\_results?filter=S3

1. S3 对所有上传使用 CDN URL \> 选择“对所有上传到 S3 的文件使用 CDN URL，而不仅仅是图片。”（Discourse 默认未选中）

## [编辑配置 (app.yml) 无品牌 URL](#edit-config-unbranded)

编辑 app.yml，针对品牌化 URL 或无品牌 Cloudfront URL 进行以下更改。

### [Discourse 无品牌 URL](#discourse-unbranded-urls)

此配置适用于无品牌 Cloudfront 分发。您的 DISCOURSE\_S3\_REGION 可能不同。  
DISCOURSE\_CDN\_URL: [https://amazonassigned.cloudfront.net](https://amazonassigned.cloudfront.net)

**S3 存储配置（无品牌）**

```plaintext
  ## 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](#discourse-branded-urls)

**DNS 配置**

如果您更喜欢使用基于 [yourdomain.com](http://yourdomain.com) 的 URL 作为 CDN，则需要进行一些 DNS 更改并调整您的 CDN URL。

**提示** ：别忘了在各自的 CloudFront 分发的“备用域名”中添加 [discourse-cdn.yourdomain.com](http://discourse-cdn.yourdomain.com) 和 [s3-cdn.yourdomain.com](http://s3-cdn.yourdomain.com) 作为域名。

如果您想使用域名品牌化的 CloudFront 分发，请配置 DNS。

**DISCOURSE\_CDN\_URL**

```plaintext
现有记录：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**

```plaintext
新记录： CNAME s3-cdn-cloudfront.yourdomain.com -> amazonassigned.cloudfront.net
新记录： CNAME s3-cdn.yourdomain.com -> s3-cdn-cloudfront.yourdomain.com

```

### [编辑配置 (app.yml) 品牌化 URL](#edit-config-branded)

DNS 更改完成后，您可以编辑 app.yml 并进行以下更改。

如果您使用域 CNAME 作为 CloudFront 分发（[amazonassigned.cloudfront.net](http://amazonassigned.cloudfront.net)），请更改 DISCOURSE\_CDN\_URL 和/或 DISCOURSE\_S3\_CDN\_URL。

DISCOURSE\_CDN\_URL: [https://discourse-cdn.yourdomain.com](https://discourse-cdn.yourdomain.com)

**S3 存储配置（品牌化）**

```plaintext
## 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)](#additional-config-edits)

无论您使用哪种方法（品牌化或 Cloudfront URL），都需要下面的 `after_assets_precompile` 部分，以确保在后续重建期间保持更新。

```plaintext
  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 任务。

```plaintext
./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` 部分：

```plaintext
  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 记录中存在问题。祝您好运！🙂

[s3-discourse-policy-your-iam-user.txt|附件](https://meta.discourse.org/uploads/short-url/QbbJlSJfCOCxNO1tKn6L9tNlrN.txt) (697 字节)

---

_[View the full topic](https://meta.discourse.org/t/configuring-awss-amazon-s3-for-storage-and-cloudfront-for-cdns/392369)._
