Skip to content

Commit

Permalink
Base django app with Dockerfile, Unique secret for development and Po…
Browse files Browse the repository at this point in the history
…stgres DB connection (#12)

* Dockerized Django app with Postgres DB connection
  • Loading branch information
GoelJatin authored Aug 26, 2020
1 parent 1977570 commit c338ea6
Show file tree
Hide file tree
Showing 14 changed files with 574 additions and 1 deletion.
18 changes: 18 additions & 0 deletions .env.development
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Postgres variables

POSTGRES_USER=hacknight
POSTGRES_PASSWORD=hacknight

# Django variables

DATABASE_HOST=postgres
DATABASE_PORT=5432

DATABASE_USER=hacknight
DATABASE_PASSWORD=hacknight

DATABASE_NAME=hacknight

DJANGO_SECRET_KEY=w_ul5ajwf&n0ffn$8w*(&3h2#=nng=h(1olo&stdoj5@kht-fq
DEBUG=1
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
24 changes: 24 additions & 0 deletions Dockerfile.django
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
FROM python:3.8-slim-buster

RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
apt-utils; \
pip install --no-cache-dir pipenv; \
apt-get clean; \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

EXPOSE 8080

WORKDIR /app

COPY src/Pipfile src/Pipfile.lock ./

RUN pipenv install

COPY ./src ./

CMD [ "bash", "startup.sh" ]
19 changes: 18 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,12 @@ We also need contacts of various speakers who are willing to present at the meet
For meetups we also need a list of Companies and PoCs whom we can contact for hosting the meetup. We can store this data in a central place for easy accessibility. This will enable the easy transfer of responsibilities between organisers of the meeup.

## Scope

The meetup manager aims to solve the problem of announcing meetup notifications in different platform from one place without having to know the credentials of each platforms. Additonally it will serve as a common location for getting data about speakers, venue and meetups.

## Purpose of the Project

The purpose of the project is to Automate most common tasks for meetup Organizers and also provide a Workflow for the tasks. Based on that here is a list of user stories which can be useful to describe various use cases.
The purpose of the project is to Automate most common tasks for meetup Organizers and also provide a Workflow for the tasks. Based on that here is a list of user stories which can be useful to describe various use cases.

### Social media Integration/Announcement system

Expand Down Expand Up @@ -48,5 +49,21 @@ Once the meetup is over we can automatically post the resources (slides, code re
- Listing of Venue partners
2. Creating Workflow for peer review of notifications posted on social media platforms

## Running the app locally

You need to have Docker installed to run the app locally

Then you need to udpate the `DJANGO_SECRET_KEY` env variable in your `.env.development` file

To build the image and run the services, run the command on the terminal:

```$ docker-compose up --build -d```

This command will build the docker image on your local system using the Dockerfile and other configuration specified.

And finally launch all services defined in the `docker-compose.yml` file, create its own network, etc.

`NOTE:` If the `meetup-manager` container keeps on going down and error in the logs show permission denied for the
`wait-for-it.sh` utility, please run the below command from src directory

```$ chmod +x wait-for-it.sh```
26 changes: 26 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
version: "3.8"

services:
postgres:
image: postgres:11
env_file: .env.development
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- "54432:5432"

django:
build:
context: .
dockerfile: Dockerfile.django
env_file: .env.development
volumes:
- ./src:/app
ports:
- "8080:8080"
depends_on:
- "postgres"
command: ["./wait-for-it.sh", "postgres:5432", "--", "bash", "startup.sh"]

volumes:
pgdata:
13 changes: 13 additions & 0 deletions src/Pipfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
django = "*"
psycopg2-binary = "*"

[requires]
python_version = "3.8"
88 changes: 88 additions & 0 deletions src/Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 22 additions & 0 deletions src/meetup_manager/manage.py
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', 'meetup_manager.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()
Empty file.
16 changes: 16 additions & 0 deletions src/meetup_manager/meetup_manager/asgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
ASGI config for meetup_manager 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/3.1/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meetup_manager.settings')

application = get_asgi_application()
127 changes: 127 additions & 0 deletions src/meetup_manager/meetup_manager/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
"""
Django settings for meetup_manager project.
Generated by 'django-admin startproject' using Django 3.1.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""

from pathlib import Path

import os
import uuid

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve(strict=True).parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.getenv('DJANGO_SECRET_KEY', str(uuid.uuid4()))

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = int(os.getenv('DEBUG', 0))

ALLOWED_HOSTS = os.getenv('DJANGO_ALLOWED_HOSTS').split()


# 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 = 'meetup_manager.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 = 'meetup_manager.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.getenv('DATABASE_NAME'),
'USER': os.getenv('DATABASE_USER'),
'PASSWORD': os.getenv('DATABASE_PASSWORD'),
'HOST': os.getenv('DATABASE_HOST'),
'PORT': os.getenv('DATABASE_PORT'),
}
}


# Password validation
# https://docs.djangoproject.com/en/3.1/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/3.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/

STATIC_URL = '/static/'
21 changes: 21 additions & 0 deletions src/meetup_manager/meetup_manager/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""meetup_manager URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/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),
]
Loading

0 comments on commit c338ea6

Please sign in to comment.