Deploy multiple Django websites with a simple command
Tags: django, bash, webdev, linux
Published: 2022-05-21 15:21:01

Setting up a web server for Django websites can be time-consuming and boring as you need to set up Nginx, database server, database connector, Python virtual environment, WSGI server, etc., and set all the config files. When you want to set up a few websites on your server, you would need to configure these services for each website.

For my personal side projects and MVP, I usually use [Digital Ocean droplet](https://m.do.co/c/008d3315ed7b) which costs me $10 per month and allows me to host 5-8 Django websites. So I decided to write a bash script that helps deploy as many Django websites as your server can handle with one simple command. I know there is Docker, but I was too lazy to learn it, and my solution better suits my needs as it is lightweight and is perfect for a cheap droplet with 1-2Gb of RAM.

## What does the script do?

- Generates SFTP/database passwords
- Creates a working directory in `/var/www/$SITENAME`
- Creates a new Linux user and adds it to the SFTP group
- Assigns user permissions to the working directory
- Installs all necessary dependencies: _nginx, python3-pip, mysql-server/mariadb-server/postgresql, virtualenv, gunicorn, django, mysql-connector-python/psycopg2_
- Creates a new Django project, database, and configures Django to work with the _MySQL/MariaDB/PostgreSQL_ database
Creates NGINX and Gunicorn config files (a separate config file for each site)
- Creates `.gitignore` file
- Adds settings for static and media files
- Collects static files after installation

The bash script [is available on Github](https://github.com/jdbit/django-auto-deploy). I have tested it on an Ubuntu droplet, but it should work on other Debian-based Linux distributions. You can download it from GitHub and run the script on your server with a single command:

`curl -o addsite https://raw.githubusercontent.com/jdbit/django-auto-deploy/master/addsite && chmod +x addsite && sudo ./addsite`

The sudo password will be requested as the script needs to install dependencies on your server.


![Deploy multiple Django websites easily](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/itkjr20zilt05ivakkzi.gif)

When you execute the command, you will be prompted to enter the website name (no whitespaces, single word) and domain name. It also asks you which database you are planning to use (_MariaDB_, _MySQL_, or _PostgreSQL_). After installation of all dependencies, the script will create a directory `/var/www/$SITENAME` and a log file deploy.log with bash script output and MySQL password.

In `/var/www/{SITENAME}/env` directory a Python virtual environment will be created. You can activate it by `source env/bin/activate` command.

The script creates two configuration files for Nginx and Gunicorn:

- Nginx config located at: `/etc/nginx/sites-available/{SITE_NAME}.conf`
- Gunicorn config: `/etc/systemd/system/gunicorn_{SITE_NAME}.service`

If you changed the Nginx config file, don't forget to reload Nginx with `sudo service nginx restart` command. If you changed any files in your Django project, you should reload the Gunicorn service with `sudo systemctl restart gunicorn_YOUR_SITE_NAME` command to apply changes.

If you would like to add a second website, just run the `./addsite` command again.

That's it. A [$10 Digital Ocean droplet](https://m.do.co/c/008d3315ed7b) can easily handle dozens of thousands visitors per day from a 5-7 websites. Hope this script will be useful for you. Let me know in the comments what you think about the script and how you deploy your Django websites.