フォーラムの更新で立ち往生し、迷子になっています。PG移行に関する問題

こんにちは、色々試して行き詰まり、アップグレードできずにここに投稿しました。

  • 私は数か月ぶりにフォーラムを更新していました。いつものようにバックアップを実行してダウンロードしました。
  • どうやら、今回のアップデートプロセスでは、PG 13から15への移行があるようです。
    アップデートが失敗するまで、すべて問題なく実行されていましたが、ディスク容量の不足により中断されました。
  • DigitaloceanのDropletにアクセスし、停止してディスクを拡張し、再度オンにしました。
  • ディスク容量を解放するために、いくつかの通常のコマンドを実行しました(古いログの削除、./launcher cleanupなど)。

そこで、再構築を開始したところ、最初の壁にぶつかりました。

root@discourse-ubuntu-s-2vcpu-4gb-fra1-01:/var/discourse# ./launcher rebuild app
警告: Docker バージョン 20.10.1 は非推奨です。24.0.7 以降へのアップグレードを推奨します。
x86_64 アーキテクチャが検出されました。
警告: containers/app.yml ファイルは誰でも読み取り可能です

アップデート:
まだ色々試しています。現時点では、PG13をサポートするビルドに戻してバックアップを復元したいだけなのですが、まだブロックされていて試すことができません。

アップグレード前のコミットハッシュはv3.3.0.beta6 +294でした。YML経由でそれを再構築しようとしていますが、ビルドアップ時にまだこう表示されます:

root@discourse-ubuntu-s-2vcpu-4gb-fra1-01:/var/discourse# ./launcher rebuild app
WARNING: Docker version 20.10.1 deprecated, recommend upgrade to 24.0.7 or newer.
x86_64 arch detected.

WARNING: We are about to start downloading the Discourse base image
This process may take anywhere between a few minutes to an hour, depending on your network speed

Please be patient

2.0.20250226-0128: Pulling from discourse/base
af302e5c37e9: Pull complete
ed49ab5c933d: Pull complete
4d13d450f300: Pull complete
a67afd5cca97: Pull complete
d22a5b6769a6: Pull complete
83c133b53b22: Pull complete
fec147508f0c: Pull complete
21850d8b3ba1: Pull complete
02e250b6bcc4: Pull complete
71ba5ea7da00: Pull complete
ddcfbf6d2647: Pull complete
9c3e54d34536: Pull complete
29ce98d2d62d: Pull complete
4c9694455fd5: Pull complete
58a8ebcc6563: Pull complete
9c8966f1f999: Pull complete
b3dde96c4217: Pull complete
f934de9e2e8d: Pull complete
834e25f513a1: Pull complete
85d3cf606a95: Pull complete
94331a6982ee: Pull complete
14936beb0e9f: Pull complete
3ef05b122d47: Pull complete
6c2dff13a1e7: Pull complete
7682543ad38b: Pull complete
f16f8d5c5a04: Pull complete
06d7037d56ef: Pull complete
bc6c17ae1969: Pull complete
d19f089ead0e: Pull complete
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Downloaded newer image for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
WARNING: containers/app.yml file is world-readable. You can secure this file by running: chmod o-rwx containers/app.yml
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
2.0.20250226-0128: Pulling from discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Image is up to date for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-06-11T09:54:52.350929 #1]  INFO -- : Reading from stdin
I, [2025-06-11T09:54:52.357807 #1]  INFO -- : 	DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector
E: Problem executing scripts DPkg::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true'
E: Sub-process returned an error code
I, [2025-06-11T09:54:53.837808 #1]  INFO -- : Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
  libcommon-sense-perl libio-pty-perl libipc-run-perl libjson-perl
  libjson-xs-perl libllvm19 libtypes-serialiser-perl libz3-4
  postgresql-client-common postgresql-common postgresql-common-dev ssl-cert
Use 'apt autoremove' to remove them.
The following packages will be REMOVED:
  postgresql-15* postgresql-15-pgvector* postgresql-client-15*
0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded.
After this operation, 60.9 MB disk space will be freed.
(Reading database ... 33951 files and directories currently installed.)
Removing postgresql-15-pgvector (0.8.0-1.pgdg120+1) ...
Removing postgresql-15 (15.12-1.pgdg120+1) ...
invoke-rc.d: could not determine current runlevel
update-alternatives: warning: forcing reinstallation of alternative /usr/share/postgresql/15/man/man1/psql.1.gz because link group psql.1.gz is broken
Removing postgresql-client-15 (15.12-1.pgdg120+1) ...
Processing triggers for postgresql-common (274.pgdg120+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
(Reading database ... 31913 files and directories currently installed.)
Purging configuration files for postgresql-15 (15.12-1.pgdg120+1) ...
Dropping cluster main...



FAILED
--------------------
Pups::ExecError: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector failed with return #",ocess::Status: pid 7 exit 100
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params "DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector"
bootstrap failed with exit code 100
** FAILED TO BOOTSTRAP ** 前のエラーメッセージをスクロールして確認してください。複数ある可能性があります。
./discourse-doctor が問題の診断に役立つ場合があります。
a609309cf458b146e5650d21103bf084e9bf66843e46e627827f50b6f8c03376

もしバックアップを取ったのであれば、一番簡単なのは新しいドロップレットを起動し、rsyncでDiscourseサイトを別のVPSに移動する(ただしデータベースファイルはコピーしない)に従って、その後バックアップを復元することです。

「いいね!」 3

こんにちは

Jayさん!ご返信ありがとうございます。ちょうどそれを始めたところです。ドロップレットは現在セットアップ中です。

簡単な質問ですが、アップデートを開始する前にバックアップファイルをダウンロードしました。ファイルはこちらです:forumname-2025-06-11-060249-v20240807024301.tar.gz (4.6GB圧縮済み) フォーラムのバージョンはv3.3.0.beta6 +294、PG13でした。

新しいドロップレットを初期化する際に、app.ymlでこのバージョンを強制的に指定しようと考えています。例えば:

## これはオールインワン、スタンドアロンのDiscourse Dockerコンテナテンプレートです
##
## このファイルを変更した後は、必ず再構築してください
## /var/discourse/launcher rebuild app
##
## 編集は*非常に*注意してください!
## YAMLファイルは空白やインデントの間違いに非常に敏感です!
## 必要に応じてこのファイルを検証するために http://www.yamllint.com/ を参照してください

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Lets Encrypt (https) を追加したい場合は、これらの2行のコメントを解除してください
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## このコンテナはどのTCP/IPポートを公開しますか?
## DiscourseがApacheやnginxのような他のウェブサーバーとポートを共有したい場合は、
## 詳細については https://meta.discourse.org/t/17247 を参照してください
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## db_shared_buffers を合計メモリの最大25%に設定します。
  ## 検出されたRAMに基づいてブートストラップによって自動的に設定されますが、上書きすることもできます
  db_shared_buffers: "1024MB"

  ## ソートパフォーマンスを向上させる可能性がありますが、接続ごとのメモリ使用量が増加します
  #db_work_mem: "40MB"

  ## このコンテナはどのGitリビジョンを使用しますか? (デフォルト: tests-passed)
  version: v3.3.0.beta6

そして、新しいフォーラムが稼働したら、そこからバックアップをインポートします。

これは理にかなっていますか? それとも、重要なパラメータや手順を見落としていますか?

「いいね!」 1

これで完了です。

関連項目: コマンドラインからバックアップを復元する

「いいね!」 3

ジェイさん、また返信ありがとうございます。この悪夢のような状況を乗り越えるのを手伝ってくれて、本当に感謝しています。

YMLでバージョンを強制する方法を試していますが、どうやら discourse_docker はまだその変更に対応していないようです。

FAILED
--------------------
Pups::ExecError: grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The "before-server" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 ) failed with return #<Process::Status: pid 2788 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in spawn'
exec failed with the params {"cmd"=>["cp $home/config/nginx.sample.conf /etc/nginx/conf.d/discourse.conf", "rm /etc/nginx/sites-enabled/default", "mkdir -p /var/nginx/cache", "grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \\\"before-server\\\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \\\"server\\\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/discourse' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \\\"discourse\\\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "mkdir -p /etc/nginx/conf.d/outlets/before-server", "touch /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf", "touch /etc/nginx/conf.d/outlets/before-server/30-ratelimited.conf", "mkdir -p /etc/nginx/conf.d/outlets/server", "touch /etc/nginx/conf.d/outlets/server/10-http.conf", "touch /etc/nginx/conf.d/outlets/server/20-https.conf", "touch /etc/nginx/conf.d/outlets/server/30-offline-page.conf", "mkdir -p /etc/nginx/conf.d/outlets/discourse", "touch /etc/nginx/conf.d/outlets/discourse/20-https.conf", "touch /etc/nginx/conf.d/outlets/discourse/30-ratelimited.conf"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
d511b0ec31ac912c99c682611c35bbb446dde1488e1762aa07ccd24690c63164


2/2


アップデート前に念のため現在のバージョンのスクリーンショットを撮っておいたのですが、discourse_docker を互換性のある古いバージョンに強制する方法はありますか?

GoogleとMetaで検索してみましたが、まだその方法についての情報は見つかりません。

やめましょう。

すべてを最新バージョンで通常どおりインストールし、データベースを復元してください。

「いいね!」 1

承知いたしました。今すぐ試してみます。

ところで、簡単な質問ですが、バックアップがPG13を使用していた古いバージョンのDiscourseのものである場合、PG15の最新バージョンのDiscourseにバックアップをインポートする際に問題が発生しますか?

「いいね!」 1

すみません @pfaffman 問題がなくなったと思って前のメッセージを書いたのですが、どんでん返しが起こりました。

長い時間をかけてインポートした後、フォーラムが再びオンラインになり、すべての投稿などがリストされているのを確認しました。

ターミナルのログは次のとおりでした。

[...]

-- execute("DELETE FROM site_settings WHERE name='warn_reviving_old_topic_age'")
   -\"> 0.0002s
== 20250609115711 RemoveComposerTipsSiteSettings: migrated (0.0012s) ==========

データベースに再接続しています...
サイト設定を再読み込みしています...
スタッフ以外のユーザーへのメール送信を無効にしています...
読み取り専用モードを無効にしています...
カテゴリキャッシュをクリアしています...
翻訳を再読み込みしています...
アップロードを再マッピングしています...
アップロードを復元しています。これには時間がかかる場合があります...
「default」のアップロードをS3に移行しています...
ファイルをS3にアップロードしています...
 - ローカルファイルを一覧表示しています
 => 5 files
 - S3ファイルを一覧表示しています
............................................................................................................................................................................ => 171490 files
 - S3にファイルを同期しています
.....
データベース内のURLを更新しています...

しばらくそこにいて、ターム接続だけの問題だと思っていました。しかし、数分後、失敗し続けました:

490 files
 - S3にファイルを同期しています
.....
データベース内のURLを更新しています...
古い最適化された画像を削除しています...
ライトボックスを含むすべての投稿にリベイクのフラグを立てています...
76198件の投稿にリベイクのフラグが立てられました
例外: 903件の投稿が新しいS3アップロードURLに再マッピングされていません。S3移行はデータベース「default」で失敗しました。
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:81:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:383:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:354:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:69:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:49:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:167:in `restore_uploads'
/var/www/discourse/lib/backup_restore/restorer.rb:71:in `run'
script/discourse:191:in `restore'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/command.rb:28:in `run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor.rb:538:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/base.rb:584:in `start'
script/discourse:345:in `
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `kernel_load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:28:in `block in 
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:20:in `
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `'
ロールバックを試みています...
ロールバックしています...
後片付けをしています...
discourse_functionsスキーマから関数を削除しています...
tmp「/var/www/discourse/tmp/restores/default/2025-06-11-121115」ディレクトリを削除しています...
sidekiqを一時停止解除しています...
復元を完了としてマークしています...
復元の終了を「system」に通知しています...
完了しました!
[失敗]
復元完了。
```突然、「復元された」オンラインフォーラムで、すべての投稿が消え、いくつかのトピックだけが残されました。

ログには「76198件の投稿がリベイク(rebake)のためにフラグが立てられました」とあるので、今はリベイクされる必要があるだけだと思いましたが、Sidekiqに行っても処理待ちのものが何もありません :(

![Screenshot 2025-06-11 at 15.07.25|690x344](upload://eTbBQ2YFhHB53eiZav2gFFOlEVV.jpeg)

![Screenshot 2025-06-11 at 15.07.52|690x221](upload://jndXpOTWcvpiv94CczGn2SRRqVU.jpeg)

更新:

railsコンソールにログインしたところ、インポートされるはずの投稿がすべてではなく、10件しかないことが判明しました :thinking:
/var/www/discourse# rails c
Loading production environment (Rails 7.2.2.1)
discourse(prod)> Post.count
=> 10
discourse(prod)> Post.where("baked_version IS NULL").count
=> 0

「いいね!」 1

ため息。同じホスト名を使用していますか?(おそらくそうでしょう?)

それがあなたの問題です。

S3をデータベースで設定しましたか、それともymlファイルで設定しましたか?前者だと思います。最も簡単なのはデータベースのみを復元することですが、説明が難しいです(sqlファイルを抽出し、tar.gzファイルと同じ名前を付けます)。

これを試すことができます

discourse restore --pause <backup_filename>

これにより、S3の復元を試みる前に一時停止します。その後、何をすべきか分かっていれば、問題のあるアップロードで問題を修正できます。

Issues with restoring backup to discourse - #16 by gerhard を参照してください。

別の方法として、app.ymlDISCOURSE_USE_S3をfalseに設定することもできます。S3アップロードやS3バケットを使用するように設定されている他のS3設定も設定する必要があるかもしれません。

「いいね!」 1

はい、しかしあなたが言及してくれたので。

  • フォーラムは今10歳です。
  • 昔はしばらくS3を設定していましたが、その後削除したので、S3画像を含む投稿はかなり古いです。

それらを特定して無視/削除する方法はありますか?そうすれば、インポートはスムーズに機能しますか?

app.ymlDISCOURSE_USE_S3 を false に設定することもできます。S3アップロードやS3バケットを使用するように設定されている他のS3関連の設定も行う必要があるかもしれません。

これも試してみます。結局のところ、これらのS3ファイルや投稿には関心がありません。ただ、それらを無視して処理する方法がまだわからないだけです。

本当に気にしないなら、一時停止させて、一時停止したら別のターミナルを開き、railsに入って次のようなことをすることができます。

bad=Upload.where("url like '%the-s3-url%'")
bad.destroy_all

ちなみに、もしあなたがまだ行き詰まって困っていて、予算があるなら、メールかPMで私に連絡するか、#marketplaceで聞いてみてください。

「いいね!」 1

最初から言ってくれればよかったのに!最初から喜んで払ったのに!へへ

今では正常に動作しています。

たくさんのことを試した後、直感に反するものの、今は機能していることを行いました。

  • 新しいインスタンスでS3を適切にセットアップしました(管理パネル経由)。
  • –pause thingでインポートを実行しましたが、2番目のステップでプロセスを停止しました。フォーラムが機能しなくなったり、画像に問題が発生したりすることを予想していましたが、動作しており、古い画像も問題なく読み込まれています。

まだ色々テストしていますが、後で何か壊れているものを見つけるかもしれませんが、今のところ、12時間のトラブルシューティングの後、今回は勝ちとします。

「いいね!」 2

それは適切ではありません。アップロード用のS3互換オブジェクトストレージプロバイダーを設定するを参照してください。それらの設定はすべてymlファイルに記述する必要があります。

「いいね!」 1