mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	postgresql-init-db: Support arbitrary database user and dbname.
Co-authored-by: Adam Birds <adam.birds@adbwebdesigns.co.uk>
This commit is contained in:
		
				
					committed by
					
						
						Tim Abbott
					
				
			
			
				
	
			
			
			
						parent
						
							54c222d3f8
						
					
				
				
					commit
					1d59330cbc
				
			@@ -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";
 | 
			
		||||
 
 | 
			
		||||
@@ -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" <<EOF
 | 
			
		||||
ALTER ROLE $DATABASE_USER PASSWORD '$PASSWORD';
 | 
			
		||||
EOF
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Clear memcached to avoid contamination from previous database state
 | 
			
		||||
"$(dirname "$0")/flush-memcached"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user