Skip to content

How to deploy

This is how we deploy

This page describes how the main instance is deployed, and is mainly meant as a way to share the knowledge. You can obviously do things differently.

Services

"La chariotte" uses different domains:

  • docs.chariotte.fr, the docs you are reading now. It's handled by readthedocs.org.
  • chariotte.fr, the main instance. It's deployed on Alwaysdata
  • blog.chariotte.fr, our blog. It's a static website deployed on Gitlab pages.

The main instance

Alwaysdata, our hosting provider

Alwaysdata offers a free plan for open source projects, which we are using for the main instance of la chariotte.

Thanks to them for supporting open source!

Getting access

To get access, you'll need to generate an ssh keypair, and give your public key to a known admin.

ssh-keygen

This will generate a private a public key. You need to share the public key. On unix systems, it's stored under ~/.ssh/id_rsa.pub by default.

Connecting to ssh

Once your key is generated and you're known to the server, you can connect there.

ssh chariotte@ssh-chariotte.alwaysdata.net

Configuration file

The chariotte application is run by uwsgi, managed by AlwaysData.

The production settings are stored in ~/ la_chariotte/prod_settings.py, and the secrets are defined in the admin console.

Here are the settings, with some comments that might be useful.

prod_settings.py
SECRET_KEY = "YOUR SECRET KEY HERE, used to hash the passwords. CHANGE IT."

# We're connecting to a psql server, AD manages the access and the backups.
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "chariotte_prod",
        "USER": "chariotte_prod",
        "PASSWORD": "",
        "HOST": "host",
    }
}

ALLOWED_HOSTS = ["chariotte.fr",]
DEBUG = False

# We're sending mails using AD infrastructure
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_FROM = 'notification@chariotte.fr'
EMAIL_HOST = 'smtp-chariotte.alwaysdata.net'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'notification@chariotte.fr'
EMAIL_HOST_PASSWORD = "XXX"
EMAIL_USE_TLS = True

DEFAULT_FROM_EMAIL = os.getenv(
    "DJANGO_DEFAULT_FROM_EMAIL", "La Chariotte <notification@chariotte.fr>"
)

CONTACT_MAIL = "contact@chariotte.fr"

# We're collecting the static files on this specific folder.
STATIC_ROOT = "/home/chariotte/static/"

We're using sentry (sentry.io) to be alerted when an error happens on the server

prod_settings.py
import sentry_sdk

sentry_sdk.init(
    dsn="PUT YOUR DSN HERE",
    # Set traces_sample_rate to 1.0 to capture 100%
    # of transactions for performance monitoring.
    traces_sample_rate=1.0,
    # Set profiles_sample_rate to 1.0 to profile 100%
    # of sampled transactions.
    # We recommend adjusting this value in production.
    profiles_sample_rate=1.0,
)

The different sites

In the AD console, here are the defined sites:

  • app.chariotte.fr, redirecting to chariotte.fr
  • chariotte.fr/static, hosting the static files, it just serves the collected static files stored in /static/
  • chariotte.fr, the main website, defined in the next section

chariotte.fr is configured as a Python WSGI app:

  • application path: /la_chariotte/la_chariotte/wsgi.py
  • working directory: /la_chariotte
  • venv location: /venv

Environment variables:

DJANGO_SETTINGS_MODULE=prod_settings

How to deploy

To deploy a new version, we'll need to:

  • get the new code
  • update the database
  • collect the static files
  • restart the daemon

Here's how:

# Activate the venv
source venv/bin/activate
cd la_chariotte

# Get the code
git fetch
git checkout tag # if we're using a tag, otherwise, just checkout the main branch

python manage.py updatedb
python manage.py collectstatic

Then you'll need to restart the server from AD's interface.

What about SSL certificates?

The SSL certificates are issued directly by AlwaysData (they use [Let's Encrypt] (https://letsencrypt.org/) behind the scenes)

Mails

Mails are hosted by alwaysdata, as part of their opensource plan.