diff --git a/scripts/setup/create-db.sql b/scripts/setup/create-db.sql index 7b63f10f6c..33ccfaf60f 100644 --- a/scripts/setup/create-db.sql +++ b/scripts/setup/create-db.sql @@ -1,16 +1,17 @@ \connect postgres -DROP DATABASE IF EXISTS zulip; -DO $$BEGIN - CREATE USER zulip; +DROP DATABASE IF EXISTS :"dbname"; +SELECT format($$BEGIN + CREATE USER %I; EXCEPTION WHEN duplicate_object THEN - RAISE NOTICE 'zulip user already exists'; -END$$; -ALTER ROLE zulip SET search_path TO zulip,public; -CREATE DATABASE zulip - OWNER=zulip + RAISE NOTICE 'user already exists'; +END$$, :'dbuser') AS code \gset +DO :'code'; +ALTER ROLE :"dbuser" SET search_path TO :"dbname",public; +CREATE DATABASE :"dbname" + OWNER=:dbuser ENCODING=UTF8 LC_COLLATE='C.UTF-8' LC_CTYPE='C.UTF-8' TEMPLATE=template0; -\connect zulip -CREATE SCHEMA zulip AUTHORIZATION zulip; +\connect :"dbname" +CREATE SCHEMA zulip AUTHORIZATION :"dbuser"; diff --git a/scripts/setup/postgresql-init-db b/scripts/setup/postgresql-init-db index 5a06229c1a..6d0b8fd802 100755 --- a/scripts/setup/postgresql-init-db +++ b/scripts/setup/postgresql-init-db @@ -10,11 +10,15 @@ set -x # What user should we use for connecting to the database POSTGRES_USER="${POSTGRES_USER:-postgres}" +# What database name and username to use when connecting to the database +DATABASE_NAME=$(crudini --get /etc/zulip/zulip.conf postgresql database_name 2>/dev/null || echo zulip) +DATABASE_USER=$(crudini --get /etc/zulip/zulip.conf postgresql database_user 2>/dev/null || echo zulip) + # This psql command may fail because the Zulip database doesn’t exist, # hence the &&. if records="$( cd / # Make sure the current working directory is readable by postgres - su "$POSTGRES_USER" -c "psql -v ON_ERROR_STOP=1 -Atc 'SELECT COUNT(*) FROM zulip.zerver_message;' zulip" + su "$POSTGRES_USER" -c "psql -v ON_ERROR_STOP=1 -Atc 'SELECT COUNT(*) FROM $DATABASE_NAME.zerver_message;' $DATABASE_USER" )" && [ "$records" -gt 200 ]; then set +x echo "WARNING: This will delete your Zulip database which currently contains $records messages." @@ -38,9 +42,19 @@ su -s /usr/bin/env - -- "$POSTGRES_USER" \ ( cd / # Make sure the current working directory is readable by postgres - su "$POSTGRES_USER" -c 'psql -v ON_ERROR_STOP=1 -e' + su "$POSTGRES_USER" -c "psql -v ON_ERROR_STOP=1 -v dbname=$DATABASE_NAME -v dbuser=$DATABASE_USER -e" ) <"$(dirname "$0")/create-db.sql" +# Set a postgres password if the postgres username is not "zulip". +# When the username is zulip, we rely on running as the zulip system +# user for authentication via postgres' peer authentication. +if [ "$DATABASE_USER" != "zulip" ]; then + PASSWORD=$(crudini --get /etc/zulip/zulip-secrets.conf secrets postgres_password) + su "$POSTGRES_USER" -c "psql -v ON_ERROR_STOP=1 -e postgres" <