Hello Linux: PostgreSQL on Live Linux Server

By Justin

Hello Linux: PostgreSQL on Live Linux Server
This is the third post of a many part series. This post is the starter post for the whole series.
PostgreSQL is a production database. It's powerful and integrates with a lot of different kinds of web frameworks. Our goal is to use Django but you could easily use Flask, Masonite, aiohttp, and many others.
Don't have a live server? Pick one up for $5/mo on Digital Ocean (no referral)
Once you set it up 1 time successfully. You'll never want to user another method (I'm looking at you SFTP).
Let's do this.

Requirments
Be sure to complete
Our Live Server
  • Ubuntu 18.04

It's recommended to use the same database technology locally as you use in production. So yeah, you'll want to install PostgreSQL on your development/local environment as well.
For the entire post, we'll be using the live Ubuntu 18.04 server for later integration to Django so we'll have Django-specific information as well.

1. SSH into your server

Replace [email protected] with your user / ip

2. Update & Install on Server

sudo apt-get update -y

sudo apt-get install postgresql postgresql-contrib -y

3. Create Default User for postgreSQL

cd  /tmp

sudo -u postgres createuser $USER

sudo -u postgres createdb $USER
If you're not familiar with $USER in the command line, it defaults to your currently logged in user.

4a. Create Database. The Bash Method

Setup your defaults:
projectDB="your_project_db_name"
projectDBuser="your_project_db_username"
dbUserPassword="your_db_user_password"
The following commands will
  • Create a database
  • Create a user with the password from above
  • Alter the user's role to fit with the requirements of Django
  • Grant all privileges for this user to do what's needed on the database in PostgreSQL
sudo -u postgres psql --command="CREATE DATABASE ${projectDB};"

sudo -u postgres psql --command="CREATE USER ${projectDBuser} WITH PASSWORD '${dbUserPassword}';"

sudo -u postgres psql --command="ALTER ROLE ${projectDBuser} SET client_encoding TO 'utf8';"

sudo -u postgres psql --command="ALTER ROLE ${projectDBuser} SET default_transaction_isolation TO 'read committed';"

sudo -u postgres psql --command="ALTER ROLE ${projectDBuser} SET timezone TO 'UTC';"

sudo -u postgres psql --command="GRANT ALL PRIVILEGES ON DATABASE ${projectDB} TO ${projectDBuser};"

4b. Create Database. The psql method

This is just another way to do part 4a
Enter a postgres session
sudo -u postgres psql
You now should see postgres@localhost: before $ on the command line. Something like postgres@localhost:~$. It's okay if it's different but it should not be the same as the normal bash shell.
Now, in the postgres session create your database
CREATE DATABASE your_database_name;
Create user:
CREATE USER your_database_user WITH PASSWORD 'database_user_password';
Be sure to include the single quotes ' around the password and not around the your_database_user
Alter User role to prep for Django:
ALTER ROLE your_database_user SET client_encoding TO 'utf8';
ALTER ROLE your_database_user SET default_transaction_isolation TO 'read committed';
ALTER ROLE your_database_user SET timezone TO 'UTC';
Grant privileges
GRANT ALL PRIVILEGES ON DATABASE ${projectDB} TO ${projectDBuser};
Exit postgres
\q

5. Update Your Django production settings

See this post for more on production vs developmentsettings.
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': '<projectDB>',
        'USER':  '<projectDBuser>',
        'PASSWORD': '<newPassword>',
        'HOST': 'localhost',
        'PORT': '',

    }
}
Replace <projectDB>, <projectDBuser>, and <dbUserPassword> with the correct values.

6. Run migrations & Create Admin User.

python manage.py migrate
python manage.py createsuperuser
That's it. Your Django project should now be setup.

Wrap Up

We now have
Now we need to
Discover Posts