mirror of
				https://github.com/zulip/zulip.git
				synced 2025-10-31 12:03:46 +00:00 
			
		
		
		
	If running on a stand-alone PostgreSQL server, then supervisor does exist -- but `stop-server` is useless, and in fact cannot run because the Zulip directory may not be readable by the `zulip` user. Detect if this is an application front-end server by looking for `/home/zulip/deployments`, and use the stop-server and flush-memcached from there if it exists. The `create-db.sql` and `terminate-psql-sessions` files are still read from the local directory, but those already have precautions from being from a non-world-readable directory, and are more obviously important to keep in sync with the `create-database` script.
		
			
				
	
	
		
			62 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| set -e
 | |
| 
 | |
| if [ "$EUID" -ne 0 ]; then
 | |
|     echo "Error: This script must be run as root" >&2
 | |
|     exit 1
 | |
| fi
 | |
| 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)
 | |
| 
 | |
| if [ "$(su "$POSTGRES_USER" -c "cd / && psql -v ON_ERROR_STOP=1 -Atc \"SELECT 1 FROM pg_database WHERE datname='$DATABASE_NAME';\"")" = "1" ]; then
 | |
|     records="$(su "$POSTGRES_USER" -c "cd / && psql -v ON_ERROR_STOP=1 -Atc 'SELECT COUNT(*) FROM $DATABASE_NAME.zerver_message;' $DATABASE_USER" || echo 0)"
 | |
|     if [ "$records" -gt 200 ]; then
 | |
|         set +x
 | |
|         echo "WARNING: This will delete your Zulip database which currently contains $records messages."
 | |
|         read -p "Do you want to proceed? [y/N] " -r
 | |
|         echo
 | |
|         if [[ ! $REPLY =~ ^[Yy]$ ]]; then
 | |
|             exit 1
 | |
|         fi
 | |
|         set -x
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| # Shut down all services to ensure a quiescent state.
 | |
| if [ -e "/home/zulip/deployments" ]; then
 | |
|     su zulip -c "/home/zulip/deployments/current/scripts/stop-server"
 | |
| fi
 | |
| 
 | |
| # Drop any open connections to any old database.
 | |
| # Send the script via stdin in case the postgres user lacks permission to read it.
 | |
| su -s /usr/bin/env - -- "$POSTGRES_USER" \
 | |
|     bash -s - zulip zulip_base <"$(dirname "$0")/terminate-psql-sessions"
 | |
| 
 | |
| (
 | |
|     cd / # Make sure the current working directory is readable by postgres
 | |
|     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
 | |
| if [ -e "/home/zulip/deployments" ]; then
 | |
|     /home/zulip/deployments/current/scripts/setup/flush-memcached
 | |
| fi
 | |
| 
 | |
| echo "Database created"
 |