From bf2fa093e92d24d8df1ef77940d16feecc48df73 Mon Sep 17 00:00:00 2001 From: p0lygun Date: Thu, 19 Oct 2023 15:47:42 +0530 Subject: [PATCH 1/8] chore(DOCKER): for better experience split docker compose into production and local --- .../{main.yml => build_docker_image.yml} | 0 .../core/management/commands/playground.py | 9 ++ docker-compose.yml | 145 ++---------------- docker/docker-compose.production.yml | 123 +++++++++++++++ Dockerfile => docker/dockerfile | 0 tox.ini | 1 + 6 files changed, 143 insertions(+), 135 deletions(-) rename .github/workflows/{main.yml => build_docker_image.yml} (100%) create mode 100644 bfportal/core/management/commands/playground.py create mode 100644 docker/docker-compose.production.yml rename Dockerfile => docker/dockerfile (100%) diff --git a/.github/workflows/main.yml b/.github/workflows/build_docker_image.yml similarity index 100% rename from .github/workflows/main.yml rename to .github/workflows/build_docker_image.yml diff --git a/bfportal/core/management/commands/playground.py b/bfportal/core/management/commands/playground.py new file mode 100644 index 0000000..4e66aec --- /dev/null +++ b/bfportal/core/management/commands/playground.py @@ -0,0 +1,9 @@ +from pathlib import Path + +from django.core.management import BaseCommand +from loguru import logger + + +class Command(BaseCommand): + def handle(self, *args, **options): + logger.debug("This is a command to be used as a playground") diff --git a/docker-compose.yml b/docker-compose.yml index c5eec94..af992fa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,131 +2,12 @@ version: "3.7" services: - # Production environment services - db: - image: postgres:14 - restart: always - profiles: - - production - volumes: - - postgress_db:/var/lib/postgresql/data - - environment: - - POSTGRES_NAME=${DB_NAME} - - POSTGRES_USER=${DB_USERNAME} - - POSTGRES_PASSWORD=${DB_PASSWORD} - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: "10s" - timeout: "5s" - retries: 5 - start_period: "10s" - - bfportal_gg_production: - image: docker.pkg.github.com/battlefield-portal-community/bfportal.gg/main:latest - restart: always - command: bash -c "python manage.py migrate --noinput && python manage.py ensure_superuser --username bfportal --email superuser@bfportal.com --password '${SU_PASSWD}' && python manage.py ensure_initialization && gunicorn --workers 4 --bind 0.0.0.0:${PRODUCTION_PORT}" - user: "33:33" - profiles: - - production - ports: - - "${PRODUCTION_PORT}:${PRODUCTION_PORT}" - volumes: - - type: "bind" - source: /var/www/bfportal-media - target: /app/media - environment: - - PRODUCTION_KEY=${PRODUCTION_KEY} - - DISCORD_CLIENT_ID=${DISCORD_CLIENT_ID} - - DISCORD_SECRET=${DISCORD_SECRET} - - DB_NAME=${DB_NAME} - - DB_USERNAME=${DB_USERNAME} - - DB_PASSWORD=${DB_PASSWORD} - - POSTGRES_HOST=db # takes precedent over .env file - - DEBUG=${DEBUG} - - APPROVAL_CHANNEL_WEBHOOK_TOKEN=${APPROVAL_CHANNEL_WEBHOOK_TOKEN} - - APPROVAL_CHANNEL_WEBHOOK_ID=${APPROVAL_CHANNEL_WEBHOOK_ID} - - APPROVAL_SUCCESS_CHANNEL_WEBHOOK_TOKEN=${APPROVAL_SUCCESS_CHANNEL_WEBHOOK_TOKEN} - - APPROVAL_SUCCESS_CHANNEL_WEBHOOK_ID=${APPROVAL_SUCCESS_CHANNEL_WEBHOOK_ID} - - PRODUCTION_HOST=${PRODUCTION_HOST} - - PRODUCTION_PORT=${PRODUCTION_PORT} - - OWNERS=${OWNERS} - depends_on: - - db - healthcheck: - test: curl -fk http://0.0.0.0:${PRODUCTION_PORT}/ || exit 1 - interval: "60s" - timeout: "3s" - retries: 3 - start_period: "5s" - - # Dev environment services (on remote server) - db_devel: - image: postgres:14 - restart: always - profiles: - - dev - volumes: - - postgress_db_devel:/var/lib/postgresql/data - - environment: - - POSTGRES_NAME=${DB_NAME} - - POSTGRES_USER=${DB_USERNAME} - - POSTGRES_PASSWORD=${DB_PASSWORD} - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: "10s" - timeout: "5s" - retries: 5 - start_period: "10s" - - bfportal_gg_dev: - image: docker.pkg.github.com/battlefield-portal-community/bfportal.gg/dev:latest - restart: always - command: bash -c "python manage.py migrate --noinput && python manage.py ensure_superuser --username bfportal --email superuser@bfportal.com --password '${SU_PASSWD}' && python manage.py ensure_initialization && gunicorn --workers 4 --bind 0.0.0.0:${DEVEL_PORT}" - user: "33:33" - profiles: - - dev - ports: - - "${DEVEL_PORT}:${DEVEL_PORT}" - volumes: - - type: "bind" - source: /var/www/bfportal-devel-media - target: /app/media - environment: - - PRODUCTION_KEY=${PRODUCTION_KEY} - - DISCORD_CLIENT_ID=${DISCORD_CLIENT_ID} - - DISCORD_SECRET=${DISCORD_SECRET} - - DB_NAME=${DB_NAME} - - DB_USERNAME=${DB_USERNAME} - - DB_PASSWORD=${DB_PASSWORD} - - POSTGRES_HOST=db_devel # takes precedent over .env file - - DEBUG=True - - APPROVAL_CHANNEL_WEBHOOK_TOKEN=${APPROVAL_CHANNEL_WEBHOOK_TOKEN} - - APPROVAL_CHANNEL_WEBHOOK_ID=${APPROVAL_CHANNEL_WEBHOOK_ID} - - APPROVAL_SUCCESS_CHANNEL_WEBHOOK_TOKEN=${APPROVAL_SUCCESS_CHANNEL_WEBHOOK_TOKEN} - - APPROVAL_SUCCESS_CHANNEL_WEBHOOK_ID=${APPROVAL_SUCCESS_CHANNEL_WEBHOOK_ID} - - PRODUCTION_HOST=${PRODUCTION_HOST} - - PRODUCTION_PORT=${PRODUCTION_PORT} - - OWNERS=${OWNERS} - - DEVEL_PORT=${DEVEL_PORT} - depends_on: - - db_devel - healthcheck: - test: curl -fk http://0.0.0.0:${DEVEL_PORT}/ || exit 1 - interval: "60s" - timeout: "3s" - retries: 3 - start_period: "5s" - # Dev environment services (on local machine) - db_dev_local: + db: image: postgres:14 restart: always volumes: - - postgress_db_dev_local:/var/lib/postgresql/data - profiles: - - dev_local + - postgres_db_dev_local:/var/lib/postgresql/data environment: - POSTGRES_NAME=${DB_NAME} - POSTGRES_USER=${DB_USERNAME} @@ -138,16 +19,14 @@ services: retries: 5 start_period: "10s" - bfportal_dev_local: + bfportal: build: context: . - dockerfile: Dockerfile + dockerfile: docker/Dockerfile target: dev restart: no command: bash -c "python manage.py migrate --noinput && python manage.py ensure_superuser --username bfportal --email superuser@bfportal.com --password 1234 && python manage.py ensure_initialization && python manage.py mock -u 10 -e 50 --noregen && python manage.py runserver 0.0.0.0:8000" container_name: bfportal_dev_local - profiles: - - dev_local ports: - "8000:8000" volumes: @@ -158,7 +37,7 @@ services: - DB_NAME=${DB_NAME} - DB_USERNAME=${DB_USERNAME} - DB_PASSWORD=${DB_PASSWORD} - - POSTGRES_HOST=db_dev_local # takes precedent over .env file + - POSTGRES_HOST=db # takes precedent over .env file - DEBUG=True - APPROVAL_CHANNEL_WEBHOOK_TOKEN=${APPROVAL_CHANNEL_WEBHOOK_TOKEN} - APPROVAL_CHANNEL_WEBHOOK_ID=${APPROVAL_CHANNEL_WEBHOOK_ID} @@ -175,26 +54,22 @@ services: retries: 5 start_period: "10s" depends_on: - - db_dev_local + - db - bfportal_dev_local_tailwind: + tailwind: build: context: . - dockerfile: Dockerfile + dockerfile: docker/dockerfile target: dev command: npm run watch restart: always container_name: bfportal_dev_local_tailwind - profiles: - - dev_local volumes: - ./bfportal:/app depends_on: - bfportal_dev_local: + bfportal: condition: service_healthy stdin_open: true volumes: - postgress_db_devel: - postgress_db: - postgress_db_dev_local: + postgres_db_dev_local: diff --git a/docker/docker-compose.production.yml b/docker/docker-compose.production.yml new file mode 100644 index 0000000..377fbe4 --- /dev/null +++ b/docker/docker-compose.production.yml @@ -0,0 +1,123 @@ +version: "3.7" +services: + + # Production environment services + db: + image: postgres:14 + restart: always + profiles: + - production + volumes: + - postgress_db:/var/lib/postgresql/data + + environment: + - POSTGRES_NAME=${DB_NAME} + - POSTGRES_USER=${DB_USERNAME} + - POSTGRES_PASSWORD=${DB_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: "10s" + timeout: "5s" + retries: 5 + start_period: "10s" + + bfportal_gg_production: + image: docker.pkg.github.com/battlefield-portal-community/bfportal.gg/main:latest + restart: always + command: bash -c "python manage.py migrate --noinput && python manage.py ensure_superuser --username bfportal --email superuser@bfportal.com --password '${SU_PASSWD}' && python manage.py ensure_initialization && gunicorn --workers 4 --bind 0.0.0.0:${PRODUCTION_PORT}" + user: "33:33" + profiles: + - production + ports: + - "${PRODUCTION_PORT}:${PRODUCTION_PORT}" + volumes: + - type: "bind" + source: /var/www/bfportal-media + target: /app/media + environment: + - PRODUCTION_KEY=${PRODUCTION_KEY} + - DISCORD_CLIENT_ID=${DISCORD_CLIENT_ID} + - DISCORD_SECRET=${DISCORD_SECRET} + - DB_NAME=${DB_NAME} + - DB_USERNAME=${DB_USERNAME} + - DB_PASSWORD=${DB_PASSWORD} + - POSTGRES_HOST=db # takes precedent over .env file + - DEBUG=${DEBUG} + - APPROVAL_CHANNEL_WEBHOOK_TOKEN=${APPROVAL_CHANNEL_WEBHOOK_TOKEN} + - APPROVAL_CHANNEL_WEBHOOK_ID=${APPROVAL_CHANNEL_WEBHOOK_ID} + - APPROVAL_SUCCESS_CHANNEL_WEBHOOK_TOKEN=${APPROVAL_SUCCESS_CHANNEL_WEBHOOK_TOKEN} + - APPROVAL_SUCCESS_CHANNEL_WEBHOOK_ID=${APPROVAL_SUCCESS_CHANNEL_WEBHOOK_ID} + - PRODUCTION_HOST=${PRODUCTION_HOST} + - PRODUCTION_PORT=${PRODUCTION_PORT} + - OWNERS=${OWNERS} + depends_on: + - db + healthcheck: + test: curl -fk http://0.0.0.0:${PRODUCTION_PORT}/ || exit 1 + interval: "60s" + timeout: "3s" + retries: 3 + start_period: "5s" + + # Dev environment services (on remote server) + db_devel: + image: postgres:14 + restart: always + profiles: + - dev + volumes: + - postgress_db_devel:/var/lib/postgresql/data + + environment: + - POSTGRES_NAME=${DB_NAME} + - POSTGRES_USER=${DB_USERNAME} + - POSTGRES_PASSWORD=${DB_PASSWORD} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: "10s" + timeout: "5s" + retries: 5 + start_period: "10s" + + bfportal_gg_dev: + image: docker.pkg.github.com/battlefield-portal-community/bfportal.gg/dev:latest + restart: always + command: bash -c "python manage.py migrate --noinput && python manage.py ensure_superuser --username bfportal --email superuser@bfportal.com --password '${SU_PASSWD}' && python manage.py ensure_initialization && gunicorn --workers 4 --bind 0.0.0.0:${DEVEL_PORT}" + user: "33:33" + profiles: + - dev + ports: + - "${DEVEL_PORT}:${DEVEL_PORT}" + volumes: + - type: "bind" + source: /var/www/bfportal-devel-media + target: /app/media + environment: + - PRODUCTION_KEY=${PRODUCTION_KEY} + - DISCORD_CLIENT_ID=${DISCORD_CLIENT_ID} + - DISCORD_SECRET=${DISCORD_SECRET} + - DB_NAME=${DB_NAME} + - DB_USERNAME=${DB_USERNAME} + - DB_PASSWORD=${DB_PASSWORD} + - POSTGRES_HOST=db_devel # takes precedent over .env file + - DEBUG=True + - APPROVAL_CHANNEL_WEBHOOK_TOKEN=${APPROVAL_CHANNEL_WEBHOOK_TOKEN} + - APPROVAL_CHANNEL_WEBHOOK_ID=${APPROVAL_CHANNEL_WEBHOOK_ID} + - APPROVAL_SUCCESS_CHANNEL_WEBHOOK_TOKEN=${APPROVAL_SUCCESS_CHANNEL_WEBHOOK_TOKEN} + - APPROVAL_SUCCESS_CHANNEL_WEBHOOK_ID=${APPROVAL_SUCCESS_CHANNEL_WEBHOOK_ID} + - PRODUCTION_HOST=${PRODUCTION_HOST} + - PRODUCTION_PORT=${PRODUCTION_PORT} + - OWNERS=${OWNERS} + - DEVEL_PORT=${DEVEL_PORT} + depends_on: + - db_devel + healthcheck: + test: curl -fk http://0.0.0.0:${DEVEL_PORT}/ || exit 1 + interval: "60s" + timeout: "3s" + retries: 3 + start_period: "5s" + +volumes: + postgress_db_devel: + postgress_db: diff --git a/Dockerfile b/docker/dockerfile similarity index 100% rename from Dockerfile rename to docker/dockerfile diff --git a/tox.ini b/tox.ini index 6f81f81..cbe9e34 100644 --- a/tox.ini +++ b/tox.ini @@ -10,6 +10,7 @@ exclude= */migrations/* .venv __pycache__ + bfportal/core/management/commands/playground.py # Ignore some of the most obnoxious linting errors. ignore= W503,E226, From 1e831235b88accedd2482b312a92c0ad0d95f44f Mon Sep 17 00:00:00 2001 From: p0lygun Date: Thu, 19 Oct 2023 15:48:04 +0530 Subject: [PATCH 2/8] feat(CI): set new path to dockerfile --- .github/workflows/build_docker_image.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_docker_image.yml b/.github/workflows/build_docker_image.yml index 613b796..a3e0c21 100644 --- a/.github/workflows/build_docker_image.yml +++ b/.github/workflows/build_docker_image.yml @@ -1,10 +1,7 @@ -name: Docker Build +name: Build Docker Image on: workflow_dispatch: - pull_request: - branches: - - none push: branches: - main @@ -54,3 +51,4 @@ jobs: labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max + file: './docker/dockerfile' From 03080295f19f3ca58ec5227f37a30bcf8f2aff31 Mon Sep 17 00:00:00 2001 From: p0lygun Date: Thu, 19 Oct 2023 15:48:39 +0530 Subject: [PATCH 3/8] docs: update contibution guide --- CONTRIBUTING.md | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3ef51ab..53e3469 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -71,41 +71,37 @@ If you're not familiar with Django or Wagtail, it might be good to start with [w You need to install the following applications on your system -- [Python](https://www.python.org/downloads/) -- [NodeJS / npm package manager](https://nodejs.org/en/download) +- [Python](https://www.python.org/downloads/) [^3.11] - [Docker](https://www.docker.com) -### Setup +## Todo +- [ ] docker `pre-commit` hooks in docker environment + - all hooks except `commit-msg-validator` are working. -- Create a Python Virtual Environment and activate it +### Setup +- Clone in repo and cd into it ``` - py -m venv ./python-venvs/bfportal - ./python-venvs/bfportal/Scripts/activate + git clone https://gh.bfportal.gg/ ``` - Install [poetry](https://python-poetry.org/docs/#installation) for dependency management ``` curl -sSL https://install.python-poetry.org | python3 - ``` -- Install python dependencies +- Install project dependencies ``` - cd bfportal.gg poetry install ``` - Install the pre-commit hooks by running ``` pre-commit install --install-hooks ``` -- Install npm dependencies - ``` - cd bfportal.gg/bfportal - npm install - ``` + - Copy the `.env.template` file to `.env` - (optional) Create a [discord application](https://discord.com/developers/applications) for OAuth2 and copy the client id and secret - Paste the client id and secret in `.env` file to `DISCORD_CLIENT_ID` and `DISCORD_SECRET` respectively - From the repositories root directory build the necessary docker images and run the platform ``` - docker-compose --profile dev_local up + docker-compose up ``` - The website should become available at `127.0.0.1:8000` @@ -115,17 +111,14 @@ You need to install the following applications on your system You need to install the following applications on your system -- [Python](https://www.python.org/downloads/) +- [Python](https://www.python.org/downloads/) [^3.11] - [NodeJS / npm package manager](https://nodejs.org/en/download) - [PostgreSQL](https://www.postgresql.org/) ### Setup -- Create a Python Virtual Environment and activate it - ``` - py -m venv ./python-venvs/bfportal - ./python-venvs/bfportal/Scripts/activate - ``` + + - Install [poetry](https://python-poetry.org/docs/#installation) for dependency management ``` curl -sSL https://install.python-poetry.org | python3 - From be058ef5bd1a15a40de6a039f76bd07721276311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20W=C3=BCnsche?= Date: Thu, 11 Jan 2024 21:53:23 +0100 Subject: [PATCH 4/8] fix(links): target url tutorials --- bfportal/core/templates/core/home_page.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bfportal/core/templates/core/home_page.html b/bfportal/core/templates/core/home_page.html index aadd54c..151a510 100644 --- a/bfportal/core/templates/core/home_page.html +++ b/bfportal/core/templates/core/home_page.html @@ -36,7 +36,7 @@

Submit Experience

- +

Help & Tutorials

From 3fabb26c22e145e4f54e2520fd27bd60db4894c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20W=C3=BCnsche?= Date: Thu, 11 Jan 2024 23:34:32 +0100 Subject: [PATCH 5/8] fix(events): render coming soon instead of 502 --- bfportal/core/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bfportal/core/views.py b/bfportal/core/views.py index c9d5b7f..7dd3e08 100644 --- a/bfportal/core/views.py +++ b/bfportal/core/views.py @@ -407,5 +407,5 @@ def events_view(request: HttpRequest): """Handles /events page""" return render( request, - "502.html", + "coming_soon.html", ) From f6558902cb1e8e366f4639d6cc93cb91906e3d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20W=C3=BCnsche?= Date: Thu, 11 Jan 2024 23:48:27 +0100 Subject: [PATCH 6/8] fix(links): use rootpage of docs for help and tutorials --- bfportal/core/templates/core/home_page.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bfportal/core/templates/core/home_page.html b/bfportal/core/templates/core/home_page.html index 151a510..3a486c1 100644 --- a/bfportal/core/templates/core/home_page.html +++ b/bfportal/core/templates/core/home_page.html @@ -36,7 +36,7 @@

Submit Experience

- +

Help & Tutorials

From 38e363b28990cb701d1ecc8a4870ffcee17de02b Mon Sep 17 00:00:00 2001 From: p0lygun Date: Fri, 12 Jan 2024 16:00:23 +0530 Subject: [PATCH 7/8] feat(home_page): open 'Helps & Tutorials' in a new tab --- bfportal/core/templates/core/home_page.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bfportal/core/templates/core/home_page.html b/bfportal/core/templates/core/home_page.html index 3a486c1..5dc3d48 100644 --- a/bfportal/core/templates/core/home_page.html +++ b/bfportal/core/templates/core/home_page.html @@ -36,7 +36,7 @@

Submit Experience

- +

Help & Tutorials

From d11201f26f2f15741a287a89fee871ec5d227014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20W=C3=BCnsche?= Date: Tue, 23 Jan 2024 21:54:40 +0100 Subject: [PATCH 8/8] fix(base.html): remove integrity attribute from script tags --- bfportal/bfportal/templates/base.html | 3 --- 1 file changed, 3 deletions(-) diff --git a/bfportal/bfportal/templates/base.html b/bfportal/bfportal/templates/base.html index 0293343..7c0fc23 100644 --- a/bfportal/bfportal/templates/base.html +++ b/bfportal/bfportal/templates/base.html @@ -131,13 +131,10 @@ {% endblock %} {# Global javascript #}