我们的团队在一个临时域名上运行 Discourse 两个月,直到我们确定了最终的域名。昨天,我尝试将所有内容从旧域名迁移到新域名。所有文本内容、用户账号,甚至线程间的链接都正确转移了。但现在:
所有过去的图片嵌入似乎都丢失了。
无法上传任何新图片。
我的操作流程如下:
在 DigitalOcean 的新 Droplet 上生成了一个新的 Discourse 应用。
将新域名连接到该新 Droplet。
确认新旧两个 Discourse 应用及所有插件都已更新至最新的可用软件版本。
将旧 Discourse 设置为只读模式,以防止添加任何新内容。
对旧 Discourse 进行了备份。
将备份上传至新 Discourse。
将 Discourse 的邮箱地址从旧域名邮箱更新为新域名邮箱。
对通知进行了测试,新 Discourse 的通知功能正常。
逐一检查所有 Discourse 设置,将提及旧域名的地方更新为新域名。
将旧子域名重定向到其正确的域名,并临时在那里添加了一条说明和指向新 Discourse 的链接。
如上所述,大部分内容似乎都完美转移了。但一天后,我们发现旧图片嵌入丢失,且无法上传新图片。仅显示了它们的“alt”文本内容。以下是示例截图。
在谷歌搜索中,我发现有几个关于此问题的长篇讨论,但似乎没有一篇同时涉及域名变更和无法重新上传的情况。
我刚刚尝试通过以下方式解决此问题:
SSH 登录到服务器。
进入 Discourse 目录并启动应用。
运行 rake posts:missing_uploads。输出如下:
Looking for missing uploads on: default
0 post uploads are missing.
运行 rake uploads:missing。输出了一个长长的列表:
/var/www/discourse/public/uploads/default/original/1X/bbc547e72f080561282be277749165709cbb0983.ico
/var/www/discourse/public/uploads/default/original/1X/0a421ccd1a08047895e2355f44c332f8b069107d.jpeg
/var/www/discourse/public/uploads/default/original/1X/034e0353b7558a26252c82982de53002fda0a33f.jpeg
[…]
/var/www/discourse/public/uploads/default/original/1X/f7a6164ffa55af4ee2706d2386227183ef6c2d61.png
96 of 281 uploads are missing
/var/www/discourse/public/uploads/default/optimized/1X/997bc5536763d84a8d035ff7becd98277a158680_2_45x45.png
[…]
/var/www/discourse/public/uploads/default/optimized/1X/8944afba36549c9050ef074b391625ef93d4d0e3_2_1035x582.jpeg
/var/www/discourse/public/uploads/default/optimized/1X/8944afba36549c9050ef074b391625ef93d4d0e3_2_10x10.png
247 of 761 optimized_images are missing
运行 rake uploads:recover_from_tombstone。该命令没有任何输出。
我承认我不清楚这些 Rake 命令具体在做什么。
我还可以看到在 containers/app.yml 文件中,DISCOURSE_HOSTNAME 已正确设置为新的子域名和域名。
运行 ./launcher rebuild app 似乎没有任何变化。
有人能帮忙吗?谢谢。
你试过重新烘焙吗?
cd /var/discourse
./launcher enter app
rake posts:rebake
If the URL to your site changed, yes, it’s a good idea to rebake.
omarfilip:
你试过重新烘焙(rebake)吗?
感谢建议。我刚刚输入了你的命令,但没有看到任何变化。旧图片仍然无法显示,新图片上传仍然失败。顺便提一下,网页浏览器控制台在上传尝试完成后会抛出“GET 404”错误。
更新:
我不确定具体是哪条命令改善了现状,但情况确实有所好转,只是尚未完全解决。
我现在可以创建并上传 TXT、DOCX、XLSX、JPG 和 PNG 类型的新文件。
大多数(但并非全部)旧上传文件,无论类型如何,现在都能正常显示和下载。
那些“问题上传”的文件此前一直能正常显示和下载,没有任何报错。但在新的测试帖子中重新上传后,它们却拒绝显示。例如:
这张图片:https://www.frontiersin.org/files/Articles/470644/fphys-10-00944-HTML-r1/image_m/fphys-10-00944-t001.jpg
在 Discourse 中,如果将其 URL 单独放在一行,可以正常显示,如下所示:
但在我完成帖子发布并刷新页面后,该图片就会从帖子中消失,只留下一行空白。检查源代码会发现一个 <img> 元素,其 src 属性指向我的域名下的路径,格式为 https://discourse.my_domain_name.org/uploads/default/original/1X/61ae2bdeff3dfe334ad6803409560b667d7dc246.jpeg。然而,在新标签页中打开该路径时,会显示 NGINX 404 错误页面。
当我从原始来源下载该图片到笔记本电脑,然后上传到我的 Discourse(就像我接下来在这个 Discourse 中做的那样)时,上传在我的 Discourse 上会失败。
在我的 Discourse 上,它看起来是这样的:
如果我按住 Control 键点击那张失败的图片,并选择“在新标签页中打开图片”,则会加载一个 NGINX 404 错误页面。
我注意到,在当前这个编辑对话框中,Discourse 将图片扩展名从 JPG 改为了 JPEG,但我认为这应该不是问题所在。
如果我用 Affinity Photo 应用打开下载的图片,以无压缩方式导出为新的 JPG 文件,然后重新上传到我的 Discourse,它就能在我的 Discourse 上正常显示。
这表明,问题仍然出在我的 Discourse 配置上,而不是上传的文件本身。
Alec
(Alec)
2020 年10 月 25 日 20:28
5
我在最近的迁移中遇到了这个问题。
最简单的非技术解决方法是:使用 FileZilla 登录您原来的站点/主机,导航至
VAR/Discourse/Uploads
在该目录下,您会找到包含图片的子文件夹。我只需从原主机下载这些文件,然后上传到新主机即可。
另一种更快的替代方法是使用以下备份方法。这是一个手动过程,但同样行之有效。
As discussed below , a warning for newbies:
this is an advanced method! there is an automated, web UI way to restore from backups at /admin/backups which is so much easier.
with the method below, no automatic backup is kept of the /var/discourse/containers/app.yml file which contains essential SMTP credentials and SSL customizations. Keep a copy of this offsite whenever you change it.
If you are using digital ocean, keep frequent snapshots of your droplets - preferably before each time you run .…
感谢您的回复。我从未使用过 FileZilla 应用程序,我使用的是 Transmit 进行 FTP 操作。但我不清楚如何通过 FTP 连接到 DigitalOcean 上的 Discourse 应用。
我可以 SSH 登录到我的 droplet,也能导航到 /var/discourse/,但那里并没有 uploads 目录。
即使我手动将图片文件从旧位置移动到新位置,这又如何解决重新上传相同图片时失败的问题呢?
Alec
(Alec)
2020 年10 月 25 日 22:58
7
我对 Discourse 的理解非常基础(我确实是个新手):上传的图片会存储在你的网站上,同时也会存储一个优化了文件大小的版本。最初,用户会看到原始图片,但在某个时间点,论坛会切换到优化后的图片(对我来说,这似乎是在 24 小时后发生的)。
我稍微尝试了一些设置,因为我担心存储空间不足。
在你的管理仪表板中查看这些设置(位于“文件”部分)。这里有多种设置可以控制图片的尺寸和分辨率。这可能与你遇到的异常图片问题有关(如果我理解正确的话)。例如,你重新格式化的图片仍然不符合这些标准。
当我从 Digital Ocean 迁移到 Hetzner 时,我遇到了一些图片(包括头像)无法显示的问题(类似于你的第一张截图)。我的解决方法是通过 FTP 移动这些文件(虽然方法粗糙,但确实有效)。我不太确定具体原因。起初,我只移动了优化后的图片,但问题并未解决;而当我移动所有图片后,问题就解决了。
抱歉之前提到了错误的文件夹路径,我是凭记忆说的。正确的文件夹结构是:VAR/Discours/Shared/Standalone/Upload
使用 FTP 客户端登录 Digital Ocean 非常简单:
主机:Discourse 的 IP 地址
端口:22
用户名:root
密码:你的 SSH 密码
正如我之前所说,我远非专家,只是最近几个月一直在摆弄它。
这里有一些人可以提供更好的建议(和见解)。但如果其他方法都无效,不妨试试我的这个方案。
我的解决方案是通过 FTP 移动它们(虽然粗糙,但确实有效)。我不完全确定原因。起初我只移动了优化后的图片,问题并未解决;但当我移动所有图片后,问题就解决了。
感谢您提供更详细的说明,指导我如何 FTP 登录我的两个 Discourse 实例。旧 Discourse 上的 uploads 文件夹约为 125 MB,新 Discourse 上约为 60 MB。因此,我将旧文件夹复制到了我的笔记本电脑桌面上。然后,我按文件夹逐一将其内容复制到新的 Discourse 实例中,并跳过了任何重复的文件。
令我惊讶的是,这似乎解决了问题。所有图片上传都已恢复正常,无论是迁移前创建的帖子,还是今天为排查问题而创建的帖子。
我推测,Discourse 可能复用了某些在迁移过程中丢失的现有内容指针。因此,如果重新上传完全相同的图片文件,它会复用损坏的指针并反复失败。但当我将其另存为新文件时,操作成功,因为它存储了新副本并分配了新指针。也许如此。
再次非常感谢。
gerhard
(Gerhard Schlager)
2020 年10 月 26 日 00:35
9
默认情况下,备份不包含优化后的图片,因为它们可以重新生成。包含它们会浪费带宽和磁盘空间。
在您的情况下,如果在创建备份之前启用 include_thumbnails_in_backups 站点设置,将优化后的图片包含在内会有所帮助。
或者,在恢复后运行 rake posts:rebake_uncooked_posts 也能达到同样效果。否则,优化后的图片将由后台任务重新生成,但这需要一些时间……恢复结束时会有日志消息明确告知您这一点。