Initial commit with BSL

This commit is contained in:
Andy Pavlo
2019-08-23 11:47:19 -04:00
commit 3e564ce922
286 changed files with 177642 additions and 0 deletions

1
docker/.dockerignore Normal file
View File

@@ -0,0 +1 @@
*.swp

23
docker/Dockerfile Normal file
View File

@@ -0,0 +1,23 @@
FROM ottertune-base
ENV DJANGO_SETTINGS_MODULE=website.settings
ENV C_FORCE_ROOT=true
RUN mkdir -p /app
COPY . /app
WORKDIR /app/server/website
COPY ./docker/credentials.py ./website/settings
COPY ./docker/start.sh .
COPY ./docker/createadmin.py .
COPY ./docker/wait-for-it.sh .
RUN chmod +x ./*.sh
RUN sed s/'@localhost'/'@rabbitmq'/g ./website/settings/common.py > tmp \
&& mv tmp ./website/settings/common.py
ENTRYPOINT ["./start.sh"]

View File

@@ -0,0 +1,31 @@
FROM centos:7
ARG GRADLE_VERSION=gradle-5.5.1
ENV GRADLE_HOME=/opt/${GRADLE_VERSION}
ENV PATH=${GRADLE_HOME}/bin:${PATH}
COPY ./server/website/requirements.txt /
RUN yum update -y \
&& yum install -y mariadb mariadb-devel \
https://centos7.iuscommunity.org/ius-release.rpm \
&& yum install -y gcc git MySQL-python openldap-devel \
parallel python36u python36u-devel python36u-libs \
python36u-pip python36u-tkinter rabbitmq-server \
java-11-openjdk-devel wget which unzip curl \
&& yum -y autoremove \
&& yum clean metadata \
&& yum clean all \
&& ln -s `which python3.6` /usr/bin/python3 \
&& ln -s `which pip3.6` /usr/bin/pip3 \
&& wget https://services.gradle.org/distributions/${GRADLE_VERSION}-bin.zip \
&& unzip ${GRADLE_VERSION}-bin.zip -d /opt \
&& rm ${GRADLE_VERSION}-bin.zip \
&& python3 --version \
&& pip3 --version \
&& javac --version \
&& gradle --version \
&& pip3 install -r /requirements.txt \
&& rm /requirements.txt

View File

@@ -0,0 +1,24 @@
FROM ubuntu:18.04
ARG GRADLE_VERSION=gradle-5.5.1
ENV DEBIAN_FRONTEND=noninteractive
ENV GRADLE_HOME=/opt/${GRADLE_VERSION}
ENV PATH=${GRADLE_HOME}/bin:${PATH}
COPY ./server/website/requirements.txt /
RUN apt-get update \
&& apt-get install -y python3.6 python3-pip python3-tk \
mysql-client libmysqlclient-dev python-mysqldb \
openjdk-11-jdk git unzip wget curl \
&& wget https://services.gradle.org/distributions/${GRADLE_VERSION}-bin.zip \
&& unzip ${GRADLE_VERSION}-bin.zip -d /opt \
&& rm ${GRADLE_VERSION}-bin.zip \
&& python3 --version \
&& pip3 --version \
&& javac --version \
&& gradle --version \
&& pip3 install -r /requirements.txt \
&& rm /requirements.txt

21
docker/Dockerfile.test Normal file
View File

@@ -0,0 +1,21 @@
FROM ottertune-base
ENV DJANGO_SETTINGS_MODULE=website.settings
ENV C_FORCE_ROOT=true
RUN mkdir -p /app
COPY . /app
WORKDIR /app/server/website
RUN pip3 install codecov
COPY ./docker/credentials.py ./website/settings
COPY ./docker/wait-for-it.sh .
RUN chmod +x ./*.sh
RUN sed s/'@localhost'/'@rabbitmq'/g ./website/settings/common.py > tmp \
&& mv tmp ./website/settings/common.py

26
docker/createadmin.py Normal file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env python
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "website.settings")
django.setup()
from django.contrib.auth.models import User
username = os.environ.get('ADMIN_USER', 'admin')
password = os.environ.get('ADMIN_PASSWORD')
email = os.environ.get('ADMIN_EMAIL', 'admin@example.com')
if password:
if not User.objects.filter(username=username).exists():
print(f"Creating '{username}' user...")
User.objects.create_superuser(username=username,
password=password,
email=email)
print(f"'{username}' user created!")
else:
print(f"'{username}' user already exists! Setting '{username}' password")
u = User.objects.get(username=username)
u.set_password(password)
u.save()

24
docker/credentials.py Normal file
View File

@@ -0,0 +1,24 @@
import secrets
from os import environ as env
db_user = env.get('MYSQL_USER')
db_pwd = env.get('MYSQL_PASSWORD')
db_host = env.get('MYSQL_HOST')
db_port = env.get('MYSQL_PORT', '3306')
debug = env.get('DEBUG')
SECRET_KEY = secrets.token_hex(16)
DATABASES = {
'default': {'ENGINE': 'django.db.backends.mysql',
'NAME': 'ottertune',
'USER': db_user,
'PASSWORD': db_pwd,
'HOST': db_host,
'PORT': db_port,
'OPTIONS': {'init_command': 'SET sql_mode=\'STRICT_TRANS_TABLES\',innodb_strict_mode=1',}
}
}
DEBUG = True
ADMINS = ()
MANAGERS = ADMINS
ALLOWED_HOSTS = []

View File

@@ -0,0 +1,85 @@
version: "3"
services:
base:
build:
context: ../
dockerfile: ./docker/Dockerfile.base-ubuntu-18.04
image: ottertune-base
container_name: ottertune-base
labels:
NAME: "ottertune-base"
test:
build:
context: ../
dockerfile: ./docker/Dockerfile.test
image: ottertune-test
container_name: ottertune-test
expose:
- "8000"
ports:
- "8000:8000"
links:
- mysql
- rabbitmq
depends_on:
- mysql
- rabbitmq
environment:
DEBUG: 'True'
MYSQL_USER: 'root'
MYSQL_PASSWORD: 'ottertune'
MYSQL_HOST: 'mysql'
MAX_DB_CONN_ATTEMPTS: 15
labels:
NAME: "ottertune-test"
volumes:
- media_data:/app/server/website/media
networks:
- ottertune-net
mysql:
image: mysql:5.7
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 'ottertune'
MYSQL_PASSWORD: 'ottertune'
MYSQL_DATABASE: 'ottertune'
expose:
- "3306"
ports:
- "3306:3306"
labels:
NAME: "mysql"
volumes:
- mysql_data:/var/lib/mysql
networks:
- ottertune-net
rabbitmq:
image: "rabbitmq:3-management"
container_name: rabbitmq
restart: always
hostname: "rabbitmq"
environment:
RABBITMQ_DEFAULT_USER: "guest"
RABBITMQ_DEFAULT_PASS: "guest"
RABBITMQ_DEFAULT_VHOST: "/"
expose:
- "15672"
- "5672"
ports:
- "15672:15672"
- "5672:5672"
labels:
NAME: "rabbitmq"
networks:
- ottertune-net
volumes:
mysql_data:
media_data:
networks:
ottertune-net:
driver: bridge

88
docker/docker-compose.yml Normal file
View File

@@ -0,0 +1,88 @@
version: "3"
services:
base:
build:
context: ../
dockerfile: ./docker/Dockerfile.base-ubuntu-18.04
image: ottertune-base
container_name: ottertune-base
labels:
NAME: "ottertune-base"
web:
build:
context: ../
dockerfile: ./docker/Dockerfile
image: ottertune
container_name: ottertune
expose:
- "8000"
ports:
- "8000:8000"
links:
- mysql
- rabbitmq
depends_on:
- base
- mysql
- rabbitmq
environment:
DEBUG: 'True'
ADMIN_PASSWORD: 'changeme'
ADMIN_EMAIL: 'admin@example.com'
MYSQL_USER: 'root'
MYSQL_PASSWORD: 'ottertune'
MYSQL_HOST: 'mysql'
MAX_DB_CONN_ATTEMPTS: 15
labels:
NAME: "ottertune"
volumes:
- media_data:/app/server/website/media
networks:
- ottertune-net
mysql:
image: mysql:5.7
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 'ottertune'
MYSQL_PASSWORD: 'ottertune'
MYSQL_DATABASE: 'ottertune'
expose:
- "3306"
ports:
- "3306:3306"
labels:
NAME: "mysql"
volumes:
- mysql_data:/var/lib/mysql
networks:
- ottertune-net
rabbitmq:
image: "rabbitmq:3-management"
container_name: rabbitmq
restart: always
hostname: "rabbitmq"
environment:
RABBITMQ_DEFAULT_USER: "guest"
RABBITMQ_DEFAULT_PASS: "guest"
RABBITMQ_DEFAULT_VHOST: "/"
expose:
- "15672"
- "5672"
ports:
- "15672:15672"
- "5672:5672"
labels:
NAME: "rabbitmq"
networks:
- ottertune-net
volumes:
mysql_data:
media_data:
networks:
ottertune-net:
driver: bridge

14
docker/start.sh Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
# Wait for MySQL connection
/bin/bash wait-for-it.sh
## Needs a connection to a DB so migrations go here
python3 manage.py makemigrations website
python3 manage.py migrate
python3 createadmin.py
python3 manage.py celery worker --loglevel=info --pool=threads &
python3 manage.py celerybeat --verbosity=2 --loglevel=info &
python3 manage.py runserver 0.0.0.0:8000

19
docker/wait-for-it.sh Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/sh
# wait until MySQL is really available
maxcounter=${MAX_DB_CONN_ATTEMPTS:-45}
echo "Trying to connect to mysql, max attempts="$maxcounter
counter=1
while ! mysql --host="$MYSQL_HOST" --protocol TCP -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "show databases;" > /dev/null 2>&1; do
sleep 1
counter=`expr $counter + 1`
if [ $counter -gt $maxcounter ]; then
>&2 echo "We have been waiting for MySQL too long already; failing."
exit 1
fi;
done
echo "-=------------------------------------------------------"
echo "-=------------------------------------------------------"
echo "Connected to MySQL!"
echo "-=------------------------------------------------------"
echo "-=------------------------------------------------------"