アップグレードの問題:重複キーによるアップグレード失敗、スナップショット復元失敗

最新のアップグレードを実行した際に問題が発生したようです。以下のエラーで失敗しています:

PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_users_on_username_lower"
DETAIL:  Key (username_lower)=(scottie) already exists.

このユーザーを Rails コンソールまたは Postgres データベースに直接アクセスして削除しようと復旧を試みましたが、サーバーが実行されていないというエラーが継続して表示されます。

アプリを起動した後、rails を実行しようとした際の出力は以下の通りです:

FAILED

--------------------

Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 3743 exit 1>

Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'

exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}

c744729efb7a5813699e2fe8fa46ab551352d45ada8dcb9204121508364f8438

** 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.

root@kForum:/var/discourse# ./launcher start app

starting up existing container

+ /usr/bin/docker start app

app

root@kForum:/var/discourse# ./launcher enter app

root@kForum-app:/var/www/discourse# rails c

bundler: failed to load command: pry (/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/pry)

PG::ConnectionBad: could not connect to server: No such file or directory

Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

次に、Postgres を実行しようとした際の出力です:

root@kForum:/var/discourse# ./launcher enter app

root@kForum-app:/var/www/discourse# su discourse

discourse@kForum-app:/var/www/discourse$ psql discourse

psql: error: could not connect to server: No such file or directory

Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

discourse@kForum-app:/var/www/discourse$

動作状態に戻すため、DigitalOcean で以前のスナップショットを復元しようとしています。しかし、奇妙な(恐ろしい?)ことに、スナップショットを復元してもサイトが正常に起動・動作しないようです。このスナップショットは24時間以上前に取得されたもので、その時点ではフォーラムが正常に動作していました。したがって、これは試みたアップグレードとは無関係であるはずです。

復元したスナップショットでは、アプリの停止/起動/再起動を試みると以下のエラーが表示されます:

root@kForum:/var/discourse# ./launcher restart app

+ /usr/bin/docker stop -t 10 app

app

starting up existing container

+ /usr/bin/docker start app

Error response from daemon: container "a1023d05a7b4de25ded1aa69ad49caed9fa59d15fa8e8130d32db82934139e6b": already exists

Error: failed to start containers: app

root@kForum:/var/discourse#

最後に、discourse-doctor を実行したところ、以下の部分が失敗に関連しているようです:

Checking cluster versions                                   ok

The source cluster was not shut down cleanly.
Failure, exiting
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Please visit https://meta.discourse.org/t/postgresql-13-update/172563 for support.

You can run ./launcher start app to restart your app in the meanwhile



FAILED
--------------------
Pups::ExecError: /root/upgrade_postgres failed with return #<Process::Status: pid 46 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params "/root/upgrade_postgres"
c98d1b076faed9b0c728cd944b3f2436afc9e266910b82a644c71fd80b42f073
** 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.
==================== END REBUILD LOG ====================
Failed to rebuild app.

Checking your domain name . . .

Connection to forum.kirupa.com succeeded.
You should probably remove any non-standard plugins and rebuild.
Attempting to restart existing container. . . 

starting up existing container
+ /usr/bin/docker start app
Error response from daemon: driver failed programming external connectivity on endpoint app (78a35e0f12e5af560bd1f991ead900fefd0c81570cc4582fe99aaa5e56b238e8): Error starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use
Error: failed to start containers: app
Failed to restart the container.


==================== PLUGINS ====================
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-sitemap.git

No non-official plugins detected.

See https://github.com/discourse/discourse/blob/master/lib/plugin/metadata.rb for the official list.

========================================
Discourse version at forum.kirupa.com: NOT FOUND
Discourse version at localhost: NOT FOUND

ここで何が起きているかについての考えはありますか?フォーラムを復元することが最優先の目標です。アップグレードの失敗を修正することは二次的な目標です。

よろしくお願いいたします、
Kirupa

こちらをご覧ください。同じ問題のようです:Help! Upgrade led to complete fail

昨日、似たような事例に対処しました(Help! Upgrade led to complete fail - #8 by Judith を参照)。大まかな手順としては、以下のような作業が必要だと考えられます。

  • postgres_data_old を postgres_data に名前を戻す
  • 古いコンテナを再起動する
  • 重複しているユーザー(大文字小文字の違いが原因で重複している場合も含む)の名前を変更して、破損したインデックスの問題を修正する
  • ユーザーテーブルのインデックスを再構築し、すべてが正常に修正されていることを確認する
  • PostgreSQL 13 アップデート で説明されている通り、PostgreSQL 12 のテンプレートに変更する
  • リビルドしてアップグレードする
  • 動作確認ができたら、テンプレートを元に戻してアップグレードを完了させる
  • ユーザー名だけでなく、username_lower も更新する必要がある点に注意

昨日修正した事例では、2020 年 2 月まで遡る重複ユーザー名が存在していました。そのため、古いデータベースを復元して修正するのはお勧めしません。

この問題を修正するには、Postgres コマンドラインを用いたレコードの修正方法、データベースの再構築、および PostgreSQL 13 アップグレードにおける複雑ながら詳細に文書化されている問題への対処法を理解する必要があります。

もし 500 ドルの予算がある場合は、私までご連絡ください。連絡先はプロフィールに記載しています。

@pfaffman - 連絡フォームからあなたにメッセージを送りました :slight_smile:

返信しました。もし届いていないなら、住所を間違えていませんか?

この件について結論を出すと、@pfaffman はまさに魔法使いです。フォーラムのアップグレード(および関連する多数の問題)を非常に迅速に解決してくれました :slight_smile:

私も同じ問題を抱えていますが、解決のために500ドルも払うつもりはありません。サーバーへのSFTPアクセスがあるので、データベースをメモ帳で開いて競合するユーザー名を変更することは可能ではないでしょうか?

または、誰かが50ドル程度で修正できるなら、私に連絡してください。

PG::UniqueViolation Problem during 3.1.0.beta4 upgrade - #3 by ahmedeldeep で、ある方が行ったことをかなりうまく説明していますので、そちらを参照してください。

SSHクライアントが必要で、SFTPではありません。Digital Ocean を使用している場合は、Webサイトのコンソールを使用できます。