|
292 | 292 |
|
293 | 293 | preStart = |
294 | 294 | '' |
295 | | - # Cleanup the data directory. |
296 | 295 | if ! test -e ${cfg.dataDir}/PG_VERSION; then |
| 296 | + # Cleanup the data directory. |
297 | 297 | rm -f ${cfg.dataDir}/*.conf |
298 | | - fi |
299 | | - ''; |
300 | 298 |
|
301 | | - script = |
302 | | - '' |
303 | | - # Initialise the database. |
304 | | - if ! test -e ${cfg.dataDir}/PG_VERSION; then |
| 299 | + # Initialise the database. |
305 | 300 | initdb -U ${cfg.superUser} ${concatStringsSep " " cfg.initdbArgs} |
| 301 | +
|
306 | 302 | # See postStart! |
307 | 303 | touch "${cfg.dataDir}/.first_startup" |
308 | 304 | fi |
| 305 | +
|
309 | 306 | ln -sfn "${configFile}" "${cfg.dataDir}/postgresql.conf" |
310 | 307 | ${optionalString (cfg.recoveryConfig != null) '' |
311 | 308 | ln -sfn "${pkgs.writeText "recovery.conf" cfg.recoveryConfig}" \ |
312 | 309 | "${cfg.dataDir}/recovery.conf" |
313 | 310 | ''} |
314 | | -
|
315 | | - exec postgres |
316 | 311 | ''; |
317 | 312 |
|
318 | 313 | serviceConfig = mkMerge [ |
319 | 314 | { ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; |
320 | 315 | User = "postgres"; |
321 | 316 | Group = "postgres"; |
322 | | - PermissionsStartOnly = true; |
323 | 317 | RuntimeDirectory = "postgresql"; |
324 | 318 | Type = if versionAtLeast cfg.package.version "9.6" |
325 | 319 | then "notify" |
|
333 | 327 | # Give Postgres a decent amount of time to clean up after |
334 | 328 | # receiving systemd's SIGINT. |
335 | 329 | TimeoutSec = 120; |
| 330 | + |
| 331 | + ExecStart = "${postgresql}/bin/postgres"; |
| 332 | + |
| 333 | + # Wait for PostgreSQL to be ready to accept connections. |
| 334 | + ExecStartPost = |
| 335 | + let |
| 336 | + setupScript = pkgs.writeScript "postgresql-setup" '' |
| 337 | + #!${pkgs.runtimeShell} -e |
| 338 | +
|
| 339 | + PSQL="${pkgs.utillinux}/bin/runuser -u ${cfg.superUser} -- psql --port=${toString cfg.port}" |
| 340 | +
|
| 341 | + while ! $PSQL -d postgres -c "" 2> /dev/null; do |
| 342 | + if ! kill -0 "$MAINPID"; then exit 1; fi |
| 343 | + sleep 0.1 |
| 344 | + done |
| 345 | +
|
| 346 | + if test -e "${cfg.dataDir}/.first_startup"; then |
| 347 | + ${optionalString (cfg.initialScript != null) '' |
| 348 | + $PSQL -f "${cfg.initialScript}" -d postgres |
| 349 | + ''} |
| 350 | + rm -f "${cfg.dataDir}/.first_startup" |
| 351 | + fi |
| 352 | + '' + optionalString (cfg.ensureDatabases != []) '' |
| 353 | + ${concatMapStrings (database: '' |
| 354 | + $PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${database}'" | grep -q 1 || $PSQL -tAc 'CREATE DATABASE "${database}"' |
| 355 | + '') cfg.ensureDatabases} |
| 356 | + '' + '' |
| 357 | + ${concatMapStrings (user: '' |
| 358 | + $PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='${user.name}'" | grep -q 1 || $PSQL -tAc 'CREATE USER "${user.name}"' |
| 359 | + ${concatStringsSep "\n" (mapAttrsToList (database: permission: '' |
| 360 | + $PSQL -tAc 'GRANT ${permission} ON ${database} TO "${user.name}"' |
| 361 | + '') user.ensurePermissions)} |
| 362 | + '') cfg.ensureUsers} |
| 363 | + ''; |
| 364 | + in |
| 365 | + "+${setupScript}"; |
336 | 366 | } |
337 | 367 | (mkIf (cfg.dataDir == "/var/lib/postgresql/${cfg.package.psqlSchema}") { |
338 | 368 | StateDirectory = "postgresql postgresql/${cfg.package.psqlSchema}"; |
339 | 369 | StateDirectoryMode = if groupAccessAvailable then "0750" else "0700"; |
340 | 370 | }) |
341 | 371 | ]; |
342 | 372 |
|
343 | | - # Wait for PostgreSQL to be ready to accept connections. |
344 | | - postStart = |
345 | | - '' |
346 | | - PSQL="${pkgs.utillinux}/bin/runuser -u ${cfg.superUser} -- psql --port=${toString cfg.port}" |
347 | | -
|
348 | | - while ! $PSQL -d postgres -c "" 2> /dev/null; do |
349 | | - if ! kill -0 "$MAINPID"; then exit 1; fi |
350 | | - sleep 0.1 |
351 | | - done |
352 | | -
|
353 | | - if test -e "${cfg.dataDir}/.first_startup"; then |
354 | | - ${optionalString (cfg.initialScript != null) '' |
355 | | - $PSQL -f "${cfg.initialScript}" -d postgres |
356 | | - ''} |
357 | | - rm -f "${cfg.dataDir}/.first_startup" |
358 | | - fi |
359 | | - '' + optionalString (cfg.ensureDatabases != []) '' |
360 | | - ${concatMapStrings (database: '' |
361 | | - $PSQL -tAc "SELECT 1 FROM pg_database WHERE datname = '${database}'" | grep -q 1 || $PSQL -tAc 'CREATE DATABASE "${database}"' |
362 | | - '') cfg.ensureDatabases} |
363 | | - '' + '' |
364 | | - ${concatMapStrings (user: '' |
365 | | - $PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='${user.name}'" | grep -q 1 || $PSQL -tAc 'CREATE USER "${user.name}"' |
366 | | - ${concatStringsSep "\n" (mapAttrsToList (database: permission: '' |
367 | | - $PSQL -tAc 'GRANT ${permission} ON ${database} TO "${user.name}"' |
368 | | - '') user.ensurePermissions)} |
369 | | - '') cfg.ensureUsers} |
370 | | - ''; |
371 | | - |
372 | 373 | unitConfig.RequiresMountsFor = "${cfg.dataDir}"; |
373 | 374 | }; |
374 | 375 |
|
|
0 commit comments