From 12e8b041286e6cd450a07fdf3a48ee1602a67148 Mon Sep 17 00:00:00 2001 From: Abhilash Raj Date: Wed, 29 Mar 2017 22:27:06 -0700 Subject: [PATCH] Add psycopg2 in mailman-web container. Copy the settings file from /opt/mailman/web/ in the host system which is supposed to be mounted at /opt/mailman-web-data/ in the container. --- web/Dockerfile | 4 +- web/assets/run.sh | 10 + web/mailman-web/settings.py | 488 ------------------------------------ 3 files changed, 12 insertions(+), 490 deletions(-) delete mode 100644 web/mailman-web/settings.py diff --git a/web/Dockerfile b/web/Dockerfile index 398f6ca..29844f5 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -11,8 +11,8 @@ RUN apt-get update \ git+https://gitlab.com/mailman/django-mailman3.git \ git+https://gitlab.com/mailman/hyperkitty.git \ whoosh \ - uwsgi - + uwsgi \ + psycopg2 ADD mailman-web /opt/mailman-web diff --git a/web/assets/run.sh b/web/assets/run.sh index 23b23cc..c149be2 100755 --- a/web/assets/run.sh +++ b/web/assets/run.sh @@ -20,6 +20,16 @@ if [[ ! $(pwd) == '/opt/mailman-web' ]]; then fi +# Check if the settings file exists, exit it not. +if [[ ! -e /opt/mailman-web-data/settings.py ]]; then + "Settings file does not exist, please provide one..." + exit 1 +fi + +# Copy the settings file from /opt/mailman-web-data/ to the pwd because +# it is not on python-path. +cp /opt/mailman-web-data/settings.py /opt/mailman-web/settings.py + # Collect static for the django installation. python manage.py collectstatic --noinput diff --git a/web/mailman-web/settings.py b/web/mailman-web/settings.py deleted file mode 100644 index bbdc97a..0000000 --- a/web/mailman-web/settings.py +++ /dev/null @@ -1,488 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (C) 1998-2016 by the Free Software Foundation, Inc. -# -# This file is part of Mailman Suite. -# -# Mailman Suite is free sofware: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) -# any later version. -# -# Mailman Suite is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# for more details. - -# You should have received a copy of the GNU General Public License along -# with Mailman Suite. If not, see . -""" -Django Settings for Mailman Suite (hyperkitty + postorius) - -For more information on this file, see -https://docs.djangoproject.com/en/1.8/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/1.8/ref/settings/ -""" - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -import os - -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'change-this-on-your-production-server' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ADMINS = ( - ('Mailman Suite Admin', 'root@localhost'), -) - -SITE_ID = 1 - -# Hosts/domain names that are valid for this site; required if DEBUG is False -# See https://docs.djangoproject.com/en/1.8/ref/settings/#allowed-hosts -ALLOWED_HOSTS = [ - "localhost", # Archiving API from Mailman, keep it. - # "lists.your-domain.org", - # Add here all production URLs you may have. -] - -# Mailman API credentials -MAILMAN_REST_API_URL = 'http://mailman-core:8001' -MAILMAN_REST_API_USER = 'restadmin' -MAILMAN_REST_API_PASS = 'restpass' -MAILMAN_ARCHIVER_KEY = 'SecretArchiverAPIKey' -MAILMAN_ARCHIVER_FROM = ('127.0.0.1', '::1') - -# Application definition - -INSTALLED_APPS = ( - 'hyperkitty', - 'postorius', - 'django_mailman3', - # Uncomment the next line to enable the admin: - 'django.contrib.admin', - # Uncomment the next line to enable admin documentation: - # 'django.contrib.admindocs', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.sites', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'rest_framework', - 'django_gravatar', - 'paintstore', - 'compressor', - 'haystack', - 'django_extensions', - 'allauth', - 'allauth.account', - 'allauth.socialaccount', - 'django_mailman3.lib.auth.fedora', - 'allauth.socialaccount.providers.openid', - 'allauth.socialaccount.providers.github', - 'allauth.socialaccount.providers.gitlab', - 'allauth.socialaccount.providers.google', - #'allauth.socialaccount.providers.facebook', - #'allauth.socialaccount.providers.twitter', - #'allauth.socialaccount.providers.stackexchange', -) - - -MIDDLEWARE_CLASSES = ( - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.middleware.locale.LocaleMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.security.SecurityMiddleware', - 'django_mailman3.middleware.TimezoneMiddleware', - 'postorius.middleware.PostoriusMiddleware', -) - -ROOT_URLCONF = 'urls' - - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.i18n', - 'django.template.context_processors.media', - 'django.template.context_processors.static', - 'django.template.context_processors.tz', - 'django.template.context_processors.csrf', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - 'django_mailman3.context_processors.common', - 'hyperkitty.context_processors.common', - 'postorius.context_processors.postorius', - ], - }, - }, -] - -WSGI_APPLICATION = 'wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/1.8/ref/settings/#databases - -DATABASES = { - 'default': { - # Use 'sqlite3', 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. - 'ENGINE': 'django.db.backends.sqlite3', - # DB name or path to database file if using sqlite3. - 'NAME': '/opt/mailman-web-data/mailmansuite.db', - # The following settings are not used with sqlite3: - 'USER': 'mailmansuite', - 'PASSWORD': 'mmpass', - # HOST: empty for localhost through domain sockets or '127.0.0.1' for - # localhost through TCP. - 'HOST': '', - # PORT: set to empty string for default. - 'PORT': '', - } - # Example for PostgreSQL (recommanded for production): - #'default': { - # 'ENGINE': 'django.db.backends.postgresql_psycopg2', - # 'NAME': 'database_name', - # 'USER': 'database_user', - # 'PASSWORD': 'database_password', - # 'HOST': 'localhost', - #} -} - - -# If you're behind a proxy, use the X-Forwarded-Host header -# See https://docs.djangoproject.com/en/1.8/ref/settings/#use-x-forwarded-host -# USE_X_FORWARDED_HOST = True - -# And if your proxy does your SSL encoding for you, set SECURE_PROXY_SSL_HEADER -# https://docs.djangoproject.com/en/1.8/ref/settings/#secure-proxy-ssl-header -# SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') -# SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_SCHEME', 'https') - -# Other security settings -# SECURE_SSL_REDIRECT = True -# If you set SECURE_SSL_REDIRECT to True, make sure the SECURE_REDIRECT_EXEMPT -# contains at least this line: -# SECURE_REDIRECT_EXEMPT = [ -# "archives/api/mailman/.*", # Request from Mailman. -# ] -# SESSION_COOKIE_SECURE = True -# SECURE_CONTENT_TYPE_NOSNIFF = True -# SECURE_BROWSER_XSS_FILTER = True -# CSRF_COOKIE_SECURE = True -# CSRF_COOKIE_HTTPONLY = True -# X_FRAME_OPTIONS = 'DENY' - - -# Password validation -# https://docs.djangoproject.com/en/1.9/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/1.8/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/1.8/howto/static-files/ - -# Absolute path to the directory static files should be collected to. -# Don't put anything in this directory yourself; store your static files -# in apps' "static/" subdirectories and in STATICFILES_DIRS. -# Example: "/var/www/example.com/static/" -STATIC_ROOT = '/opt/mailman-web-data/static' - -# URL prefix for static files. -# Example: "http://example.com/static/", "http://static.example.com/" -STATIC_URL = '/static/' - -# Additional locations of static files -STATICFILES_DIRS = ( - # Put strings here, like "/home/html/static" or "C:/www/django/static". - # Always use forward slashes, even on Windows. - # Don't forget to use absolute paths, not relative paths. - # BASE_DIR + '/static/', -) - -# List of finder classes that know how to find static files in -# various locations. -STATICFILES_FINDERS = ( - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - # 'django.contrib.staticfiles.finders.DefaultStorageFinder', - 'compressor.finders.CompressorFinder', -) - -# Django 1.6+ defaults to a JSON serializer, but it won't work with -# django-openid, see -# https://bugs.launchpad.net/django-openid-auth/+bug/1252826 -SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer' - - -LOGIN_URL = 'account_login' -LOGIN_REDIRECT_URL = 'list_index' -LOGOUT_URL = 'account_logout' - - -# If you enable internal authentication, this is the address that the emails -# will appear to be coming from. Make sure you set a valid domain name, -# otherwise the emails may get rejected. -# https://docs.djangoproject.com/en/1.8/ref/settings/#default-from-email -# DEFAULT_FROM_EMAIL = "mailing-lists@you-domain.org" -DEFAULT_FROM_EMAIL = 'postorius@localhost.local' - -# If you enable email reporting for error messages, this is where those emails -# will appear to be coming from. Make sure you set a valid domain name, -# otherwise the emails may get rejected. -# https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-SERVER_EMAIL -# SERVER_EMAIL = 'root@your-domain.org' -SERVER_EMAIL = 'root@localhost.local' - -# Change this when you have a real email backend -EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' - -# Compatibility with Bootstrap 3 -from django.contrib.messages import constants as messages # flake8: noqa -MESSAGE_TAGS = { - messages.ERROR: 'danger' -} - - -# -# Social auth -# -AUTHENTICATION_BACKENDS = ( - 'django.contrib.auth.backends.ModelBackend', - 'allauth.account.auth_backends.AuthenticationBackend', -) - -# Django Allauth -ACCOUNT_AUTHENTICATION_METHOD = "username_email" -ACCOUNT_EMAIL_REQUIRED = True -ACCOUNT_EMAIL_VERIFICATION = "mandatory" -# You probably want https in production, but this is a dev setup file -ACCOUNT_DEFAULT_HTTP_PROTOCOL = "http" -ACCOUNT_UNIQUE_EMAIL = True - -SOCIALACCOUNT_PROVIDERS = { - 'openid': { - 'SERVERS': [ - dict(id='yahoo', - name='Yahoo', - openid_url='http://me.yahoo.com'), - ], - }, - 'google': { - 'SCOPE': ['profile', 'email'], - 'AUTH_PARAMS': {'access_type': 'online'}, - }, - 'facebook': { - 'METHOD': 'oauth2', - 'SCOPE': ['email'], - 'FIELDS': [ - 'email', - 'name', - 'first_name', - 'last_name', - 'locale', - 'timezone', - ], - 'VERSION': 'v2.4', - }, -} - - -# -# Gravatar -# https://github.com/twaddington/django-gravatar -# -# Gravatar base url. -# GRAVATAR_URL = 'http://cdn.libravatar.org/' -# Gravatar base secure https url. -# GRAVATAR_SECURE_URL = 'https://seccdn.libravatar.org/' -# Gravatar size in pixels. -# GRAVATAR_DEFAULT_SIZE = '80' -# An image url or one of the following: 'mm', 'identicon', 'monsterid', -# 'wavatar', 'retro'. -# GRAVATAR_DEFAULT_IMAGE = 'mm' -# One of the following: 'g', 'pg', 'r', 'x'. -# GRAVATAR_DEFAULT_RATING = 'g' -# True to use https by default, False for plain http. -# GRAVATAR_DEFAULT_SECURE = True - -# -# django-compressor -# https://pypi.python.org/pypi/django_compressor -# -COMPRESS_PRECOMPILERS = ( - ('text/less', 'lessc {infile} {outfile}'), - ('text/x-scss', 'sass -t compressed {infile} {outfile}'), - ('text/x-sass', 'sass -t compressed {infile} {outfile}'), -) -# On a production setup, setting COMPRESS_OFFLINE to True will bring a -# significant performance improvement, as CSS files will not need to be -# recompiled on each requests. It means running an additional "compress" -# management command after each code upgrade. -# http://django-compressor.readthedocs.io/en/latest/usage/#offline-compression -# COMPRESS_OFFLINE = True - -# Needed for debug mode -# INTERNAL_IPS = ('127.0.0.1',) - - -# -# Full-text search engine -# -HAYSTACK_CONNECTIONS = { - 'default': { - 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', - 'PATH': os.path.join(BASE_DIR, "fulltext_index"), - # You can also use the Xapian engine, it's faster and more accurate, - # but requires another library. - # http://django-haystack.readthedocs.io/en/v2.4.1/installing_search_engines.html#xapian - # Example configuration for Xapian: - #'ENGINE': 'xapian_backend.XapianEngine' - }, -} - - -# A sample logging configuration. The only tangible logging -# performed by this configuration is to send an email to -# the site admins on every HTTP 500 error when DEBUG=False. -# See http://docs.djangoproject.com/en/dev/topics/logging for -# more details on how to customize your logging configuration. -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'filters': { - 'require_debug_false': { - '()': 'django.utils.log.RequireDebugFalse' - } - }, - 'handlers': { - 'mail_admins': { - 'level': 'ERROR', - 'filters': ['require_debug_false'], - 'class': 'django.utils.log.AdminEmailHandler' - }, - 'file':{ - 'level': 'INFO', - #'class': 'logging.handlers.RotatingFileHandler', - 'class': 'logging.handlers.WatchedFileHandler', - 'filename': os.path.join(BASE_DIR, 'logs', 'mailmansuite.log'), - 'formatter': 'verbose', - }, - 'console': { - 'class': 'logging.StreamHandler', - 'formatter': 'simple', - }, - }, - 'loggers': { - 'django.request': { - 'handlers': ['mail_admins', 'file'], - 'level': 'ERROR', - 'propagate': True, - }, - 'django': { - 'handlers': ['file'], - 'level': 'ERROR', - 'propagate': True, - }, - 'hyperkitty': { - 'handlers': ['file'], - 'level': 'DEBUG', - 'propagate': True, - }, - 'postorius': { - 'handlers': ['console', 'file'], - 'level': 'INFO', - }, - }, - 'formatters': { - 'verbose': { - 'format': '%(levelname)s %(asctime)s %(process)d %(name)s %(message)s' - }, - 'simple': { - 'format': '%(levelname)s %(message)s' - }, - }, - #'root': { - # 'handlers': ['file'], - # 'level': 'INFO', - #}, -} - - -# Using the cache infrastructure can significantly improve performance on a -# production setup. This is an example with a local Memcached server. -#CACHES = { -# 'default': { -# 'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache', -# 'LOCATION': '127.0.0.1:11211', -# } -#} - - -# When DEBUG is True, don't actually send emails to the SMTP server, just store -# them in a directory. This way you won't accidentally spam your mailing-lists -# while you're fiddling with the code. -if DEBUG == True: - EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' - EMAIL_FILE_PATH = os.path.join(BASE_DIR, 'emails') - - -# -# HyperKitty-specific -# - -# Only display mailing-lists from the same virtual host as the webserver -FILTER_VHOST = False - - -try: - from settings_local import * -except ImportError: - pass