Обновление до версии 3.3 не удаётся у меня

Я попытался выполнить обновление через интерфейс, но это не удалось, как описано здесь:

Поэтому я восстановил свой droplet из резервной копии, а затем попытался выполнить обновление вручную.

cd /var/discourse
git pull
./launcher rebuild app

Это выдаёт следующее:

WARNING: Docker version 20.10.7 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.20240825-0027: Pulling from discourse/base
e4fff0779e6d: Pulling fs layer 
04dda0e597e7: Pulling fs layer 
0b0ac7902d91: Pulling fs layer 
1ea0327cd622: Waiting 
459f11cf96b2: Waiting 
cd49b55154ee: Waiting 
4f4fb700ef54: Pull complete 
890a63bee26b: Pull complete 
1d239a1092e9: Pull complete 
7439767d748f: Pull complete 
19e63282f9d1: Pull complete 
6da4866029f1: Pull complete 
3274548c87f4: Pull complete 
fb2589b81eef: Pull complete 
da453ab7ba03: Pull complete 
260969aca4e8: Pull complete 
0c7927423a10: Pull complete 
cfdfd8bdc03e: Pull complete 
f837c184a2c0: Pull complete 
d14903daf553: Pull complete 
01422fc4dc02: Pull complete 
e918b15c8f19: Pull complete 
3202b43401af: Pull complete 
3fa0a48e923e: Pull complete 
2f1f96b416a1: Pull complete 
b5376d8069b5: Pull complete 
259e102648be: Pull complete 
807236570b2a: Pull complete 
e98845c05b05: Pull complete 
578a5e3e249f: Pull complete 
6b0bf88c86e8: Pull complete 
9551a14ee15e: Pull complete 
8bbcc4c7a11d: Pull complete 
5aff35532071: Pull complete 
f73f45300530: Pull complete 
42888ce727c0: Pull complete 
e8467a663928: Pull complete 
d2fb91f4643c: Pull complete 
88fc9778a448: Pull complete 
2a19d28a5a17: Pull complete 
6a2d56837370: Pull complete 
933885f686e0: Pull complete 
aecf6df6a6bb: Pull complete 
33fcdcfe61e2: Pull complete 
12726a4d34c8: Pull complete 
Digest: sha256:6de68cb49198b5281f79ed9401b3fe818c854d220dcf0238549fe2f2adb19146
Status: Downloaded newer image for discourse/base:2.0.20240825-0027
docker.io/discourse/base:2.0.20240825-0027
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
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20240825-0027: Pulling from discourse/base
Digest: sha256:6de68cb49198b5281f79ed9401b3fe818c854d220dcf0238549fe2f2adb19146
Status: Image is up to date for discourse/base:2.0.20240825-0027
docker.io/discourse/base:2.0.20240825-0027
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2024-10-15T06:14:37.390458 #1]  INFO -- : Reading from stdin
I, [2024-10-15T06:14:37.395803 #1]  INFO -- : > echo cron is now included in base image, remove from templates
I, [2024-10-15T06:14:37.398391 #1]  INFO -- : cron is now included in base image, remove from templates

I, [2024-10-15T06:14:37.408024 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown: 
I, [2024-10-15T06:14:37.412237 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2024-10-15T06:14:37.416506 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2024-10-15T06:14:37.420758 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown: 
I, [2024-10-15T06:14:37.424824 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown: 
I, [2024-10-15T06:14:37.425837 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/13/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.426590 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.427073 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.427713 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.428194 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.428633 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.429175 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.429569 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.430001 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/13/main/postgresql.conf
I, [2024-10-15T06:14:37.430562 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/13/main/pg_hba.conf
I, [2024-10-15T06:14:37.430964 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/13/main/pg_hba.conf
I, [2024-10-15T06:14:37.431353 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/13/main/pg_hba.conf
I, [2024-10-15T06:14:37.431673 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

I, [2024-10-15T06:14:37.974529 #1]  INFO -- : Generating locales (this might take a while)...
Generation complete.

I, [2024-10-15T06:14:37.975013 #1]  INFO -- : > HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main
I, [2024-10-15T06:14:37.976577 #1]  INFO -- : Terminating async processes
2024-10-15 06:14:38.136 UTC [36] LOG:  starting PostgreSQL 13.16 (Debian 13.16-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
2024-10-15 06:14:38.138 UTC [36] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2024-10-15 06:14:38.139 UTC [36] LOG:  listening on IPv6 address "::", port 5432
2024-10-15 06:14:38.143 UTC [36] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2024-10-15 06:14:38.154 UTC [37] LOG:  database system was shut down at 2024-10-15 06:14:28 UTC
2024-10-15 06:14:38.176 UTC [36] LOG:  database system is ready to accept connections

На этом этапе обновление прекращается, дальнейших действий не происходит, и сервер становится недоступен (полное отсутствие веб-соединения).

Что мне стоит попробовать дальше?

Я полагаю, что обновления интерфейса требуют больше памяти, поскольку вы пытаетесь одновременно запускать сайт и выполнять пересборку.

Убедитесь, что у вас достаточно пространства подкачки (swap) для работы — как минимум столько же, сколько у вас оперативной памяти (RAM).

Так, на сервере с 4 ГБ памяти убедитесь, что у вас выделено 4 ГБ подкачки.

Кстати, команда git pull здесь избыточна. Скрипт сборки делает это за вас.

На моём сервере 4 ГБ ОЗУ и 4 ГБ swap-памяти. Пересборка останавливается на сообщении database system is ready to accept connections, не завершается, и форум остаётся недоступным. Я могу восстановить его из резервной копии Droplet (снова), что вернёт меня к работающей версии форума 3.2, но было бы лучше решить эту проблему.

# free
              total        used        free      shared  buff/cache   available
Mem:           3919         286        1443          20        2189        3360
Swap:          4095           2        4093
Total:         8015         288        5537

В таких случаях я обычно перезагружаюсь (на свой страх и риск), но это ещё меня не подводило. По крайней мере, так сайт снова становится доступным.

Убедитесь, что ваша ОС достаточно актуальна (LTS), и обратите внимание на предупреждение Docker.

Стоит ли мониторить потребление памяти во время пересборки с помощью htop?

Похоже, что используется много swap-памяти. :+1:

Моя ОС — Ubuntu 20.04.6 LTS.

Хм. Ладно, я перезагрузился, и форум снова заработал.

Ах да, но всё ещё написано, что установлена версия 3.2.4, а последняя — 3.3.2, значит, обновление не применено.

Так что я не совсем понимаю, что теперь делать. Попробую обновить снова.

Да, всё останавливается на том же месте. Скорее всего, для более новой версии Docker потребуется обновить основную версию Ubuntu. Я, наверное, мог бы это сделать, просто не планировал делать это сейчас.

Я бы обновил вашу ОС и Docker, просто на всякий случай.

Иногда в скрипте сборки бывают значительные задержки в различных точках. Сколько именно времени это занимает?

Когда я вернулся через 15–20 минут, процесс всё ещё был застопорен на этом этапе. С тех пор я не ждал особенно долго. Возможно, он просто выполняет какие-то действия, но никаких доказательств этого нет. Никакие процессы не используют заметный объём процессорного времени.

На данном этапе у вас есть два варианта:

  • Обновление ОС и Docker на месте — затем повторите попытку
  • Создание нового Droplet.

Второй вариант может оказаться быстрее.

Что ж, у меня есть актуальный снимок состояния системы, так что, полагаю, обновление Ubuntu в данный момент не повредит — я всегда смогу всё откатить.

Ах, отказ, потому что:

Извините, этот драйвер хранилища не поддерживается в ядрах для более новых
релизов.

Больше не будет релизов Ubuntu, которые обеспечивают поддержку драйвера
хранилища aufs.

Пожалуйста, убедитесь, что ни один из ваших контейнеров не использует драйвер
хранилища aufs, удалите каталог /var/lib/docker/aufs и попробуйте снова.

Вздыхаю. Ничего никогда не бывает просто, не так ли?

Новый Droplet. :).

(И не забудьте создать swap на новом сервере, если это еще не сделано)

Хорошо, весь этот процесс обновления можно записать как небольшую катастрофу.

Я отменю обновление дроплета до предыдущей версии (Ubuntu 20.04.6 LTS и Discord 3.2.4), спрячусь с головой в песок и забуду всё о версии 3.3, чтобы попробовать снова в другой день.

Спасибо за попытку помочь.

Бонусная функция: при восстановлении droplet по какой-то причине я выхожу из системы — и войти в систему невозможно, даже как администратор, пока сайт находится в режиме только для чтения!

Только что понял: я не могу переключить Docker на overlay2, как описано здесь (Change the Docker storage backend), чтобы обновить Ubuntu, поскольку переход на overlay потребует выполнения команды ./launcher rebuild app, которая завершится ошибкой (если только переход на overlay2 не решит проблему, но это кажется маловероятным). Поэтому миграция на новый droplet, похоже, остаётся единственным разумным вариантом, хотя это, вероятно, потребует изменений в DNS, что обычно занимает довольно много времени. Ух ты.

Вы, возможно, сможете перезапустить контейнер командой

  docker start app

Также вы, возможно, сможете решить вашу проблему с помощью

 apt install docker-ce docker-ce-cli

Не уверен насчет проблемы с overlay. Вы когда-нибудь выполняли обновление ОС с более старой версии Ubuntu?

Если вы используете DigitalOcean, вы можете создать статический IP-адрес, указывающий на старый сервер, и обновить DNS, чтобы он указывал на него. Затем, при переходе на новый сервер, задержки DNS не будет, так как вы сможете перенаправить IP-адрес на новый сервер.

Да, это перезапустило контейнер, но без какого-либо обновления.

Я не знаю, что происходит дальше после фразы database system is ready to accept connections в процессе обновления, но процесс застревает на этом этапе и не продвигается дальше (если только следующий шаг не занимает очень много времени).

Да, Ubuntu ранее обновлялась. Таким образом, Docker всегда работал на aufs.

Возможно ли выполнить пересборку без обновления? Если это сработает, то, возможно, я смогу переключить текущий Docker с aufs на overlay2, что, в свою очередь, может позволить обновить Ubuntu до версии 22, а это, возможно, решит другие проблемы. Но на данный момент я не понимаю, почему обновление застревает именно на этом этапе, поэтому всё это пока лишь надежда на то, что может помочь.

Нет, это обновит до последнего коммита в указанной ветке.

Помните, что миграция на новый сервер может занять всего 30 минут.

Да, похоже, мне придётся пойти этим путём — пусть я и сентиментален, но не очень хотел бы настраивать совершенно новый сервер (на котором работают ещё несколько сервисов, помимо Discourse, который тоже нужно будет мигрировать) только ради обновления форума.

Ну что ж, такова жизнь любого, кто управляет собственным сервером.

Да, похоже, что процесс просто зависает по какой-то причине. Я не знаю почему, но обновление Docker, кажется, помогло нескольким сайтам.

Вы пробовали обновить Docker, как я упоминал выше?

Теоретически вы могли бы исправить проблему с оверлеем, если поищете решения в других местах. Именно поэтому я не доверяю обновлениям операционной системы.

Нет, но я попробую это сделать следующим шагом. Мне нужно будет запланировать ещё один период обслуживания. Мой стандартный процесс — выключать дроплет и делать его снимок, что занимает довольно много времени и составляет основную часть простоя, но гарантирует, что я смогу очень легко откатить изменения. Это уже не раз оказывалось полезным.

Поэтому я планирую следующее окно обслуживания на вторник, а затем попробую обновить Docker (а если это сработает, то также попробую переключиться на overlay). Если не получится, на следующей неделе перейду к тестированию нового сервера (или, возможно, сделаю это параллельно, так как в любом случае могу настроить новый сервер на тестовом дроплете).

Спасибо.