Merge pull request #69344 from talyz/gitlab-create-database
nixos/gitlab: Fix databaseCreateLocally evaluation and operation
This commit is contained in:
commit
b5449e65b5
|
@ -7,6 +7,11 @@ let
|
||||||
|
|
||||||
ruby = cfg.packages.gitlab.ruby;
|
ruby = cfg.packages.gitlab.ruby;
|
||||||
|
|
||||||
|
postgresqlPackage = if config.services.postgresql.enable then
|
||||||
|
config.services.postgresql.package
|
||||||
|
else
|
||||||
|
pkgs.postgresql;
|
||||||
|
|
||||||
gitlabSocket = "${cfg.statePath}/tmp/sockets/gitlab.socket";
|
gitlabSocket = "${cfg.statePath}/tmp/sockets/gitlab.socket";
|
||||||
gitalySocket = "${cfg.statePath}/tmp/sockets/gitaly.socket";
|
gitalySocket = "${cfg.statePath}/tmp/sockets/gitaly.socket";
|
||||||
pathUrlQuote = url: replaceStrings ["/"] ["%2F"] url;
|
pathUrlQuote = url: replaceStrings ["/"] ["%2F"] url;
|
||||||
|
@ -22,6 +27,9 @@ let
|
||||||
} // cfg.extraDatabaseConfig;
|
} // cfg.extraDatabaseConfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# We only want to create a database if we're actually going to connect to it.
|
||||||
|
databaseActuallyCreateLocally = cfg.databaseCreateLocally && cfg.databaseHost == "";
|
||||||
|
|
||||||
gitalyToml = pkgs.writeText "gitaly.toml" ''
|
gitalyToml = pkgs.writeText "gitaly.toml" ''
|
||||||
socket_path = "${lib.escape ["\""] gitalySocket}"
|
socket_path = "${lib.escape ["\""] gitalySocket}"
|
||||||
bin_dir = "${cfg.packages.gitaly}/bin"
|
bin_dir = "${cfg.packages.gitaly}/bin"
|
||||||
|
@ -138,7 +146,7 @@ let
|
||||||
mkdir -p $out/bin
|
mkdir -p $out/bin
|
||||||
makeWrapper ${cfg.packages.gitlab.rubyEnv}/bin/rake $out/bin/gitlab-rake \
|
makeWrapper ${cfg.packages.gitlab.rubyEnv}/bin/rake $out/bin/gitlab-rake \
|
||||||
${concatStrings (mapAttrsToList (name: value: "--set ${name} '${value}' ") gitlabEnv)} \
|
${concatStrings (mapAttrsToList (name: value: "--set ${name} '${value}' ") gitlabEnv)} \
|
||||||
--set PATH '${lib.makeBinPath [ pkgs.nodejs pkgs.gzip pkgs.git pkgs.gnutar config.services.postgresql.package pkgs.coreutils pkgs.procps ]}:$PATH' \
|
--set PATH '${lib.makeBinPath [ pkgs.nodejs pkgs.gzip pkgs.git pkgs.gnutar postgresqlPackage pkgs.coreutils pkgs.procps ]}:$PATH' \
|
||||||
--set RAKEOPT '-f ${cfg.packages.gitlab}/share/gitlab/Rakefile' \
|
--set RAKEOPT '-f ${cfg.packages.gitlab}/share/gitlab/Rakefile' \
|
||||||
--run 'cd ${cfg.packages.gitlab}/share/gitlab'
|
--run 'cd ${cfg.packages.gitlab}/share/gitlab'
|
||||||
'';
|
'';
|
||||||
|
@ -153,7 +161,7 @@ let
|
||||||
mkdir -p $out/bin
|
mkdir -p $out/bin
|
||||||
makeWrapper ${cfg.packages.gitlab.rubyEnv}/bin/rails $out/bin/gitlab-rails \
|
makeWrapper ${cfg.packages.gitlab.rubyEnv}/bin/rails $out/bin/gitlab-rails \
|
||||||
${concatStrings (mapAttrsToList (name: value: "--set ${name} '${value}' ") gitlabEnv)} \
|
${concatStrings (mapAttrsToList (name: value: "--set ${name} '${value}' ") gitlabEnv)} \
|
||||||
--set PATH '${lib.makeBinPath [ pkgs.nodejs pkgs.gzip pkgs.git pkgs.gnutar config.services.postgresql.package pkgs.coreutils pkgs.procps ]}:$PATH' \
|
--set PATH '${lib.makeBinPath [ pkgs.nodejs pkgs.gzip pkgs.git pkgs.gnutar postgresqlPackage pkgs.coreutils pkgs.procps ]}:$PATH' \
|
||||||
--run 'cd ${cfg.packages.gitlab}/share/gitlab'
|
--run 'cd ${cfg.packages.gitlab}/share/gitlab'
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
@ -266,8 +274,8 @@ in {
|
||||||
description = ''
|
description = ''
|
||||||
Whether a database should be automatically created on the
|
Whether a database should be automatically created on the
|
||||||
local host. Set this to <literal>false</literal> if you plan
|
local host. Set this to <literal>false</literal> if you plan
|
||||||
on provisioning a local database yourself or use an external
|
on provisioning a local database yourself. This has no effect
|
||||||
one.
|
if <option>services.gitlab.databaseHost</option> is customized.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -557,8 +565,8 @@ in {
|
||||||
|
|
||||||
assertions = [
|
assertions = [
|
||||||
{
|
{
|
||||||
assertion = cfg.databaseCreateLocally -> (cfg.user == cfg.databaseUsername);
|
assertion = databaseActuallyCreateLocally -> (cfg.user == cfg.databaseUsername);
|
||||||
message = "For local automatic database provisioning services.gitlab.user and services.gitlab.databaseUsername should be identical.";
|
message = ''For local automatic database provisioning (services.gitlab.databaseCreateLocally == true) with peer authentication (services.gitlab.databaseHost == "") to work services.gitlab.user and services.gitlab.databaseUsername must be identical.'';
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
assertion = (cfg.databaseHost != "") -> (cfg.databasePasswordFile != null);
|
assertion = (cfg.databaseHost != "") -> (cfg.databasePasswordFile != null);
|
||||||
|
@ -592,14 +600,14 @@ in {
|
||||||
services.redis.enable = mkDefault true;
|
services.redis.enable = mkDefault true;
|
||||||
|
|
||||||
# We use postgres as the main data store.
|
# We use postgres as the main data store.
|
||||||
services.postgresql = optionalAttrs cfg.databaseCreateLocally {
|
services.postgresql = optionalAttrs databaseActuallyCreateLocally {
|
||||||
enable = true;
|
enable = true;
|
||||||
ensureUsers = singleton { name = cfg.databaseUsername; };
|
ensureUsers = singleton { name = cfg.databaseUsername; };
|
||||||
};
|
};
|
||||||
# The postgresql module doesn't currently support concepts like
|
# The postgresql module doesn't currently support concepts like
|
||||||
# objects owners and extensions; for now we tack on what's needed
|
# objects owners and extensions; for now we tack on what's needed
|
||||||
# here.
|
# here.
|
||||||
systemd.services.postgresql.postStart = mkAfter (optionalString cfg.databaseCreateLocally ''
|
systemd.services.postgresql.postStart = mkAfter (optionalString databaseActuallyCreateLocally ''
|
||||||
$PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${cfg.databaseName}'" | grep -q 1 || $PSQL -tAc 'CREATE DATABASE "${cfg.databaseName}" OWNER "${cfg.databaseUsername}"'
|
$PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${cfg.databaseName}'" | grep -q 1 || $PSQL -tAc 'CREATE DATABASE "${cfg.databaseName}" OWNER "${cfg.databaseUsername}"'
|
||||||
current_owner=$($PSQL -tAc "SELECT pg_catalog.pg_get_userbyid(datdba) FROM pg_catalog.pg_database WHERE datname = '${cfg.databaseName}'")
|
current_owner=$($PSQL -tAc "SELECT pg_catalog.pg_get_userbyid(datdba) FROM pg_catalog.pg_database WHERE datname = '${cfg.databaseName}'")
|
||||||
if [[ "$current_owner" != "${cfg.databaseUsername}" ]]; then
|
if [[ "$current_owner" != "${cfg.databaseUsername}" ]]; then
|
||||||
|
@ -675,7 +683,7 @@ in {
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
environment = gitlabEnv;
|
environment = gitlabEnv;
|
||||||
path = with pkgs; [
|
path = with pkgs; [
|
||||||
config.services.postgresql.package
|
postgresqlPackage
|
||||||
gitAndTools.git
|
gitAndTools.git
|
||||||
ruby
|
ruby
|
||||||
openssh
|
openssh
|
||||||
|
@ -756,7 +764,7 @@ in {
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
environment = gitlabEnv;
|
environment = gitlabEnv;
|
||||||
path = with pkgs; [
|
path = with pkgs; [
|
||||||
config.services.postgresql.package
|
postgresqlPackage
|
||||||
gitAndTools.git
|
gitAndTools.git
|
||||||
openssh
|
openssh
|
||||||
nodejs
|
nodejs
|
||||||
|
|
Loading…
Reference in New Issue
Block a user