Всем привет.
У меня возникла проблема при пересборке (обновлении) Discourse. В логе я обнаружил, что во время настройки Redis запускается в первый раз без проблем, но через некоторое время настройка пытается запустить его снова и завершается с ошибкой «server TCP listening socket *:6379: bind: Address already in use».
После нескольких попыток и ошибок, в том числе с помощью Gemini, я добавил этот фрагмент кода в файл app.yml:
hooks: before_db_migrate: - exec: cmd: - "pkill -9 redis-server || true" - "sleep 2" - "exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf &" - "sleep 5"
В итоге пересборка завершилась успешно.
Ниже приведён фрагмент лога, где мой фикс убивает упрямый экземпляр Redis и запускает его заново:
389:C 24 Feb 2026 17:07:21.756 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
389:C 24 Feb 2026 17:07:21.756 * Redis version=7.4.7, bits=64, commit=00000000, modified=1, pid=389, just started
389:C 24 Feb 2026 17:07:21.756 * Configuration loaded
389:M 24 Feb 2026 17:07:21.756 * monotonic clock: POSIX clock_gettime
389:M 24 Feb 2026 17:07:21.757 * Running mode=standalone, port=6379.
389:M 24 Feb 2026 17:07:21.757 # Warning: Could not create server TCP listening socket *:6379: bind: Address already in use
389:M 24 Feb 2026 17:07:21.757 # Failed listening on port 6379 (tcp), aborting.
I, [2026-02-24T17:07:31.750972 #1] INFO -- : > pkill -9 redis-server || true
I, [2026-02-24T17:07:31.758767 #1] INFO -- : > sleep 2
I, [2026-02-24T17:07:33.761955 #1] INFO -- : > exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf &
I, [2026-02-24T17:07:33.765205 #1] INFO -- : > sleep 5
396:C 24 Feb 2026 17:07:33.773 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
396:C 24 Feb 2026 17:07:33.773 * Redis version=7.4.7, bits=64, commit=00000000, modified=1, pid=396, just started
396:C 24 Feb 2026 17:07:33.773 * Configuration loaded
396:M 24 Feb 2026 17:07:33.773 * monotonic clock: POSIX clock_gettime
396:M 24 Feb 2026 17:07:33.774 * Running mode=standalone, port=6379.
396:M 24 Feb 2026 17:07:33.775 * Server initialized
396:M 24 Feb 2026 17:07:33.776 * Loading RDB produced by version 7.4.7
396:M 24 Feb 2026 17:07:33.776 * RDB age 19606 seconds
396:M 24 Feb 2026 17:07:33.776 * RDB memory usage when created 4.60 Mb
396:M 24 Feb 2026 17:07:33.787 * Done loading RDB, keys loaded: 3413, keys expired: 1.
396:M 24 Feb 2026 17:07:33.788 * DB loaded from disk: 0.013 seconds
396:M 24 Feb 2026 17:07:33.788 * Ready to accept connections tcp
Теперь мой вопрос: ПОЧЕМУ происходит два запуска Redis? И почему второй запуск обнаруживает, что первый всё ещё держит порт 6379? И почему не используется уже запущенный экземпляр, если он доступен?
И, наконец, что могло вызвать эту проблему? Я прекрасно понимаю, что наложил пластырь на рану, не зная, почему она появилась, но хотя бы теперь всё работает.
Прежде чем кто-то спросит: НЕТ, у меня не запущен никакой другой Redis вне Discourse (иначе первая попытка в начале пересборки сразу бы упала), и ДА, Discourse работает в окружении Docker вместе со многими другими контейнерами, хотя до нескольких обновлений назад подобных проблем не возникало.
Буду благодарен за любую помощь и подсказки. Извините, если эта проблема уже обсуждалась в другой теме, но я искал безрезультатно.