diff --git a/{{cookiecutter.project_slug}}/compose/caddy/Dockerfile b/{{cookiecutter.project_slug}}/compose/caddy/Dockerfile deleted file mode 100644 index 774b0bf5b..000000000 --- a/{{cookiecutter.project_slug}}/compose/caddy/Dockerfile +++ /dev/null @@ -1,2 +0,0 @@ -FROM abiosoft/caddy:0.10.6 -COPY Caddyfile /etc/Caddyfile diff --git a/{{cookiecutter.project_slug}}/compose/django/Dockerfile b/{{cookiecutter.project_slug}}/compose/django/Dockerfile deleted file mode 100644 index 618533f7d..000000000 --- a/{{cookiecutter.project_slug}}/compose/django/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM python:3.5 - -ENV PYTHONUNBUFFERED 1 - -RUN groupadd -r django \ - && useradd -r -g django django - -# Requirements have to be pulled and installed here, otherwise caching won't work -COPY ./requirements /requirements -RUN pip install --no-cache-dir -r /requirements/production.txt \ - && rm -rf /requirements - -COPY ./compose/django/gunicorn.sh ./compose/django/entrypoint.sh / -RUN sed -i 's/\r//' /entrypoint.sh \ - && sed -i 's/\r//' /gunicorn.sh \ - && chmod +x /entrypoint.sh \ - && chown django /entrypoint.sh \ - && chmod +x /gunicorn.sh \ - && chown django /gunicorn.sh - -COPY . /app - -RUN chown -R django /app - -USER django - -WORKDIR /app - -ENTRYPOINT ["/entrypoint.sh"] diff --git a/{{cookiecutter.project_slug}}/compose/django/Dockerfile-local b/{{cookiecutter.project_slug}}/compose/django/Dockerfile-local deleted file mode 100644 index d2c56532a..000000000 --- a/{{cookiecutter.project_slug}}/compose/django/Dockerfile-local +++ /dev/null @@ -1,26 +0,0 @@ -FROM python:3.5 -ENV PYTHONUNBUFFERED 1 - -# Requirements have to be pulled and installed here, otherwise caching won't work -COPY ./requirements /requirements -RUN pip install -r /requirements/local.txt - -COPY ./compose/django/entrypoint.sh /entrypoint.sh -RUN sed -i 's/\r//' /entrypoint.sh -RUN chmod +x /entrypoint.sh - -COPY ./compose/django/start-dev.sh /start-dev.sh -RUN sed -i 's/\r//' /start-dev.sh -RUN chmod +x /start-dev.sh - -COPY ./compose/django/celery/worker/start-dev.sh /start-celeryworker-dev.sh -RUN sed -i 's/\r//' /start-celeryworker-dev.sh -RUN chmod +x /start-celeryworker-dev.sh - -COPY ./compose/django/celery/beat/start-dev.sh /start-celerybeat-dev.sh -RUN sed -i 's/\r//' /start-celerybeat-dev.sh -RUN chmod +x /start-celerybeat-dev.sh - -WORKDIR /app - -ENTRYPOINT ["/entrypoint.sh"] diff --git a/{{cookiecutter.project_slug}}/compose/django/start-dev.sh b/{{cookiecutter.project_slug}}/compose/django/start-dev.sh deleted file mode 100644 index 04e06981f..000000000 --- a/{{cookiecutter.project_slug}}/compose/django/start-dev.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -python manage.py migrate -python manage.py runserver_plus 0.0.0.0:8000 diff --git a/{{cookiecutter.project_slug}}/compose/postgres/Dockerfile b/{{cookiecutter.project_slug}}/compose/postgres/Dockerfile deleted file mode 100644 index 9cdaaba30..000000000 --- a/{{cookiecutter.project_slug}}/compose/postgres/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM postgres:{{ cookiecutter.postgresql_version }} - -# add backup scripts -ADD backup.sh /usr/local/bin/backup -ADD restore.sh /usr/local/bin/restore -ADD list-backups.sh /usr/local/bin/list-backups - -# make them executable -RUN chmod +x /usr/local/bin/restore -RUN chmod +x /usr/local/bin/list-backups -RUN chmod +x /usr/local/bin/backup diff --git a/{{cookiecutter.project_slug}}/compose/caddy/Caddyfile b/{{cookiecutter.project_slug}}/compose/production/caddy/Caddyfile similarity index 100% rename from {{cookiecutter.project_slug}}/compose/caddy/Caddyfile rename to {{cookiecutter.project_slug}}/compose/production/caddy/Caddyfile diff --git a/{{cookiecutter.project_slug}}/compose/production/caddy/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/caddy/Dockerfile new file mode 100644 index 000000000..d02f0342d --- /dev/null +++ b/{{cookiecutter.project_slug}}/compose/production/caddy/Dockerfile @@ -0,0 +1,3 @@ +FROM abiosoft/caddy:0.10.6 + +COPY ./compose/production/caddy/Caddyfile /etc/Caddyfile diff --git a/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile new file mode 100644 index 000000000..fcbe51844 --- /dev/null +++ b/{{cookiecutter.project_slug}}/compose/production/django/Dockerfile @@ -0,0 +1,39 @@ +FROM python:3.5 + +ENV PYTHONUNBUFFERED 1 + +RUN groupadd -r django \ + && useradd -r -g django django + +# Requirements have to be pulled and installed here, otherwise caching won't work +COPY ./requirements /requirements +RUN pip install --no-cache-dir -r /requirements/production.txt \ + && rm -rf /requirements + +COPY ./compose/production/django/gunicorn.sh /gunicorn.sh +RUN sed -i 's/\r//' /gunicorn.sh +RUN chmod +x /gunicorn.sh +RUN chown django /gunicorn.sh + +COPY ./compose/production/django/entrypoint.sh /entrypoint.sh +RUN sed -i 's/\r//' /entrypoint.sh +RUN chmod +x /entrypoint.sh +RUN chown django /entrypoint.sh + +COPY ./compose/production/django/celery/worker/start.sh /start-celeryworker.sh +RUN sed -i 's/\r//' /start-celeryworker.sh +RUN chmod +x /start-celeryworker.sh + +COPY ./compose/production/django/celery/beat/start.sh /start-celerybeat.sh +RUN sed -i 's/\r//' /start-celerybeat.sh +RUN chmod +x /start-celerybeat.sh + +COPY . /app + +RUN chown -R django /app + +USER django + +WORKDIR /app + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/{{cookiecutter.project_slug}}/compose/django/celery/beat/start-dev.sh b/{{cookiecutter.project_slug}}/compose/production/django/celery/beat/start.sh similarity index 65% rename from {{cookiecutter.project_slug}}/compose/django/celery/beat/start-dev.sh rename to {{cookiecutter.project_slug}}/compose/production/django/celery/beat/start.sh index 987d7259e..845db0a3d 100644 --- a/{{cookiecutter.project_slug}}/compose/django/celery/beat/start-dev.sh +++ b/{{cookiecutter.project_slug}}/compose/production/django/celery/beat/start.sh @@ -1,8 +1,8 @@ -#!/bin/sh +#!/usr/bin/env bash set -o errexit +set -o pipefail set -o nounset -set -o xtrace -rm -f './celerybeat.pid' + celery -A {{cookiecutter.project_slug}}.taskapp beat -l INFO diff --git a/{{cookiecutter.project_slug}}/compose/django/celery/worker/start-dev.sh b/{{cookiecutter.project_slug}}/compose/production/django/celery/worker/start.sh similarity index 71% rename from {{cookiecutter.project_slug}}/compose/django/celery/worker/start-dev.sh rename to {{cookiecutter.project_slug}}/compose/production/django/celery/worker/start.sh index 594065e6c..4529aad92 100644 --- a/{{cookiecutter.project_slug}}/compose/django/celery/worker/start-dev.sh +++ b/{{cookiecutter.project_slug}}/compose/production/django/celery/worker/start.sh @@ -1,7 +1,8 @@ -#!/bin/sh +#!/usr/bin/env bash set -o errexit +set -o pipefail set -o nounset -set -o xtrace + celery -A {{cookiecutter.project_slug}}.taskapp worker -l INFO diff --git a/{{cookiecutter.project_slug}}/compose/django/entrypoint.sh b/{{cookiecutter.project_slug}}/compose/production/django/entrypoint.sh similarity index 91% rename from {{cookiecutter.project_slug}}/compose/django/entrypoint.sh rename to {{cookiecutter.project_slug}}/compose/production/django/entrypoint.sh index 9fe7f5c88..3b83c7bb6 100644 --- a/{{cookiecutter.project_slug}}/compose/django/entrypoint.sh +++ b/{{cookiecutter.project_slug}}/compose/production/django/entrypoint.sh @@ -1,5 +1,12 @@ -#!/bin/bash -set -e +#!/usr/bin/env bash + +set -o errexit +set -o pipefail + +# todo: turn on after #1295 +# set -o nounset + + cmd="$@" # This entrypoint is used to play nicely with the current cookiecutter configuration. diff --git a/{{cookiecutter.project_slug}}/compose/django/gunicorn.sh b/{{cookiecutter.project_slug}}/compose/production/django/gunicorn.sh similarity index 59% rename from {{cookiecutter.project_slug}}/compose/django/gunicorn.sh rename to {{cookiecutter.project_slug}}/compose/production/django/gunicorn.sh index 014f173e3..25da06496 100644 --- a/{{cookiecutter.project_slug}}/compose/django/gunicorn.sh +++ b/{{cookiecutter.project_slug}}/compose/production/django/gunicorn.sh @@ -1,3 +1,9 @@ -#!/bin/sh +#!/usr/bin/env bash + +set -o errexit +set -o pipefail +set -o nounset + + python /app/manage.py collectstatic --noinput -/usr/local/bin/gunicorn config.wsgi -w 4 -b 0.0.0.0:5000 --chdir=/app \ No newline at end of file +/usr/local/bin/gunicorn config.wsgi -w 4 -b 0.0.0.0:5000 --chdir=/app diff --git a/{{cookiecutter.project_slug}}/compose/production/postgres/Dockerfile b/{{cookiecutter.project_slug}}/compose/production/postgres/Dockerfile new file mode 100644 index 000000000..769f79892 --- /dev/null +++ b/{{cookiecutter.project_slug}}/compose/production/postgres/Dockerfile @@ -0,0 +1,9 @@ +FROM postgres:{{ cookiecutter.postgresql_version }} + +ADD ./compose/production/postgres/backup.sh /usr/local/bin/backup +ADD ./compose/production/postgres/restore.sh /usr/local/bin/restore +ADD ./compose/production/postgres/list-backups.sh /usr/local/bin/list-backups + +RUN chmod +x /usr/local/bin/restore +RUN chmod +x /usr/local/bin/list-backups +RUN chmod +x /usr/local/bin/backup diff --git a/{{cookiecutter.project_slug}}/compose/postgres/backup.sh b/{{cookiecutter.project_slug}}/compose/production/postgres/backup.sh similarity index 90% rename from {{cookiecutter.project_slug}}/compose/postgres/backup.sh rename to {{cookiecutter.project_slug}}/compose/production/postgres/backup.sh index 47f7a5140..46438011c 100644 --- a/{{cookiecutter.project_slug}}/compose/postgres/backup.sh +++ b/{{cookiecutter.project_slug}}/compose/production/postgres/backup.sh @@ -1,6 +1,9 @@ -#!/bin/bash -# stop on errors -set -e +#!/usr/bin/env bash + +set -o errexit +set -o pipefail +set -o nounset + # we might run into trouble when using the default `postgres` user, e.g. when dropping the postgres # database in restore.sh. Check that something else is used here diff --git a/{{cookiecutter.project_slug}}/compose/postgres/list-backups.sh b/{{cookiecutter.project_slug}}/compose/production/postgres/list-backups.sh similarity index 53% rename from {{cookiecutter.project_slug}}/compose/postgres/list-backups.sh rename to {{cookiecutter.project_slug}}/compose/production/postgres/list-backups.sh index 75972b75b..2be3d1d61 100644 --- a/{{cookiecutter.project_slug}}/compose/postgres/list-backups.sh +++ b/{{cookiecutter.project_slug}}/compose/production/postgres/list-backups.sh @@ -1,4 +1,10 @@ -#!/bin/bash +#!/usr/bin/env bash + +set -o errexit +set -o pipefail +set -o nounset + + echo "listing available backups" echo "-------------------------" ls /backups/ diff --git a/{{cookiecutter.project_slug}}/compose/postgres/restore.sh b/{{cookiecutter.project_slug}}/compose/production/postgres/restore.sh similarity index 96% rename from {{cookiecutter.project_slug}}/compose/postgres/restore.sh rename to {{cookiecutter.project_slug}}/compose/production/postgres/restore.sh index ddfc90d5f..e7358949e 100644 --- a/{{cookiecutter.project_slug}}/compose/postgres/restore.sh +++ b/{{cookiecutter.project_slug}}/compose/production/postgres/restore.sh @@ -1,7 +1,9 @@ -#!/bin/bash +#!/usr/bin/env bash + +set -o errexit +set -o pipefail +set -o nounset -# stop on errors -set -e # we might run into trouble when using the default `postgres` user, e.g. when dropping the postgres # database in restore.sh. Check that something else is used here diff --git a/{{cookiecutter.project_slug}}/local.yml b/{{cookiecutter.project_slug}}/local.yml index 0fbb4436a..aaf131fa2 100644 --- a/{{cookiecutter.project_slug}}/local.yml +++ b/{{cookiecutter.project_slug}}/local.yml @@ -1,14 +1,14 @@ version: '2' volumes: - postgres_data_dev: {} - postgres_backup_dev: {} + postgres_data_local: {} + postgres_backup_local: {} services: - django: &django + django:{% if cookiecutter.use_celery == 'y' %} &django{% endif %} build: context: . - dockerfile: ./compose/django/Dockerfile-local + dockerfile: ./compose/local/django/Dockerfile depends_on: - postgres{% if cookiecutter.use_mailhog == 'y' %} - mailhog{% endif %} @@ -19,13 +19,15 @@ services: - USE_DOCKER=yes ports: - "8000:8000" - command: /start-dev.sh + command: /start.sh postgres: - build: ./compose/postgres + build: + context: . + dockerfile: ./compose/production/postgres/Dockerfile volumes: - - postgres_data_dev:/var/lib/postgresql/data - - postgres_backup_dev:/backups + - postgres_data_local:/var/lib/postgresql/data + - postgres_backup_local:/backups environment: - POSTGRES_USER={{cookiecutter.project_slug}} {% if cookiecutter.use_mailhog == 'y' %} @@ -46,7 +48,7 @@ services: - postgres{% if cookiecutter.use_mailhog == 'y' %} - mailhog{% endif %} ports: [] - command: /start-celeryworker-dev.sh + command: /start-celeryworker.sh celerybeat: # https://github.com/docker/compose/issues/3220 @@ -56,5 +58,5 @@ services: - postgres{% if cookiecutter.use_mailhog == 'y' %} - mailhog{% endif %} ports: [] - command: /start-celerybeat-dev.sh + command: /start-celerybeat.sh {% endif %} diff --git a/{{cookiecutter.project_slug}}/production.yml b/{{cookiecutter.project_slug}}/production.yml index 79e856dfb..ef9163e5a 100644 --- a/{{cookiecutter.project_slug}}/production.yml +++ b/{{cookiecutter.project_slug}}/production.yml @@ -6,54 +6,52 @@ volumes: caddy: {} services: - django: + django:{% if cookiecutter.use_celery == 'y' %} &django{% endif %} build: context: . - dockerfile: ./compose/django/Dockerfile + dockerfile: ./compose/production/django/Dockerfile depends_on: - postgres - redis - command: /gunicorn.sh env_file: .env + command: /gunicorn.sh postgres: - build: ./compose/postgres + build: + context: . + dockerfile: ./compose/production/postgres/Dockerfile volumes: - postgres_data:/var/lib/postgresql/data - postgres_backup:/backups env_file: .env caddy: - build: ./compose/caddy + build: + context: . + dockerfile: ./compose/production/caddy/Dockerfile depends_on: - django - ports: - - "0.0.0.0:80:80" - - "0.0.0.0:443:443" volumes: - caddy:/root/.caddy env_file: .env + ports: + - "0.0.0.0:80:80" + - "0.0.0.0:443:443" redis: image: redis:3.0 {% if cookiecutter.use_celery == 'y' %} celeryworker: - build: - context: . - dockerfile: ./compose/django/Dockerfile - env_file: .env + <<: *django depends_on: - postgres - redis - command: celery -A {{cookiecutter.project_slug}}.taskapp worker -l INFO + command: /start-celeryworker.sh celerybeat: - build: - context: . - dockerfile: ./compose/django/Dockerfile - env_file: .env + <<: *django depends_on: - postgres - redis - command: celery -A {{cookiecutter.project_slug}}.taskapp beat -l INFO + command: /start-celerybeat.sh {% endif %} diff --git a/{{cookiecutter.project_slug}}/requirements/production.txt b/{{cookiecutter.project_slug}}/requirements/production.txt index b9f09ca75..a347337f8 100644 --- a/{{cookiecutter.project_slug}}/requirements/production.txt +++ b/{{cookiecutter.project_slug}}/requirements/production.txt @@ -4,8 +4,8 @@ {% if cookiecutter.windows == 'y' -%} # Python-PostgreSQL Database Adapter -# If using Win for dev, this assumes Unix in prod -# ------------------------------------------------ +# Assuming Windows is used locally, and *nix -- in production. +# ------------------------------------------------------------ psycopg2==2.7.3.1 {%- endif %}