From a15ed70d44c75daee983a12d89c07745b8877ccf Mon Sep 17 00:00:00 2001 From: Munaawa Philip Date: Tue, 12 Jan 2021 18:21:53 +0000 Subject: [PATCH] initial docker deployment implementation --- .gitignore | 3 + .mailmap | 1 + Dockerfile | 66 ++++++++++++ cms/settings.py | 7 +- deploy/docker/README.md | 3 + deploy/docker/local_settings.py | 32 ++++++ deploy/{ => docker}/nginx.conf | 0 deploy/docker/nginx_http_only.conf | 30 ++++++ deploy/docker/prestart.sh | 64 ++++++++++++ .../reverse_proxy/certs/mediacms.io.crt | 17 ++++ .../reverse_proxy/certs/mediacms.io.key | 27 +++++ .../reverse_proxy/client_max_body_size.conf | 1 + deploy/docker/start.sh | 17 ++++ .../supervisord/supervisord-celery_beat.conf | 12 +++ .../supervisord/supervisord-celery_long.conf | 13 +++ .../supervisord/supervisord-celery_short.conf | 12 +++ .../supervisord/supervisord-debian.conf | 2 + .../docker/supervisord/supervisord-nginx.conf | 11 ++ .../docker/supervisord/supervisord-uwsgi.conf | 9 ++ deploy/docker/uwsgi.ini | 24 +++++ deploy/{ => docker}/uwsgi_params | 0 .../{ => local_install}/celery_beat.service | 0 .../{ => local_install}/celery_long.service | 0 .../{ => local_install}/celery_short.service | 0 deploy/{ => local_install}/mediacms.io | 2 +- .../mediacms.io_fullchain.pem | 0 .../mediacms.io_privkey.pem | 0 deploy/{ => local_install}/mediacms.service | 2 +- deploy/{ => local_install}/mediacms_logrorate | 0 deploy/local_install/nginx.conf | 41 ++++++++ uwsgi.ini => deploy/local_install/uwsgi.ini | 8 +- deploy/local_install/uwsgi_params | 16 +++ deploy/uwsgi.ini | 19 ---- docker-compose-http-proxy.yaml | 93 +++++++++++++++++ docker-compose-https-proxy.yaml | 95 ++++++++++++++++++ docker-compose-named-volumes.yaml | 91 +++++++++++++++++ docker-compose.yaml | 87 ++++++++++++++++ docs/Docker_deployment.md | 40 ++++++++ docs/images/architecture.png | Bin 0 -> 153760 bytes files/context_processors.py | 2 +- install.sh | 23 +++-- 41 files changed, 832 insertions(+), 38 deletions(-) create mode 100644 .gitignore create mode 100644 .mailmap create mode 100644 Dockerfile create mode 100644 deploy/docker/README.md create mode 100644 deploy/docker/local_settings.py rename deploy/{ => docker}/nginx.conf (100%) create mode 100644 deploy/docker/nginx_http_only.conf create mode 100644 deploy/docker/prestart.sh create mode 100644 deploy/docker/reverse_proxy/certs/mediacms.io.crt create mode 100644 deploy/docker/reverse_proxy/certs/mediacms.io.key create mode 100644 deploy/docker/reverse_proxy/client_max_body_size.conf create mode 100644 deploy/docker/start.sh create mode 100644 deploy/docker/supervisord/supervisord-celery_beat.conf create mode 100644 deploy/docker/supervisord/supervisord-celery_long.conf create mode 100644 deploy/docker/supervisord/supervisord-celery_short.conf create mode 100644 deploy/docker/supervisord/supervisord-debian.conf create mode 100644 deploy/docker/supervisord/supervisord-nginx.conf create mode 100644 deploy/docker/supervisord/supervisord-uwsgi.conf create mode 100644 deploy/docker/uwsgi.ini rename deploy/{ => docker}/uwsgi_params (100%) rename deploy/{ => local_install}/celery_beat.service (100%) rename deploy/{ => local_install}/celery_long.service (100%) rename deploy/{ => local_install}/celery_short.service (100%) rename deploy/{ => local_install}/mediacms.io (98%) rename deploy/{ => local_install}/mediacms.io_fullchain.pem (100%) rename deploy/{ => local_install}/mediacms.io_privkey.pem (100%) rename deploy/{ => local_install}/mediacms.service (88%) rename deploy/{ => local_install}/mediacms_logrorate (100%) create mode 100644 deploy/local_install/nginx.conf rename uwsgi.ini => deploy/local_install/uwsgi.ini (69%) create mode 100644 deploy/local_install/uwsgi_params delete mode 100644 deploy/uwsgi.ini create mode 100644 docker-compose-http-proxy.yaml create mode 100644 docker-compose-https-proxy.yaml create mode 100644 docker-compose-named-volumes.yaml create mode 100644 docker-compose.yaml create mode 100644 docs/Docker_deployment.md create mode 100644 docs/images/architecture.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96a9096 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +media_files/encoded/ +media_files/original/ +postgres_data/ \ No newline at end of file diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000..f83b739 --- /dev/null +++ b/.mailmap @@ -0,0 +1 @@ +Swift Ugandan \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4fea25c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,66 @@ +FROM python:3.8-buster AS compile-image + +SHELL ["/bin/bash", "-c"] + +# Set up virtualenv +ENV VIRTUAL_ENV=/home/mediacms.io +ENV PATH="$VIRTUAL_ENV/bin:$PATH" +ENV PIP_NO_CACHE_DIR=1 + +RUN mkdir -p /home/mediacms.io/mediacms/{logs,pids} && cd /home/mediacms.io && python3 -m venv $VIRTUAL_ENV + +# Install dependencies: +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY . /home/mediacms.io/mediacms +WORKDIR /home/mediacms.io/mediacms + +RUN wget -q http://zebulon.bok.net/Bento4/binaries/Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip && \ + mkdir -p /home/mediacms.io/mediacms/media_files/hls Bento4-SDK-1-6-0-632.x86_64-unknown-linux/bin/ && \ + unzip -j Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip Bento4-SDK-1-6-0-632.x86_64-unknown-linux/bin/mp4hls -d Bento4-SDK-1-6-0-632.x86_64-unknown-linux/bin/ && \ + rm Bento4-SDK-1-6-0-632.x86_64-unknown-linux.zip + +RUN chown -R www-data. /home/mediacms.io/ && chmod +x /home/mediacms.io/mediacms/deploy/docker/start.sh /home/mediacms.io/mediacms/deploy/docker/prestart.sh + +############ RUNTIME IMAGE ############ +FROM python:3.8-slim-buster as runtime-image + +ENV PYTHONUNBUFFERED=1 +ENV ADMIN_USER='admin' +ENV ADMIN_PASSWORD='mediacms' +ENV ADMIN_EMAIL='admin@localhost' + +# See: https://github.com/celery/celery/issues/6285#issuecomment-715316219 +ENV CELERY_APP='cms' + +# Use these to toggle which processes supervisord should run +ENV ENABLE_UWSGI='yes' +ENV ENABLE_NGINX='yes' +ENV ENABLE_CELERY_BEAT='yes' +ENV ENABLE_CELERY_SHORT='yes' +ENV ENABLE_CELERY_LONG='yes' +ENV ENABLE_MIGRATIONS='yes' + +# Set up virtualenv +ENV VIRTUAL_ENV=/home/mediacms.io +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +COPY --from=compile-image /home/mediacms.io /home/mediacms.io + +RUN apt-get update -y && apt-get -y upgrade && apt-get install --no-install-recommends \ + supervisor nginx ffmpeg imagemagick procps -y && \ + rm -rf /var/lib/apt/lists/* && \ + apt-get purge --auto-remove && \ + apt-get clean + +# forward request and error logs to docker log collector +RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log && \ + ln -sf /dev/stdout /var/log/nginx/mediacms.io.access.log && ln -sf /dev/stderr /var/log/nginx/mediacms.io.error.log + +WORKDIR /home/mediacms.io/mediacms + +EXPOSE 9000 80 + +CMD ["./deploy/docker/start.sh"] + \ No newline at end of file diff --git a/cms/settings.py b/cms/settings.py index 110777e..2c6c115 100644 --- a/cms/settings.py +++ b/cms/settings.py @@ -419,6 +419,8 @@ CELERY_BEAT_SCHEDULE = { # TODO: beat, delete chunks from media root # chunks_dir after xx days...(also uploads_dir) +LOCAL_INSTALL = False + try: # keep a local_settings.py file for local overrides from .local_settings import * @@ -434,4 +436,7 @@ if "http" not in FRONTEND_HOST: # FRONTEND_HOST needs a http:// preffix FRONTEND_HOST = f"http://{FRONTEND_HOST}" -SSL_FRONTEND_HOST = FRONTEND_HOST.replace("http", "https") +if LOCAL_INSTALL: + SSL_FRONTEND_HOST = FRONTEND_HOST.replace("http", "https") +else: + SSL_FRONTEND_HOST = FRONTEND_HOST diff --git a/deploy/docker/README.md b/deploy/docker/README.md new file mode 100644 index 0000000..0139f1f --- /dev/null +++ b/deploy/docker/README.md @@ -0,0 +1,3 @@ +# MediaCMS on Docker + +See: [Details](../../docs/Docker_deployment.md) \ No newline at end of file diff --git a/deploy/docker/local_settings.py b/deploy/docker/local_settings.py new file mode 100644 index 0000000..11567db --- /dev/null +++ b/deploy/docker/local_settings.py @@ -0,0 +1,32 @@ +FRONTEND_HOST = 'http://localhost' +PORTAL_NAME = 'MediaCMS' +SECRET_KEY = 'ma!s3^b-cw!f#7s6s0m3*jx77a@riw(7701**(r=ww%w!2+yk2' +POSTGRES_HOST = 'db' +REDIS_LOCATION = "redis://redis:6379/1" + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.postgresql", + "NAME": "mediacms", + "HOST": POSTGRES_HOST, + "PORT": "5432", + "USER": "mediacms", + "PASSWORD": "mediacms", + } +} + +CACHES = { + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": REDIS_LOCATION, + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient", + }, + } +} + +# CELERY STUFF +BROKER_URL = REDIS_LOCATION +CELERY_RESULT_BACKEND = BROKER_URL + +DEBUG = False \ No newline at end of file diff --git a/deploy/nginx.conf b/deploy/docker/nginx.conf similarity index 100% rename from deploy/nginx.conf rename to deploy/docker/nginx.conf diff --git a/deploy/docker/nginx_http_only.conf b/deploy/docker/nginx_http_only.conf new file mode 100644 index 0000000..91ce75a --- /dev/null +++ b/deploy/docker/nginx_http_only.conf @@ -0,0 +1,30 @@ +server { + listen 80 ; + + gzip on; + access_log /var/log/nginx/mediacms.io.access.log; + + error_log /var/log/nginx/mediacms.io.error.log warn; + + location /static { + alias /home/mediacms.io/mediacms/static ; + } + + location /media/original { + alias /home/mediacms.io/mediacms/media_files/original; + } + + location /media { + alias /home/mediacms.io/mediacms/media_files ; + } + + location / { + add_header 'Access-Control-Allow-Origin' '*'; + add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; + add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; + add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; + + include /etc/nginx/sites-enabled/uwsgi_params; + uwsgi_pass 127.0.0.1:9000; + } +} \ No newline at end of file diff --git a/deploy/docker/prestart.sh b/deploy/docker/prestart.sh new file mode 100644 index 0000000..7336d37 --- /dev/null +++ b/deploy/docker/prestart.sh @@ -0,0 +1,64 @@ +#!/bin/bash +mkdir -p /home/mediacms.io/mediacms/logs +touch /home/mediacms.io/mediacms/logs/debug.log +chown www-data. -R /home/mediacms.io/mediacms/logs + +RANDOM_ADMIN_PASS=`python -c "import secrets;chars = 'abcdefghijklmnopqrstuvwxyz0123456789';print(''.join(secrets.choice(chars) for i in range(10)))"` +ADMIN_PASSWORD=${ADMIN_PASSWORD:-$RANDOM_ADMIN_PASS} + +if [ X"$ENABLE_MIGRATIONS" = X"yes" ]; then + python manage.py migrate + python manage.py loaddata fixtures/encoding_profiles.json + python manage.py loaddata fixtures/categories.json + python manage.py collectstatic --noinput + + echo "Admin Password: $ADMIN_PASSWORD" + + # post_save, needs redis to succeed (ie. migrate depends on redis) + DJANGO_SUPERUSER_PASSWORD=$ADMIN_PASSWORD python manage.py createsuperuser \ + --no-input \ + --username=$ADMIN_USER \ + --email=$ADMIN_EMAIL \ + --database=default || true + + # echo "Updating hostname ..." + # TODO: Get the FRONTEND_HOST from cms/local_settings.py + # echo "from django.contrib.sites.models import Site; Site.objects.update(name='$FRONTEND_HOST', domain='$FRONTEND_HOST')" | python manage.py shell +fi + +# Setting up internal nginx server +# HTTPS setup is delegated to a reverse proxy running infront of the application + +cp deploy/docker/nginx_http_only.conf /etc/nginx/sites-available/default +cp deploy/docker/nginx_http_only.conf /etc/nginx/sites-enabled/default +cp deploy/docker/uwsgi_params /etc/nginx/sites-enabled/uwsgi_params +cp deploy/docker/nginx.conf /etc/nginx/ + +#### Supervisord Configurations ##### + +cp deploy/docker/supervisord/supervisord-debian.conf /etc/supervisor/conf.d/supervisord-debian.conf + +if [ X"$ENABLE_UWSGI" = X"yes" ] ; then + echo "Enabling uwsgi app server" + cp deploy/docker/supervisord/supervisord-uwsgi.conf /etc/supervisor/conf.d/supervisord-uwsgi.conf +fi + +if [ X"$ENABLE_NGINX" = X"yes" ] ; then + echo "Enabling nginx as uwsgi app proxy and media server" + cp deploy/docker/supervisord/supervisord-nginx.conf /etc/supervisor/conf.d/supervisord-nginx.conf +fi + +if [ X"$ENABLE_CELERY_BEAT" = X"yes" ] ; then + echo "Enabling celery-beat scheduling server" + cp deploy/docker/supervisord/supervisord-celery_beat.conf /etc/supervisor/conf.d/supervisord-celery_beat.conf +fi + +if [ X"$ENABLE_CELERY_SHORT" = X"yes" ] ; then + echo "Enabling celery-short task worker" + cp deploy/docker/supervisord/supervisord-celery_short.conf /etc/supervisor/conf.d/supervisord-celery_short.conf +fi + +if [ X"$ENABLE_CELERY_LONG" = X"yes" ] ; then + echo "Enabling celery-long task worker" + cp deploy/docker/supervisord/supervisord-celery_long.conf /etc/supervisor/conf.d/supervisord-celery_long.conf +fi diff --git a/deploy/docker/reverse_proxy/certs/mediacms.io.crt b/deploy/docker/reverse_proxy/certs/mediacms.io.crt new file mode 100644 index 0000000..767e5e6 --- /dev/null +++ b/deploy/docker/reverse_proxy/certs/mediacms.io.crt @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICyTCCAbGgAwIBAgIJAPHG6VrZeH1/MA0GCSqGSIb3DQEBBQUAMBYxFDASBgNV +BAMTC21lZGlhY21zLmlvMB4XDTIxMDExNjE1NDUzNVoXDTMxMDExNDE1NDUzNVow +FjEUMBIGA1UEAxMLbWVkaWFjbXMuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQC+xxnUwjoIZq8sTw2DYGgIYxQ5lJ8Uvt+z+K/PQpT5nFqd1jURF8Zd +a92TlJjM5aSKosavuPHbFNkA7rSnLvP+I+8qsNPoinEUlE12Spg4E7dQkOkvTGty +/amFq69o9vm46GpvwImTZ5AQkzejk0ARUuFSdq9ev4aA44IBYiV4c2jRqnP7LY4j ++SA/rt+9bNUTwQ6QWEHDTHmKePr91UTZBcDw/oaoaJwWFXuEVC7VjtDN09ZNjkdg +pI6PvQZVw2IlBHS4S+ol+G2k2ckSCLgOj+dZrndr8OGrlAb8wgsInLK54nHm6VRe +G883CJd/VlOQAulE26ZkzIdAIjJCwb+DAgMBAAGjGjAYMBYGA1UdEQQPMA2CC21l +ZGlhY21zLmlvMA0GCSqGSIb3DQEBBQUAA4IBAQBwxkTE5GBuFjcFsBzMqhePgC7W +INzoTmyMLJrNClFLkUKkDrwNmShLNhZUbMHeDD1W40aKYJCV44QhT04fK18HU/DW +RkprlJDI8WUnuY97zN6Ms9z/GwYDGNXGLh8I/SEMhfJ8cIQuofhvuyi/E4AdWRva +Hw1RSC8RikTZQ5Y84oJ44RfHNfK7xkaeurcm/Tn4Vxx4RgXA2MMoFA7XbT08vhKw +iiQ9u4QL1GP3Nm8cTDDA9OChhLl56k24MD3WJM2HFTFlE5S4hFRkEqzy4pI/BTU4 +S4fkXK88xDtB/kHlHgRQiNH+6ik8ZXXP1F56+vDLuR28nK3hRTpQwaRQ7dzC +-----END CERTIFICATE----- diff --git a/deploy/docker/reverse_proxy/certs/mediacms.io.key b/deploy/docker/reverse_proxy/certs/mediacms.io.key new file mode 100644 index 0000000..1073f05 --- /dev/null +++ b/deploy/docker/reverse_proxy/certs/mediacms.io.key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAvscZ1MI6CGavLE8Ng2BoCGMUOZSfFL7fs/ivz0KU+ZxandY1 +ERfGXWvdk5SYzOWkiqLGr7jx2xTZAO60py7z/iPvKrDT6IpxFJRNdkqYOBO3UJDp +L0xrcv2phauvaPb5uOhqb8CJk2eQEJM3o5NAEVLhUnavXr+GgOOCAWIleHNo0apz ++y2OI/kgP67fvWzVE8EOkFhBw0x5inj6/dVE2QXA8P6GqGicFhV7hFQu1Y7QzdPW +TY5HYKSOj70GVcNiJQR0uEvqJfhtpNnJEgi4Do/nWa53a/Dhq5QG/MILCJyyueJx +5ulUXhvPNwiXf1ZTkALpRNumZMyHQCIyQsG/gwIDAQABAoIBAQCMauVTWOX3+wRi +G4l5skLAMZTYUNDKJzdmMtvMNFiMZI258Mk8XIBvkI4VKuFQppH2TJrrCbhSJUUX +z5p+FywVWYOWq3I9jXBv0jw1ne/uDmz1ysMnQhswFw5oSZahLm9drwtwV4mrSiWa +XZEtP5t/ZL5dwOeRWGz6fvnYZNHpldkyZDO8+ywB55P+XDfGyxUppMOWdbNV9wGo +Fg6ypUFWFEUD8Ou8xd5FT5QqrQ5ruZJDKcYhPTuK0/dRsMgAxB+Bhf8XH3ynUZp2 ++qMXcKyIQumq9r+/ulE/Yhnbh/E4hYBbThhnmPejNeSvWb7niYfL/fsPI8FLmtmi +z+Ab5IABAoGBAPb4rUP3rVDatzsf2jJSUXcMn9gAdf3ajbw+Z2CCf4j1wj1BTIM5 +5YmABJMS7D97H+a6Vn+SZd426UJYMlKPDnVOTXvvlzhP/TmiSFa8FW8Rjho9Rcnc +LDwnO48q0AJg3HslrjEUaDuWaNHJkqB5tGqzKgZCZxrqoNRYgufPwH+DAoGBAMXA +hr4KxwlcXYIwbM+Uj8eHnESwPWk2+cRwpv62u4ezctZrBCHgAHKvznG7VUeniQfj +P2MaGFz6Pvzw3cFRLKRVqJom5iXO6+H0EucusdqJY4xdWZt02ZweoJXZi9tiDGmG +fPOp3vUax4uGUS4LeSo+ZhPNfbfy9c8ZGQ7Z9cABAoGAA0oyvKoK8/3F3RLCjFMO +ZMCVTIJNEBGeO7i1FdMHMeLcMIazJzhZN2iuJutknD/en+sxhceEdd5TYx/bo7/m +GGfvnkwFvqlKHT9tKUKeInmgY/cW++Zj7HU1VOXkGXQC290Xoe28qbaKNOkze9HD +NnymfajayMABXnLDY6Uf0lMCgYBgVLIOn4dnuvPeOKK42ADWTOxF1aiEuYAgPlRL +Hk7qAvN9GfKQYeM1+whRBNW9KxKoof290/dsS4clhlwwEM/zWbrhJPPWFR95GYGf +1nJTJ7wzo0HEZb6fu5e0h54Gh5POT/JMbEKtGZd9Ezg2euZSOsVU/jQwyI0PjoVT +Y7/AAQKBgHEWxqZwJ3BE9gXRRGhKiPLNG9+OzwjrMiinN4s9Hol0STB1AqryswpU +9QL7Mb8SdxCDY2CseQRwT2VFiP10ElCuzZJ6Yk2cxzmrxAAhRWGHSIuNlnXTA6LR +AhIMLFLz+7KqBx8VHybkhZNCR1nPR9MicS9MpSEYTuRAnV2B1cuU +-----END RSA PRIVATE KEY----- diff --git a/deploy/docker/reverse_proxy/client_max_body_size.conf b/deploy/docker/reverse_proxy/client_max_body_size.conf new file mode 100644 index 0000000..e333433 --- /dev/null +++ b/deploy/docker/reverse_proxy/client_max_body_size.conf @@ -0,0 +1 @@ +client_max_body_size 1g; \ No newline at end of file diff --git a/deploy/docker/start.sh b/deploy/docker/start.sh new file mode 100644 index 0000000..dbd11fe --- /dev/null +++ b/deploy/docker/start.sh @@ -0,0 +1,17 @@ +#! /usr/bin/env sh +set -e + +# If there's a prestart.sh script in the /app directory, run it before starting +PRE_START_PATH=deploy/docker/prestart.sh +echo "Checking for script in $PRE_START_PATH" +if [ -f $PRE_START_PATH ] ; then + echo "Running script $PRE_START_PATH" + . $PRE_START_PATH +else + echo "There is no script $PRE_START_PATH" +fi + +# Start Supervisor, with Nginx and uWSGI +echo "Starting server using supervisord..." + +exec /usr/bin/supervisord \ No newline at end of file diff --git a/deploy/docker/supervisord/supervisord-celery_beat.conf b/deploy/docker/supervisord/supervisord-celery_beat.conf new file mode 100644 index 0000000..9c8d76c --- /dev/null +++ b/deploy/docker/supervisord/supervisord-celery_beat.conf @@ -0,0 +1,12 @@ +[program:celery_beat] +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +startsecs=0 +numprocs=1 +user=www-data +directory=/home/mediacms.io/mediacms +priority=300 +startinorder=true +command=/home/mediacms.io/bin/celery beat --pidfile=/home/mediacms.io/mediacms/pids/beat%%n.pid --loglevel=INFO --logfile=/home/mediacms.io/mediacms/logs/celery_beat.log \ No newline at end of file diff --git a/deploy/docker/supervisord/supervisord-celery_long.conf b/deploy/docker/supervisord/supervisord-celery_long.conf new file mode 100644 index 0000000..e5b1135 --- /dev/null +++ b/deploy/docker/supervisord/supervisord-celery_long.conf @@ -0,0 +1,13 @@ +[program:celery_long] +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +startsecs=10 +numprocs=1 +user=www-data +directory=/home/mediacms.io/mediacms +priority=500 +startinorder=true +startsecs=0 +command=/home/mediacms.io/bin/celery multi start long1 --pidfile=/home/mediacms.io/mediacms/pids/%%n.pid --loglevel=INFO --logfile=/home/mediacms.io/mediacms/logs/celery_long.log -Ofair --prefetch-multiplier=1 -Q long_tasks \ No newline at end of file diff --git a/deploy/docker/supervisord/supervisord-celery_short.conf b/deploy/docker/supervisord/supervisord-celery_short.conf new file mode 100644 index 0000000..2373869 --- /dev/null +++ b/deploy/docker/supervisord/supervisord-celery_short.conf @@ -0,0 +1,12 @@ +[program:celery_short] +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +startsecs=0 +numprocs=1 +user=www-data +directory=/home/mediacms.io/mediacms +priority=400 +startinorder=true +command=/home/mediacms.io/bin/celery multi start short1 short2 --pidfile=/home/mediacms.io/mediacms/pids/%%n.pid --loglevel=INFO --logfile=/home/mediacms.io/mediacms/logs/celery_short.log --soft-time-limit=300 -c10 -Q short_tasks \ No newline at end of file diff --git a/deploy/docker/supervisord/supervisord-debian.conf b/deploy/docker/supervisord/supervisord-debian.conf new file mode 100644 index 0000000..d92638b --- /dev/null +++ b/deploy/docker/supervisord/supervisord-debian.conf @@ -0,0 +1,2 @@ +[supervisord] +nodaemon=true \ No newline at end of file diff --git a/deploy/docker/supervisord/supervisord-nginx.conf b/deploy/docker/supervisord/supervisord-nginx.conf new file mode 100644 index 0000000..22c921c --- /dev/null +++ b/deploy/docker/supervisord/supervisord-nginx.conf @@ -0,0 +1,11 @@ +[program:nginx] +command=/usr/sbin/nginx -g 'daemon off;' +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=200 +startinorder=true +startsecs=0 +# Graceful stop, see http://nginx.org/en/docs/control.html +stopsignal=QUIT \ No newline at end of file diff --git a/deploy/docker/supervisord/supervisord-uwsgi.conf b/deploy/docker/supervisord/supervisord-uwsgi.conf new file mode 100644 index 0000000..eb2414c --- /dev/null +++ b/deploy/docker/supervisord/supervisord-uwsgi.conf @@ -0,0 +1,9 @@ +[program:uwsgi] +command=/home/mediacms.io/bin/uwsgi --ini /home/mediacms.io/mediacms/deploy/docker/uwsgi.ini +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=100 +startinorder=true +startsecs=0 \ No newline at end of file diff --git a/deploy/docker/uwsgi.ini b/deploy/docker/uwsgi.ini new file mode 100644 index 0000000..2a98501 --- /dev/null +++ b/deploy/docker/uwsgi.ini @@ -0,0 +1,24 @@ +[uwsgi] + +chdir = /home/mediacms.io/mediacms/ +virtualenv = /home/mediacms.io +module = cms.wsgi + +uid=www-data +gid=www-data + +processes = 2 +threads = 2 + +master = true + +socket = 127.0.0.1:9000 + +workers = 2 + +vacuum = true + +hook-master-start = unix_signal:15 gracefully_kill_them_all +need-app = true +die-on-term = true + diff --git a/deploy/uwsgi_params b/deploy/docker/uwsgi_params similarity index 100% rename from deploy/uwsgi_params rename to deploy/docker/uwsgi_params diff --git a/deploy/celery_beat.service b/deploy/local_install/celery_beat.service similarity index 100% rename from deploy/celery_beat.service rename to deploy/local_install/celery_beat.service diff --git a/deploy/celery_long.service b/deploy/local_install/celery_long.service similarity index 100% rename from deploy/celery_long.service rename to deploy/local_install/celery_long.service diff --git a/deploy/celery_short.service b/deploy/local_install/celery_short.service similarity index 100% rename from deploy/celery_short.service rename to deploy/local_install/celery_short.service diff --git a/deploy/mediacms.io b/deploy/local_install/mediacms.io similarity index 98% rename from deploy/mediacms.io rename to deploy/local_install/mediacms.io index 0a0b279..106cc33 100644 --- a/deploy/mediacms.io +++ b/deploy/local_install/mediacms.io @@ -59,7 +59,7 @@ server { location /media/original { alias /home/mediacms.io/mediacms/media_files/original; #auth_basic "auth protected area"; - #auth_basic_user_file /home/mediacms.io/mediacms/deploy/.htpasswd; + #auth_basic_user_file /home/mediacms.io/mediacms/deploy/local_install/.htpasswd; } location /media { diff --git a/deploy/mediacms.io_fullchain.pem b/deploy/local_install/mediacms.io_fullchain.pem similarity index 100% rename from deploy/mediacms.io_fullchain.pem rename to deploy/local_install/mediacms.io_fullchain.pem diff --git a/deploy/mediacms.io_privkey.pem b/deploy/local_install/mediacms.io_privkey.pem similarity index 100% rename from deploy/mediacms.io_privkey.pem rename to deploy/local_install/mediacms.io_privkey.pem diff --git a/deploy/mediacms.service b/deploy/local_install/mediacms.service similarity index 88% rename from deploy/mediacms.service rename to deploy/local_install/mediacms.service index 4d81e53..3a1d823 100644 --- a/deploy/mediacms.service +++ b/deploy/local_install/mediacms.service @@ -2,7 +2,7 @@ Description=MediaCMS uwsgi [Service] -ExecStart=/home/mediacms.io/bin/uwsgi --ini /home/mediacms.io/mediacms/uwsgi.ini +ExecStart=/home/mediacms.io/bin/uwsgi --ini /home/mediacms.io/mediacms/deploy/local_install/uwsgi.ini ExecStop=/usr/bin/killall -9 uwsgi RestartSec=3 #ExecRestart=killall -9 uwsgi; sleep 5; /home/sss/bin/uwsgi --ini /home/sss/wordgames/uwsgi.ini diff --git a/deploy/mediacms_logrorate b/deploy/local_install/mediacms_logrorate similarity index 100% rename from deploy/mediacms_logrorate rename to deploy/local_install/mediacms_logrorate diff --git a/deploy/local_install/nginx.conf b/deploy/local_install/nginx.conf new file mode 100644 index 0000000..1dda610 --- /dev/null +++ b/deploy/local_install/nginx.conf @@ -0,0 +1,41 @@ +user www-data; +worker_processes auto; +pid /run/nginx.pid; + +events { + worker_connections 10240; +} + + worker_rlimit_nofile 20000; #each connection needs a filehandle (or 2 if you are proxying) +http { + proxy_connect_timeout 75; + proxy_read_timeout 12000; + client_max_body_size 5800M; + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 10; + types_hash_max_size 2048; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE + ssl_prefer_server_ciphers on; + + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + + gzip on; + gzip_disable "msie6"; + + log_format compression '$remote_addr - $remote_user [$time_local] ' + '"$request" $status $body_bytes_sent ' + '"$http_referer" "$http_user_agent" "$gzip_ratio"'; + + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-enabled/*; +} + diff --git a/uwsgi.ini b/deploy/local_install/uwsgi.ini similarity index 69% rename from uwsgi.ini rename to deploy/local_install/uwsgi.ini index 63f692e..7c2d552 100644 --- a/uwsgi.ini +++ b/deploy/local_install/uwsgi.ini @@ -1,8 +1,8 @@ [uwsgi] -chdir = /home/mediacms.io/mediacms/ +chdir = /home/mediacms.io/mediacms/ virtualenv = /home/mediacms.io -module = cms.wsgi +module = cms.wsgi uid=www-data gid=www-data @@ -10,7 +10,7 @@ gid=www-data processes = 2 threads = 2 -master = true +master = true socket = 127.0.0.1:9000 #socket = /home/mediacms.io/mediacms/deploy/uwsgi.sock @@ -19,7 +19,7 @@ socket = 127.0.0.1:9000 workers = 2 -vacuum = true +vacuum = true logto = /home/mediacms.io/mediacms/logs/errorlog.txt diff --git a/deploy/local_install/uwsgi_params b/deploy/local_install/uwsgi_params new file mode 100644 index 0000000..5abf809 --- /dev/null +++ b/deploy/local_install/uwsgi_params @@ -0,0 +1,16 @@ +uwsgi_param QUERY_STRING $query_string; +uwsgi_param REQUEST_METHOD $request_method; +uwsgi_param CONTENT_TYPE $content_type; +uwsgi_param CONTENT_LENGTH $content_length; + +uwsgi_param REQUEST_URI $request_uri; +uwsgi_param PATH_INFO $document_uri; +uwsgi_param DOCUMENT_ROOT $document_root; +uwsgi_param SERVER_PROTOCOL $server_protocol; +uwsgi_param REQUEST_SCHEME $scheme; +uwsgi_param HTTPS $https if_not_empty; + +uwsgi_param REMOTE_ADDR $remote_addr; +uwsgi_param REMOTE_PORT $remote_port; +uwsgi_param SERVER_PORT $server_port; +uwsgi_param SERVER_NAME $server_name; diff --git a/deploy/uwsgi.ini b/deploy/uwsgi.ini deleted file mode 100644 index b38fe84..0000000 --- a/deploy/uwsgi.ini +++ /dev/null @@ -1,19 +0,0 @@ -[uwsgi] - -chdir = /home/mediacms.io/mediacms/ -virtualenv = /home/mediacms.io -module = cms.wsgi - -uid = www-data -gid = www-data - -processes = 10 -threads = 10 -master = true -workers = 8 -vacuum = true - -socket = 127.0.0.1:9000 - -logto = /home/mediacms.io/mediacms/logs/errorlog.txt - diff --git a/docker-compose-http-proxy.yaml b/docker-compose-http-proxy.yaml new file mode 100644 index 0000000..61ebd0e --- /dev/null +++ b/docker-compose-http-proxy.yaml @@ -0,0 +1,93 @@ +version: "3" + +services: + nginx-proxy: + image: jwilder/nginx-proxy + ports: + - "80:80" + volumes: + - /var/run/docker.sock:/tmp/docker.sock:ro + - ./deploy/docker/reverse_proxy/client_max_body_size.conf:/etc/nginx/conf.d/client_max_body_size.conf:ro + migrations: + image: mediacms:latest + volumes: + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_CELERY_BEAT: 'no' + depends_on: + redis: + condition: service_healthy + db: + condition: service_healthy + web: + build: + context: . + target: runtime-image + image: mediacms:latest + deploy: + replicas: 1 + volumes: + - ./media_files/:/home/mediacms.io/mediacms/media_files/ + - ./static/:/home/mediacms.io/mediacms/static/ + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_CELERY_BEAT: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_MIGRATIONS: 'no' + VIRTUAL_HOST: localhost + depends_on: + - migrations + celery_beat: + image: mediacms:latest + volumes: + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_MIGRATIONS: 'no' + depends_on: + - redis + celery_worker: + image: mediacms:latest + deploy: + replicas: 1 + volumes: + - ./media_files/:/home/mediacms.io/mediacms/media_files/ + - ./static/:/home/mediacms.io/mediacms/static/ + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_BEAT: 'no' + ENABLE_MIGRATIONS: 'no' + depends_on: + - migrations + db: + image: postgres + volumes: + - ./postgres_data/:/var/lib/postgresql/data/ + restart: always + environment: + POSTGRES_USER: mediacms + POSTGRES_PASSWORD: mediacms + POSTGRES_DB: mediacms + healthcheck: + test: ["CMD-SHELL", "pg_isready -U mediacms"] + interval: 10s + timeout: 5s + retries: 5 + redis: + image: "redis:alpine" + restart: always + healthcheck: + test: ["CMD", "redis-cli","ping"] + interval: 30s + timeout: 10s + retries: 3 \ No newline at end of file diff --git a/docker-compose-https-proxy.yaml b/docker-compose-https-proxy.yaml new file mode 100644 index 0000000..d80e553 --- /dev/null +++ b/docker-compose-https-proxy.yaml @@ -0,0 +1,95 @@ +version: "3" + +services: + nginx-proxy: + image: jwilder/nginx-proxy + ports: + - "80:80" + - "443:443" + volumes: + - /var/run/docker.sock:/tmp/docker.sock:ro + - ./deploy/docker/reverse_proxy/certs:/etc/nginx/certs + - ./deploy/docker/reverse_proxy/client_max_body_size.conf:/etc/nginx/conf.d/client_max_body_size.conf:ro + migrations: + image: mediacms:latest + volumes: + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_CELERY_BEAT: 'no' + depends_on: + redis: + condition: service_healthy + db: + condition: service_healthy + web: + build: + context: . + target: runtime-image + image: mediacms:latest + deploy: + replicas: 1 + volumes: + - ./media_files/:/home/mediacms.io/mediacms/media_files/ + - ./static/:/home/mediacms.io/mediacms/static/ + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_CELERY_BEAT: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_MIGRATIONS: 'no' + VIRTUAL_HOST: localhost + depends_on: + - migrations + celery_beat: + image: mediacms:latest + volumes: + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_MIGRATIONS: 'no' + depends_on: + - redis + celery_worker: + image: mediacms:latest + deploy: + replicas: 2 + volumes: + - ./media_files/:/home/mediacms.io/mediacms/media_files/ + - ./static/:/home/mediacms.io/mediacms/static/ + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_BEAT: 'no' + ENABLE_MIGRATIONS: 'no' + depends_on: + - migrations + db: + image: postgres + volumes: + - ./postgres_data/:/var/lib/postgresql/data/ + restart: always + environment: + POSTGRES_USER: mediacms + POSTGRES_PASSWORD: mediacms + POSTGRES_DB: mediacms + healthcheck: + test: ["CMD-SHELL", "pg_isready -U mediacms"] + interval: 10s + timeout: 5s + retries: 5 + redis: + image: "redis:alpine" + restart: always + healthcheck: + test: ["CMD", "redis-cli","ping"] + interval: 30s + timeout: 10s + retries: 3 \ No newline at end of file diff --git a/docker-compose-named-volumes.yaml b/docker-compose-named-volumes.yaml new file mode 100644 index 0000000..af116c2 --- /dev/null +++ b/docker-compose-named-volumes.yaml @@ -0,0 +1,91 @@ +version: "3" + +services: + migrations: + image: mediacms:latest + volumes: + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_CELERY_BEAT: 'no' + depends_on: + redis: + condition: service_healthy + db: + condition: service_healthy + web: + build: + context: . + target: runtime-image + image: mediacms:latest + deploy: + replicas: 1 + ports: + - "80:80" + volumes: + - media_store:/home/mediacms.io/mediacms/media_files/ + - static_store:/home/mediacms.io/mediacms/static/ + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_CELERY_BEAT: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_MIGRATIONS: 'no' + depends_on: + - migrations + celery_beat: + image: mediacms:latest + volumes: + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_MIGRATIONS: 'no' + depends_on: + - redis + celery_worker: + image: mediacms:latest + deploy: + replicas: 2 + volumes: + - media_store:/home/mediacms.io/mediacms/media_files/ + - static_store:/home/mediacms.io/mediacms/static/ + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_BEAT: 'no' + ENABLE_MIGRATIONS: 'no' + depends_on: + - migrations + db: + image: postgres + volumes: + - postgres_data:/var/lib/postgresql/data/ + restart: always + environment: + POSTGRES_USER: mediacms + POSTGRES_PASSWORD: mediacms + POSTGRES_DB: mediacms + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $mediacms"] + interval: 10s + timeout: 5s + retries: 5 + redis: + image: "redis:alpine" + restart: always + healthcheck: + test: ["CMD", "redis-cli","ping"] + interval: 30s + timeout: 10s + retries: 3 +volumes: + postgres_data: + media_store: + static_store: \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..68e9cd5 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,87 @@ +version: "3" + +services: + migrations: + image: mediacms:latest + volumes: + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_CELERY_BEAT: 'no' + depends_on: + redis: + condition: service_healthy + db: + condition: service_healthy + web: + build: + context: . + target: runtime-image + image: mediacms:latest + deploy: + replicas: 1 + ports: + - "80:80" + volumes: + - ./media_files/:/home/mediacms.io/mediacms/media_files/ + - ./static/:/home/mediacms.io/mediacms/static/ + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_CELERY_BEAT: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_MIGRATIONS: 'no' + depends_on: + - migrations + celery_beat: + image: mediacms:latest + volumes: + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_SHORT: 'no' + ENABLE_CELERY_LONG: 'no' + ENABLE_MIGRATIONS: 'no' + depends_on: + - redis + celery_worker: + image: mediacms:latest + deploy: + replicas: 1 + volumes: + - ./media_files/:/home/mediacms.io/mediacms/media_files/ + - ./static/:/home/mediacms.io/mediacms/static/ + - ./deploy/docker/local_settings.py:/home/mediacms.io/mediacms/cms/local_settings.py + environment: + ENABLE_UWSGI: 'no' + ENABLE_NGINX: 'no' + ENABLE_CELERY_BEAT: 'no' + ENABLE_MIGRATIONS: 'no' + depends_on: + - migrations + db: + image: postgres + volumes: + - ./postgres_data:/var/lib/postgresql/data/ + restart: always + environment: + POSTGRES_USER: mediacms + POSTGRES_PASSWORD: mediacms + POSTGRES_DB: mediacms + healthcheck: + test: ["CMD-SHELL", "pg_isready -U mediacms"] + interval: 10s + timeout: 5s + retries: 5 + redis: + image: "redis:alpine" + restart: always + healthcheck: + test: ["CMD", "redis-cli","ping"] + interval: 30s + timeout: 10s + retries: 3 \ No newline at end of file diff --git a/docs/Docker_deployment.md b/docs/Docker_deployment.md new file mode 100644 index 0000000..f8db7ea --- /dev/null +++ b/docs/Docker_deployment.md @@ -0,0 +1,40 @@ +# MediaCMS on Docker + +The mediacms image is built to use supervisord as the main process, which manages one or more services required to run mediacms. We can toggle which services are run in a given container by setting the environment variables below to `yes` or `no`: + +* ENABLE_UWSGI +* ENABLE_NGINX +* ENABLE_CELERY_BEAT +* ENABLE_CELERY_SHORT +* ENABLE_CELERY_LONG +* ENABLE_MIGRATIONS + +By default, all these services are enabled, but in order to create a scaleable deployment, some of them are disabled. + +Also see the `Dockerfile` for other environment variables which you may wish to override. Application settings can also be overridden by updating the `deploy/docker/local_settings.py` file. + +See example deployments in the sections below. These example deployments have been tested on `docker-compose version 1.27.4` running on `Docker version 19.03.13` + +To run, update the configs above if necessary, build the image by running `docker-compose build`, then run `docker-compose run` + +## Simple Deployment, accessed as http://localhost + +The main container runs migrations, mediacms_web, celery_beat, celery_workers (celery_short and celery_long services), exposed on port 80 supported by redis and postgres database. The FRONTEND_HOST in `deploy/docker/local_settings.py` is configured as http://localhost, on the docker host machine. + +## Advanced Deployment, accessed as http://localhost:8000 + +Here we can run 1 mediacms_web instance, with the FRONTEND_HOST in `deploy/docker/local_settings.py` is configured as http://localhost:8000. This is bootstrapped by a single migrations instance and supported by a single celery_beat instance and 1 or more celery_worker instances. Redis and postgres containers are also used for persistence. Clients can access the service on http://localhost:8000, on the docker host machine. This is similar to [this deployment](../docker-compose.yaml), with a `port` defined in FRONTEND_HOST. + +## Advanced Deployment, with reverse proxy, accessed as http://mediacms.io + +Here we can use `jwilder/nginx-proxy` to reverse proxy to 1 or more instances of mediacms_web supported by other services as mentioned in the previous deployment. The FRONTEND_HOST in `deploy/docker/local_settings.py` is configured as http://mediacms.io, nginx-proxy has port 80 exposed. Clients can access the service on http://mediacms.io (Assuming DNS or the hosts file is setup correctly to point to the IP of the nginx-proxy instance). This is similar to [this deployment](../docker-compose-http-proxy.yaml). + +## Advanced Deployment, with reverse proxy, accessed as https://mediacms.io + +The reverse proxy (`jwilder/nginx-proxy`) can be configured to provide SSL termination using self-signed certificates, letsencrypt or CA signed certificates (see: https://hub.docker.com/r/jwilder/nginx-proxy). In this case the FRONTEND_HOST should be set to https://mediacms.io. This is similar to [this deployment](../docker-compose-http-proxy.yaml). + +## A Scaleable Deployment Architecture (Docker, Swarm, Kubernetes) + +The architecture below generalises all the deployment scenarios above, and provides a conceptual design for other deployments based on kubernetes and docker swarm. It allows for horizontal scaleability through the use of multiple mediacms_web instances and celery_workers. For large deployments, managed postgres, redis and storage may be adopted. + +![MediaCMS](images/architecture.png) \ No newline at end of file diff --git a/docs/images/architecture.png b/docs/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..5e14bb73bc158d491bc53da0a042c4239ec6a223 GIT binary patch literal 153760 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�`p>8)O)Oc89>=c`cO98>sHvRRYxuQw$`! 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 LvZ86iT2KEMs28sC literal 0 HcmV?d00001 diff --git a/files/context_processors.py b/files/context_processors.py index d11aa1d..ef550f1 100644 --- a/files/context_processors.py +++ b/files/context_processors.py @@ -5,7 +5,7 @@ from .methods import is_mediacms_editor, is_mediacms_manager def stuff(request): """Pass settings to the frontend""" ret = {} - if request.is_secure(): + if request.is_secure() and settings.LOCAL_INSTALL: # in case session is https, pass this setting so # that the frontend uses https too ret["FRONTEND_HOST"] = settings.SSL_FRONTEND_HOST diff --git a/install.sh b/install.sh index 6c85af5..c488cb9 100644 --- a/install.sh +++ b/install.sh @@ -58,7 +58,7 @@ SECRET_KEY=`python -c 'from django.core.management.utils import get_random_secre FRONTEND_HOST=`echo "$FRONTEND_HOST" | sed -r 's/http:\/\///g'` FRONTEND_HOST=`echo "$FRONTEND_HOST" | sed -r 's/https:\/\///g'` -sed -i s/localhost/$FRONTEND_HOST/g deploy/mediacms.io +sed -i s/localhost/$FRONTEND_HOST/g deploy/local_install/mediacms.io echo 'FRONTEND_HOST='\'"$FRONTEND_HOST"\' >> cms/local_settings.py @@ -66,6 +66,7 @@ echo 'PORTAL_NAME='\'"$PORTAL_NAME"\' >> cms/local_settings.py echo "SSL_FRONTEND_HOST = FRONTEND_HOST.replace('http', 'https')" >> cms/local_settings.py echo 'SECRET_KEY='\'"$SECRET_KEY"\' >> cms/local_settings.py +echo "LOCAL_INSTALL = True" >> cms/local_settings.py mkdir logs mkdir pids @@ -80,19 +81,19 @@ echo "from users.models import User; User.objects.create_superuser('admin', 'adm echo "from django.contrib.sites.models import Site; Site.objects.update(name='$FRONTEND_HOST', domain='$FRONTEND_HOST')" | python manage.py shell chown -R www-data. /home/mediacms.io/ -cp deploy/celery_long.service /etc/systemd/system/celery_long.service && systemctl enable celery_long && systemctl start celery_long -cp deploy/celery_short.service /etc/systemd/system/celery_short.service && systemctl enable celery_short && systemctl start celery_short -cp deploy/celery_beat.service /etc/systemd/system/celery_beat.service && systemctl enable celery_beat &&systemctl start celery_beat -cp deploy/mediacms.service /etc/systemd/system/mediacms.service && systemctl enable mediacms.service && systemctl start mediacms.service +cp deploy/local_install/celery_long.service /etc/systemd/system/celery_long.service && systemctl enable celery_long && systemctl start celery_long +cp deploy/local_install/celery_short.service /etc/systemd/system/celery_short.service && systemctl enable celery_short && systemctl start celery_short +cp deploy/local_install/celery_beat.service /etc/systemd/system/celery_beat.service && systemctl enable celery_beat &&systemctl start celery_beat +cp deploy/local_install/mediacms.service /etc/systemd/system/mediacms.service && systemctl enable mediacms.service && systemctl start mediacms.service mkdir -p /etc/letsencrypt/live/mediacms.io/ mkdir -p /etc/letsencrypt/live/$FRONTEND_HOST -cp deploy/mediacms.io_fullchain.pem /etc/letsencrypt/live/$FRONTEND_HOST/fullchain.pem -cp deploy/mediacms.io_privkey.pem /etc/letsencrypt/live/$FRONTEND_HOST/privkey.pem -cp deploy/mediacms.io /etc/nginx/sites-available/default -cp deploy/mediacms.io /etc/nginx/sites-enabled/default -cp deploy/uwsgi_params /etc/nginx/sites-enabled/uwsgi_params -cp deploy/nginx.conf /etc/nginx/ +cp deploy/local_install/mediacms.io_fullchain.pem /etc/letsencrypt/live/$FRONTEND_HOST/fullchain.pem +cp deploy/local_install/mediacms.io_privkey.pem /etc/letsencrypt/live/$FRONTEND_HOST/privkey.pem +cp deploy/local_install/mediacms.io /etc/nginx/sites-available/default +cp deploy/local_install/mediacms.io /etc/nginx/sites-enabled/default +cp deploy/local_install/uwsgi_params /etc/nginx/sites-enabled/uwsgi_params +cp deploy/local_install/nginx.conf /etc/nginx/ systemctl stop nginx systemctl start nginx