From d5ce30d489c634f18dd0a3aac3fe283a0eabcff6 Mon Sep 17 00:00:00 2001 From: Julien Maulny Date: Mon, 16 Apr 2018 18:54:07 +0200 Subject: [PATCH] Docker env for development try to add pgadmin install postgres client in container so that I can use ./manage.py dbshell pgadmin --- .gitignore | 8 ++++++ Dockerfile | 30 ++++++++-------------- assets.py | 21 ++++++++++++++++ docker/.env | 7 +++++- docker/Makefile | 52 +++++++++++++++++++++++++++++++++++++++ docker/README.md | 51 ++++++++++++++++++++++++++++++++------ docker/docker-compose.yml | 49 +++++++++++++++++++++++++++++++++--- docker/settings_docker.py | 1 - 8 files changed, 185 insertions(+), 34 deletions(-) create mode 100755 assets.py create mode 100644 docker/Makefile diff --git a/.gitignore b/.gitignore index 9f92a18..3c8323b 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,11 @@ repomaker-static/ /dist/ /repomaker.egg-info/ /docker/data + +# Docker +.env +docker-compose.yml +Makefile +httpd-foreground +repomaker/settings_docker.py +wait-for diff --git a/Dockerfile b/Dockerfile index c10a047..718c5c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,15 @@ FROM registry.gitlab.com/fdroid/ci-images-repomaker:latest MAINTAINER team@f-droid.org -ENV PYTHONUNBUFFERED 1 -ENV DJANGO_SETTINGS_MODULE repomaker.settings_docker -ENV REPOMAKER_SECRET_KEY "913d6#u8@-*#3l)spwzurd#fd77bey-6mfs5fc$a=yhnh!n4p9" - -WORKDIR /repomaker - -ADD . /repomaker - -COPY docker/settings_docker.py ./repomaker/ -COPY docker/apache.conf /etc/apache2/sites-available/repomaker.conf -COPY docker/wait-for ./ -COPY docker/httpd-foreground ./ - RUN apt update && \ - apt install openssh-client netcat gettext apache2 libapache2-mod-wsgi-py3 -y --no-install-recommends && \ - cat docker/ssh_config >> /etc/ssh/ssh_config && \ - a2dissite 000-default && \ - a2ensite repomaker && \ - pip3 install -r requirements.txt && \ - npm install && \ - ./pre-release.sh + apt install -y --no-install-recommends \ + openssh-client netcat gettext postgresql-client \ + apache2 libapache2-mod-wsgi-py3 + +COPY requirements.txt requirements.txt +COPY requirements-dev.txt requirements-dev.txt +COPY requirements-gui.txt requirements-gui.txt +COPY debian/requirements.txt debian/requirements.txt +RUN pip3 install -r requirements-gui.txt && \ + pip3 install -r requirements-dev.txt diff --git a/assets.py b/assets.py new file mode 100755 index 0000000..3983bda --- /dev/null +++ b/assets.py @@ -0,0 +1,21 @@ +# compile stylesheets +python3 manage.py compilescss + +# rename folders so they can be ignored +mv ${NODE}/material-design-lite/src ${NODE}/material-design-lite/src-ignore +mv ${NODE}/roboto-fontface/css ${NODE}/roboto-fontface/css-ignore + +# copy static files into STATIC_DIR +python3 manage.py collectstatic --no-input \ + -i *.scss -i *.less \ + -i tiny_mce \ + -i src-ignore \ + -i css-ignore \ + --clear + +# rename folders back +mv ${NODE}/material-design-lite/src-ignore ${NODE}/material-design-lite/src +mv ${NODE}/roboto-fontface/css-ignore ${NODE}/roboto-fontface/css + +# compress stylesheets and javascripts +python3 manage.py compress --force diff --git a/docker/.env b/docker/.env index d9d85d7..a93cca2 100644 --- a/docker/.env +++ b/docker/.env @@ -1,5 +1,5 @@ # Please enter your hostname here -REPOMAKER_HOSTNAME=abc-repomaker-test.org +REPOMAKER_HOSTNAME=localhost # Here all repomaker related files (including the database) will be stored REPOMAKER_PATH=/var/lib/repomaker @@ -7,8 +7,13 @@ REPOMAKER_PATH=/var/lib/repomaker # The local port repomaker will listen on the host machine REPOMAKER_PORT=80 +# The database user interface port +DB_ADMIN_PORT=5050 + # Warning: Changing this later will change all repo locations in default storage REPOMAKER_SECRET_KEY=913d6#u8@-*#3l)spwzurd#fd77bey-6mfs5fc$a=yhnh!n4p9 # You usually do not need to change this DJANGO_SETTINGS_MODULE=repomaker.settings_docker + +PYTHONUNBUFFERED=1 diff --git a/docker/Makefile b/docker/Makefile new file mode 100644 index 0000000..fff1747 --- /dev/null +++ b/docker/Makefile @@ -0,0 +1,52 @@ +all: build_container pipinstall npminstall build run_tasks start logs + +build_container: + docker build . + +rebuild_container: + docker build --no-cache . + +pipinstall: + docker-compose up -d + docker exec -it repomaker-web bash -c "pip3 install -r requirements.txt" + docker exec -it repomaker-tasks bash -c "pip3 install -r requirements.txt" + docker exec -it repomaker-bash bash -c "pip3 install -r requirements.txt" + docker exec -it repomaker-bash bash -c "pip3 install -r requirements-dev.txt" + +npminstall: + docker-compose up -d bash + docker exec -it repomaker-bash bash -c "npm install" + +build: + docker-compose up -d bash + docker exec -it repomaker-bash bash -c "./pre-release.sh" + +start: + docker-compose up -d + docker exec -it repomaker-web bash -c "a2dissite 000-default && a2ensite repomaker" + docker exec -dit repomaker-web bash -c "./wait-for db:5432 -- python3 manage.py migrate && ./httpd-foreground" + +rebuild: restart_workers pipinstall build start logs + +restart_workers: + docker-compose restart -t 1 web tasks + +bash: + docker-compose up -d bash + docker exec -it repomaker-bash bash + +bash_web: + docker-compose up -d web + docker exec -it repomaker-web bash + +assets: + docker exec -it repomaker-bash bash -c "./assets.py" + +webserver: + docker exec -it repomaker-web bash -c "./httpd-foreground" + +run_tasks: + docker exec -dit repomaker-tasks bash -c "./wait-for web:80 -- su - www-data -p -s /bin/bash -c 'cd /repomaker && python3 manage.py process_tasks'" + +logs: + docker-compose logs -ft diff --git a/docker/README.md b/docker/README.md index dc65ca1..328337f 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,19 +1,54 @@ # Docker Compose Deployment -First download the files `docker-compose.yml` and `.env` from this directory. +First, copy the files `docker-compose.yml`, `Makefile` and `.env` from this directory: + +``` bash +cp docker/docker-compose.yml docker/Makefile docker/.env . +``` Decide on which domain name your repomaker instance will be running. -Then generate a new secret key for your deployment. -For example like so: +Then edit your `.env` file: - echo "REPOMAKER_SECRET_KEY=$(pwgen -cny 64 1)" + - `REPOMAKER_HOSTNAME` Set your hostname, i.e `localhost`, `repomaker.domain.tld`, ... + - `REPOMAKER_PORT` Leave it as default (80), or set another port if you get a port conflict. + - `REPOMAKER_SECRET_KEY` Generate a new secret key for your deployment, for example like so: -Edit the downloaded file `.env` and put your domain name and your secret key there. +``` bash +echo "REPOMAKER_SECRET_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 64 | head -n 1)" +``` -Then start the docker containers: +Then install start the docker containers: - docker-compose up +``` +make +``` If everything worked as it should, -there should now be a repomaker instance running on your domain name. +there should now be a repomaker instance running on your domain name (i.e ). + + +## Makefile commands + +When developing, you may need to rebuild assets, +reinstall npm dependencies or python dependencies. + +``` bash +# After editing HTML, css or js +make rebuild + +# After adding or removing npm deps +make npminstall +make rebuild + +# After adding or removing python deps +make rebuild + +# After editing Dockerfile +make rebuild_container +make rebuild +``` + + +## Database browser +Go to , and login with: `postgres` / `admin` diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index f972a73..77fe340 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -7,15 +7,32 @@ services: - ${REPOMAKER_PATH}/pgdata:/var/lib/postgresql/data restart: unless-stopped + dbadmin: + image: fenglc/pgadmin4:alpine + ports: + - "${DB_ADMIN_PORT}:5050" + links: + - db:postgres + depends_on: + - db + web: - image: registry.gitlab.com/fdroid/repomaker:latest + build: . + container_name: repomaker-web hostname: ${REPOMAKER_HOSTNAME} domainname: ${REPOMAKER_HOSTNAME} env_file: - .env - command: bash -c './wait-for db:5432 -- python3 manage.py migrate && ./httpd-foreground' + command: sleep infinity volumes: + - .:/repomaker - ${REPOMAKER_PATH}/data:/repomaker/data + - ./docker/settings_docker.py:/repomaker/repomaker/settings_docker.py + - ./docker/apache.conf:/etc/apache2/sites-available/repomaker.conf + - ./docker/wait-for:/repomaker/wait-for + - ./docker/httpd-foreground:/repomaker/httpd-foreground + - ./docker/ssh_config:/etc/ssh/ssh_config + working_dir: /repomaker ports: - "${REPOMAKER_PORT}:80" depends_on: @@ -23,15 +40,39 @@ services: restart: unless-stopped tasks: - image: registry.gitlab.com/fdroid/repomaker:latest + build: . + container_name: repomaker-tasks env_file: - .env - command: bash -c './wait-for web:80 -- su - www-data -p -s /bin/bash -c "cd /repomaker && python3 manage.py process_tasks"' + command: sleep infinity volumes: + - .:/repomaker - ${REPOMAKER_PATH}/data:/repomaker/data + - ./docker/settings_docker.py:/repomaker/repomaker/settings_docker.py + - ./docker/apache.conf:/etc/apache2/sites-available/repomaker.conf + - ./docker/wait-for:/repomaker/wait-for + - ./docker/httpd-foreground:/repomaker/httpd-foreground + - ./docker/ssh_config:/etc/ssh/ssh_config + working_dir: /repomaker depends_on: - db - web restart: unless-stopped + bash: + build: . + container_name: repomaker-bash + env_file: + - .env + command: sleep infinity + volumes: + - .:/repomaker + - ${REPOMAKER_PATH}/data:/repomaker/data + - ./docker/settings_docker.py:/repomaker/repomaker/settings_docker.py + - ./docker/apache.conf:/etc/apache2/sites-available/repomaker.conf + - ./docker/wait-for:/repomaker/wait-for + - ./docker/httpd-foreground:/repomaker/httpd-foreground + - ./docker/ssh_config:/etc/ssh/ssh_config + working_dir: /repomaker + # vim: set tabstop=2:softtabstop=2:shiftwidth=2 diff --git a/docker/settings_docker.py b/docker/settings_docker.py index a4c21bd..e2f11b9 100644 --- a/docker/settings_docker.py +++ b/docker/settings_docker.py @@ -57,4 +57,3 @@ ACCOUNT_EMAIL_VERIFICATION = "none" if DEBUG: SASS_PROCESSOR_ENABLED = False - -- GitLab