files/gitlab-cookbooks/gitlab-ee/recipes/geo-postgresql.rb (144 lines of code) (raw):
#
# Copyright:: Copyright (c) 2012 Opscode, Inc.
# Copyright:: Copyright (c) 2017 GitLab Inc.
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
include_recipe 'postgresql::bin'
include_recipe 'postgresql::user'
include_recipe 'postgresql::sysctl'
account_helper = AccountHelper.new(node)
omnibus_helper = OmnibusHelper.new(node)
logfiles_helper = LogfilesHelper.new(node)
logging_settings = logfiles_helper.logging_settings('geo-postgresql')
postgresql_username = account_helper.postgresql_user
postgresql_data_dir = File.join(node['gitlab']['geo_postgresql']['dir'], 'data')
geo_pg_helper = GeoPgHelper.new(node)
database_version = geo_pg_helper.pinned_postgresql_version || geo_pg_helper.database_version || geo_pg_helper.version
directory node['gitlab']['geo_postgresql']['dir'] do
owner postgresql_username
mode '0755'
recursive true
end
directory postgresql_data_dir do
owner postgresql_username
mode '0700'
recursive true
end
# Create log_directory
directory logging_settings[:log_directory] do
owner logging_settings[:log_directory_owner]
mode logging_settings[:log_directory_mode]
if log_group = logging_settings[:log_directory_group]
group log_group
end
recursive true
end
execute "/opt/gitlab/embedded/bin/initdb -D #{postgresql_data_dir} -E UTF8" do
user postgresql_username
not_if { geo_pg_helper.bootstrapped? }
end
postgresql_config = File.join(postgresql_data_dir, 'postgresql.conf')
postgresql_runtime_config = File.join(postgresql_data_dir, 'runtime.conf')
bootstrapping = !geo_pg_helper.bootstrapped?
should_notify = omnibus_helper.should_notify?('geo-postgresql') && !bootstrapping
template postgresql_config do
source 'postgresql.conf.erb'
owner postgresql_username
mode '0644'
helper(:pg_helper) { geo_pg_helper }
variables(node['gitlab']['geo_postgresql'].to_hash)
cookbook 'postgresql'
notifies :restart, 'runit_service[geo-postgresql]', :immediately if should_notify
end
template postgresql_runtime_config do
source 'postgresql-runtime.conf.erb'
owner postgresql_username
mode '0644'
helper(:pg_helper) { geo_pg_helper }
variables(node['gitlab']['geo_postgresql'].to_hash)
cookbook 'postgresql'
notifies :run, 'execute[reload geo-postgresql]', :immediately if should_notify
end
pg_hba_config = File.join(postgresql_data_dir, 'pg_hba.conf')
template pg_hba_config do
source 'pg_hba.conf.erb'
owner postgresql_username
mode '0644'
variables(lazy { node['gitlab']['geo_postgresql'].to_hash })
cookbook 'postgresql'
notifies :restart, 'runit_service[geo-postgresql]', :immediately if should_notify
end
template File.join(postgresql_data_dir, 'pg_ident.conf') do
owner postgresql_username
mode '0644'
variables(node['gitlab']['geo_postgresql'].to_hash)
cookbook 'postgresql'
notifies :restart, 'runit_service[geo-postgresql]', :immediately if should_notify
end
runit_service 'geo-postgresql' do
start_down node['gitlab']['geo_postgresql']['ha']
restart_on_update false
control(['t'])
options({
log_directory: logging_settings[:log_directory],
log_user: logging_settings[:runit_owner],
log_group: logging_settings[:runit_group],
database_version: database_version.major
}.merge(params))
log_options logging_settings[:options]
end
execute 'start geo-postgresql' do
command '/opt/gitlab/bin/gitlab-ctl start geo-postgresql'
retries 20
action :nothing unless bootstrapping
end
###
# Create the database, migrate it, and create the users we need, and grant them
# privileges.
###
# This template is needed to make the gitlab-geo-psql script and GeoPgHelper work
template '/opt/gitlab/etc/gitlab-geo-psql-rc' do
owner 'root'
group 'root'
end
geo_pg_port = node['gitlab']['geo_postgresql']['port']
geo_pg_user = node['gitlab']['geo_postgresql']['sql_user']
geo_pg_user_password = node['gitlab']['geo_postgresql']['sql_user_password']
geo_database_name = node['gitlab']['geo_secondary']['db_database']
if node['gitlab']['geo_postgresql']['enable']
postgresql_user geo_pg_user do
password "md5#{geo_pg_user_password}" unless geo_pg_user_password.nil?
helper geo_pg_helper
action :create
end
postgresql_database geo_database_name do
owner geo_pg_user
database_port geo_pg_port
database_socket node['gitlab']['geo_postgresql']['unix_socket_directory']
helper geo_pg_helper
action :create
end
postgresql_extension 'pg_trgm' do
database geo_database_name
helper geo_pg_helper
action :enable
end
version_file 'Create version file for PostgreSQL' do
version_file_path File.join(node['gitlab']['geo_postgresql']['dir'], 'VERSION')
version_check_cmd "/opt/gitlab/embedded/bin/postgres --version"
notifies :restart, 'runit_service[geo-postgresql]', :immediately if node['gitlab']['geo_postgresql']['auto_restart_on_version_change'] && geo_pg_helper.is_running? && should_notify
end
ruby_block 'warn pending geo-postgresql restart' do
block do
message = <<~MESSAGE
The version of the running geo-postgresql service is different than what is installed.
Please restart geo-postgresql to start the new version.
sudo gitlab-ctl restart geo-postgresql
MESSAGE
LoggingHelper.warning(message)
end
only_if { geo_pg_helper.is_running? && geo_pg_helper.running_version != geo_pg_helper.version }
not_if { node['gitlab']['geo_postgresql']['auto_restart_on_version_change'] }
end
end
execute 'reload geo-postgresql' do
command %(/opt/gitlab/bin/gitlab-ctl hup geo-postgresql)
retries 20
action :nothing
only_if { geo_pg_helper.is_running? }
end
execute 'start geo-postgresql again' do
command %(/opt/gitlab/bin/gitlab-ctl start geo-postgresql)
retries 20
action :nothing
not_if { geo_pg_helper.is_running? }
end