···
HOME = "${cfg.statePath}/home";
145
-
UNICORN_PATH = "${cfg.statePath}/";
145
+
PUMA_PATH = "${cfg.statePath}/";
GITLAB_PATH = "${cfg.packages.gitlab}/share/gitlab/";
SCHEMA = "${cfg.statePath}/db/structure.sql";
GITLAB_UPLOADS_PATH = "${cfg.statePath}/uploads";
···
description = "Port of the SMTP server for Gitlab.";
···
environment.systemPackages = [ pkgs.git gitlab-rake gitlab-rails cfg.packages.gitlab-shell ];
644
+
systemd.targets.gitlab = {
645
+
description = "Common target for all GitLab services.";
646
+
wantedBy = [ "multi-user.target" ];
# Redis is required for the sidekiq queue runner.
services.redis.enable = mkDefault true;
···
systemd.services.gitlab-postgresql = let pgsql = config.services.postgresql; in mkIf databaseActuallyCreateLocally {
after = [ "postgresql.service" ];
658
-
wantedBy = [ "multi-user.target" ];
659
-
path = [ pgsql.package ];
663
+
bindsTo = [ "postgresql.service" ];
664
+
wantedBy = [ "gitlab.target" ];
665
+
partOf = [ "gitlab.target" ];
663
-
PSQL="${pkgs.util-linux}/bin/runuser -u ${pgsql.superUser} -- psql --port=${toString pgsql.port}"
674
+
psql --port=${toString pgsql.port} "$@"
665
-
$PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${cfg.databaseName}'" | grep -q 1 || $PSQL -tAc 'CREATE DATABASE "${cfg.databaseName}" OWNER "${cfg.databaseUsername}"'
666
-
current_owner=$($PSQL -tAc "SELECT pg_catalog.pg_get_userbyid(datdba) FROM pg_catalog.pg_database WHERE datname = '${cfg.databaseName}'")
677
+
PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${cfg.databaseName}'" | grep -q 1 || PSQL -tAc 'CREATE DATABASE "${cfg.databaseName}" OWNER "${cfg.databaseUsername}"'
678
+
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
668
-
$PSQL -tAc 'ALTER DATABASE "${cfg.databaseName}" OWNER TO "${cfg.databaseUsername}"'
680
+
PSQL -tAc 'ALTER DATABASE "${cfg.databaseName}" OWNER TO "${cfg.databaseUsername}"'
if [[ -e "${config.services.postgresql.dataDir}/.reassigning_${cfg.databaseName}" ]]; then
echo "Reassigning ownership of database ${cfg.databaseName} to user ${cfg.databaseUsername} failed on last boot. Failing..."
touch "${config.services.postgresql.dataDir}/.reassigning_${cfg.databaseName}"
674
-
$PSQL "${cfg.databaseName}" -tAc "REASSIGN OWNED BY \"$current_owner\" TO \"${cfg.databaseUsername}\""
686
+
PSQL "${cfg.databaseName}" -tAc "REASSIGN OWNED BY \"$current_owner\" TO \"${cfg.databaseUsername}\""
rm "${config.services.postgresql.dataDir}/.reassigning_${cfg.databaseName}"
677
-
$PSQL '${cfg.databaseName}' -tAc "CREATE EXTENSION IF NOT EXISTS pg_trgm"
678
-
$PSQL '${cfg.databaseName}' -tAc "CREATE EXTENSION IF NOT EXISTS btree_gist;"
689
+
PSQL '${cfg.databaseName}' -tAc "CREATE EXTENSION IF NOT EXISTS pg_trgm"
690
+
PSQL '${cfg.databaseName}' -tAc "CREATE EXTENSION IF NOT EXISTS btree_gist;"
694
+
User = pgsql.superUser;
696
+
RemainAfterExit = true;
# Use postfix to send out mails.
687
-
services.postfix.enable = mkDefault true;
701
+
services.postfix.enable = mkDefault (cfg.smtp.enable && cfg.smtp.address == "localhost");
users.users.${cfg.user} =
···
"d ${cfg.statePath} 0750 ${cfg.user} ${cfg.group} -"
"d ${cfg.statePath}/builds 0750 ${cfg.user} ${cfg.group} -"
"d ${cfg.statePath}/config 0750 ${cfg.user} ${cfg.group} -"
706
-
"d ${cfg.statePath}/config/initializers 0750 ${cfg.user} ${cfg.group} -"
"d ${cfg.statePath}/db 0750 ${cfg.user} ${cfg.group} -"
"d ${cfg.statePath}/log 0750 ${cfg.user} ${cfg.group} -"
"d ${cfg.statePath}/repositories 2770 ${cfg.user} ${cfg.group} -"
···
"L+ /run/gitlab/uploads - - - - ${cfg.statePath}/uploads"
"L+ /run/gitlab/shell-config.yml - - - - ${pkgs.writeText "config.yml" (builtins.toJSON gitlabShellConfig)}"
730
-
"L+ ${cfg.statePath}/config/unicorn.rb - - - - ${./defaultUnicornConfig.rb}"
745
+
systemd.services.gitlab-config = {
746
+
wantedBy = [ "gitlab.target" ];
747
+
partOf = [ "gitlab.target" ];
748
+
path = with pkgs; [
758
+
TimeoutSec = "infinity";
759
+
Restart = "on-failure";
760
+
WorkingDirectory = "${cfg.packages.gitlab}/share/gitlab";
761
+
RemainAfterExit = true;
764
+
preStartFullPrivileges = ''
765
+
shopt -s dotglob nullglob
768
+
chown --no-dereference '${cfg.user}':'${cfg.group}' '${cfg.statePath}'/*
769
+
if [[ -n "$(ls -A '${cfg.statePath}'/config/)" ]]; then
770
+
chown --no-dereference '${cfg.user}':'${cfg.group}' '${cfg.statePath}'/config/*
773
+
in "+${pkgs.writeShellScript "gitlab-pre-start-full-privileges" preStartFullPrivileges}";
775
+
ExecStart = pkgs.writeShellScript "gitlab-config" ''
778
+
umask u=rwx,g=rx,o=
780
+
cp -f ${cfg.packages.gitlab}/share/gitlab/VERSION ${cfg.statePath}/VERSION
781
+
rm -rf ${cfg.statePath}/db/*
782
+
rm -f ${cfg.statePath}/lib
783
+
find '${cfg.statePath}/config/' -maxdepth 1 -mindepth 1 -type d -execdir rm -rf {} \;
784
+
cp -rf --no-preserve=mode ${cfg.packages.gitlab}/share/gitlab/config.dist/* ${cfg.statePath}/config
785
+
cp -rf --no-preserve=mode ${cfg.packages.gitlab}/share/gitlab/db/* ${cfg.statePath}/db
786
+
ln -sf ${extraGitlabRb} ${cfg.statePath}/config/initializers/extra-gitlab.rb
788
+
${cfg.packages.gitlab-shell}/bin/install
790
+
${optionalString cfg.smtp.enable ''
791
+
install -m u=rw ${smtpSettings} ${cfg.statePath}/config/initializers/smtp_settings.rb
792
+
${optionalString (cfg.smtp.passwordFile != null) ''
793
+
smtp_password=$(<'${cfg.smtp.passwordFile}')
794
+
replace-literal -e '@smtpPassword@' "$smtp_password" '${cfg.statePath}/config/initializers/smtp_settings.rb'
801
+
openssl rand -hex 32 > ${cfg.statePath}/gitlab_shell_secret
803
+
rm -f '${cfg.statePath}/config/database.yml'
805
+
${if cfg.databasePasswordFile != null then ''
806
+
export db_password="$(<'${cfg.databasePasswordFile}')"
808
+
if [[ -z "$db_password" ]]; then
809
+
>&2 echo "Database password was an empty string!"
813
+
jq <${pkgs.writeText "database.yml" (builtins.toJSON databaseConfig)} \
814
+
'.production.password = $ENV.db_password' \
815
+
>'${cfg.statePath}/config/database.yml'
818
+
jq <${pkgs.writeText "database.yml" (builtins.toJSON databaseConfig)} \
819
+
>'${cfg.statePath}/config/database.yml'
823
+
${utils.genJqSecretsReplacementSnippet
825
+
"${cfg.statePath}/config/gitlab.yml"
828
+
rm -f '${cfg.statePath}/config/secrets.yml'
830
+
export secret="$(<'${cfg.secrets.secretFile}')"
831
+
export db="$(<'${cfg.secrets.dbFile}')"
832
+
export otp="$(<'${cfg.secrets.otpFile}')"
833
+
export jws="$(<'${cfg.secrets.jwsFile}')"
834
+
jq -n '{production: {secret_key_base: $ENV.secret,
835
+
otp_key_base: $ENV.otp,
836
+
db_key_base: $ENV.db,
837
+
openid_connect_signing_key: $ENV.jws}}' \
838
+
> '${cfg.statePath}/config/secrets.yml'
841
+
# We remove potentially broken links to old gitlab-shell versions
842
+
rm -Rf ${cfg.statePath}/repositories/**/*.git/hooks
844
+
git config --global core.autocrlf "input"
849
+
systemd.services.gitlab-db-config = {
850
+
after = [ "gitlab-config.service" "gitlab-postgresql.service" "postgresql.service" ];
852
+
"gitlab-config.service"
853
+
] ++ optional (cfg.databaseHost == "") "postgresql.service"
854
+
++ optional databaseActuallyCreateLocally "gitlab-postgresql.service";
855
+
wantedBy = [ "gitlab.target" ];
856
+
partOf = [ "gitlab.target" ];
861
+
TimeoutSec = "infinity";
862
+
Restart = "on-failure";
863
+
WorkingDirectory = "${cfg.packages.gitlab}/share/gitlab";
864
+
RemainAfterExit = true;
866
+
ExecStart = pkgs.writeShellScript "gitlab-db-config" ''
868
+
umask u=rwx,g=rx,o=
870
+
initial_root_password="$(<'${cfg.initialRootPasswordFile}')"
871
+
${gitlab-rake}/bin/gitlab-rake gitlab:db:configure GITLAB_ROOT_PASSWORD="$initial_root_password" \
872
+
GITLAB_ROOT_EMAIL='${cfg.initialRootEmail}' > /dev/null
systemd.services.gitlab-sidekiq = {
734
-
after = [ "network.target" "redis.service" "gitlab.service" ];
735
-
wantedBy = [ "multi-user.target" ];
881
+
"postgresql.service"
882
+
"gitlab-config.service"
883
+
"gitlab-db-config.service"
887
+
"gitlab-config.service"
888
+
"gitlab-db-config.service"
889
+
] ++ optional (cfg.databaseHost == "") "postgresql.service";
890
+
wantedBy = [ "gitlab.target" ];
891
+
partOf = [ "gitlab.target" ];
···
systemd.services.gitaly = {
761
-
after = [ "network.target" "gitlab.service" ];
762
-
bindsTo = [ "gitlab.service" ];
763
-
wantedBy = [ "multi-user.target" ];
917
+
after = [ "network.target" "gitlab-config.service" ];
918
+
bindsTo = [ "gitlab-config.service" ];
919
+
wantedBy = [ "gitlab.target" ];
920
+
partOf = [ "gitlab.target" ];
procps # See https://gitlab.com/gitlab-org/gitaly/issues/1562
···
systemd.services.gitlab-pages = mkIf (gitlabConfig.production.pages.enabled or false) {
description = "GitLab static pages daemon";
786
-
after = [ "network.target" "redis.service" "gitlab.service" ]; # gitlab.service creates configs
787
-
wantedBy = [ "multi-user.target" ];
943
+
after = [ "network.target" "gitlab-config.service" ];
944
+
bindsTo = [ "gitlab-config.service" ];
945
+
wantedBy = [ "gitlab.target" ];
946
+
partOf = [ "gitlab.target" ];
···
systemd.services.gitlab-workhorse = {
after = [ "network.target" ];
806
-
wantedBy = [ "multi-user.target" ];
965
+
wantedBy = [ "gitlab.target" ];
966
+
partOf = [ "gitlab.target" ];
···
systemd.services.gitlab-mailroom = mkIf (gitlabConfig.production.incoming_email.enabled or false) {
description = "GitLab incoming mail daemon";
835
-
after = [ "network.target" "redis.service" "gitlab.service" ]; # gitlab.service creates configs
836
-
wantedBy = [ "multi-user.target" ];
995
+
after = [ "network.target" "redis.service" "gitlab-config.service" ];
996
+
bindsTo = [ "gitlab-config.service" ];
997
+
wantedBy = [ "gitlab.target" ];
998
+
partOf = [ "gitlab.target" ];
···
845
-
ExecStart = "${cfg.packages.gitlab.rubyEnv}/bin/bundle exec mail_room -c ${cfg.packages.gitlab}/share/gitlab/config.dist/mail_room.yml";
1007
+
ExecStart = "${cfg.packages.gitlab.rubyEnv}/bin/bundle exec mail_room -c ${cfg.statePath}/config/mail_room.yml";
WorkingDirectory = gitlabEnv.HOME;
systemd.services.gitlab = {
851
-
after = [ "gitlab-workhorse.service" "network.target" "gitlab-postgresql.service" "redis.service" ];
852
-
requires = [ "gitlab-sidekiq.service" ];
853
-
wantedBy = [ "multi-user.target" ];
1014
+
"gitlab-workhorse.service"
1017
+
"gitlab-config.service"
1018
+
"gitlab-db-config.service"
1022
+
"gitlab-config.service"
1023
+
"gitlab-db-config.service"
1024
+
] ++ optional (cfg.databaseHost == "") "postgresql.service";
1025
+
wantedBy = [ "gitlab.target" ];
1026
+
partOf = [ "gitlab.target" ];
···
WorkingDirectory = "${cfg.packages.gitlab}/share/gitlab";
872
-
preStartFullPrivileges = ''
873
-
shopt -s dotglob nullglob
876
-
chown --no-dereference '${cfg.user}':'${cfg.group}' '${cfg.statePath}'/*
877
-
chown --no-dereference '${cfg.user}':'${cfg.group}' '${cfg.statePath}'/config/*
882
-
cp -f ${cfg.packages.gitlab}/share/gitlab/VERSION ${cfg.statePath}/VERSION
883
-
rm -rf ${cfg.statePath}/db/*
884
-
rm -rf ${cfg.statePath}/config/initializers/*
885
-
rm -f ${cfg.statePath}/lib
886
-
cp -rf --no-preserve=mode ${cfg.packages.gitlab}/share/gitlab/config.dist/* ${cfg.statePath}/config
887
-
cp -rf --no-preserve=mode ${cfg.packages.gitlab}/share/gitlab/db/* ${cfg.statePath}/db
888
-
ln -sf ${extraGitlabRb} ${cfg.statePath}/config/initializers/extra-gitlab.rb
890
-
${cfg.packages.gitlab-shell}/bin/install
892
-
${optionalString cfg.smtp.enable ''
893
-
install -m u=rw ${smtpSettings} ${cfg.statePath}/config/initializers/smtp_settings.rb
894
-
${optionalString (cfg.smtp.passwordFile != null) ''
895
-
smtp_password=$(<'${cfg.smtp.passwordFile}')
896
-
${pkgs.replace}/bin/replace-literal -e '@smtpPassword@' "$smtp_password" '${cfg.statePath}/config/initializers/smtp_settings.rb'
903
-
${pkgs.openssl}/bin/openssl rand -hex 32 > ${cfg.statePath}/gitlab_shell_secret
905
-
if [[ -h '${cfg.statePath}/config/database.yml' ]]; then
906
-
rm '${cfg.statePath}/config/database.yml'
909
-
${if cfg.databasePasswordFile != null then ''
910
-
export db_password="$(<'${cfg.databasePasswordFile}')"
912
-
if [[ -z "$db_password" ]]; then
913
-
>&2 echo "Database password was an empty string!"
917
-
${pkgs.jq}/bin/jq <${pkgs.writeText "database.yml" (builtins.toJSON databaseConfig)} \
918
-
'.production.password = $ENV.db_password' \
919
-
>'${cfg.statePath}/config/database.yml'
922
-
${pkgs.jq}/bin/jq <${pkgs.writeText "database.yml" (builtins.toJSON databaseConfig)} \
923
-
>'${cfg.statePath}/config/database.yml'
927
-
${utils.genJqSecretsReplacementSnippet
929
-
"${cfg.statePath}/config/gitlab.yml"
932
-
if [[ -h '${cfg.statePath}/config/secrets.yml' ]]; then
933
-
rm '${cfg.statePath}/config/secrets.yml'
936
-
export secret="$(<'${cfg.secrets.secretFile}')"
937
-
export db="$(<'${cfg.secrets.dbFile}')"
938
-
export otp="$(<'${cfg.secrets.otpFile}')"
939
-
export jws="$(<'${cfg.secrets.jwsFile}')"
940
-
${pkgs.jq}/bin/jq -n '{production: {secret_key_base: $ENV.secret,
941
-
otp_key_base: $ENV.otp,
942
-
db_key_base: $ENV.db,
943
-
openid_connect_signing_key: $ENV.jws}}' \
944
-
> '${cfg.statePath}/config/secrets.yml'
947
-
initial_root_password="$(<'${cfg.initialRootPasswordFile}')"
948
-
${gitlab-rake}/bin/gitlab-rake gitlab:db:configure GITLAB_ROOT_PASSWORD="$initial_root_password" \
949
-
GITLAB_ROOT_EMAIL='${cfg.initialRootEmail}' > /dev/null
951
-
# We remove potentially broken links to old gitlab-shell versions
952
-
rm -Rf ${cfg.statePath}/repositories/**/*.git/hooks
954
-
${pkgs.git}/bin/git config --global core.autocrlf "input"
957
-
"+${pkgs.writeShellScript "gitlab-pre-start-full-privileges" preStartFullPrivileges}"
958
-
"${pkgs.writeShellScript "gitlab-pre-start" preStart}"
960
-
ExecStart = "${cfg.packages.gitlab.rubyEnv}/bin/unicorn -c ${cfg.statePath}/config/unicorn.rb -E production";
1044
+
ExecStart = "${cfg.packages.gitlab.rubyEnv}/bin/puma -C ${cfg.statePath}/config/puma.rb -e production";