[mailman3] Create a new role mailman3
It seems that the mailman update is more complicated than I originally thought. So I decided to start with clean role and will slowly start adding new changes. Signed-off-by: Michal Konecny <mkonecny@redhat.com>
This commit is contained in:
parent
b148c77ff5
commit
c2862e1e8b
24 changed files with 1327 additions and 0 deletions
|
@ -100,6 +100,16 @@
|
||||||
mailman_hyperkitty_admin_db_pass: "{{ mailman_hk_admin_db_pass }}"
|
mailman_hyperkitty_admin_db_pass: "{{ mailman_hk_admin_db_pass }}"
|
||||||
mailman_hyperkitty_db_pass: "{{ mailman_hk_db_pass }}"
|
mailman_hyperkitty_db_pass: "{{ mailman_hk_db_pass }}"
|
||||||
mailman_hyperkitty_cookie_key: "{{ mailman_hk_cookie_key }}"
|
mailman_hyperkitty_cookie_key: "{{ mailman_hk_cookie_key }}"
|
||||||
|
when: env != "staging"
|
||||||
|
- role: mailman3
|
||||||
|
mailman_rest_api_user: "{{ mailman_stg_rest_api_user }}"
|
||||||
|
mailman_rest_api_pass: "{{ mailman_stg_rest_api_pass }}"
|
||||||
|
mailman_mailman_db_pass: "{{ mailman_mm_db_pass }}"
|
||||||
|
mailman_hyperkitty_admin_db_pass: "{{ mailman_hk_admin_db_pass }}"
|
||||||
|
mailman_hyperkitty_db_pass: "{{ mailman_hk_db_pass }}"
|
||||||
|
mailman_hyperkitty_cookie_key: "{{ mailman_hk_cookie_key }}"
|
||||||
|
mailman_hyperkitty_archiver_key: "{{ mailman_hk_stg_archiver_key }}"
|
||||||
|
when: env == "staging"
|
||||||
- {role: fedmsg/base,
|
- {role: fedmsg/base,
|
||||||
when: env != "staging"}
|
when: env != "staging"}
|
||||||
# Set up for fedora-messaging
|
# Set up for fedora-messaging
|
||||||
|
|
36
roles/mailman3/defaults/main.yml
Normal file
36
roles/mailman3/defaults/main.yml
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
---
|
||||||
|
# Mailman core settings
|
||||||
|
mailman_webui_basedir: /srv/webui
|
||||||
|
mailman_webui_confdir: /etc/mailman3
|
||||||
|
mailman_rest_api_user: restadmin
|
||||||
|
mailman_rest_api_pass: changeme
|
||||||
|
mailman_rest_api_workers: 2
|
||||||
|
mailman_log_directory: /var/log/mailman3
|
||||||
|
mailman_log_items:
|
||||||
|
- archiver
|
||||||
|
- bounce
|
||||||
|
- config
|
||||||
|
- database
|
||||||
|
- http
|
||||||
|
- runner
|
||||||
|
- smtp
|
||||||
|
- subscribe
|
||||||
|
- task
|
||||||
|
|
||||||
|
# Mailman DB settings (the values should be provided by playbook)
|
||||||
|
mailman_db_server: localhost
|
||||||
|
mailman_mailman_db_pass: changeme
|
||||||
|
|
||||||
|
# Hyperkitty/Postorius settings (the values should be provided by playbook)
|
||||||
|
mailman_hyperkitty_admin_db_pass: changeme
|
||||||
|
mailman_hyperkitty_db_pass: changeme
|
||||||
|
mailman_hyperkitty_cookie_key: changeme
|
||||||
|
mailman_hyperkitty_archiver_key: changeme
|
||||||
|
mailman_domains:
|
||||||
|
- lists.example.com
|
||||||
|
- lists.example.org
|
||||||
|
mailman_social_login: []
|
||||||
|
|
||||||
|
# Apache configuration
|
||||||
|
# Use mailman-web wsgi for mailman3
|
||||||
|
wsgi_dir: /usr/lib/python3.9/site-packages/mailman_web
|
BIN
roles/mailman3/files/favicon.ico
Normal file
BIN
roles/mailman3/files/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
9
roles/mailman3/files/headers.html
Normal file
9
roles/mailman3/files/headers.html
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<style>
|
||||||
|
.socialaccount_provider.fedora {
|
||||||
|
padding: 10px 16px;
|
||||||
|
font-size: 18px;
|
||||||
|
line-height: 1.33333;
|
||||||
|
border-radius: 6px;
|
||||||
|
border-color: #aaa;
|
||||||
|
}
|
||||||
|
</style>
|
6
roles/mailman3/files/login_extra_top.html
Normal file
6
roles/mailman3/files/login_extra_top.html
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<p>
|
||||||
|
By subscribing or posting to these mailing lists, you agree that any email
|
||||||
|
to the list is public and viewable worldwide (unless it's one of the few private mailing-lists).
|
||||||
|
For more details, see our
|
||||||
|
<a href="https://fedoraproject.org/wiki/Legal:PrivacyPolicy">Privacy policy</a>.
|
||||||
|
</p>
|
BIN
roles/mailman3/files/logo-hyperkitty-fedora.png
Normal file
BIN
roles/mailman3/files/logo-hyperkitty-fedora.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.5 KiB |
20
roles/mailman3/files/mailman-hyperkitty.cfg
Normal file
20
roles/mailman3/files/mailman-hyperkitty.cfg
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# This is the mailman extension configuration file to enable HyperKitty as an
|
||||||
|
# archiver. Remember to add the following lines in the mailman.cfg file:
|
||||||
|
#
|
||||||
|
# [archiver.hyperkitty]
|
||||||
|
# class: mailman_hyperkitty.Archiver
|
||||||
|
# enable: yes
|
||||||
|
# configuration: /path/to/here/hyperkitty.cfg
|
||||||
|
#
|
||||||
|
|
||||||
|
[general]
|
||||||
|
|
||||||
|
# This is your HyperKitty installation, preferably on the localhost. This
|
||||||
|
# address will be used by Mailman to forward incoming emails to HyperKitty
|
||||||
|
# for archiving. It does not need to be publicly available, in fact it's
|
||||||
|
# better if it is not.
|
||||||
|
base_url: http://localhost/archives/
|
||||||
|
|
||||||
|
# Shared API key, must be the identical to the value in HyperKitty's
|
||||||
|
# settings.
|
||||||
|
api_key: {{ mailman_hypperkitty_archiver_key }}
|
|
@ -0,0 +1,15 @@
|
||||||
|
As list administrator, your authorization is requested for the
|
||||||
|
following mailing list posting:
|
||||||
|
|
||||||
|
List: $listname
|
||||||
|
From: $sender_email
|
||||||
|
Subject: $subject
|
||||||
|
|
||||||
|
The message is being held because:
|
||||||
|
|
||||||
|
$reasons
|
||||||
|
|
||||||
|
At your convenience, visit your dashboard to approve or deny the
|
||||||
|
request:
|
||||||
|
|
||||||
|
https://lists.fedoraproject.org/admin/lists/$list_id/held_messages
|
|
@ -0,0 +1,8 @@
|
||||||
|
--
|
||||||
|
_______________________________________________
|
||||||
|
$display_name mailing list -- $listname
|
||||||
|
To unsubscribe send an email to ${short_listname}-leave@${domain}
|
||||||
|
Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
|
||||||
|
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
|
||||||
|
List Archives: https://${domain}/archives/list/${listname}
|
||||||
|
Do not reply to spam, report it: https://pagure.io/fedora-infrastructure/new_issue
|
|
@ -0,0 +1,25 @@
|
||||||
|
Your mail to '$listname' with the subject
|
||||||
|
|
||||||
|
$subject
|
||||||
|
|
||||||
|
Is being held until the list moderator can review it for approval.
|
||||||
|
|
||||||
|
The message is being held because:
|
||||||
|
|
||||||
|
$reasons
|
||||||
|
|
||||||
|
Either the message will get posted to the list, or you will receive
|
||||||
|
notification of the moderator's decision.
|
||||||
|
|
||||||
|
NOTE: If your message has been held due to size, please consider
|
||||||
|
this a rejection and a friendly request to reduce the size and
|
||||||
|
resend. The list moderators will not approve such messages.
|
||||||
|
|
||||||
|
If you are attaching logs or command output, please trim it to a
|
||||||
|
minimal amount (we can ask for more context, if needed).
|
||||||
|
|
||||||
|
If you are attaching an image, please crop it to reduce their size.
|
||||||
|
|
||||||
|
Also keep in mind that attachments will be encoded by your mail
|
||||||
|
client (usually via base64) and this encoding increases the size by
|
||||||
|
as much as 33%.
|
6
roles/mailman3/files/mailman3.logrotate.conf
Normal file
6
roles/mailman3/files/mailman3.logrotate.conf
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
/var/log/mailman3/*.log {
|
||||||
|
missingok
|
||||||
|
notifempty
|
||||||
|
delaycompress
|
||||||
|
su root apache
|
||||||
|
}
|
5
roles/mailman3/files/memcached.sysconfig
Normal file
5
roles/mailman3/files/memcached.sysconfig
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
PORT="11211"
|
||||||
|
USER="memcached"
|
||||||
|
MAXCONN="1024"
|
||||||
|
CACHESIZE="655350"
|
||||||
|
OPTIONS=""
|
5
roles/mailman3/files/navbar-brand.html
Normal file
5
roles/mailman3/files/navbar-brand.html
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{% load static %}
|
||||||
|
<a class="navbar-brand" href="{% url 'hk_root' %}"
|
||||||
|
title="{{ site_name|title }}" style="padding:8px 15px">
|
||||||
|
<img alt="{{ site_name|title }}" src="{% static 'logo-hyperkitty-fedora.png' %}" />
|
||||||
|
</a>
|
4
roles/mailman3/files/robots.txt
Normal file
4
roles/mailman3/files/robots.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
User-agent: *
|
||||||
|
Disallow: /accounts/
|
||||||
|
Disallow: /django-admin/
|
||||||
|
Disallow: /archives/*/vote$
|
21
roles/mailman3/files/signup_closed.html
Normal file
21
roles/mailman3/files/signup_closed.html
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{% extends "account/base.html" %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block head_title %}{% trans "Signup" %}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>{% trans "Sign Up" %}</h1>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
{% blocktrans %}
|
||||||
|
Account creation for the Fedora mailing-lists is done by
|
||||||
|
<a href="https://accounts.fedoraproject.org/">creating an account in FAS</a>.
|
||||||
|
{% endblocktrans %}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{% url LOGIN_URL as login_url %}
|
||||||
|
<p>{% blocktrans %}Already have an account? Then please <a href="{{login_url}}">sign in</a>.{% endblocktrans %}</p>
|
||||||
|
|
||||||
|
|
||||||
|
{% endblock %}
|
10
roles/mailman3/files/top.html
Normal file
10
roles/mailman3/files/top.html
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<!-- This markup will be inserted after the <body> tag -->
|
||||||
|
|
||||||
|
<!-- https://pagure.io/fedora-infrastructure/issue/10741 -->
|
||||||
|
<!--
|
||||||
|
<div style="margin: auto" class="container">
|
||||||
|
<a href="https://fedoraproject.limequery.com/2023" target="_blank">
|
||||||
|
<img src="https://pagure.io/fedora-infrastructure/issue/raw/files/b4d328e7ce730f610530822af4c9cdab1029c47dc2bdb15648d4008e1b304e43-contributor-survey-banner.png" style="max-width: 100%">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
-->
|
12
roles/mailman3/handlers/main.yml
Normal file
12
roles/mailman3/handlers/main.yml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
---
|
||||||
|
- name: restart mailman3
|
||||||
|
service: name=mailman3 state=restarted
|
||||||
|
|
||||||
|
- name: reload apache
|
||||||
|
service: name=httpd state=reloaded
|
||||||
|
|
||||||
|
- name: restart memcached
|
||||||
|
service: name=memcached state=restarted
|
||||||
|
|
||||||
|
- name: systemctl daemon-reload
|
||||||
|
command: /usr/bin/systemctl daemon-reload
|
452
roles/mailman3/tasks/main.yml
Normal file
452
roles/mailman3/tasks/main.yml
Normal file
|
@ -0,0 +1,452 @@
|
||||||
|
---
|
||||||
|
# Configuration for Mailman 3
|
||||||
|
# PostgreSQL initialization must have been done already
|
||||||
|
|
||||||
|
#
|
||||||
|
# SELinux
|
||||||
|
#
|
||||||
|
- name: Set the SELinux policy for the fulltext index
|
||||||
|
community.general.sefcontext:
|
||||||
|
target: "{{ mailman_webui_basedir }}/fulltext_index(/.*)?"
|
||||||
|
setype: httpd_sys_rw_content_t
|
||||||
|
state: present
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- selinux
|
||||||
|
|
||||||
|
- name: Set the SELinux policy for the static files directory
|
||||||
|
community.general.sefcontext:
|
||||||
|
target: "{{ mailman_webui_basedir }}/static(/.*)?"
|
||||||
|
setype: httpd_sys_content_t
|
||||||
|
state: present
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- selinux
|
||||||
|
|
||||||
|
- name: Set the SELinux policy for the templates override directory
|
||||||
|
community.general.sefcontext:
|
||||||
|
target: "{{ mailman_webui_basedir }}/templates(/.*)?"
|
||||||
|
setype: httpd_sys_content_t
|
||||||
|
state: present
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- selinux
|
||||||
|
|
||||||
|
- name: set the SELinux policy for the log directory
|
||||||
|
community.general.sefcontext:
|
||||||
|
target: "{{ mailman_log_directory }}(/.*)?"
|
||||||
|
setype: httpd_log_t
|
||||||
|
state: present
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- selinux
|
||||||
|
|
||||||
|
- name: Set the SELinux policy for the generated postfix databases
|
||||||
|
community.general.sefcontext:
|
||||||
|
target: "{{ mailman_webui_basedir }}/var/data/postfix_.*"
|
||||||
|
setype: etc_aliases_t
|
||||||
|
state: present
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- selinux
|
||||||
|
|
||||||
|
- name: Set the SELinux policy for the old static archives
|
||||||
|
community.general.sefcontext:
|
||||||
|
target: "{{ mailman_webui_basedir }}/old-archives/pipermail(/.*)?"
|
||||||
|
setype: httpd_sys_content_t
|
||||||
|
state: present
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- selinux
|
||||||
|
|
||||||
|
- name: Allow Apache to remotely connect to PostgreSQL
|
||||||
|
ansible.posix.seboolean:
|
||||||
|
name: httpd_can_network_connect_db
|
||||||
|
state: yes
|
||||||
|
persistent: yes
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- selinux
|
||||||
|
|
||||||
|
- name: Allow Apache to remotely connect to Mailman
|
||||||
|
ansible.posix.seboolean:
|
||||||
|
name: httpd_can_network_connect
|
||||||
|
state: yes
|
||||||
|
persistent: yes
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- selinux
|
||||||
|
|
||||||
|
- name: Allow Apache to remotely connect to Memcached
|
||||||
|
ansible.posix.seboolean:
|
||||||
|
name: httpd_can_network_memcache
|
||||||
|
state: yes
|
||||||
|
persistent: yes
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- selinux
|
||||||
|
|
||||||
|
|
||||||
|
- name: Install needed packages
|
||||||
|
ansible.builtin.package:
|
||||||
|
name: {{item}}
|
||||||
|
state: present
|
||||||
|
with_items:
|
||||||
|
- httpd
|
||||||
|
- hyperkitty
|
||||||
|
- fedora-messaging
|
||||||
|
- mailman3
|
||||||
|
- memcached
|
||||||
|
- postorius
|
||||||
|
- python3-mailman-hyperkitty
|
||||||
|
- python3-mailman-web
|
||||||
|
- python3-mod_wsgi
|
||||||
|
- python3-pylibmc
|
||||||
|
- python3-psycopg2
|
||||||
|
- python3-whoosh
|
||||||
|
- sassc
|
||||||
|
tags:
|
||||||
|
- packages
|
||||||
|
- mailman
|
||||||
|
|
||||||
|
- name: Set the mailman conffile
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: mailman.cfg.j2
|
||||||
|
dest: /etc/mailman.cfg
|
||||||
|
owner: mailman
|
||||||
|
group: mailman
|
||||||
|
mode: 0640
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
- mailman
|
||||||
|
notify:
|
||||||
|
- restart mailman3
|
||||||
|
|
||||||
|
#
|
||||||
|
# Logging
|
||||||
|
#
|
||||||
|
- name: Ensuring log directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ mailman3_log_directory }}"
|
||||||
|
state: directory
|
||||||
|
owner: mailman
|
||||||
|
group: mailman
|
||||||
|
tags:
|
||||||
|
- logging
|
||||||
|
- mailman
|
||||||
|
|
||||||
|
- name: Mailman logging -- rotation
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: mailman3.logrotate.conf
|
||||||
|
dest: /etc/logrotate.d/mailman3
|
||||||
|
tags:
|
||||||
|
- logging
|
||||||
|
- mailman
|
||||||
|
|
||||||
|
- name: Ensuring mailman-core is started
|
||||||
|
ansible.builtin.service:
|
||||||
|
name: mailman3
|
||||||
|
state: started
|
||||||
|
enabled: yes
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
|
||||||
|
#
|
||||||
|
# HyperKitty + Postorius setup
|
||||||
|
#
|
||||||
|
- name: Create site/en dir
|
||||||
|
ansible.builtin.file:
|
||||||
|
state: directory
|
||||||
|
path: /var/lib/mailman3/templates/site/en
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
- mailman
|
||||||
|
|
||||||
|
- name: Set default list footer
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: mailman-template-list-member-generic-footer.txt
|
||||||
|
dest: /var/lib/mailman3/templates/site/en/list:member:generic:footer.txt
|
||||||
|
owner: mailman
|
||||||
|
group: mailman
|
||||||
|
mode: 0644
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
- mailman
|
||||||
|
|
||||||
|
- name: Set default list:admin:action:post template
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: mailman-template-list-admin-action-post.txt
|
||||||
|
dest: /var/lib/mailman3/templates/site/en/list:admin:action:post.txt
|
||||||
|
owner: mailman
|
||||||
|
group: mailman
|
||||||
|
mode: 0644
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
- mailman
|
||||||
|
|
||||||
|
- name: Create lists/users.lists.fedoraproject.org/en template dir
|
||||||
|
ansible.builtin.file:
|
||||||
|
state: directory
|
||||||
|
path: /var/lib/mailman3/templates/lists/users.lists.fedoraproject.org/en
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
- mailman
|
||||||
|
|
||||||
|
- name: Set list:user:notice:hold template for users list
|
||||||
|
anisble.builtin.copy:
|
||||||
|
src: mailman-template-users-list-user-notice-hold.txt
|
||||||
|
dest: /var/lib/mailman3/templates/lists/users.lists.fedoraproject.org/en/list:user:notice:hold.txt
|
||||||
|
owner: mailman
|
||||||
|
group: mailman
|
||||||
|
mode: 0644
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
- mailman
|
||||||
|
|
||||||
|
- name: Install the hyperkitty/postorius settings file
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: settings.py.j2
|
||||||
|
dest: "{{ mailman_webui_confdir }}/settings.py"
|
||||||
|
owner: root
|
||||||
|
group: apache
|
||||||
|
mode: 0640
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
- mailman
|
||||||
|
notify:
|
||||||
|
- reload apache
|
||||||
|
|
||||||
|
- name: Install the hyperkitty/postorius httpd conf file
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: apache.conf.j2
|
||||||
|
dest: /etc/httpd/conf.d/mailman-webui.conf
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
- mailman
|
||||||
|
notify:
|
||||||
|
- reload apache
|
||||||
|
|
||||||
|
- name: Create the fulltext index dir
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ mailman_webui_basedir }}/fulltext_index"
|
||||||
|
state: directory
|
||||||
|
owner: apache
|
||||||
|
group: apache
|
||||||
|
mode: 0755
|
||||||
|
tags: mailman
|
||||||
|
|
||||||
|
- name: Create the hyperkitty static files dirs
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ mailman_webui_basedir }}/{{ item }}"
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0755
|
||||||
|
with_items:
|
||||||
|
- static
|
||||||
|
- static-fedora
|
||||||
|
register: static_root_dir
|
||||||
|
tags: mailman
|
||||||
|
|
||||||
|
- name: Create the fedora-specific hyperkitty img dir
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ mailman_webui_basedir }}/static-fedora/hyperkitty/img"
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0755
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
- name: Create the hyperkitty templates override dirs
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ mailman_webui_basedir }}/templates/{{ item }}"
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0755
|
||||||
|
with_items:
|
||||||
|
- hyperkitty
|
||||||
|
- django_mailman3
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hypperkitty
|
||||||
|
|
||||||
|
# Add the Nest banner
|
||||||
|
# See issue https://pagure.io/fedora-infrastructure/issue/10103
|
||||||
|
- name: Replace the top.html template in hyperkitty/postorius to change banner
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: top.html
|
||||||
|
dest: "{{ mailman_webui_basedir }}/templates/hyperkitty/top.html"
|
||||||
|
notify:
|
||||||
|
- reload apache
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- banner
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
- name: Install our fedora-specific logo
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: logo-hyperkitty-fedora.png
|
||||||
|
dest: "{{ mailman_webui_basedir }}/static-fedora/logo-hyperkitty-fedora.png"
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
- name: Install our fedora-specific favicon
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: favicon.ico
|
||||||
|
dest: "{{ mailman_webui_basedir }}/static-fedora/favicon.ico"
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
- name: Install our fedora-specific robots.txt
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: robots.txt
|
||||||
|
dest: "{{ mailman_webui_basedir }}/static-fedora/robots.txt"
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
- name: Install our fedora-specific brand template override
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: navbar-brand.html
|
||||||
|
dest: "{{ mailman_webui_basedir }}/templates/hyperkitty/navbar-brand.html"
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
- name: Install our fedora-specific page headers
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: headers.html
|
||||||
|
dest: "{{ mailman_webui_basedir }}/templates/hyperkitty/headers.html"
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
- name: Install our fedora-specific login page extension
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: login_extra_top.html
|
||||||
|
dest: "{{ mailman_webui_basedir }}/templates/django_mailman3/login_extra_top.html"
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
- name: Create dirs for signup_closed page
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ mailman_webui_basedir }}/templates/account"
|
||||||
|
state: directory
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: 0755
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
- name: Install our fedora-specific signup_closed page
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: signup_closed.html
|
||||||
|
dest: "{{ mailman_webui_basedir }}/templates/account/signup_closed.html"
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
- name: Install our fedmenu js hook
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: bottom.html
|
||||||
|
dest: "{{mailman_webui_basedir }}/templates/hyperkitty/bottom.html"
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
|
||||||
|
|
||||||
|
- name: Ensuring we have correct DB schema for django apps
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: mailman-web migrate
|
||||||
|
chdir: /etc/mailman3
|
||||||
|
become_user: mailman
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- db
|
||||||
|
|
||||||
|
#
|
||||||
|
# Plug HyperKitty into Mailman
|
||||||
|
#
|
||||||
|
- name: Copy the mailman-hyperkitty conffile
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: mailman-hyperkitty.cfg
|
||||||
|
dest: "/etc/mailman3.d/hyperkitty.cfg"
|
||||||
|
owner: mailman
|
||||||
|
group: mailman
|
||||||
|
mode: 0640
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
||||||
|
notify:
|
||||||
|
- restart mailman3
|
||||||
|
|
||||||
|
- name: Populating static_root dir with django files/css
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: mailman-web collectstatic --no-input
|
||||||
|
chdir: /etc/mailman3
|
||||||
|
become_user: mailman
|
||||||
|
when:
|
||||||
|
- static_root_dir is changed
|
||||||
|
|
||||||
|
#
|
||||||
|
# Scripts
|
||||||
|
#
|
||||||
|
|
||||||
|
- name: Install the staging-sync script
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: prod-to-stg.py
|
||||||
|
dest: "{{ mailman_webui_basedir }}/bin/prod-to-stg.py"
|
||||||
|
when: env == "staging"
|
||||||
|
tags: mailman
|
||||||
|
|
||||||
|
#
|
||||||
|
# Systemd
|
||||||
|
#
|
||||||
|
- name: Install the systemd service files
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: "{{ item }}.service.j2"
|
||||||
|
dest: "/etc/systemd/system/{{ item }}.service"
|
||||||
|
with_items:
|
||||||
|
- webui-qcluster
|
||||||
|
- webui-warm-up-cache
|
||||||
|
notify:
|
||||||
|
- systemctl daemon-reload
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
- mailman
|
||||||
|
- systemd
|
||||||
|
|
||||||
|
# Memcached
|
||||||
|
- name: Set the memcached sysconfig file
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: memcached.sysconfig
|
||||||
|
dest: /etc/sysconfig/memcached
|
||||||
|
notify:
|
||||||
|
- restart memcached
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- memcached
|
||||||
|
|
||||||
|
# Start services
|
||||||
|
- name: Start services
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
state: started
|
||||||
|
enabled: yes
|
||||||
|
name: {{item}}
|
||||||
|
with_items:
|
||||||
|
- httpd
|
||||||
|
- mailman3
|
||||||
|
- postfix
|
||||||
|
- webui-qcluster
|
||||||
|
- webui-warm-up-cache
|
||||||
|
tags:
|
||||||
|
- mailman
|
||||||
|
- hyperkitty
|
43
roles/mailman3/templates/apache.conf.j2
Normal file
43
roles/mailman3/templates/apache.conf.j2
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
Alias /favicon.ico {{ mailman_webui_basedir }}/static/favicon.ico
|
||||||
|
Alias /robots.txt {{ mailman_webui_basedir }}/static/robots.txt
|
||||||
|
Alias /static {{ mailman_webui_basedir }}/static
|
||||||
|
|
||||||
|
#ErrorLog /var/log/httpd/webui_error.log
|
||||||
|
#CustomLog /var/log/httpd/webui_access.log combined
|
||||||
|
|
||||||
|
WSGIScriptAlias / {{ wsgi_dir }}/wsgi.py
|
||||||
|
WSGIDaemonProcess webui display-name=webui maximum-requests=1000 processes=4 threads=30 python-path={{ wsgi_dir }}
|
||||||
|
WSGIProcessGroup webui
|
||||||
|
WSGISocketPrefix run/wsgi
|
||||||
|
WSGIRestrictStdout On
|
||||||
|
WSGIRestrictSignal Off
|
||||||
|
WSGIPythonOptimize 1
|
||||||
|
|
||||||
|
<Directory "{{ wsgi_dir }}">
|
||||||
|
<Files wsgi.py>
|
||||||
|
Order deny,allow
|
||||||
|
Allow from all
|
||||||
|
Require all granted
|
||||||
|
</Files>
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
<Directory "{{ mailman_webui_basedir }}/static">
|
||||||
|
Order deny,allow
|
||||||
|
Allow from all
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
|
||||||
|
# Old static archives
|
||||||
|
|
||||||
|
Alias /pipermail/ {{ mailman_webui_basedir }}/old-archives/pipermail/
|
||||||
|
<Directory {{ mailman_webui_basedir }}/old-archives/pipermail>
|
||||||
|
Options FollowSymLinks
|
||||||
|
AllowOverride None
|
||||||
|
Require all granted
|
||||||
|
AddDefaultCharset Off
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
RedirectMatch ^/pipermail[/]*$ /
|
||||||
|
RedirectMatch ^/mailman/listinfo/$ /
|
||||||
|
RedirectMatch ^/mailman$ /
|
15
roles/mailman3/templates/bottom.html
Normal file
15
roles/mailman3/templates/bottom.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{% if env == 'staging' %}
|
||||||
|
<script src="https://apps.stg.fedoraproject.org/fedmenu/js/fedmenu.js"> </script>
|
||||||
|
{% else %}
|
||||||
|
<script src="https://apps.fedoraproject.org/fedmenu/js/fedmenu.js"> </script>
|
||||||
|
{% endif %}
|
||||||
|
<script>
|
||||||
|
fedmenu({
|
||||||
|
{% if env == 'staging' %}
|
||||||
|
'url': 'https://apps.stg.fedoraproject.org/js/data.js',
|
||||||
|
{% else %}
|
||||||
|
'url': 'https://apps.fedoraproject.org/js/data.js',
|
||||||
|
{% endif %}
|
||||||
|
'position': 'bottom-left'
|
||||||
|
});
|
||||||
|
</script>
|
191
roles/mailman3/templates/mailman.cfg.j2
Normal file
191
roles/mailman3/templates/mailman.cfg.j2
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
# This is the absolute bare minimum base configuration file. User supplied
|
||||||
|
# configurations are pushed onto this.
|
||||||
|
|
||||||
|
[mailman]
|
||||||
|
# This address is the "site owner" address. Certain messages which must be
|
||||||
|
# delivered to a human, but which can't be delivered to a list owner (e.g. a
|
||||||
|
# bounce from a list owner), will be sent to this address. It should point to
|
||||||
|
# a human.
|
||||||
|
site_owner: admin@fedoraproject.org
|
||||||
|
|
||||||
|
# The local URL part to the administration interface (Postorius).
|
||||||
|
# The full URL will be constructed by prepending the domain URL set in the
|
||||||
|
# list's domain properties.
|
||||||
|
listinfo_url = /admin/
|
||||||
|
|
||||||
|
# Set the paths to be Fedora-compliant
|
||||||
|
layout: fhs
|
||||||
|
|
||||||
|
[paths.fhs]
|
||||||
|
bin_dir: /usr/libexec/mailman3
|
||||||
|
var_dir: /var/lib/mailman3
|
||||||
|
queue_dir: /var/spool/mailman3
|
||||||
|
log_dir: /var/log/mailman3
|
||||||
|
lock_dir: /run/lock/mailman3
|
||||||
|
ext_dir: /etc/mailman3.d
|
||||||
|
pid_file: /run/mailman3/master.pid
|
||||||
|
|
||||||
|
[database]
|
||||||
|
class: mailman.database.postgresql.PostgreSQLDatabase
|
||||||
|
url: postgresql://mailmanadmin:{{ mailman_mailman_db_pass }}@{{ mailman_db_server }}/mailman
|
||||||
|
|
||||||
|
[archiver.hyperkitty]
|
||||||
|
class: mailman_hyperkitty.Archiver
|
||||||
|
enable: yes
|
||||||
|
configuration: /etc/mailman3.d/hyperkitty.cfg
|
||||||
|
|
||||||
|
[webservice]
|
||||||
|
hostname: localhost
|
||||||
|
port: 8001
|
||||||
|
admin_user: {{ mailman3_rest_api_user }}
|
||||||
|
admin_pass: {{ mailman3_rest_api_pass }}
|
||||||
|
workers: {{ mailman3_rest_api_workers }}
|
||||||
|
|
||||||
|
{% for item in mailman3_log_items %}
|
||||||
|
|
||||||
|
[loggin.{{ item }}]
|
||||||
|
level: {{ mailman3_log_level }}
|
||||||
|
path: {{ mailman3_log_directory }}/{{ item }}.log
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
[antispam]
|
||||||
|
# This section defines basic antispam detection settings.
|
||||||
|
|
||||||
|
# This value contains lines which specify RFC 822 headers in the email to
|
||||||
|
# check for spamminess. Each line contains a `key: value` pair, where the key
|
||||||
|
# is the header to check and the value is a Python regular expression to match
|
||||||
|
# against the header's value. E.g.:
|
||||||
|
#
|
||||||
|
# X-Spam: (yes|maybe)
|
||||||
|
#
|
||||||
|
# The header value and regular expression are always matched
|
||||||
|
# case-insensitively.
|
||||||
|
header_checks:
|
||||||
|
X-Spam: yes
|
||||||
|
X-Spam-Flag: Yes
|
||||||
|
X-Spam-Status: ^Yes,
|
||||||
|
|
||||||
|
# The chain to jump to if any of the header patterns matches. This must be
|
||||||
|
# the name of an existing chain such as 'discard', 'reject', 'hold', or
|
||||||
|
# 'accept', otherwise 'hold' will be used.
|
||||||
|
jump_chain: discard
|
||||||
|
|
||||||
|
|
||||||
|
[mta]
|
||||||
|
# Email is sent on the submission port to bypass spam checking.
|
||||||
|
smtp_port: 587
|
||||||
|
# Remove DKIM signatures in the email headers.
|
||||||
|
remove_dkim_headers: yes
|
||||||
|
# Don't process old stale bounces
|
||||||
|
verp_probes: yes
|
||||||
|
|
||||||
|
|
||||||
|
[language.en]
|
||||||
|
# Change the english language to be UTF-8 (it defaults to ascii).
|
||||||
|
description: English (USA)
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
|
||||||
|
# http://www.lingoes.net/en/translator/langcode.htm
|
||||||
|
|
||||||
|
[language.pt]
|
||||||
|
description: Protuguese
|
||||||
|
charset: iso-8859-15
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.cs]
|
||||||
|
description: Czech
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.ca]
|
||||||
|
description: Catalan
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.ja]
|
||||||
|
description: Japanese
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.ar]
|
||||||
|
description: Arabic
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.nl]
|
||||||
|
description: Dutch
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.pl]
|
||||||
|
description: Polish
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.es]
|
||||||
|
description: Spanish
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.pt_BR]
|
||||||
|
description: Protuguese (Brazil)
|
||||||
|
charset: iso-8859-15
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.zh_CN]
|
||||||
|
description: Chinese (S)
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.zh_TW]
|
||||||
|
description: Chinese (T)
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.ru]
|
||||||
|
description: Russian
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.vi]
|
||||||
|
description: Vietnamese
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.it]
|
||||||
|
description: Italian
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.fr]
|
||||||
|
description: French
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.ro]
|
||||||
|
description: Romanian
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.de]
|
||||||
|
description: German
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.hu]
|
||||||
|
description: Hungarian
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.ko]
|
||||||
|
description: Korean
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
||||||
|
|
||||||
|
[language.uk]
|
||||||
|
description: Ukrainian
|
||||||
|
charset: utf-8
|
||||||
|
enabled: yes
|
406
roles/mailman3/templates/settings.py.j2
Normal file
406
roles/mailman3/templates/settings.py.j2
Normal file
|
@ -0,0 +1,406 @@
|
||||||
|
#-*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Django settings for HyperKitty + Postorius
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
# Import mailman_web default settings
|
||||||
|
from mailman_web.settings.base import * # noqa: F403
|
||||||
|
from mailman_web.settings.mailman import * # noqa: F403
|
||||||
|
|
||||||
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
|
SECRET_KEY = '{{ mailman_hyperkitty_cookie_key }}'
|
||||||
|
|
||||||
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
|
DEBUG = False
|
||||||
|
|
||||||
|
ADMINS = (
|
||||||
|
('HyperKitty Admin', 'abompard@fedoraproject.org'),
|
||||||
|
)
|
||||||
|
|
||||||
|
SERVER_EMAIL = 'root@fedoraproject.org'
|
||||||
|
DEFAULT_FROM_EMAIL = "admin@fedoraproject.org"
|
||||||
|
|
||||||
|
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 = [
|
||||||
|
{% for host in mailman_domains %}
|
||||||
|
"{{ host }}",
|
||||||
|
{% endfor %}
|
||||||
|
".fedoraproject.org",
|
||||||
|
"localhost", # Archiving API from Mailman
|
||||||
|
"127.0.0.1", # HAProxy ping
|
||||||
|
"{{ ansible_hostname }}", # Varnish ping
|
||||||
|
]
|
||||||
|
|
||||||
|
# Mailman API credentials
|
||||||
|
MAILMAN_REST_API_URL = 'http://localhost:8001'
|
||||||
|
MAILMAN_REST_API_USER = '{{ mailman_rest_api_user }}'
|
||||||
|
MAILMAN_REST_API_PASS = '{{ mailman_rest_api_pass }}'
|
||||||
|
MAILMAN_ARCHIVER_KEY = '{{ mailman_hyperkitty_archiver_key }}'
|
||||||
|
MAILMAN_ARCHIVER_FROM = ('127.0.0.1', '::1')
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'mailman_web.urls'
|
||||||
|
|
||||||
|
# Application definition
|
||||||
|
|
||||||
|
INSTALLED_APPS = (
|
||||||
|
'allauth',
|
||||||
|
'allauth.account',
|
||||||
|
'allauth.socialaccount',
|
||||||
|
'compressor',
|
||||||
|
# Uncomment the next line to enable the admin:
|
||||||
|
'django.contrib.admin',
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.sites',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles',
|
||||||
|
'django.contrib.humanize',
|
||||||
|
'django_extensions',
|
||||||
|
'django_gravatar',
|
||||||
|
'django_mailman3',
|
||||||
|
'django_mailman3.lib.auth.fedora',
|
||||||
|
'django_q',
|
||||||
|
'hyperkitty',
|
||||||
|
'postorius',
|
||||||
|
{% for service_name, service_data in mailman_login.items() %}
|
||||||
|
'allauth.socialaccount.providers.{{ service_data.provider }}',
|
||||||
|
{% endfor %}
|
||||||
|
'allauth.socialaccount.providers.openid',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
MIDDLEWARE = (
|
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
|
'django_mailman3.middleware.TimezoneMiddleware',
|
||||||
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
'django.middleware.csrf.CsrfViewMiddleware',
|
||||||
|
'django.middleware.locale.LocaleMiddleware',
|
||||||
|
'django.middleware.security.SecurityMiddleware',
|
||||||
|
'postorius.middleware.PostoriusMiddleware',
|
||||||
|
)
|
||||||
|
|
||||||
|
TEMPLATES = [
|
||||||
|
{
|
||||||
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||||
|
'DIRS': [
|
||||||
|
'{{ mailman_webui_basedir }}/templates',
|
||||||
|
],
|
||||||
|
'OPTIONS': {
|
||||||
|
'loaders': [
|
||||||
|
# https://docs.djangoproject.com/en/1.8/ref/templates/api/#django.template.loaders.cached.Loader
|
||||||
|
('django.template.loaders.cached.Loader', [
|
||||||
|
'django.template.loaders.filesystem.Loader',
|
||||||
|
'django.template.loaders.app_directories.Loader',
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
'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': {
|
||||||
|
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||||
|
'NAME': 'hyperkitty',
|
||||||
|
'USER': 'hyperkittyapp',
|
||||||
|
'PASSWORD': '{{ mailman_hyperkitty_db_pass }}',
|
||||||
|
'HOST': '{{ mailman_db_server }}',
|
||||||
|
'PORT': '', # Set to empty string for default.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Security & production settings
|
||||||
|
# https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
|
||||||
|
|
||||||
|
CSRF_COOKIE_SECURE = True
|
||||||
|
CSRF_COOKIE_HTTPONLY = True
|
||||||
|
SESSION_COOKIE_SECURE = True
|
||||||
|
SECURE_CONTENT_TYPE_NOSNIFF = True
|
||||||
|
SECURE_BROWSER_XSS_FILTER = True
|
||||||
|
X_FRAME_OPTIONS = 'DENY'
|
||||||
|
# We'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
|
||||||
|
# In the Fedora infra, requests are systematically redirected to HTTPS.
|
||||||
|
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_SCHEME', 'https')
|
||||||
|
|
||||||
|
|
||||||
|
# Internationalization
|
||||||
|
# https://docs.djangoproject.com/en/1.8/topics/i18n/
|
||||||
|
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
TIME_ZONE = 'America/Chicago'
|
||||||
|
|
||||||
|
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 = "{{ mailman_webui_basedir }}/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.
|
||||||
|
"{{ mailman_webui_basedir }}/static-fedora/",
|
||||||
|
)
|
||||||
|
|
||||||
|
# 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',
|
||||||
|
'compressor.finders.CompressorFinder',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Compatibility with Bootstrap 3
|
||||||
|
from django.contrib.messages import constants as messages
|
||||||
|
MESSAGE_TAGS = {
|
||||||
|
messages.ERROR: 'danger'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Authentication
|
||||||
|
#
|
||||||
|
|
||||||
|
LOGIN_URL = 'account_login'
|
||||||
|
LOGIN_REDIRECT_URL = 'hk_root'
|
||||||
|
LOGOUT_URL = 'account_logout'
|
||||||
|
|
||||||
|
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"
|
||||||
|
ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https"
|
||||||
|
ACCOUNT_UNIQUE_EMAIL = True
|
||||||
|
# Disable local signup
|
||||||
|
ACCOUNT_ADAPTER = "django_fedora_nosignup.NoLocalSignUpAdapter"
|
||||||
|
SOCIALACCOUNT_ADAPTER = "django_fedora_nosignup.SignUpEnabledSocialAdapter"
|
||||||
|
|
||||||
|
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',
|
||||||
|
},
|
||||||
|
'stackexchange': {
|
||||||
|
'SITE': 'stackoverflow',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# 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 = 'retro'
|
||||||
|
# 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', 'sassc -t compressed {infile} {outfile}'),
|
||||||
|
('text/x-sass', 'sassc -t compressed {infile} {outfile}'),
|
||||||
|
)
|
||||||
|
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': "{{ mailman_webui_basedir }}/fulltext_index",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Asynchronous tasks
|
||||||
|
#
|
||||||
|
Q_CLUSTER = {
|
||||||
|
'timeout': 300,
|
||||||
|
'save_limit': 100000,
|
||||||
|
'orm': 'default',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# REST framework
|
||||||
|
#
|
||||||
|
REST_FRAMEWORK = {
|
||||||
|
'PAGE_SIZE': 10,
|
||||||
|
'DEFAULT_FILTER_BACKENDS': (
|
||||||
|
'rest_framework.filters.OrderingFilter',
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# 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'
|
||||||
|
},
|
||||||
|
'exclude_useless_errors': {
|
||||||
|
'()': 'django.utils.log.CallbackFilter',
|
||||||
|
'callback': django_fedora.exclude_useless_errors,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'handlers': {
|
||||||
|
'mail_admins': {
|
||||||
|
'level': 'ERROR',
|
||||||
|
'filters': ['require_debug_false', 'exclude_useless_errors'],
|
||||||
|
'class': 'django.utils.log.AdminEmailHandler'
|
||||||
|
},
|
||||||
|
'file':{
|
||||||
|
'level': 'DEBUG',
|
||||||
|
#'class': 'logging.handlers.RotatingFileHandler',
|
||||||
|
'class': 'logging.handlers.WatchedFileHandler',
|
||||||
|
'filename': '/var/log/hyperkitty/hyperkitty.log',
|
||||||
|
'formatter': 'verbose',
|
||||||
|
},
|
||||||
|
'null': {
|
||||||
|
'class': 'logging.NullHandler',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'django.request': {
|
||||||
|
'handlers': [
|
||||||
|
'file',
|
||||||
|
# Don't send an email on server errors, there's just too many
|
||||||
|
#{% if env == 'production' %}
|
||||||
|
#'mail_admins',
|
||||||
|
#{% endif %}
|
||||||
|
#
|
||||||
|
|
||||||
|
],
|
||||||
|
'level': 'DEBUG',
|
||||||
|
},
|
||||||
|
'django.security.DisallowedHost': {
|
||||||
|
'handlers': ['null'],
|
||||||
|
'propagate': False,
|
||||||
|
},
|
||||||
|
'requests.packages.urllib3': {
|
||||||
|
'level': 'WARNING',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'formatters': {
|
||||||
|
'verbose': {
|
||||||
|
'format': '%(levelname)s %(asctime)s %(process)d %(name)s %(message)s'
|
||||||
|
},
|
||||||
|
'simple': {
|
||||||
|
'format': '%(levelname)s %(message)s'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'root': {
|
||||||
|
'handlers': ['file'],
|
||||||
|
'level': 'INFO',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Cache: use the local memcached server
|
||||||
|
CACHES = {
|
||||||
|
'default': {
|
||||||
|
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
|
||||||
|
'LOCATION': '127.0.0.1:11211',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Only display mailing-lists from the same virtual host as the webserver
|
||||||
|
FILTER_VHOST = False
|
14
roles/mailman3/templates/webui-qcluster.service.j2
Normal file
14
roles/mailman3/templates/webui-qcluster.service.j2
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Mailman web UI async tasks runner
|
||||||
|
After=network.target remote-fs.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/usr/bin/mailman-web qcluster
|
||||||
|
ExecStop=/bin/kill -s TERM $MAINPID
|
||||||
|
User=mailman
|
||||||
|
Group=mailman
|
||||||
|
WorkingDirectory=/etc/mailman3
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
14
roles/mailman3/templates/webui-warm-up-cache.service.j2
Normal file
14
roles/mailman3/templates/webui-warm-up-cache.service.j2
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Mailman web UI warm up cache
|
||||||
|
Requires=memcached.service
|
||||||
|
After=memcached.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/bin/mailman-web hyperkitty_warm_up_cache
|
||||||
|
User=mailman
|
||||||
|
Group=mailman
|
||||||
|
WorkingDirectory=/etc/mailman3
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
Loading…
Add table
Add a link
Reference in a new issue