Настройка Azure PostgreSQL в Gitlab EE

#gitlab #sidekiq #gitlab-omnibus #azure-postgresql #gitlab-ee

# #gitlab #sidekiq #gitlab-омнибус #azure-postgresql #gitlab-ee

Вопрос:

Я ищу некоторую помощь в настройке Azure PostgreSQL DB в экземпляре Gitlab на основе Docker Swarm.

Первоначально я следовал документации в https://docs.gitlab.com/13.6/ee/administration/postgresql/external.html . Тем не менее, я узнал, что по умолчанию предоставленный пользователь представлен в виде имени пользователя, тогда как Azure требует, чтобы он был в форме username@hostname . Я попытался передать имя пользователя в файле gitlab.rb ( gitlab_rails['db_username'] = 'username@hostname' ), но это все равно не удалось, даже после замены @ на @ в кодировке URI.

После некоторого тщательного поиска я нашел эту документацию — https://docs.gitlab.com/13.6/ee/administration/environment_variables.html , который предлагает использовать переменную DATABASE_URL среды для установки полной строки подключения в форме postgresql://username:password@hostname:port/dbname , что я и сделал, и это решило проблему для самой Gitlab, взаимодействующей с Azure PostgreSQL (в этом случае я заменил имя пользователя на username@hostname, согласно Azureтребования).

Аллас, успех был недолгим, с тех пор я узнал, что ни Puma, ни Sidekiq не могут подключиться к базе данных, всегда выдавая следующую ошибку:

 ==> /var/log/gitlab/sidekiq/current <==
could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"?
 

После некоторого поиска я обнаружил, что gitlab-ctl при запуске экземпляра Gitlab генерируется следующий файл:

 # This file is managed by gitlab-ctl. Manual changes will be
# erased! To change the contents below, edit /etc/gitlab/gitlab.rb
# and run `sudo gitlab-ctl reconfigure`.
production:
  adapter: postgresql
  encoding: unicode
  collation:
  database: <database>
  username: "<username>"
  password:
  host: "/var/opt/gitlab/postgresql"
  port: 5432
  socket:
  sslmode:
  sslcompression: 0
  sslrootcert:
  sslca:
  load_balancing: {"hosts":[]}
  prepared_statements: false
  statement_limit: 1000
  connect_timeout:
  variables:
    statement_timeout:
 

(база данных и имя пользователя удалены)

В значительной степени он игнорирует переменную DATABASE_URL env и принимает теперь несуществующие параметры конфигурации в gitlab.rb.

Итак, прямо сейчас у меня немного нет вариантов, и мне было интересно, сталкивался ли кто-нибудь с подобной проблемой, и если да, то как вы можете это преодолеть.

Любая помощь приветствуется.

Заранее благодарю.

Ответ №1:

TL / DR: передайте username@hostname строку непосредственно в gitlab_rails[‘db_username’] в двойных кавычках. Документация для подключения к Azure PostgreSQL на официальной странице Gitlab неверна.

Итак, после некоторого поиска и углубления в конфигурацию Gitlab я обнаружил, что проблема очень специфична и связана с использованием секретов docker.

В моем файле конфигурации gitlab.rb в части конфигурации базы данных я использую следующее:

 ### GitLab database settings
###! Docs: https://docs.gitlab.com/omnibus/settings/database.html
###! **Only needed if you use an external database.**
gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "unicode"
gitlab_rails['db_database'] = File.read('/run/secrets/postgresql_database')
gitlab_rails['db_username'] = File.read('/run/secrets/postgresql_user')
gitlab_rails['db_password'] = File.read('/run/secrets/postgresql_password')
gitlab_rails['db_host'] = File.read('/run/secrets/postgresql_host')
gitlab_rails['db_port'] = File.read('/run/secrets/postgresql_port')
gitlab_rails['db_sslmode'] = 'require'
 

Теперь эта точная конфигурация использовалась ранее для целей тестирования и работала (но без использования базы данных Azure PostgreSQL). И я передаю правильные секреты в docker, и я подтвердил, что секреты на самом деле существуют.

(Примечание: кроме того, я установил, что Gitlab использует метод ActiveRecord::Base.establish_connection из библиотеки Ruby ActiveRecord::Base для подключения к базе данных)

Тем не менее, при использовании конфигурации username@hostname для пользователя и передаче ее в секрет postgresql_user, внезапно метод ActiveRecord::Base.establish_connection предполагает, что @hostname это фактическое имя хоста, к которому я хочу подключиться. И я подтвердил, что секрет генерируется правильно внутри контейнера docker

Теперь это становится еще более странным, потому что, если я передаю строку username@hostname непосредственно в файл gitlab.rb — параметр gitlab_rails [‘db_username’] — в двойных кавычках, он внезапно начинает подключаться без жалоб.

Короче говоря, если вы используете базу данных Azure PostgreSQL для настроенного экземпляра Gitlab и используете секреты для передачи конфигурации в файл gitlab.rb, не передавайте username@hostame через секрет, а поместите его непосредственно в файл gitlab.rb.

Я не знаю, является ли это конкретной проблемой Ruby или Gitlab (я не разработчик Ruby), но я попытался преобразовать вывод File.read в строку, в символ, использовал File.open(‘filepath’, amp;:readline) и другие махинации,но ничего не сработало. Итак, если кто-нибудь захочет добавить свою причину для этого, пожалуйста, не стесняйтесь это делать.

Кроме того, руководство, предоставленное Azure — https://docs.microsoft.com/pt-pt/azure/postgresql/connect-ruby — не работает с Gitlab, так как он жалуется на @.

Надеюсь, это кому-нибудь поможет.