Server Architecture and configurations

Third Party Services

Following third-party services are required in order to setup/deploy this project successfully.

Heroku

Heroku is platform as a service provider. We use to host the primarily web server along with different services required by this project like postgres database, newrelic, redis. See getting started docs here, you’ll require to create an account and install the cli-tool to successfully deploy this project.

Note: Alternatively, you should be able configure a linux instance to run the same project as well, heroku like settings can be added via .env file. (refer: settings/common.py). Just that, this documentation and project is focused more with Heroku as platform of choice.

Amazon S3

Amazon Simple Storage Service (Amazon S3) is used to store the uploaded media files and static content. It is a scalable and cost-efficient storage solution.

After signing up for Amazon S3, setup an IAM user with access to a S3 bucket, you’ll need BUCKET_NAME, and AWS_ACCESS_ID & AWS_ACCESS_SECRET of IAM user to setup the project.

Note: - Heroku doesn’t provide a persistent storage for uploaded content, best practise is to store the uploaded files in S3 buckets. - IAM user must have permission to list, update, create objects in S3.

Deploying Project

The deployment are managed via travis, but for the first time you’ll need to set the configuration values on each of the server. Read this only, if you need to deploy for the first time.

Heroku

Run these commands to deploy this project on Heroku

heroku create --ssh-git deepositive-workshop

heroku addons:create heroku-postgresql --app=deepositive-workshop
heroku pg:backups schedule DATABASE_URL --at '04:00 UTC' --app=deepositive-workshop
heroku pg:promote DATABASE_URL --app=deepositive-workshop

heroku addons:create mailgun --app=deepositive-workshop
heroku config:set EMAIL_HOST="\$MAILGUN_SMTP_SERVER" \
                  EMAIL_HOST_USER="\$MAILGUN_SMTP_LOGIN" \
                  EMAIL_HOST_PASSWORD="\$MAILGUN_SMTP_PASSWORD" --app=deepositive-workshop

heroku addons:create redistogo --app=deepositive-workshop
heroku addons:create redismonitor --url `heroku config:get REDISTOGO_URL --app=deepositive-workshop` --app=deepositive-workshop

heroku addons:create newrelic --app=deepositive-workshop
heroku config:set NEW_RELIC_APP_NAME=deepositive-w --app=deepositive-workshop

heroku config:set DJANGO_SETTINGS_MODULE='settings.production' \
DJANGO_SECRET_KEY=`openssl rand -base64 32` \
SITE_DOMAIN=deepositive-workshop.herokuapp.com \
SITE_SCHEME=https \
SITE_NAME=DJANGO_SITE_NAME_HERE --app=deepositive-workshop

git push heroku master
heroku run python manage.py createsuperuser --app=deepositive-workshop
heroku open --app=deepositive-workshop

The following configuration doesn’t allow you to “by default” upload the media on the heroku server as heroku does not support persistent storage. We use S3 for storing uploaded media. If you want to enable media upload:

heroku config:set ENABLE_MEDIA_UPLOAD_TO_S3=true \
DJANGO_AWS_ACCESS_KEY_ID=<YOUR_AWS_ACCESS_ID_HERE> \
DJANGO_AWS_SECRET_ACCESS_KEY=<YOUR_SECRET_KEY_HERE> \
DJANGO_AWS_STORAGE_BUCKET_NAME=<YOUR_BUCKET_NAME_HERE>

Note: - Use --app=deepositive-workshop if you have more than one heroku app configured in current project. - Update travis.yml, and add the deepositive-workshop to automatically deploy to this configured heroku app.

AWS/EC2

For deploying on aws you need to configure all the addons provided and use python-dotenv to store and read enironment variables.

Add the following to your ~/.ssh/config file.

Host workshop.com
    hostname <server_ip_or_>
    user ubuntu
    ForwardAgent yes
    identityfile <PATH_OF_SERVER_PRIVATE_KEY_HERE>

Add your github private key to your local ssh-agent, which will be used by ansible on remote server to fetch the code using ForwardAgent

ssh-add <PATH_TO_YOUR_GITHUB_PRIVATE_KEY>

Now you can run the ansible script to setup the machine.

fab prod configure

This will setup os dependencies, services like supervisor, nginx and fetch our code from github. Our production environment requires some environment variables in .env. So you can write a file prod.env locally and upload it to server with

scp prod.env workshop.com:/home/ubuntu/workshop-web/.env

You can also use fab to set environment variables one by one:

fab prod config:set,<VAR_NAME>,<VAR_VALUE>

Now that you have .env setup, you can deploy your code and start services:

fab prod deploy