Wiki.js

Dockerfile for Python (django) application

This is the base Dockerfile can be used to serve Django or similar php application. Based on Debian slim. Average size may vary.

Backend.Dockerfile

FROM python:3.7-slim-stretch

RUN apt-get update \
    && apt-get -y install libpq-dev build-essential \
    && apt-get -y install nginx \
    && export LC_ALL="en_EN.UTF-8" \
    && mkdir /opt/app \
    && apt-get clean && rm -rf /var/lib/apt/lists/*


WORKDIR /opt/app

COPY requirements.txt /opt/app/requirements.txt

RUN pip3 install -r /opt/app/requirements.txt

COPY config/nginx_proxy.conf /etc/nginx/sites-available/default

EXPOSE 80

COPY . /opt/app

CMD /bin/bash -c "while true; do sleep 1; done"

Frontend.Dockerfile

FROM node:12-alpine

RUN apk add nginx curl
RUN mkdir -p /run/nginx && mkdir -p /app/packages/ui
COPY ./nginx_default.conf /etc/nginx/conf.d/default.conf

WORKDIR /app

ENV API_URL=https://hypr.shakuro.info

COPY . .

RUN yarn install
RUN yarn build

RUN ln -s /app/packages/app-next/.next/ /app/packages/app-next/_next

EXPOSE 80
CMD ["sh", "-c", "nginx; yarn start"]

Docker-compose.file

version: '3'
services:
  
  db:
    image: postgres:12-alpine
    container_name: ${PROJECT_NAME}_db
    restart: always
    networks:
       overlay:
        aliases:
         - postgres
    ports:
      - "5432:5432"
    env_file:
      - ./.env
    volumes:
      - pg_data:/var/lib/postgresql/data

  backend:
    build:
      context: .
      dockerfile: Dockerfile
    image: ${PROJECT_HUB}/${PROJECT_NAME}/backend:${IMAGE_TAG}
    container_name: ${PROJECT_NAME}_backend
    restart: always
    #volumes:
    #  - ./:/opt/app
    networks:
       overlay:
        aliases:
         - backend
    env_file:
      - ./.env
    command: bash -c "nginx && python3 manage.py migrate && gunicorn --workers 3 --bind unix:/tmp/gunicorn.sock config.wsgi:application"
    #command: bash -c "python manage.py runserver 0:8000"
    ports:
      - "8000:80"


  frontend:
    image: ${PROJECT_HUB}/${PROJECT_NAME}/frontend:${IMAGE_TAG}
    container_name: ${PROJECT_NAME}_frontend
    restart: always
    networks:
      overlay:
        aliases:
          - frontend
    env_file:
      - ./.env
    ports:
      - "7000:80"

networks:
  overlay:

volumes:
  pg_data:

nginx_proxy.conf (for backend)

upstream app_server {
   server unix:/tmp/gunicorn.sock fail_timeout=0;
}

server {
	listen 80 default_server;
	listen [::]:80 default_server;

	root /opt/app;

	index index.html index.htm index.nginx-debian.html;

	server_name _;

  location / {
      try_files $uri @proxy_to_app;
  }

  location /static/ {
    root /opt/app;
  }

  location @proxy_to_app {
     proxy_pass http://app_server;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "upgrade";
     proxy_set_header Host $http_host;
     proxy_set_header X-Forwarded-Proto $scheme;
     proxy_set_header X-Forwarded-For $remote_addr;
     proxy_set_header X-Forwarded-Port $server_port;
     proxy_set_header X-Request-Start $msec;
  }
}

nginx_default.conf (for frontend)

upstream hypr {
  server 127.0.0.1:3001;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        #gzip on;
        #gzip_vary on;
        #gzip_types text/plain application/json application/javascript image/svg+xml;

        #location /static {
        #   root /app/packages/project-bfd;
        #   expires max;
        #}

        location /_next {
           root /app/packages/app-next;
           expires max;
        }


        location / {
         proxy_pass http://hypr;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

}