#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, так как он жалуется на @.
Надеюсь, это кому-нибудь поможет.