-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5 from CodeForPhilly/4-developers-have-a-shared-e…
…asily-deployed-docker-environment-for-balancer-backend 4 developers have a shared easily deployed docker environment for balancer backend
- Loading branch information
Showing
14 changed files
with
591 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
# Don't include project creation utilities in testing/staging/production builds! | ||
Python-Docker |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
# Env files can be used to override any variable defaults | ||
# (e.g., DOCKER_SPECIFIC_ENV_PATH=config/docker/env/base.env DOCKER_SPECIFIC_ENV_PATH=config/docker/env/local.env make do-something) | ||
ifdef DOCKER_COMMON_ENV_PATH | ||
include $(DOCKER_COMMON_ENV_PATH) | ||
DOCKER_COMMON_ENV_PATH_FROM_PYTHON_DOCKER=$(DOCKER_CTX_FROM_PYTHON_DOCKER)/$(DOCKER_COMMON_ENV_PATH) | ||
endif | ||
|
||
ifdef DOCKER_SPECIFIC_ENV_PATH | ||
include $(DOCKER_SPECIFIC_ENV_PATH) | ||
DOCKER_SPECIFIC_ENV_PATH_FROM_PYTHON_DOCKER=$(DOCKER_CTX_FROM_PYTHON_DOCKER)/$(DOCKER_SPECIFIC_ENV_PATH) | ||
endif | ||
|
||
export | ||
|
||
NAMESPACE ?= local | ||
PROJECT_NAME ?= balancer_backend | ||
PYTHON_VERSION ?= 3.10 | ||
|
||
DOCKER_APP_DEST ?= /app | ||
DOCKER_CTX_FROM_COMPOSE ?= ../../.. | ||
DOCKER_CTX_FROM_PROJECT_ROOT ?= . | ||
DOCKER_CTX_FROM_PYTHON_DOCKER ?= .. | ||
DOCKER_ENTRYPOINT_DEST ?= /entrypoint.sh | ||
DOCKER_LOCAL_CMD ?= /bin/bash | ||
DOCKER_LOG_FOLDER_PATH ?= /root/.$(PROJECT_NAME)/logs | ||
DOCKER_NO_CACHE ?= # Define with any value to disable caching on build | ||
DOCKER_PROJECT_ROOT_FROM_CTX ?= . | ||
DOCKER_PROJECT_SERVICE_NAME ?= balancer-backend | ||
DOCKER_PYTHON_DOCKER_FROM_CTX ?= Python-Docker | ||
DOCKER_REGISTRY ?= docker.fakecodeforphillydomain.com | ||
DOCKER_TAG_VERSION ?= latest | ||
DOCKER_WATCH ?= # Define with any value to display background deployment | ||
|
||
# These are built dyanimcally and used below? | ||
DOCKER_APP_SOURCE_FROM_COMPOSE ?= $(DOCKER_CTX_FROM_COMPOSE)/$(DOCKER_PROJECT_ROOT_FROM_CTX) | ||
DOCKER_COMPOSE_FILE ?= $(DOCKER_CTX_FROM_PYTHON_DOCKER)/$(DOCKER_PROJECT_ROOT_FROM_CTX)/config/docker/compose/docker-compose.$(NAMESPACE).yaml | ||
DOCKER_CONFIG_FOLDER_PATH ?= /root/.$(DOCKER_PROJECT_SERVICE_NAME)/config | ||
DOCKER_ENTRYPOINT_SOURCE_FROM_CTX ?= $(DOCKER_PROJECT_ROOT_FROM_CTX)/config/docker/scripts/$(NAMESPACE)-entrypoint.sh | ||
DOCKER_USER_CONFIG_PATH_FROM_CTX ?= $(DOCKER_PROJECT_ROOT_FROM_CTX)/config | ||
DOCKER_USER_LOCAL_LOG_PATH_FROM_CTX ?= $(DOCKER_PROJECT_ROOT_FROM_CTX)/logs | ||
|
||
# No need to do this manually | ||
pull-python-docker: | ||
if ! [ -d Python-Docker ]; then\ | ||
git clone https://github.com/jusjayson/Python-Docker.git;\ | ||
fi | ||
cd Python-Docker && git pull; | ||
|
||
build-base-image: pull-python-docker | ||
cd $(DOCKER_CTX_FROM_PROJECT_ROOT)/$(DOCKER_PYTHON_DOCKER_FROM_CTX) && \ | ||
DOCKER_REGISTRY=$(DOCKER_REGISTRY) \ | ||
DOCKER_TAG_VERSION=$(DOCKER_TAG_VERSION) \ | ||
PYTHON_VERSION=$(PYTHON_VERSION) \ | ||
make build-base-image | ||
|
||
build-project: pull-python-docker | ||
cd $(DOCKER_CTX_FROM_PROJECT_ROOT)/$(DOCKER_PYTHON_DOCKER_FROM_CTX) && \ | ||
DOCKER_APP_DEST=$(DOCKER_APP_DEST) \ | ||
DOCKER_CONFIG_FOLDER_PATH=$(DOCKER_CONFIG_FOLDER_PATH) \ | ||
DOCKER_CTX_FROM_PYTHON_DOCKER=$(DOCKER_CTX_FROM_PYTHON_DOCKER) \ | ||
DOCKER_ENTRYPOINT_DEST=$(DOCKER_ENTRYPOINT_DEST) \ | ||
DOCKER_ENTRYPOINT_SOURCE_FROM_CTX=$(DOCKER_ENTRYPOINT_SOURCE_FROM_CTX) \ | ||
DOCKER_LOG_FOLDER_PATH=$(DOCKER_LOG_FOLDER_PATH) \ | ||
DOCKER_NO_CACHE=$(DOCKER_NO_CACHE) \ | ||
DOCKER_PROJECT_ROOT_FROM_CTX=$(DOCKER_PROJECT_ROOT_FROM_CTX) \ | ||
DOCKER_REGISTRY=$(DOCKER_REGISTRY) \ | ||
DOCKER_TAG_VERSION=$(DOCKER_TAG_VERSION) \ | ||
DOCKER_USER_CONFIG_PATH_FROM_CTX=$(DOCKER_USER_CONFIG_PATH_FROM_CTX) \ | ||
NAMESPACE=$(NAMESPACE) \ | ||
PROJECT_NAME=$(PROJECT_NAME) \ | ||
DONT_PASS_SSH_KEYS=1 \ | ||
make build-project | ||
|
||
deploy-project: pull-python-docker | ||
cd $(DOCKER_CTX_FROM_PROJECT_ROOT)/$(DOCKER_PYTHON_DOCKER_FROM_CTX) && \ | ||
DOCKER_APP_DEST=$(DOCKER_APP_DEST) \ | ||
DOCKER_APP_SOURCE_FROM_COMPOSE=$(DOCKER_APP_SOURCE_FROM_COMPOSE) \ | ||
DOCKER_COMPOSE_FILE=$(DOCKER_COMPOSE_FILE) \ | ||
DOCKER_CONFIG_FOLDER_PATH=$(DOCKER_CONFIG_FOLDER_PATH) \ | ||
DOCKER_CTX_FROM_COMPOSE=$(DOCKER_CTX_FROM_COMPOSE) \ | ||
DOCKER_LOG_FOLDER_PATH=$(DOCKER_LOG_FOLDER_PATH) \ | ||
DOCKER_PROJECT_SERVICE_NAME=$(DOCKER_PROJECT_SERVICE_NAME) \ | ||
DOCKER_REGISTRY=$(DOCKER_REGISTRY) \ | ||
DOCKER_TAG_VERSION=$(DOCKER_TAG_VERSION) \ | ||
DOCKER_USER_CONFIG_PATH_FROM_CTX=${DOCKER_USER_CONFIG_PATH_FROM_CTX} \ | ||
DOCKER_USER_LOCAL_LOG_PATH_FROM_CTX=${DOCKER_USER_LOCAL_LOG_PATH_FROM_CTX} \ | ||
DOCKER_WATCH=$(DOCKER_WATCH) \ | ||
NAMESPACE=$(NAMESPACE) \ | ||
PROJECT_NAME=$(PROJECT_NAME) \ | ||
make deploy-project | ||
|
||
teardown-project: pull-python-docker | ||
cd $(DOCKER_CTX_FROM_PROJECT_ROOT)/$(DOCKER_PYTHON_DOCKER_FROM_CTX) && \ | ||
DOCKER_COMPOSE_FILE=$(DOCKER_COMPOSE_FILE) \ | ||
make teardown-project | ||
|
||
launch-local-project: pull-python-docker | ||
DOCKER_APP_DEST=${DOCKER_APP_DEST} \ | ||
DOCKER_APP_SOURCE_FROM_COMPOSE=$(DOCKER_APP_SOURCE_FROM_COMPOSE) \ | ||
DOCKER_CONFIG_FOLDER_PATH=$(DOCKER_CONFIG_FOLDER_PATH) \ | ||
DOCKER_CTX_FROM_COMPOSE=$(DOCKER_CTX_FROM_COMPOSE) \ | ||
DOCKER_LOG_FOLDER_PATH=$(DOCKER_LOG_FOLDER_PATH) \ | ||
DOCKER_REGISTRY=$(DOCKER_REGISTRY) \ | ||
DOCKER_TAG_VERSION=$(DOCKER_TAG_VERSION) \ | ||
DOCKER_USER_CONFIG_PATH_FROM_CTX={DOCKER_USER_CONFIG_PATH_FROM_CTX} \ | ||
DOCKER_USER_LOCAL_LOG_PATH_FROM_CTX={DOCKER_USER_LOCAL_LOG_PATH_FROM_CTX} \ | ||
NAMESPACE=$(NAMESPACE) \ | ||
PROJECT_NAME=$(PROJECT_NAME) \ | ||
docker compose \ | ||
-f config/docker/compose/docker-compose.local.yaml \ | ||
run -it ${DOCKER_PROJECT_SERVICE_NAME} $(DOCKER_LOCAL_CMD) | ||
|
||
init-project: | ||
cd $(DOCKER_CTX_FROM_PROJECT_ROOT)/$(DOCKER_PYTHON_DOCKER_FROM_CTX) && \ | ||
DOCKER_ABSOLUTE_APP_SOURCE=$(shell realpath ".") \ | ||
DOCKER_REGISTRY=$(DOCKER_REGISTRY) \ | ||
DOCKER_TAG_VERSION=$(DOCKER_TAG_VERSION) \ | ||
PYTHON_VERSION=$(PYTHON_VERSION) \ | ||
make init-project | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,27 @@ | ||
# balancer-backend | ||
Django driven backend for the CodeForPhilly balancer project (https://opencollective.com/code-for-philly/projects/balancer) | ||
|
||
## Environment setup instructions | ||
This project makes use of Python-Docker in order to | ||
1. Rapidly initialize and update packages (using Python poetry) | ||
2. Build project (backend) image (with requirements) for local environment. | ||
3. Launch and teardown docker containers. | ||
|
||
### To build backend | ||
1. Run | ||
```make build-base-image``` | ||
in order to install poetry atop the Python base image. | ||
2. Run | ||
```make build-project``` | ||
in order to create an image for dev deployment with all packages | ||
defined in pyproject.toml. | ||
|
||
### Deploy project | ||
1. Run | ||
```make launch-local-project``` (after building) | ||
in order to launch a development container with interactive shell. | ||
|
||
### Teardown project | ||
1. Run | ||
```make teardown-project``` | ||
in order to tear down any exisiting development containers. |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
""" | ||
ASGI config for balancer project. | ||
It exposes the ASGI callable as a module-level variable named ``application``. | ||
For more information on this file, see | ||
https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ | ||
""" | ||
|
||
import os | ||
|
||
from django.core.asgi import get_asgi_application | ||
|
||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'balancer.settings') | ||
|
||
application = get_asgi_application() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
""" | ||
Django settings for balancer project. | ||
Generated by 'django-admin startproject' using Django 4.2.2. | ||
For more information on this file, see | ||
https://docs.djangoproject.com/en/4.2/topics/settings/ | ||
For the full list of settings and their values, see | ||
https://docs.djangoproject.com/en/4.2/ref/settings/ | ||
""" | ||
|
||
from pathlib import Path | ||
|
||
# Build paths inside the project like this: BASE_DIR / 'subdir'. | ||
BASE_DIR = Path(__file__).resolve().parent.parent | ||
|
||
|
||
# Quick-start development settings - unsuitable for production | ||
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ | ||
|
||
# SECURITY WARNING: keep the secret key used in production secret! | ||
SECRET_KEY = 'django-insecure-vi%ccle5(!=4=c!=03z5bqr+ljh#0#xa^#af#-&2e#4lmhn&h8' | ||
|
||
# SECURITY WARNING: don't run with debug turned on in production! | ||
DEBUG = True | ||
|
||
ALLOWED_HOSTS = [] | ||
|
||
|
||
# Application definition | ||
|
||
INSTALLED_APPS = [ | ||
'django.contrib.admin', | ||
'django.contrib.auth', | ||
'django.contrib.contenttypes', | ||
'django.contrib.sessions', | ||
'django.contrib.messages', | ||
'django.contrib.staticfiles', | ||
] | ||
|
||
MIDDLEWARE = [ | ||
'django.middleware.security.SecurityMiddleware', | ||
'django.contrib.sessions.middleware.SessionMiddleware', | ||
'django.middleware.common.CommonMiddleware', | ||
'django.middleware.csrf.CsrfViewMiddleware', | ||
'django.contrib.auth.middleware.AuthenticationMiddleware', | ||
'django.contrib.messages.middleware.MessageMiddleware', | ||
'django.middleware.clickjacking.XFrameOptionsMiddleware', | ||
] | ||
|
||
ROOT_URLCONF = 'balancer.urls' | ||
|
||
TEMPLATES = [ | ||
{ | ||
'BACKEND': 'django.template.backends.django.DjangoTemplates', | ||
'DIRS': [], | ||
'APP_DIRS': True, | ||
'OPTIONS': { | ||
'context_processors': [ | ||
'django.template.context_processors.debug', | ||
'django.template.context_processors.request', | ||
'django.contrib.auth.context_processors.auth', | ||
'django.contrib.messages.context_processors.messages', | ||
], | ||
}, | ||
}, | ||
] | ||
|
||
WSGI_APPLICATION = 'balancer.wsgi.application' | ||
|
||
|
||
# Database | ||
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases | ||
|
||
DATABASES = { | ||
'default': { | ||
'ENGINE': 'django.db.backends.sqlite3', | ||
'NAME': BASE_DIR / 'db.sqlite3', | ||
} | ||
} | ||
|
||
|
||
# Password validation | ||
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators | ||
|
||
AUTH_PASSWORD_VALIDATORS = [ | ||
{ | ||
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', | ||
}, | ||
{ | ||
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', | ||
}, | ||
{ | ||
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', | ||
}, | ||
{ | ||
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', | ||
}, | ||
] | ||
|
||
|
||
# Internationalization | ||
# https://docs.djangoproject.com/en/4.2/topics/i18n/ | ||
|
||
LANGUAGE_CODE = 'en-us' | ||
|
||
TIME_ZONE = 'UTC' | ||
|
||
USE_I18N = True | ||
|
||
USE_TZ = True | ||
|
||
|
||
# Static files (CSS, JavaScript, Images) | ||
# https://docs.djangoproject.com/en/4.2/howto/static-files/ | ||
|
||
STATIC_URL = 'static/' | ||
|
||
# Default primary key field type | ||
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field | ||
|
||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
""" | ||
URL configuration for balancer project. | ||
The `urlpatterns` list routes URLs to views. For more information please see: | ||
https://docs.djangoproject.com/en/4.2/topics/http/urls/ | ||
Examples: | ||
Function views | ||
1. Add an import: from my_app import views | ||
2. Add a URL to urlpatterns: path('', views.home, name='home') | ||
Class-based views | ||
1. Add an import: from other_app.views import Home | ||
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') | ||
Including another URLconf | ||
1. Import the include() function: from django.urls import include, path | ||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) | ||
""" | ||
from django.contrib import admin | ||
from django.urls import path | ||
|
||
urlpatterns = [ | ||
path('admin/', admin.site.urls), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
""" | ||
WSGI config for balancer project. | ||
It exposes the WSGI callable as a module-level variable named ``application``. | ||
For more information on this file, see | ||
https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ | ||
""" | ||
|
||
import os | ||
|
||
from django.core.wsgi import get_wsgi_application | ||
|
||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'balancer.settings') | ||
|
||
application = get_wsgi_application() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
version: "3" | ||
services: | ||
balancer-backend: | ||
image: ${DOCKER_REGISTRY}/${PROJECT_NAME}/${NAMESPACE}:${DOCKER_TAG_VERSION} | ||
environment: | ||
PROJECT_NAME: ${PROJECT_NAME} | ||
|
||
volumes: | ||
- "${DOCKER_APP_SOURCE_FROM_COMPOSE}:${DOCKER_APP_DEST}" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
#!/bin/bash | ||
set -eu | ||
|
||
exec "$@" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#!/usr/bin/env python | ||
"""Django's command-line utility for administrative tasks.""" | ||
import os | ||
import sys | ||
|
||
|
||
def main(): | ||
"""Run administrative tasks.""" | ||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'balancer.settings') | ||
try: | ||
from django.core.management import execute_from_command_line | ||
except ImportError as exc: | ||
raise ImportError( | ||
"Couldn't import Django. Are you sure it's installed and " | ||
"available on your PYTHONPATH environment variable? Did you " | ||
"forget to activate a virtual environment?" | ||
) from exc | ||
execute_from_command_line(sys.argv) | ||
|
||
|
||
if __name__ == '__main__': | ||
main() |
Oops, something went wrong.