备份包含多个目录和子目录。我认为您需要递归地将两个存储桶中目录内的所有文件复制到本地服务器上的相应位置。例如,两个存储桶中 1X 和 2X 目录下的所有内容都必须复制到本地服务器上的 1X 和 2X 目录。我不完全确定,但应该是这样。
您能否确认已正确复制了所有文件?
备份包含多个目录和子目录。我认为您需要递归地将两个存储桶中目录内的所有文件复制到本地服务器上的相应位置。例如,两个存储桶中 1X 和 2X 目录下的所有内容都必须复制到本地服务器上的 1X 和 2X 目录。我不完全确定,但应该是这样。
您能否确认已正确复制了所有文件?
是的,我完全理解,并已确保它们的相对路径保持完全一致。
例如,如果某个文件之前位于:
//bucket1/uploads/original/2x/f/filename.jpg
而另一个文件位于:
//bucket2/uploads/original/1x/a/filename.png
现在这两个文件也分别位于:
/var/discourse/shared/web_only/uploads/default/original/2x/filename.jpg 和 ../original/1x/a/filename.png
问题
在将存储桶内容复制到本地服务器之前,我发现部分图片仅显示为图标,网站访客必须点击该图标才能查看完整图片。
在我将所有存储桶内容(而非移动)复制到本地服务器的上述位置(保持相对路径不变)后,并执行了命令:
discourse remap:oldurl-or-path new-url-or-path
网站表面上没有任何变化。但随后我执行了:
rake posts:rebake
结果连图片图标也消失了,鼠标悬停在图片占位符的空白处时,也不再显示任何 URL 或路径。
希望我已提供了足够的详细信息。
如果是这样,我认为下面的命令可以解决你的问题。
./launcher enter app
discourse remap //bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
discourse remap //bhdisco.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
rake posts:rebake
谢谢,ji。
但正如我之前解释过的,在我执行“重新映射”和“重新烘焙”操作后,图片的图标甚至都消失了(也就是说,情况变得更糟了)。
在执行重映射时,必须提供正确的路径,否则可能会导致问题。我根据您之前提供的示例输出,手动重映射了一个 S3 链接,测试后确认可以正常工作。
托管在存储桶中的图片:
托管在您本地服务器上的同一张图片:
您可以在新标签页中打开图片,查看上述两张图片的链接。因此,我认为这样操作是可行的。
./launcher enter app
discourse remap //bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
discourse remap //bhdisco.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
rake posts:rebake
再次感谢。
我右键点击了(第一张)图片,但地址栏中显示的路径并不属于我的存储桶:
第二张图片的情况也是如此。
您可以查看我网站上的一个示例帖子 此处(该帖子为印地语,但您可以轻松在帖子中间找到图片的小图标)。只有点击该小图标时,才会显示完整图片。
但是,如果我先重新映射,然后再重新构建,这个小图标也会完全消失。这样一来,访客就完全无法查看图片了。
看来您之前曾使用过 CloudFront 进行缓存。请清除浏览器缓存后重试。
如果您做过任何 CloudFront 配置,建议撤销所有这些配置。
我的网站在过去大约两年里,完全没有使用 Cloudflare(已编辑:CloudFront)或任何其他 CDN。
Meta 上的图片可能确实存储在 Cloudflare 上。
不是 Cloudflare,是 CloudFront。你清除过浏览器缓存吗?
是的,是 CloudFront(抱歉)。
是的,我清除了。此外,我还在 Firefox 的无痕模式下打开了这个主题。
现在,我也收到了相同的 CloudFront 链接。看来您已为网站启用了 AWS CloudFront。CloudFront 正在缓存您存储桶中的图片。我认为您需要移除 CloudFront 的分发。请登录您的 AWS 账户,检查 CloudFront 分发是否处于活动状态?
嘿,我们之前对 CloudFront 的理解有误。实际上,是 Meta Discourse 在缓存图片。这是我的疏忽。
我从未在 AWS 或前端使用过 CloudFront(或其他任何 CDN)。尽管大约两年前,我曾使用过 CloudFlare 一个月左右,但随后就彻底移除了它。
我也没有在 AWS 中选择过 CloudFront。因此,这方面也不存在任何疑问。
此外,在我的电脑上打开图片时,它们显示的是 AWS 存储桶地址,而不是其他任何 CDN。
我刚才对 CloudFront 产生了误解。实际上是 meta discourse 缓存了该图片。我已经编辑了之前的帖子,请查看。
你只是在建议我重新映射图片路径(从 S3 存储桶 URL 改为本地服务器路径),然后重新生成。
但正如我之前所说,我已经这样做了,却发现这加剧了问题。(此外,重新生成后,“还原”功能也无法使用,而且很难回退。)
还有其他有用的建议吗?
当你执行重映射时,是否确认路径与下方所示一致?
discourse remap //bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
discourse remap //bhdisco.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
你在重映射时指定了哪个路径?
我在之前的帖子中已经提供了一个示例,该方法是有效的。我不了解其他任何方法。
我会再试一次,并尽可能小心。
但我正在寻找一种方法,让我能了解幕后发生了什么。至少通过一个示例帖子,我想看看哪些帖子映射到了哪些存储桶,以及我陷入了怎样的混乱。
无论如何,我会再试一次,并在这里告知结果。再次感谢。
您之前在重映射中指定的路径将反映在以下命令的输出中。由于两个存储桶仍然存在,我认为您之前的重映射可能失败了。无论如何,现在由您决定。希望您能尽快找到解决方案。祝您好运。
./launcher enter app
rails c
Upload.all.sample(2000).pluck(:url)
谢谢
我虽不如你聪明,但刚刚亲自走了一遍流程——并在 @Pravi 的帮助下成功完成了迁移。
这并非特别简单——请务必仔细处理文本和链接,否则一旦出错,清理起来会非常麻烦。不过,这完全是可以实现的。
public/uploads/default 文件夹首先,在应用容器内安装 AWS CLI:
cd /var/discourse
./launcher enter app
sudo apt install awscli
使用你的 S3 ID 和密码配置 AWS(通常很简单):
aws configure
然后使用 aws 命令将存储桶中的所有内容复制到 public/uploads/default/:
aws s3 sync s3://my-bucket-name/ public/uploads/default/
最简单的方法是找到论坛中的一张图片并检查其 URL。你需要的是直到实际文件名之前的所有部分(包括最后的 /):
discourse remap //your-images-url-until-the-filename /uploads/default/
rake posts:rebake
exit
./launcher rebuild app
呼!完成了。到目前为止我还没有遇到任何问题。快去测试一下吧!
干得漂亮!我相信这些步骤最终帮助我取得了成功,不过我之前也尝试过很多不同的重映射方案,效果都不如这些好!能有这样规范化的操作指南真是太好了。