This guide will help us deploy a flask application on a VPS via SSH. There are several ways to deploy python based apps but in this case, we will use Apache and Phusion Passenger – the same software used in shared hosting.
Requirements #
- root access to the server
- Ubuntu 20.04 installed
- Minimum 512MB RAM, 10GB space
- a domain/subdomain pointed to your VPS IP address
The steps involved are as follows:
1.Install needed software (Python3, Apache, Passenger and Git)
2.Upload you website
3.Setup server configuration
Lets get started
Install needed software #
The software needed are python3, Apache, Passenger and Git
Uninstall Python 2
$ sudo apt remove python2
$ sudo apt remove python-is-python2
$ sudo apt autoremove --purge
Install Python 3
$ sudo apt-get update
$ sudo apt-get install -y python3 python3-pip
Install Apache
$ sudo apt-get install apache2
Install Passenger and needed Apache modules
$ sudo apt-get install -y dirmngr gnupg $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7 $ sudo apt-get install -y apt-transport-https ca-certificates $ sudo apt-get install -y libapache2-mod-passenger $ sudo a2enmod passenger $ systemctl restart apache2
Install Git
$ sudo apt-get install -y git
Upload your website #
We will use git to upload our website. To do this, you need to have your website already available in a repo such as Github or Gitlab.
Create a user for your app. We will call our user appuser
$ useradd appuser
$ passwd appuser
Create your application directory
$ sudo mkdir -p /var/www/awesomeapp
$ sudo chown appuser: /var/www/awesomeapp
Clone your app
$ cd /var/www/awesomeapp && sudo -u appuser -H git clone https://gitlab.com/username/awesomeapp.git
Note: If you do not have an app in a repo such as Github or Gitlab already, please manually upload your app files to/var/www/awesomeapp
Setup server configuration #
The next thing is to complete the set up of our app. This means we install the application requirements and configure Apache
Install app requirements
Your app should have a requirements.txt file. Run the command below to install required files
$ pip3 install -r requirements.txt
Create an Apache VHOST file using the following command. We’ll assume your domain is called truehosttestdomain.com
$ sudo vim /etc/apache2/sites-enabled/awesomeapp.conf
Copy the content below
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName truehosttestdomain.com
ServerAlias truehosttestdomain.com
# Tell Apache and Passenger where your app's code directory is
DocumentRoot /var/www/awesomeapp/code/
PassengerAppRoot /var/www/awesomeapp/code
# Tell Passenger that your app is a Python app
PassengerAppType wsgi
PassengerStartupFile passenger_wsgi.py
ErrorLog /var/www/truehosttestdomain.com/logs/error.log
CustomLog /var/www/truehosttestdomain.com/logs/access.log combined
Alias /static/ /var/www/awesomeapp/static
<Directory /var/www/awesomeapp/static>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Restart apache and check your domain online!
$ systemctl restart apache2