Skip to content
Permalink
Browse files

Updated compose and dockerfile.

  • Loading branch information...
aaronweaver committed Feb 5, 2019
2 parents 897dc04 + 6107333 commit 2d2c212f1e76c6c113d0007e5eff95e410251645
@@ -1,3 +1,10 @@
# Docker container persistent data
docker/data/
docker/static/

# VS Code
.vscode/

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
@@ -46,7 +53,6 @@ coverage.xml
# Django stuff:
*.log
*.pot
**/settings.py

# Vim swapfiles
*.swp
@@ -14,9 +14,9 @@ Here are a few things to keep in mind when making changes to DefectDojo.

## Modifying DefectDojo and Testing

Please use [these test scripts](./tests) to test your changes. These are the exact scripts we run in our [Travis Build](https://travis-ci.org/OWASP/django-DefectDojo)
Please use [these test scripts](./tests) to test your changes. These are the exact scripts we run in our [Travis Build](https://travis-ci.org/OWASP/django-DefectDojo).

For changes that require additional settings. settings.dist.py is the file you want to change. settings.py is populated by setup.bash from settings.dist.py
For changes that require additional settings, settings.dist.py is the file you want to change. Settings.py is created by setup.bash from settings.dist.py

## Submitting Pull Requests

@@ -1,7 +1,21 @@
FROM ubuntu:16.04 as base
FROM ubuntu:latest as base
MAINTAINER Matt Tesauro <matt.tesauro@owasp.org>, Aaron Weaver <aaron.weaver@owasp.org>

# # # Create a docker image for DefectDojo and all dependencies
# Multi-stage build for DefectDojo
# Stage 1: base
# Creates the base image with DefectDojo and Django
#
# Stage 2: dev-mysql-self-contained
# Creates an all in one with mysql for travis and dev testing
#
# Stage 3: release
# DefectDojo app only with depenencies and for use with an external DB
#
# To build MySQL:
# docker build --target dev-mysql-self-contained -t defectdojo-dev-mysql-self-contained .
#
# To build release (no DB):
# docker build --target release -t defectdojo-release .

# Create the application user;
RUN adduser --disabled-password --gecos "DefectDojo" dojo
@@ -17,12 +31,13 @@ RUN ./setup-docker.bash -y dependencies
FROM base as dev-mysql-self-contained
RUN ./setup-docker.bash -y db -d MYSQL
# Give the app user sudo permissions and switch executing user
ADD ./docker/etc/dojo_sudo /etc/sudoers.d/
ADD ./docker/dojo_sudo /etc/sudoers.d/
USER dojo:dojo
# Start DefectDojo Services
CMD entrypoint_scripts/run/startup-docker.bash

########## Stage: release ##########
FROM dev-mysql-self-contained as release
RUN ./setup-docker.bash -y release
# USER dojo
CMD gunicorn --bind 0.0.0.0:$PORT wsgi
RUN chmod +x docker/entrypoint.sh
CMD docker/entrypoint.sh
@@ -28,7 +28,7 @@
"@yarn_components/mocha": "mochajs/mocha#~1.17.1",
"@yarn_components/moment": "moment/moment#^2.9.0",
"@yarn_components/morrisjs": "morrisjs/morris.js#~0.5.1",
"@yarn_components/startbootstrap-sb-admin-2": "BlackrockDigital/startbootstrap-sb-admin-2#*",
"@yarn_components/startbootstrap-sb-admin-2": "BlackrockDigital/startbootstrap-sb-admin-2#~3.3.7+1",
"@yarn_components/simplemde": "sparksuite/simplemde-markdown-editor#1.11.2"
},
"engines": {
@@ -0,0 +1,77 @@
# Structure:
# Internet --> [ nginx ] --> [ django ] --> [ mysql ]
# | Data network |
# | Proxy network |

version: '3.4'

networks:
data:
external: false
proxy:
external: false

services:

django:
build:
context: .
target: release
container_name: 'defectdojo_django'
depends_on:
- mysql
environment:
DEFECT_DOJO_ADMIN_PASSWORD: ${DEFECT_DOJO_ADMIN_PASSWORD:-admin}
DEFECT_DOJO_DEFAULT_DATABASE_HOST: 'mysql'
DEFECT_DOJO_DEFAULT_DATABASE_PORT: '3306'
DEFECT_DOJO_DEFAULT_DATABASE_NAME: 'dojodb'
DEFECT_DOJO_DEFAULT_DATABASE_USER: 'dojo'
DEFECT_DOJO_DEFAULT_DATABASE_PASSWORD: ${DEFECT_DOJO_DEFAULT_DATABASE_PASSWORD:-dojodbpwd}
DD_DATABASE_URL: 'mysql://dojo:${DEFECT_DOJO_DEFAULT_DATABASE_PASSWORD:-dojodbpwd}@mysql:3306/dojodb'
DD_ALLOWED_HOSTS: '*'
DD_SECRET_KEY: ${DD_SECRET_KEY:-"hhZCp@D28z!n@NED*yB!ROMt+WzsY*iq"}
DD_CREDENTIAL_AES_256_KEY: ${DD_CREDENTIAL_AES_256_KEY:-"&91a*agLqesc*0DJ+2*bAbsUZfR*4nLw"}
hostname: 'django'
networks:
- data
- proxy
volumes:
- './docker/static:/opt/django-DefectDojo/static'

mysql:
command: '--default-authentication-plugin=mysql_native_password'
container_name: 'defectdojo_mysql'
environment:
MYSQL_ROOT_PASSWORD: ${DEFECT_DOJO_MYSQL_ROOT_PASSWORD:-defectojo}
MYSQL_DATABASE: 'dojodb'
MYSQL_USER: 'dojo'
MYSQL_PASSWORD: ${DEFECT_DOJO_DEFAULT_DATABASE_PASSWORD:-dojodbpwd}
hostname: 'mysql'
image: 'mysql:5.7'
networks:
- data
volumes:
- './docker/data:/var/lib/mysql'

nginx:
container_name: 'defectdojo_nginx'
depends_on:
- django
hostname: 'nginx'
image: 'nginx:latest'
networks:
- proxy
ports:
- '8080:80'
- '4443:443'
volumes:
- "$PWD/docker/nginx.conf:/etc/nginx/nginx.conf:ro"
- "$PWD/docker/cert.pem:/cert.pem:ro"
- "$PWD/docker/key.pem:/key.pem:ro"
# This gives Nginx access to the static assets compiled by Django.
- './docker/static:/usr/share/nginx/html/static:ro'
healthcheck:
test: ["CMD", "wget", "-qO-", "http://django:8000"]
interval: 20s
timeout: 1s
retries: 6
@@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIFCjCCAvICCQC/GBFtSPGSvTANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQGEwJV
UzEOMAwGA1UECgwFT1dBU1AxKDAmBgNVBAMMH0RlZmF1bHQgRGVmZWN0IERvam8g
Q2VydGlmaWNhdGUwHhcNMTgxMTI5MjA0MDEyWhcNMTkxMTI5MjA0MDEyWjBHMQsw
CQYDVQQGEwJVUzEOMAwGA1UECgwFT1dBU1AxKDAmBgNVBAMMH0RlZmF1bHQgRGVm
ZWN0IERvam8gQ2VydGlmaWNhdGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQDMgFFI9ESJ6D7hLCo4t8ZWVdaQZVGzPnh2iggF29gUM1pOca+Sv9Gz6PbT
LLRa90O5xK0S0Y+71t7uLJUZKYZYslBw0GF/U7d9Ej1ZcsiSH1zjYhAynuAGb84V
YWlBz1is/MSMO6N2DyMaBC2fSTh3FK0fDndcYyHHMbxDG64b3f67AAXMjTFpqUIo
SlRf0WJO6dvniYp7Npz9L6idY2lpFOz7GRj3EjuTK6nxm/jU6XN0EIbMkol263em
EKpB0+6m+KByRl83QIeBdN7AdlSZiAImj1GY1a3KutJXOJAOegE1J2pcXlZl2o3K
YwiIkRUzk6m8opL+JBRuCVd38WnpRufjK8ajXrDfJthJ9cRAL8xAG1mwmq1huDfP
nckBnb6ucdbuErTyKTSRKB833J0Y8+FyZ51g5dpkhOB1WJ7pwJBIb87ZElqNAzCh
i9azlTwx+thop8Una2MVmrfGgUcdFIDPgieIsya/mNODNhsnSsRYihEPo7g2mLFp
oLT2aQKO4CH/7VjiXzG1QT013PSz/XOI9MJx2Gd2RPzMNxtXZoylmnTcHNF3SL14
sEQ/MNcLGSgIaX4gZ8Y5xVXKiF72+hsbZM7s55jhiYdZKMozrHPtks1RsmdD4Ksk
hZ8jgejkZR4pXZhf354/U9NtTxUeHawPvtaKjAk4GfHNnDHQowIDAQABMA0GCSqG
SIb3DQEBCwUAA4ICAQBmBjlyR5m6ECoJ2sUNvzGc/7fDc1qdSJ2hRRw3mjg3Yejk
YCB+q4VOlJn2pzhfYKrmMFT4K0RpOsQr0MKwxrEnWm4WdpbfTe2cDWI+VCVVxv7C
MQAxvwhdaecVgr3onUOSSOehw2wi6bzBYXklx0p53npfQVjUMXTxgYBV7zwuttnS
e/gKIN6y4Pag74KJHVHZtHbVL98NKJvubBe1iYgl5zbOSZyjy/L1nhErFu7IjXL/
GY3IE4vaioMXsChRX8nnT01+IzkVkhDof2sMZxAKSWGy2v6W3/4B9TV2wOeTHejr
h8dQUumrhvZ4pE+I5HyCkpofnAufBIadaOM/Dza9ZjX2bwlLGywfF2JYAYZgdbqi
4VCOJTQzyxcjo5lRtrtrhMVzIcaakOFBgsE9WApGnzehenhFazUmjWW2mK7o5911
3715rLdG6T70CYjO0IzQwh0WbHmJca/DyqztTKIcba88ujNmXVXutE4xMIzRedVy
ccyUFV4kBOmR8dz0P/myVYW6lMjgIKKj10KM1bd4DFPgO+Cxg+nZGlyuflmBp+he
5gCHq96ZkVpdPVWnuxmKJDGOvH60WepgzmipvB/SoUpePke8CGuXnrnZiTzkRjNB
CiNaQdQRCuTgasSOO66sXqQzrhodjqze2H527MrzjJnO0ia9+CEJ0NtzVSZKuQ==
-----END CERTIFICATE-----
@@ -12,12 +12,6 @@ source entrypoint_scripts/common/dojo-shared-resources.sh
# This function invocation ensures we're running the script at the right place
verify_cwd

#Set the SQL variables
SQLUSER=$MYSQL_USER
SQLPWD=$MYSQL_PASSWORD
SQLHOST=$DOJO_MYSQL_HOST
DBNAME=$MYSQL_DATABASE

########### Setup and Run Entry #############
if [ "$1" == "setup" ]; then
setupdojo
@@ -33,44 +27,7 @@ else

source $DOJO_VENV_NAME/bin/activate

#Check to see if Dojo has been setup by checking the settings.py file
if [ ! -f dojo/settings/settings.py ];
then
echo "=============================================================================="
echo "Creating dojo/settings/settings.py file"
echo "=============================================================================="
echo
unset HISTFILE

SECRET=`cat /dev/urandom | tr -dc "a-zA-Z0-9" | head -c 128`

cp dojo/settings/settings.dist.py dojo/settings/settings.py

# Save MySQL details in settings file
sed -i "s/MYSQLUSER/$SQLUSER/g" dojo/settings/settings.py
sed -i "s/MYSQLPWD/$SQLPWD/g" dojo/settings/settings.py
sed -i "s/MYSQLDB/$DBNAME/g" dojo/settings/settings.py
sed -i "s/MYSQLHOST/$DOJO_MYSQL_HOST/g" dojo/settings/settings.py
sed -i "s/MYSQLPORT/$DOJO_MYSQL_PORT/g" dojo/settings/settings.py
sed -i "s#DOJODIR#$PWD/dojo#g" dojo/settings/settings.py
sed -i "s/DOJOSECRET/$SECRET/g" dojo/settings/settings.py
sed -i "s#DOJOURLPREFIX#$DOJO_URL_PREFIX#g" dojo/settings/settings.py
sed -i "s#BOWERDIR#$PWD/components#g" dojo/settings/settings.py
sed -i "s#DOJO_MEDIA_ROOT#$PWD/media/#g" dojo/settings/settings.py
sed -i "s#DOJO_STATIC_ROOT#$PWD/static/#g" dojo/settings/settings.py

if [ "$RUN_TIERED" = True ]; then
echo "Setting dojo settings for tiered docker-compose."
sed -i "s/TEMPLATE_DEBUG = DEBUG/TEMPLATE_DEBUG = False/g" dojo/settings/settings.py
sed -i "s/DEBUG = True/DEBUG = False/g" dojo/settings/settings.py
sed -i "s/ALLOWED_HOSTS = \[]/ALLOWED_HOSTS = ['localhost', '127.0.0.1']/g" dojo/settings/settings.py
else
echo "Setting dojo settings for SQLLITEDB."
SQLLITEDB="'NAME': os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'db.sqlite3')"
sed -i "s/django.db.backends.mysql/django.db.backends.sqlite3/g" dojo/settings/settings.py
sed -i "s/'NAME': '$DBNAME'/$SQLLITEDB/g" dojo/settings/settings.py
fi
fi
unset HISTFILE

#Checking if local or 3 tier setup
if [ "$RUN_TIERED" = True ]; then
@@ -79,13 +36,13 @@ else
echo "=============================================================================="
echo
#Make sure MySQL is up and running, run the mysql script to check the port and report back
bash $DOCKER_DIR/wait-for-it.sh $DOJO_MYSQL_HOST:$DOJO_MYSQL_PORT
bash ./wait-for-it.sh $DEFECT_DOJO_DEFAULT_DATABASE_HOST:$DEFECT_DOJO_DEFAULT_DATABASE_PORT

if [ $? -eq 0 ]; then
echo "Database server is up and running."
echo
if [ $(mysql -N -s -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE --host $DOJO_MYSQL_HOST -e \
"select count(*) from information_schema.tables where table_schema='$MYSQL_DATABASE' and table_name='dojo_product';") -eq 1 ]; then
if [ $(mysql -N -s -u$DEFECT_DOJO_DEFAULT_DATABASE_USER -p$DEFECT_DOJO_DEFAULT_DATABASE_PASSWORD $DEFECT_DOJO_DEFAULT_DATABASE_NAME --host $DEFECT_DOJO_DEFAULT_DATABASE_HOST --port $DEFECT_DOJO_DEFAULT_DATABASE_PORT -e \
"select count(*) from information_schema.tables where table_schema='$DEFECT_DOJO_DEFAULT_DATABASE_NAME' and table_name='dojo_product';") -eq 1 ]; then
echo "DB Exists."
else
setupdb
@@ -108,12 +65,12 @@ else
if [ ! -f setupcomplete ];
then
createadmin
bash $DOCKER_DIR/dojo-data.bash load
bash docker/dojo-data.bash load
touch setupcomplete
fi

echo "=============================================================================="
echo "Login with $DOJO_ADMIN_USER/$DOJO_ADMIN_PASSWORD"
echo "Login with $DOJO_ADMIN_USER/$DEFECT_DOJO_DEFAULT_DATABASE_USER"
echo "URL: http://localhost:$PORT"
echo "=============================================================================="
echo
File renamed without changes.
@@ -0,0 +1,44 @@
#!/bin/sh

# Waits for the database to come up.
./docker/wait-for-it.sh $DEFECT_DOJO_DEFAULT_DATABASE_HOST:$DEFECT_DOJO_DEFAULT_DATABASE_PORT

if [ ! -f "/opt/django-DefectDojo/static/docker_complete" ]; then
python manage.py makemigrations dojo
python manage.py makemigrations --merge --noinput
python manage.py migrate

if [ -z "$DEFECT_DOJO_ADMIN_PASSWORD" ]; then
DEFECT_DOJO_ADMIN_PASSWORD="admin"
fi

# The '&&' is critical here. If the admin user is already created, setting the
# password will not be done.
python manage.py createsuperuser \
--noinput \
--username=admin \
--email='admin@localhost' && \
./docker/setup-superuser.expect

python manage.py loaddata product_type
python manage.py loaddata test_type
python manage.py loaddata development_environment
python manage.py loaddata system_settings
python manage.py loaddata benchmark_type
python manage.py loaddata benchmark_category
python manage.py loaddata benchmark_requirement
python manage.py loaddata language_type
python manage.py loaddata objects_review
python manage.py loaddata regulation
python manage.py installwatson
python manage.py buildwatson
python manage.py collectstatic --noinput
touch /opt/django-DefectDojo/static/docker_complete
fi

gunicorn \
--env DJANGO_SETTINGS_MODULE=dojo.settings.settings \
dojo.wsgi:application \
--bind 0.0.0.0:8000 \
--workers 3 &
celery -A dojo worker -l info --concurrency 3
@@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
3GxKNfArkd2PJiPG5dVN03SFMg0IEQFH
-----END PRIVATE KEY-----

0 comments on commit 2d2c212

Please sign in to comment.
You can’t perform that action at this time.