diff --git a/README.md b/README.md index 443f3df6..93430988 100644 --- a/README.md +++ b/README.md @@ -81,9 +81,9 @@ git clone https://github.com/chakki-works/doccano.git cd doccano ``` -To install doccano, there are two options: +To install doccano, there are three options: -**Option1: Pull the Docker image** +**Option1: Pull the production Docker image** ```bash docker pull chakkiworks/doccano @@ -108,6 +108,12 @@ npm run build # npm start # for developers ``` +**Option3: Pull the development Docker-Compose images** + +```bash +docker-compose pull +``` + ## Usage ### Start the development server @@ -150,6 +156,14 @@ Finally, to start the server, run the following command: python manage.py runserver ``` +**Option3: Running the development Docker-Compose stack** + +We can use docker-compose to set up the webpack server, django server, database, etc. all in one command: + +```bash +docker-compose up +``` + Now, open a Web browser and go to . You should see the login screen: Login Form diff --git a/app/server/webpack.config.js b/app/server/webpack.config.js index 7477d93a..8f260bcc 100644 --- a/app/server/webpack.config.js +++ b/app/server/webpack.config.js @@ -4,6 +4,9 @@ const VueLoaderPlugin = require('vue-loader/lib/plugin') const devMode = process.env.DEBUG !== 'False'; const hotReload = process.env.HOT_RELOAD === '1'; +const webpackHost = process.env.WEBPACK_HOST || '127.0.0.1'; +const webpackPort = process.env.WEBPACK_PORT ? parseInt(process.env.WEBPACK_PORT, 10) : 8080; +const pollMillis = process.env.WEBPACK_POLL_MILLIS ? parseInt(process.env.WEBPACK_POLL_MILLIS, 10) : false; module.exports = { mode: devMode ? 'development' : 'production', @@ -27,16 +30,21 @@ module.exports = { 'download_text_classification': './static/js/download_text_classification.js', }, output: { - publicPath: hotReload ? 'http://localhost:8080/' : '', + publicPath: hotReload ? `http://127.0.0.1:${webpackPort}/` : '', path: __dirname + '/static/bundle', filename: '[name].js' }, devtool: devMode ? 'cheap-eval-source-map' : 'source-map', devServer: { + port: webpackPort, + host: webpackHost, hot: true, quiet: false, headers: { 'Access-Control-Allow-Origin': '*' } }, + watchOptions: { + poll: pollMillis, + }, module: { rules: [ { diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..500e4239 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,42 @@ +version: "3" +services: + + django: + image: python:3.6 + volumes: + - .:/src + - venv:/src/venv + command: ["/src/tools/dev-django.sh", "0.0.0.0:8000"] + environment: + ADMIN_USERNAME: "admin" + ADMIN_PASSWORD: "password" + ADMIN_EMAIL: "admin@example.com" + DATABASE_URL: "postgres://doccano:doccano@postgres:5432/doccano?sslmode=disable" + ports: + - 8000:8000 + + webpack: + image: node:8 + volumes: + - .:/src + - node_modules:/src/app/server/node_modules + command: ["/src/tools/dev-webpack.sh"] + environment: + WEBPACK_HOST: "0.0.0.0" + WEBPACK_PORT: "8080" + WEBPACK_POLL_MILLIS: "1000" + ports: + - 8080:8080 + + postgres: + image: postgres:9.6 + environment: + POSTGRES_USER: "doccano" + POSTGRES_PASSWORD: "doccano" + POSTGRES_DB: "doccano" + ports: + - 5432:5432 + +volumes: + node_modules: + venv: diff --git a/tools/dev-django.sh b/tools/dev-django.sh new file mode 100755 index 00000000..a6d70df6 --- /dev/null +++ b/tools/dev-django.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +set -o errexit + +root="$(dirname "$0")/.." +app="${root}/app" +venv="${root}/venv" + +if [[ ! -f "${venv}/bin/python" ]]; then + echo "Creating virtualenv" + mkdir -p "${venv}" + python3 -m venv "${venv}" + "${venv}/bin/pip" install --upgrade pip setuptools +fi + +echo "Installing dependencies" +"${venv}/bin/pip" install -r "${root}/requirements.txt" + +echo "Initializing database" +"${venv}/bin/python" "${app}/manage.py" wait_for_db +"${venv}/bin/python" "${app}/manage.py" migrate + +if [[ -n "${ADMIN_USERNAME}" ]] && [[ -n "${ADMIN_PASSWORD}" ]] && [[ -n "${ADMIN_EMAIL}" ]]; then + "${venv}/bin/python" "${app}/manage.py" create_admin \ + --username "${ADMIN_USERNAME}" \ + --password "${ADMIN_PASSWORD}" \ + --email "${ADMIN_EMAIL}" \ + --noinput \ + || true +fi + +echo "Starting django" +"${venv}/bin/python" -u "${app}/manage.py" runserver "$@" diff --git a/tools/dev-webpack.sh b/tools/dev-webpack.sh new file mode 100755 index 00000000..fea3cf3e --- /dev/null +++ b/tools/dev-webpack.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -o errexit + +root="$(dirname "$0")/.." +server="${root}/app/server" + +( + cd "${server}" + + if [[ ! -d node_modules/.bin ]]; then + echo "Installing dependencies" + npm install + fi + + echo "Starting webpack" + npm start +)