Skip to content

Instantly share code, notes, and snippets.

@kennethlove
Created May 16, 2019 16:53
Show Gist options
  • Save kennethlove/45119c5dce560665f9090a22d9153d15 to your computer and use it in GitHub Desktop.
Save kennethlove/45119c5dce560665f9090a22d9153d15 to your computer and use it in GitHub Desktop.
# data/nginx/app.conf
upstream app {
server app:8000;
}
server {
listen 80;
server_name localhost; # your-domain.com;
# uncomment this next block if you want only HTTPS connections
# this will require more work, though, as you'll need
# valid SSL certificates
# location / {
# return 301 https://$host$request_uri;
# }
location / {
proxy_pass http://app;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# data/postgres/database_env
POSTGRES_USER=database_role
POSTGRES_PASSWORD=database_password
POSTGRES_DB=project_database
version: "3"
services:
nginx: # nginx is a web server, we use this for static assets and redirects
image: nginx:1.15-alpine
ports:
- "80:80" # this will actually make your site available on `localhost` with no port
- "443:443" # only used for HTTPS
volumes:
- ./data/nginx:/etc/nginx/conf.d
command: '/bin/sh -c ''while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g "daemon off;"'''
networks:
- frontend
depends_on:
- app # make sure the app container is started
database:
image: postgres:10
ports:
- "5432:5432" # you likely don't need this if you don't use a local postgres gui
volumes:
- pg_data:/var/lib/postgresql/data
- pg_backups:/pg_backups
env_file:
- data/postgres/database_env # this sets up passwords and such
networks:
- backend # so django can talk to the database
app: # this is our Django app
build: . # our Dockerfile is in the current dir and should be used to create this container
restart: always
ports:
- "8000:8000" # expose runserver's port
depends_on:
- database # gotta have a database
networks:
- frontend # so nginx can talk to django
- backend # so django can talk to the database
volumes:
- ./app:/opt/app # put our local "app" directory into the container at /opt/app
manage: # this is just for convenience
build: .
command: shell # run the `shell` management command by default
entrypoint: /usr/local/bin/python3 /opt/app/manage.py # append the command to this path
networks:
- backend # so django can talk to the database
volumes:
- ./app:/opt/app # we need the same code available as `app`, so put it in the same place
depends_on:
- database # needs the database to be able to run migrations and such
volumes:
pg_data: {}
pg_backups: {}
networks:
frontend:
driver: bridge
backend:
driver: bridge
FROM python:3.7
RUN apt-get update && \
apt-get install -y && \
pip3 install uwsgi
COPY ./app /opt/app
RUN python -m pip install --upgrade pip
RUN pip3 install -r /opt/app/requirements.txt
ENV DJANGO_ENV=prod
ENV PYTHONUNBUFFERED 1
EXPOSE 8000
CMD ["uwsgi", "--ini", "/opt/app/uwsgi.ini"]
[uwsgi]
http-socket = :8000
chdir = /opt/app
module = app.wsgi
master = 1
processes = 2
threads = 2
py-autoreload = 3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment