diff --git a/files/mailman/index.html b/files/mailman/index.html
new file mode 100644
index 0000000000..d6c2fbc392
--- /dev/null
+++ b/files/mailman/index.html
@@ -0,0 +1,8 @@
+
+
+
+
+
diff --git a/files/mailman/pgpass.j2 b/files/mailman/pgpass.j2
new file mode 100644
index 0000000000..bfb3161ad0
--- /dev/null
+++ b/files/mailman/pgpass.j2
@@ -0,0 +1,7 @@
+*:*:mailman:mailman:{{ mailman_mm_db_pass }}
+*:*:hyperkitty:hyperkittyapp:{{ mailman_hk_db_pass }}
+*:*:hyperkitty:hyperkittyadmin:{{ mailman_hk_admin_db_pass }}
+*:*:kittystore:kittystoreapp:{{ mailman_ks_db_pass }}
+*:*:kittystore:kittystoreadmin:{{ mailman_ks_admin_db_pass }}
+*:*:postorius:postoriusapp:{{ mailman_ps_db_pass }}
+*:*:postorius:postoriusadmin:{{ mailman_ps_admin_db_pass }}
diff --git a/playbooks/groups/mailman.yml b/playbooks/groups/mailman.yml
index fbd4480e62..5411b8374b 100644
--- a/playbooks/groups/mailman.yml
+++ b/playbooks/groups/mailman.yml
@@ -7,7 +7,7 @@
user: root
gather_facts: False
- vars_files:
+ vars_files:
- /srv/web/infra/ansible/vars/global.yml
- ${private}/vars.yml
- ${vars}/${ansible_distribution}.yml
@@ -23,18 +23,18 @@
user: root
gather_facts: True
- vars_files:
+ vars_files:
- /srv/web/infra/ansible/vars/global.yml
- ${private}/vars.yml
- ${vars}/${ansible_distribution}.yml
roles:
- - /srv/web/infra/ansible/roles/base
- - /srv/web/infra/ansible/roles/rkhunter
- - /srv/web/infra/ansible/roles/denyhosts
- - /srv/web/infra/ansible/roles/nagios_client
- - /srv/web/infra/ansible/roles/fas_client
- - /srv/web/infra/ansible/roles/yum-cron
+ - ${roles}/base
+ - ${roles}/rkhunter
+ - ${roles}/denyhosts
+ - ${roles}/nagios_client
+ - ${roles}/fas_client
+ - ${roles}/yum-cron
tasks:
# this is how you include other task lists
@@ -44,6 +44,83 @@
- include: $tasks/collectd/client.yml
- include: $tasks/motd.yml
- include: $tasks/sudo.yml
+ - include: $tasks/apache.yml
+ - include: $tasks/mod_wsgi.yml
+
+ handlers:
+ - include: $handlers/restart_services.yml
+
+
+# Database setup
+- name: setup the database
+ hosts: dbserver-stg
+ gather_facts: no
+ sudo: yes
+ sudo_user: postgres
+ vars_files:
+ - /srv/web/infra/ansible/vars/global.yml
+ - ${private}/vars.yml
+ - ${vars}/${ansible_distribution}.yml
+
+ tasks:
+ # mailman auto-updates its schema, there can only be one admin user
+ - name: mailman DB user
+ postgresql_user: name=mailmanadmin password=$mailman_mm_db_pass
+ - name: hyperkitty DB admin user
+ postgresql_user: name=hyperkittyadmin password=$mailman_hk_admin_db_pass
+ - name: hyperkitty DB user
+ postgresql_user: name=hyperkittyapp password=$mailman_hk_db_pass
+ db=hyperkitty priv=SELECT,INSERT,UPDATE,DELETE
+ - name: kittystore DB admin user
+ postgresql_user: name=kittystoreadmin password=$mailman_ks_admin_db_pass
+ - name: kittystore DB user
+ postgresql_user: name=kittystoreapp password=$mailman_ks_db_pass
+ db=kittystore priv=SELECT,INSERT,UPDATE,DELETE
+ - name: postorius DB admin user
+ postgresql_user: name=postoriusadmin password=$mailman_ps_admin_db_pass
+ - name: postorius DB user
+ postgresql_user: name=postoriusapp password=$mailman_ps_db_pass
+ db=postorius priv=SELECT,INSERT,UPDATE,DELETE
+ - name: databases creation
+ postgresql_db: name=$item owner=${item}admin encoding=UTF-8
+ with_items:
+ - mailman
+ - hyperkitty
+ - kittystore
+ - postorius
+
+
+# Real MM/HK-specific work
+- name: setup mailman and hyperkitty
+ hosts: mailman-stg
+ user: root
+ gather_facts: True
+
+ vars_files:
+ - /srv/web/infra/ansible/vars/global.yml
+ - ${private}/vars.yml
+ - ${vars}/${ansible_distribution}.yml
+
+ roles:
+ - ${roles}/mailman
+
+ tasks:
+ - name: server front page
+ copy: src=$files/mailman/index.html
+ dest=/var/www/html/index.html
+
+ #- name: easy access to the postgresql databases
+ # template: src=$files/mailman/pgpass.j2 dest=/root/.pgpass
+ # owner=root group=root mode=0600
+
+ - name: start services
+ service: state=started name=$item
+ with_items:
+ - httpd
+ - postgresql
+ - mailman
+ - postfix
+
handlers:
- include: $handlers/restart_services.yml
diff --git a/roles/mailman/files/hyperkitty.apache.conf b/roles/mailman/files/hyperkitty.apache.conf
new file mode 100644
index 0000000000..b229913536
--- /dev/null
+++ b/roles/mailman/files/hyperkitty.apache.conf
@@ -0,0 +1,28 @@
+#Alias /robots.txt /etc/hyperkitty/sites/default/static/robots.txt
+#Alias /favicon.ico /etc/hyperkitty/sites/default/static/favicon.ico
+Alias /hyperkitty/static /var/lib/hyperkitty/sites/default/static
+
+#ErrorLog /var/log/httpd/hyperkitty_error.log
+#CustomLog /var/log/httpd/hyperkitty_access.log combined
+
+WSGIScriptAlias /hyperkitty /etc/hyperkitty/sites/default/wsgi.py
+WSGIDaemonProcess hyperkitty display-name=hyperkitty maximum-requests=1000 processes=4 threads=4 python-path=/etc/hyperkitty/sites/default
+WSGISocketPrefix run/wsgi
+WSGIRestrictStdout On
+WSGIRestrictSignal Off
+WSGIPythonOptimize 1
+
+
+
+ Order deny,allow
+ Allow from all
+ Require all granted
+
+ WSGIProcessGroup hyperkitty
+
+
+
+ Order deny,allow
+ Allow from all
+ Require all granted
+
diff --git a/roles/mailman/files/hyperkitty.cfg b/roles/mailman/files/hyperkitty.cfg
new file mode 100644
index 0000000000..4e58a998f6
--- /dev/null
+++ b/roles/mailman/files/hyperkitty.cfg
@@ -0,0 +1,3 @@
+[general]
+base_url: http://mailman01.stg.phx2.fedoraproject.org/
+django_settings: /etc/hyperkitty/sites/default/settings.py
diff --git a/roles/mailman/files/hyperkitty.logrotate.conf b/roles/mailman/files/hyperkitty.logrotate.conf
new file mode 100644
index 0000000000..3e5b70f0ae
--- /dev/null
+++ b/roles/mailman/files/hyperkitty.logrotate.conf
@@ -0,0 +1,10 @@
+/var/log/hyperkitty/*.log {
+ missingok
+ notifempty
+ sharedscripts
+ delaycompress
+ su root apache
+ postrotate
+ /sbin/service httpd reload > /dev/null 2>/dev/null || true
+ endscript
+}
diff --git a/roles/mailman/files/hyperkitty.urls.py b/roles/mailman/files/hyperkitty.urls.py
new file mode 100644
index 0000000000..194a4e6a1b
--- /dev/null
+++ b/roles/mailman/files/hyperkitty.urls.py
@@ -0,0 +1,37 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 1998-2012 by the Free Software Foundation, Inc.
+#
+# This file is part of HyperKitty.
+#
+# HyperKitty is free software: 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.
+#
+# HyperKitty 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
+# HyperKitty. If not, see .
+
+import hyperkitty
+
+from django.conf.urls.defaults import *
+from django.conf import settings
+
+# Uncomment the next two lines to enable the admin:
+from django.contrib import admin
+admin.autodiscover()
+
+# Import mailman urls and set urlpatterns if you want to hook
+# mailman_django into an existing django site.
+# Otherwise set ROOT_URLCONF in settings.py to
+# `mailman_django.urls`.
+# from mailman_django import urls as mailman_urls
+
+urlpatterns = patterns('',
+ url(r'^$', 'hyperkitty.views.pages.index'),
+ url(r'', include('hyperkitty.urls')),
+)
diff --git a/roles/mailman/files/postfix-main.cf b/roles/mailman/files/postfix-main.cf
new file mode 100644
index 0000000000..84449ed683
--- /dev/null
+++ b/roles/mailman/files/postfix-main.cf
@@ -0,0 +1,694 @@
+# "false"
+# Global Postfix configuration file. This file lists only a subset
+# of all parameters. For the syntax, and for a complete parameter
+# list, see the postconf(5) manual page (command: "man 5 postconf").
+#
+# For common configuration examples, see BASIC_CONFIGURATION_README
+# and STANDARD_CONFIGURATION_README. To find these documents, use
+# the command "postconf html_directory readme_directory", or go to
+# http://www.postfix.org/.
+#
+# For best results, change no more than 2-3 parameters at a time,
+# and test if Postfix still works after every change.
+
+# SOFT BOUNCE
+#
+# The soft_bounce parameter provides a limited safety net for
+# testing. When soft_bounce is enabled, mail will remain queued that
+# would otherwise bounce. This parameter disables locally-generated
+# bounces, and prevents the SMTP server from rejecting mail permanently
+# (by changing 5xx replies into 4xx replies). However, soft_bounce
+# is no cure for address rewriting mistakes or mail routing mistakes.
+#
+#soft_bounce = no
+
+# LOCAL PATHNAME INFORMATION
+#
+# The queue_directory specifies the location of the Postfix queue.
+# This is also the root directory of Postfix daemons that run chrooted.
+# See the files in examples/chroot-setup for setting up Postfix chroot
+# environments on different UNIX systems.
+#
+queue_directory = /var/spool/postfix
+
+# The command_directory parameter specifies the location of all
+# postXXX commands.
+#
+command_directory = /usr/sbin
+
+# The daemon_directory parameter specifies the location of all Postfix
+# daemon programs (i.e. programs listed in the master.cf file). This
+# directory must be owned by root.
+#
+daemon_directory = /usr/libexec/postfix
+
+# QUEUE AND PROCESS OWNERSHIP
+#
+# The mail_owner parameter specifies the owner of the Postfix queue
+# and of most Postfix daemon processes. Specify the name of a user
+# account THAT DOES NOT SHARE ITS USER OR GROUP ID WITH OTHER ACCOUNTS
+# AND THAT OWNS NO OTHER FILES OR PROCESSES ON THE SYSTEM. In
+# particular, don't specify nobody or daemon. PLEASE USE A DEDICATED
+# USER.
+#
+mail_owner = postfix
+
+# The default_privs parameter specifies the default rights used by
+# the local delivery agent for delivery to external file or command.
+# These rights are used in the absence of a recipient user context.
+# DO NOT SPECIFY A PRIVILEGED USER OR THE POSTFIX OWNER.
+#
+#default_privs = nobody
+
+# INTERNET HOST AND DOMAIN NAMES
+#
+# The myhostname parameter specifies the internet hostname of this
+# mail system. The default is to use the fully-qualified domain name
+# from gethostname(). $myhostname is used as a default value for many
+# other configuration parameters.
+#
+#myhostname = host.domain.tld
+#myhostname = virtual.domain.tld
+
+# The mydomain parameter specifies the local internet domain name.
+# The default is to use $myhostname minus the first component.
+# $mydomain is used as a default value for many other configuration
+# parameters.
+#
+#mydomain = domain.tld
+
+# SENDING MAIL
+#
+# The myorigin parameter specifies the domain that locally-posted
+# mail appears to come from. The default is to append $myhostname,
+# which is fine for small sites. If you run a domain with multiple
+# machines, you should (1) change this to $mydomain and (2) set up
+# a domain-wide alias database that aliases each user to
+# user@that.users.mailhost.
+#
+# For the sake of consistency between sender and recipient addresses,
+# myorigin also specifies the default domain name that is appended
+# to recipient addresses that have no @domain part.
+#
+#myorigin = $myhostname
+#myorigin = $mydomain
+
+mydomain = fedoraproject.org
+myorigin = fedoraproject.org
+
+# RECEIVING MAIL
+
+# The inet_interfaces parameter specifies the network interface
+# addresses that this mail system receives mail on. By default,
+# the software claims all active interfaces on the machine. The
+# parameter also controls delivery of mail to user@[ip.address].
+#
+# See also the proxy_interfaces parameter, for network addresses that
+# are forwarded to us via a proxy or network address translator.
+#
+# Note: you need to stop/start Postfix when this parameter changes.
+#
+#inet_interfaces = all
+#inet_interfaces = $myhostname
+#inet_interfaces = $myhostname, localhost
+inet_interfaces = all
+
+# The proxy_interfaces parameter specifies the network interface
+# addresses that this mail system receives mail on by way of a
+# proxy or network address translation unit. This setting extends
+# the address list specified with the inet_interfaces parameter.
+#
+# You must specify your proxy/NAT addresses when your system is a
+# backup MX host for other domains, otherwise mail delivery loops
+# will happen when the primary MX host is down.
+#
+#proxy_interfaces =
+#proxy_interfaces = 1.2.3.4
+
+# The mydestination parameter specifies the list of domains that this
+# machine considers itself the final destination for.
+#
+# These domains are routed to the delivery agent specified with the
+# local_transport parameter setting. By default, that is the UNIX
+# compatible delivery agent that lookups all recipients in /etc/passwd
+# and /etc/aliases or their equivalent.
+#
+# The default is $myhostname + localhost.$mydomain. On a mail domain
+# gateway, you should also include $mydomain.
+#
+# Do not specify the names of virtual domains - those domains are
+# specified elsewhere (see VIRTUAL_README).
+#
+# Do not specify the names of domains that this machine is backup MX
+# host for. Specify those names via the relay_domains settings for
+# the SMTP server, or use permit_mx_backup if you are lazy (see
+# STANDARD_CONFIGURATION_README).
+#
+# The local machine is always the final destination for mail addressed
+# to user@[the.net.work.address] of an interface that the mail system
+# receives mail on (see the inet_interfaces parameter).
+#
+# Specify a list of host or domain names, /file/name or type:table
+# patterns, separated by commas and/or whitespace. A /file/name
+# pattern is replaced by its contents; a type:table is matched when
+# a name matches a lookup key (the right-hand side is ignored).
+# Continue long lines by starting the next line with whitespace.
+#
+# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".
+#
+mydestination = $myhostname, mailman.fedoraproject.org,
+ localhost.$mydomain, localhost
+#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
+#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
+# mail.$mydomain, www.$mydomain, ftp.$mydomain
+
+# REJECTING MAIL FOR UNKNOWN LOCAL USERS
+#
+# The local_recipient_maps parameter specifies optional lookup tables
+# with all names or addresses of users that are local with respect
+# to $mydestination, $inet_interfaces or $proxy_interfaces.
+#
+# If this parameter is defined, then the SMTP server will reject
+# mail for unknown local users. This parameter is defined by default.
+#
+# To turn off local recipient checking in the SMTP server, specify
+# local_recipient_maps = (i.e. empty).
+#
+# The default setting assumes that you use the default Postfix local
+# delivery agent for local delivery. You need to update the
+# local_recipient_maps setting if:
+#
+# - You define $mydestination domain recipients in files other than
+# /etc/passwd, /etc/aliases, or the $virtual_alias_maps files.
+# For example, you define $mydestination domain recipients in
+# the $virtual_mailbox_maps files.
+#
+# - You redefine the local delivery agent in master.cf.
+#
+# - You redefine the "local_transport" setting in main.cf.
+#
+# - You use the "luser_relay", "mailbox_transport", or "fallback_transport"
+# feature of the Postfix local delivery agent (see local(8)).
+#
+# Details are described in the LOCAL_RECIPIENT_README file.
+#
+# Beware: if the Postfix SMTP server runs chrooted, you probably have
+# to access the passwd file via the proxymap service, in order to
+# overcome chroot restrictions. The alternative, having a copy of
+# the system passwd file in the chroot jail is just not practical.
+#
+# The right-hand side of the lookup tables is conveniently ignored.
+# In the left-hand side, specify a bare username, an @domain.tld
+# wild-card, or specify a user@domain.tld address.
+#
+#local_recipient_maps = unix:passwd.byname $alias_maps
+#local_recipient_maps = proxy:unix:passwd.byname $alias_maps
+#local_recipient_maps =
+
+# The unknown_local_recipient_reject_code specifies the SMTP server
+# response code when a recipient domain matches $mydestination or
+# ${proxy,inet}_interfaces, while $local_recipient_maps is non-empty
+# and the recipient address or address local-part is not found.
+#
+# The default setting is 550 (reject mail) but it is safer to start
+# with 450 (try again later) until you are certain that your
+# local_recipient_maps settings are OK.
+#
+unknown_local_recipient_reject_code = 550
+
+# TRUST AND RELAY CONTROL
+
+# The mynetworks parameter specifies the list of "trusted" SMTP
+# clients that have more privileges than "strangers".
+#
+# In particular, "trusted" SMTP clients are allowed to relay mail
+# through Postfix. See the smtpd_recipient_restrictions parameter
+# in postconf(5).
+#
+# You can specify the list of "trusted" network addresses by hand
+# or you can let Postfix do it for you (which is the default).
+#
+# By default (mynetworks_style = subnet), Postfix "trusts" SMTP
+# clients in the same IP subnetworks as the local machine.
+# On Linux, this does works correctly only with interfaces specified
+# with the "ifconfig" command.
+#
+# Specify "mynetworks_style = class" when Postfix should "trust" SMTP
+# clients in the same IP class A/B/C networks as the local machine.
+# Don't do this with a dialup site - it would cause Postfix to "trust"
+# your entire provider's network. Instead, specify an explicit
+# mynetworks list by hand, as described below.
+#
+# Specify "mynetworks_style = host" when Postfix should "trust"
+# only the local machine.
+#
+#mynetworks_style = class
+#mynetworks_style = subnet
+#mynetworks_style = host
+
+# Alternatively, you can specify the mynetworks list by hand, in
+# which case Postfix ignores the mynetworks_style setting.
+#
+# Specify an explicit list of network/netmask patterns, where the
+# mask specifies the number of bits in the network part of a host
+# address.
+#
+# You can also specify the absolute pathname of a pattern file instead
+# of listing the patterns here. Specify type:table for table-based lookups
+# (the value on the table right-hand side is not used).
+#
+#mynetworks = 168.100.189.0/28, 127.0.0.0/8
+#mynetworks = $config_directory/mynetworks
+#mynetworks = hash:/etc/postfix/network_table
+
+
+# The relay_domains parameter restricts what destinations this system will
+# relay mail to. See the smtpd_recipient_restrictions description in
+# postconf(5) for detailed information.
+#
+# By default, Postfix relays mail
+# - from "trusted" clients (IP address matches $mynetworks) to any destination,
+# - from "untrusted" clients to destinations that match $relay_domains or
+# subdomains thereof, except addresses with sender-specified routing.
+# The default relay_domains value is $mydestination.
+#
+# In addition to the above, the Postfix SMTP server by default accepts mail
+# that Postfix is final destination for:
+# - destinations that match $inet_interfaces or $proxy_interfaces,
+# - destinations that match $mydestination
+# - destinations that match $virtual_alias_domains,
+# - destinations that match $virtual_mailbox_domains.
+# These destinations do not need to be listed in $relay_domains.
+#
+# Specify a list of hosts or domains, /file/name patterns or type:name
+# lookup tables, separated by commas and/or whitespace. Continue
+# long lines by starting the next line with whitespace. A file name
+# is replaced by its contents; a type:name table is matched when a
+# (parent) domain appears as lookup key.
+#
+# NOTE: Postfix will not automatically forward mail for domains that
+# list this system as their primary or backup MX host. See the
+# permit_mx_backup restriction description in postconf(5).
+#
+#relay_domains = $mydestination
+
+
+
+# INTERNET OR INTRANET
+
+# The relayhost parameter specifies the default host to send mail to
+# when no entry is matched in the optional transport(5) table. When
+# no relayhost is given, mail is routed directly to the destination.
+#
+# On an intranet, specify the organizational domain name. If your
+# internal DNS uses no MX records, specify the name of the intranet
+# gateway host instead.
+#
+# In the case of SMTP, specify a domain, host, host:port, [host]:port,
+# [address] or [address]:port; the form [host] turns off MX lookups.
+#
+# If you're connected via UUCP, see also the default_transport parameter.
+#
+#relayhost = $mydomain
+#relayhost = [gateway.my.domain]
+#relayhost = [mailserver.isp.tld]
+#relayhost = uucphost
+#relayhost = [an.ip.add.ress]
+relayhost = bastion
+
+
+# REJECTING UNKNOWN RELAY USERS
+#
+# The relay_recipient_maps parameter specifies optional lookup tables
+# with all addresses in the domains that match $relay_domains.
+#
+# If this parameter is defined, then the SMTP server will reject
+# mail for unknown relay users. This feature is off by default.
+#
+# The right-hand side of the lookup tables is conveniently ignored.
+# In the left-hand side, specify an @domain.tld wild-card, or specify
+# a user@domain.tld address.
+#
+#relay_recipient_maps = hash:/etc/postfix/relay_recipients
+
+# INPUT RATE CONTROL
+#
+# The in_flow_delay configuration parameter implements mail input
+# flow control. This feature is turned on by default, although it
+# still needs further development (it's disabled on SCO UNIX due
+# to an SCO bug).
+#
+# A Postfix process will pause for $in_flow_delay seconds before
+# accepting a new message, when the message arrival rate exceeds the
+# message delivery rate. With the default 100 SMTP server process
+# limit, this limits the mail inflow to 100 messages a second more
+# than the number of messages delivered per second.
+#
+# Specify 0 to disable the feature. Valid delays are 0..10.
+#
+#in_flow_delay = 1s
+
+# ADDRESS REWRITING
+#
+# The ADDRESS_REWRITING_README document gives information about
+# address masquerading or other forms of address rewriting including
+# username->Firstname.Lastname mapping.
+
+masquerade_domains = redhat.com
+masquerade_exceptions = root apache
+
+# ADDRESS REDIRECTION (VIRTUAL DOMAIN)
+#
+# The VIRTUAL_README document gives information about the many forms
+# of domain hosting that Postfix supports.
+
+# "USER HAS MOVED" BOUNCE MESSAGES
+#
+# See the discussion in the ADDRESS_REWRITING_README document.
+
+# TRANSPORT MAP
+#
+# See the discussion in the ADDRESS_REWRITING_README document.
+
+# ALIAS DATABASE
+#
+# The alias_maps parameter specifies the list of alias databases used
+# by the local delivery agent. The default list is system dependent.
+#
+# On systems with NIS, the default is to search the local alias
+# database, then the NIS alias database. See aliases(5) for syntax
+# details.
+#
+# If you change the alias database, run "postalias /etc/aliases" (or
+# wherever your system stores the mail alias file), or simply run
+# "newaliases" to build the necessary DBM or DB file.
+#
+# It will take a minute or so before changes become visible. Use
+# "postfix reload" to eliminate the delay.
+#
+#alias_maps = dbm:/etc/aliases
+alias_maps = hash:/etc/aliases
+#alias_maps = hash:/etc/aliases, nis:mail.aliases
+#alias_maps = netinfo:/aliases
+
+# The alias_database parameter specifies the alias database(s) that
+# are built with "newaliases" or "sendmail -bi". This is a separate
+# configuration parameter, because alias_maps (see above) may specify
+# tables that are not necessarily all under control by Postfix.
+#
+#alias_database = dbm:/etc/aliases
+#alias_database = dbm:/etc/mail/aliases
+alias_database = hash:/etc/aliases
+#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases
+
+# ADDRESS EXTENSIONS (e.g., user+foo)
+#
+# The recipient_delimiter parameter specifies the separator between
+# user names and address extensions (user+foo). See canonical(5),
+# local(8), relocated(5) and virtual(5) for the effects this has on
+# aliases, canonical, virtual, relocated and .forward file lookups.
+# Basically, the software tries user+foo and .forward+foo before
+# trying user and .forward.
+#
+recipient_delimiter = +
+
+# DELIVERY TO MAILBOX
+#
+# The home_mailbox parameter specifies the optional pathname of a
+# mailbox file relative to a user's home directory. The default
+# mailbox file is /var/spool/mail/user or /var/mail/user. Specify
+# "Maildir/" for qmail-style delivery (the / is required).
+#
+#home_mailbox = Mailbox
+#home_mailbox = Maildir/
+
+# The mail_spool_directory parameter specifies the directory where
+# UNIX-style mailboxes are kept. The default setting depends on the
+# system type.
+#
+#mail_spool_directory = /var/mail
+#mail_spool_directory = /var/spool/mail
+
+# The mailbox_command parameter specifies the optional external
+# command to use instead of mailbox delivery. The command is run as
+# the recipient with proper HOME, SHELL and LOGNAME environment settings.
+# Exception: delivery for root is done as $default_user.
+#
+# Other environment variables of interest: USER (recipient username),
+# EXTENSION (address extension), DOMAIN (domain part of address),
+# and LOCAL (the address localpart).
+#
+# Unlike other Postfix configuration parameters, the mailbox_command
+# parameter is not subjected to $parameter substitutions. This is to
+# make it easier to specify shell syntax (see example below).
+#
+# Avoid shell meta characters because they will force Postfix to run
+# an expensive shell process. Procmail alone is expensive enough.
+#
+# IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN
+# ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER.
+#
+#mailbox_command = /usr/bin/procmail
+#mailbox_command = /some/where/procmail -a "$EXTENSION"
+
+# The mailbox_transport specifies the optional transport in master.cf
+# to use after processing aliases and .forward files. This parameter
+# has precedence over the mailbox_command, fallback_transport and
+# luser_relay parameters.
+#
+# Specify a string of the form transport:nexthop, where transport is
+# the name of a mail delivery transport defined in master.cf. The
+# :nexthop part is optional. For more details see the sample transport
+# configuration file.
+#
+# NOTE: if you use this feature for accounts not in the UNIX password
+# file, then you must update the "local_recipient_maps" setting in
+# the main.cf file, otherwise the SMTP server will reject mail for
+# non-UNIX accounts with "User unknown in local recipient table".
+#
+#mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp
+
+# If using the cyrus-imapd IMAP server deliver local mail to the IMAP
+# server using LMTP (Local Mail Transport Protocol), this is prefered
+# over the older cyrus deliver program by setting the
+# mailbox_transport as below:
+#
+# mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp
+#
+# The efficiency of LMTP delivery for cyrus-imapd can be enhanced via
+# these settings.
+#
+# local_destination_recipient_limit = 300
+# local_destination_concurrency_limit = 5
+#
+# Of course you should adjust these settings as appropriate for the
+# capacity of the hardware you are using. The recipient limit setting
+# can be used to take advantage of the single instance message store
+# capability of Cyrus. The concurrency limit can be used to control
+# how many simultaneous LMTP sessions will be permitted to the Cyrus
+# message store.
+#
+# To use the old cyrus deliver program you have to set:
+#mailbox_transport = cyrus
+
+# The fallback_transport specifies the optional transport in master.cf
+# to use for recipients that are not found in the UNIX passwd database.
+# This parameter has precedence over the luser_relay parameter.
+#
+# Specify a string of the form transport:nexthop, where transport is
+# the name of a mail delivery transport defined in master.cf. The
+# :nexthop part is optional. For more details see the sample transport
+# configuration file.
+#
+# NOTE: if you use this feature for accounts not in the UNIX password
+# file, then you must update the "local_recipient_maps" setting in
+# the main.cf file, otherwise the SMTP server will reject mail for
+# non-UNIX accounts with "User unknown in local recipient table".
+#
+#fallback_transport = lmtp:unix:/var/lib/imap/socket/lmtp
+#fallback_transport =
+
+#transport_maps = hash:/etc/postfix/transport
+# The luser_relay parameter specifies an optional destination address
+# for unknown recipients. By default, mail for unknown@$mydestination,
+# unknown@[$inet_interfaces] or unknown@[$proxy_interfaces] is returned
+# as undeliverable.
+#
+# The following expansions are done on luser_relay: $user (recipient
+# username), $shell (recipient shell), $home (recipient home directory),
+# $recipient (full recipient address), $extension (recipient address
+# extension), $domain (recipient domain), $local (entire recipient
+# localpart), $recipient_delimiter. Specify ${name?value} or
+# ${name:value} to expand value only when $name does (does not) exist.
+#
+# luser_relay works only for the default Postfix local delivery agent.
+#
+# NOTE: if you use this feature for accounts not in the UNIX password
+# file, then you must specify "local_recipient_maps =" (i.e. empty) in
+# the main.cf file, otherwise the SMTP server will reject mail for
+# non-UNIX accounts with "User unknown in local recipient table".
+#
+#luser_relay = $user@other.host
+#luser_relay = $local@other.host
+#luser_relay = admin+$local
+
+# JUNK MAIL CONTROLS
+#
+# The controls listed here are only a very small subset. The file
+# SMTPD_ACCESS_README provides an overview.
+
+# The header_checks parameter specifies an optional table with patterns
+# that each logical message header is matched against, including
+# headers that span multiple physical lines.
+#
+# By default, these patterns also apply to MIME headers and to the
+# headers of attached messages. With older Postfix versions, MIME and
+# attached message headers were treated as body text.
+#
+# For details, see "man header_checks".
+#
+header_checks = regexp:/etc/postfix/header_checks
+
+# FAST ETRN SERVICE
+#
+# Postfix maintains per-destination logfiles with information about
+# deferred mail, so that mail can be flushed quickly with the SMTP
+# "ETRN domain.tld" command, or by executing "sendmail -qRdomain.tld".
+# See the ETRN_README document for a detailed description.
+#
+# The fast_flush_domains parameter controls what destinations are
+# eligible for this service. By default, they are all domains that
+# this server is willing to relay mail to.
+#
+#fast_flush_domains = $relay_domains
+
+# SHOW SOFTWARE VERSION OR NOT
+#
+# The smtpd_banner parameter specifies the text that follows the 220
+# code in the SMTP server's greeting banner. Some people like to see
+# the mail version advertised. By default, Postfix shows no version.
+#
+# You MUST specify $myhostname at the start of the text. That is an
+# RFC requirement. Postfix itself does not care.
+#
+#smtpd_banner = $myhostname ESMTP $mail_name
+#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
+
+# PARALLEL DELIVERY TO THE SAME DESTINATION
+#
+# How many parallel deliveries to the same user or domain? With local
+# delivery, it does not make sense to do massively parallel delivery
+# to the same user, because mailbox updates must happen sequentially,
+# and expensive pipelines in .forward files can cause disasters when
+# too many are run at the same time. With SMTP deliveries, 10
+# simultaneous connections to the same domain could be sufficient to
+# raise eyebrows.
+#
+# Each message delivery transport has its XXX_destination_concurrency_limit
+# parameter. The default is $default_destination_concurrency_limit for
+# most delivery transports. For the local delivery agent the default is 2.
+
+#local_destination_concurrency_limit = 2
+#default_destination_concurrency_limit = 20
+
+# DEBUGGING CONTROL
+#
+# The debug_peer_level parameter specifies the increment in verbose
+# logging level when an SMTP client or server host name or address
+# matches a pattern in the debug_peer_list parameter.
+#
+debug_peer_level = 2
+
+# The debug_peer_list parameter specifies an optional list of domain
+# or network patterns, /file/name patterns or type:name tables. When
+# an SMTP client or server host name or address matches a pattern,
+# increase the verbose logging level by the amount specified in the
+# debug_peer_level parameter.
+#
+#debug_peer_list = 127.0.0.1
+#debug_peer_list = some.domain
+
+# The debugger_command specifies the external command that is executed
+# when a Postfix daemon program is run with the -D option.
+#
+# Use "command .. & sleep 5" so that the debugger can attach before
+# the process marches on. If you use an X-based debugger, be sure to
+# set up your XAUTHORITY environment variable before starting Postfix.
+#
+debugger_command =
+ PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
+ xxgdb $daemon_directory/$process_name $process_id & sleep 5
+
+# If you can't use X, use this to capture the call stack when a
+# daemon crashes. The result is in a file in the configuration
+# directory, and is named after the process name and the process ID.
+#
+# debugger_command =
+# PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont;
+# echo where) | gdb $daemon_directory/$process_name $process_id 2>&1
+# >$config_directory/$process_name.$process_id.log & sleep 5
+#
+# Another possibility is to run gdb under a detached screen session.
+# To attach to the screen sesssion, su root and run "screen -r
+# " where uniquely matches one of the detached
+# sessions (from "screen -list").
+#
+# debugger_command =
+# PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH; screen
+# -dmS $process_name gdb $daemon_directory/$process_name
+# $process_id & sleep 1
+
+# INSTALL-TIME CONFIGURATION INFORMATION
+#
+# The following parameters are used when installing a new Postfix version.
+#
+# sendmail_path: The full pathname of the Postfix sendmail command.
+# This is the Sendmail-compatible mail posting interface.
+#
+sendmail_path = /usr/sbin/sendmail.postfix
+
+# newaliases_path: The full pathname of the Postfix newaliases command.
+# This is the Sendmail-compatible command to build alias databases.
+#
+newaliases_path = /usr/bin/newaliases.postfix
+
+# mailq_path: The full pathname of the Postfix mailq command. This
+# is the Sendmail-compatible mail queue listing command.
+#
+mailq_path = /usr/bin/mailq.postfix
+
+# setgid_group: The group for mail submission and queue management
+# commands. This must be a group name with a numerical group ID that
+# is not shared with other accounts, not even with the Postfix account.
+#
+setgid_group = postdrop
+
+# html_directory: The location of the Postfix HTML documentation.
+#
+html_directory = no
+
+# manpage_directory: The location of the Postfix on-line manual pages.
+#
+manpage_directory = /usr/share/man
+
+# sample_directory: The location of the Postfix sample configuration files.
+# This parameter is obsolete as of Postfix 2.1.
+#
+sample_directory = /usr/share/doc/postfix-2.4.5/samples
+
+# readme_directory: The location of the Postfix README files.
+#
+readme_directory = /usr/share/doc/postfix-2.4.5/README_FILES
+
+# add this to new postfix to get it to add proper message-id and other
+# headers to outgoing emails via the gateway.
+
+
+message_size_limit = 20971520
+
+
+# Mailman, see MTA.rst
+owner_request_special = no
+transport_maps = hash:/var/lib/mailman3/data/postfix_lmtp
+local_recipient_maps = hash:/var/lib/mailman3/data/postfix_lmtp
+relay_domains = hash:/var/lib/mailman3/data/postfix_domains
diff --git a/roles/mailman/files/postorius.apache.conf b/roles/mailman/files/postorius.apache.conf
new file mode 100644
index 0000000000..5055e44588
--- /dev/null
+++ b/roles/mailman/files/postorius.apache.conf
@@ -0,0 +1,28 @@
+#Alias /robots.txt /var/lib/postorius/sites/default/static/robots.txt
+#Alias /favicon.ico /var/lib/postorius/sites/default/static/favicon.ico
+Alias /postorius/static /var/lib/postorius/sites/default/static
+
+#ErrorLog /var/log/httpd/postorius_error.log
+#CustomLog /var/log/httpd/postorius_access.log combined
+
+WSGIScriptAlias /postorius /etc/postorius/sites/default/srv/postorius.wsgi
+WSGIDaemonProcess postorius display-name=postorius maximum-requests=1000 processes=4 threads=4 python-path=/etc/postorius/sites/default
+WSGISocketPrefix run/wsgi
+WSGIRestrictStdout On
+WSGIRestrictSignal Off
+WSGIPythonOptimize 1
+
+
+
+ Order deny,allow
+ Allow from all
+ Require all granted
+
+ WSGIProcessGroup postorius
+
+
+
+ Order deny,allow
+ Allow from all
+ Require all granted
+
diff --git a/roles/mailman/files/postorius.initial-user.json b/roles/mailman/files/postorius.initial-user.json
new file mode 100644
index 0000000000..887d3ef337
--- /dev/null
+++ b/roles/mailman/files/postorius.initial-user.json
@@ -0,0 +1,20 @@
+[
+ {
+ "fields": {
+ "date_joined": "2013-04-10T10:25:49.996",
+ "email": "root@fedoraproject.org",
+ "first_name": "List Admin",
+ "groups": [],
+ "is_active": true,
+ "is_staff": true,
+ "is_superuser": true,
+ "last_login": "2013-04-10T10:25:49.996",
+ "last_name": "",
+ "password": "pbkdf2_sha256$10000$uXnbYx0visOx$yux8mAZ2H/sjyCEYBvO3JEtJ7dmWfNMnvekQjePbue0=",
+ "user_permissions": [],
+ "username": "listadmin"
+ },
+ "model": "auth.user",
+ "pk": 1
+ }
+]
diff --git a/roles/mailman/files/postorius.urls.py b/roles/mailman/files/postorius.urls.py
new file mode 100644
index 0000000000..643bf33023
--- /dev/null
+++ b/roles/mailman/files/postorius.urls.py
@@ -0,0 +1,38 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 1998-2012 by the Free Software Foundation, Inc.
+#
+# This file is part of Postorius.
+#
+# Postorius is free software: 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.
+#
+# Postorius 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
+# Postorius. If not, see .
+
+import postorius
+
+from django.conf.urls import *
+from django.conf import settings
+
+# Uncomment the next two lines to enable the admin:
+from django.contrib import admin
+admin.autodiscover()
+
+# Import mailman urls and set urlpatterns if you want to hook
+# mailman_django into an existing django site.
+# Otherwise set ROOT_URLCONF in settings.py to
+# `mailman_django.urls`.
+# from mailman_django import urls as mailman_urls
+
+urlpatterns = patterns('',
+ url(r'^$', 'postorius.views.list_index'),
+ url(r'', include('postorius.urls')),
+ url(r'', include('social_auth.urls')),
+)
diff --git a/roles/mailman/tasks/main.yml b/roles/mailman/tasks/main.yml
new file mode 100644
index 0000000000..27c58a10db
--- /dev/null
+++ b/roles/mailman/tasks/main.yml
@@ -0,0 +1,138 @@
+---
+# Configuration for Mailman 3
+# PostgreSQL initialization must have been done already
+
+- name: install needed packages
+ yum: pkg=$item state=installed
+ with_items:
+ - mailman3
+ - python-psycopg2
+ - python-storm-postgresql
+ - kittystore
+ - hyperkitty
+ - postorius
+ - yum-plugin-post-transaction-actions
+ tags:
+ - packages
+
+# Initialize mailman (must be done after settings up the DBs)
+- name: add mailman to the apache group
+ user: name=mailman groups=apache append=yes
+ tags:
+ - config
+ notify:
+ - restart mailman
+
+- name: set the mailman conffile
+ template: src=mailman.cfg.j2 dest=/etc/mailman.cfg
+ tags:
+ - config
+ notify:
+ - restart mailman
+
+# Logging
+- name: hyperkitty logging -- directory
+ file: path=/var/log/hyperkitty state=directory
+ owner=root group=apache mode=2775
+- name: hyperkitty logging -- file creation
+ copy: content="" dest=/var/log/hyperkitty/hyperkitty.log
+ force=no
+- name: hyperkitty logging -- file permissions
+ file: path=/var/log/hyperkitty/hyperkitty.log state=file
+ owner=root group=apache mode=664
+- name: hyperkitty logging -- rotation
+ copy: src=hyperkitty.logrotate.conf
+ dest=/etc/logrotate.d/hyperkitty
+
+# settings / conf
+- name: install the hyperkitty/postorius settings file
+ template: src=$item.settings_local.py.j2
+ dest=/etc/$item/sites/default/settings_local.py
+ owner=root group=apache mode=0640
+ with_items:
+ - hyperkitty
+ - postorius
+ tags:
+ - config
+ notify:
+ - reload apache
+ - restart mailman
+
+- name: install the hyperkitty/postorius settings admin file
+ template: src=$item.settings_admin.py.j2
+ dest=/etc/$item/sites/default/settings_admin.py
+ owner=root group=root mode=0600
+ with_items:
+ - hyperkitty
+ - postorius
+ tags:
+ - config
+
+- name: install the hyperkitty/postorius urls file
+ copy: src=$item.urls.py
+ dest=/etc/$item/sites/default/urls.py
+ owner=root group=root mode=0644
+ with_items:
+ - hyperkitty
+ - postorius
+ tags:
+ - config
+ notify:
+ - reload apache
+ - restart mailman
+
+- name: install the hyperkitty/postorius httpd conf file
+ copy: src=$item.apache.conf
+ dest=/etc/httpd/conf.d/$item.conf
+ with_items:
+ - hyperkitty
+ - postorius
+ tags:
+ - config
+ notify:
+ - reload apache
+
+- name: set the hyperkitty conffile in mailman
+ copy: src=hyperkitty.cfg
+ dest=/etc/mailman.d/hyperkitty.cfg
+ tags:
+ - config
+ notify:
+ - restart mailman
+
+
+# Sync databases
+# FIXME the db migrations should happen no matter when the pkgs are updated
+# so really this should be run once
+# and then stored in a yum-post-transaction-action on the system(s)
+# so no matter when it is run the right thing happens
+#
+- name: run django syncdb
+ command: /usr/bin/django-admin syncdb --pythonpath=/etc/$item/sites/default --settings=settings_admin
+ with_items:
+ - hyperkitty
+ - postorius
+- name: run django migrate
+ command: /usr/bin/django-admin migrate --pythonpath=/etc/hyperkitty/sites/default --settings=settings_admin hyperkitty
+- name: kittystore schema update
+ command: /usr/bin/kittystore-updatedb --pythonpath=/etc/hyperkitty/sites/default --settings=settings_admin
+
+- name: copy the initial user fixture
+ copy: src=postorius.initial-user.json
+ dest=/etc/postorius/sites/default/initial-user.json
+ owner=root group=apache mode=0640
+
+- name: load the inital user
+ command: /usr/bin/django-admin loaddata --pythonpath=/etc/postorius/sites/default --settings=settings /etc/postorius/sites/default/initial-user.json
+
+
+# Postfix
+- name: set the postfix conffile
+ copy: src=postfix-main.cf dest=/etc/postfix/main.cf
+ notify:
+ - restart postfix
+
+
+
+handlers:
+- include: $handlers/restart_services.yml
diff --git a/roles/mailman/templates/hyperkitty.settings_admin.py.j2 b/roles/mailman/templates/hyperkitty.settings_admin.py.j2
new file mode 100644
index 0000000000..afc92c4dd8
--- /dev/null
+++ b/roles/mailman/templates/hyperkitty.settings_admin.py.j2
@@ -0,0 +1,21 @@
+#-*- coding: utf-8 -*-
+
+"""
+Copy of the Django settings file, but with database admin credentials (for
+schema modifications)
+"""
+
+from settings import *
+from settings_local import *
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.postgresql_psycopg2',
+ 'NAME': 'hyperkitty',
+ 'USER': 'hyperkittyadmin',
+ 'PASSWORD': '{{ mailman_hk_admin_db_pass }}',
+ 'HOST': 'localhost',
+ 'PORT': '',
+ }
+}
+KITTYSTORE_URL = 'postgres://kittystoreadmin:{{ mailman_ks_admin_db_pass }}@localhost/kittystore'
diff --git a/roles/mailman/templates/hyperkitty.settings_local.py.j2 b/roles/mailman/templates/hyperkitty.settings_local.py.j2
new file mode 100644
index 0000000000..6ff8a781e7
--- /dev/null
+++ b/roles/mailman/templates/hyperkitty.settings_local.py.j2
@@ -0,0 +1,101 @@
+#-*- coding: utf-8 -*-
+
+"""
+Django local settings for the hyperkitty project.
+"""
+
+DEBUG = False
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = ()
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.postgresql_psycopg2',
+ 'NAME': 'hyperkitty',
+ 'USER': 'hyperkittyapp',
+ 'PASSWORD': '{{ mailman_hk_db_pass }}',
+ 'HOST': 'localhost',
+ 'PORT': '',
+ }
+}
+# URL prefix for static files.
+# Example: "http://media.lawrence.com/static/"
+STATIC_URL = '/hyperkitty/static/'
+
+# Add Fedora to the authentication backends
+AUTHENTICATION_BACKENDS = (
+ 'social_auth.backends.browserid.BrowserIDBackend',
+ 'hyperkitty.lib.fedora.FedoraBackend',
+ 'social_auth.backends.google.GoogleBackend',
+ 'social_auth.backends.yahoo.YahooBackend',
+ #'social_auth.backends.OpenIDBackend',
+ 'django.contrib.auth.backends.ModelBackend',
+)
+
+# Use the email address as the username (add associate_by_email).
+SOCIAL_AUTH_PIPELINE = (
+ 'social_auth.backends.pipeline.social.social_auth_user',
+ 'social_auth.backends.pipeline.associate.associate_by_email',
+ 'social_auth.backends.pipeline.user.get_username',
+ 'social_auth.backends.pipeline.user.create_user',
+ 'social_auth.backends.pipeline.social.associate_user',
+ 'social_auth.backends.pipeline.social.load_extra_data',
+ 'social_auth.backends.pipeline.user.update_user_details'
+)
+
+# 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.
+# 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,
+ 'handlers': {
+ 'mail_admins': {
+ 'level': 'ERROR',
+ 'class': 'django.utils.log.AdminEmailHandler'
+ },
+ 'file':{
+ 'level': 'DEBUG',
+ #'class': 'logging.handlers.RotatingFileHandler',
+ 'class': 'logging.FileHandler',
+ 'filename': '/var/log/hyperkitty/hyperkitty.log',
+ 'formatter': 'verbose',
+ },
+ },
+ 'loggers': {
+ 'django.request': {
+ 'handlers': ['file'],
+ 'level': 'ERROR',
+ 'propagate': True,
+ },
+ 'django': {
+ 'handlers': ['file'],
+ 'level': 'ERROR',
+ 'propagate': True,
+ },
+ 'hyperkitty': {
+ 'handlers': ['file'],
+ 'level': 'DEBUG',
+ 'propagate': True,
+ },
+ },
+ 'formatters': {
+ 'verbose': {
+ 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
+ },
+ 'simple': {
+ 'format': '%(levelname)s %(message)s'
+ },
+ },
+}
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = '{{ mailman_hk_cookie_key }}'
+
+APP_NAME = 'Fedora list archives'
+KITTYSTORE_URL = 'postgres://kittystoreapp:{{ mailman_ks_db_pass }}@localhost/kittystore'
+KITTYSTORE_SEARCH_INDEX = '/var/lib/hyperkitty/sites/default/kittystore_search_index'
+KITTYSTORE_DEBUG = False
+USE_MOCKUPS = False
diff --git a/roles/mailman/templates/mailman.cfg.j2 b/roles/mailman/templates/mailman.cfg.j2
new file mode 100644
index 0000000000..d4c1aa561c
--- /dev/null
+++ b/roles/mailman/templates/mailman.cfg.j2
@@ -0,0 +1,32 @@
+# 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: root@localhost
+
+# 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: postgres://mailmanadmin:{{ mailman_mm_db_pass }}@localhost/mailman
+
+[archiver.hyperkitty]
+class: hyperkitty.archiver.Archiver
+enable: yes
+configuration: /etc/mailman3.d/hyperkitty.cfg
+
+#[archiver.prototype]
+#enable: yes
diff --git a/roles/mailman/templates/postorius.settings_admin.py.j2 b/roles/mailman/templates/postorius.settings_admin.py.j2
new file mode 100644
index 0000000000..067d320a5d
--- /dev/null
+++ b/roles/mailman/templates/postorius.settings_admin.py.j2
@@ -0,0 +1,21 @@
+#-*- coding: utf-8 -*-
+
+"""
+Copy of the Django settings file, but with database admin credentials (for
+schema modifications)
+"""
+
+from settings import *
+from settings_local import *
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.postgresql_psycopg2',
+ 'NAME': 'postorius',
+ 'USER': 'postoriusadmin',
+ 'PASSWORD': '{{ mailman_ps_admin_db_pass }}',
+ 'HOST': 'localhost',
+ 'PORT': '',
+ }
+}
+KITTYSTORE_URL = 'postgres://kittystoreadmin:{{ mailman_ks_admin_db_pass }}@localhost/kittystore'
diff --git a/roles/mailman/templates/postorius.settings_local.py.j2 b/roles/mailman/templates/postorius.settings_local.py.j2
new file mode 100644
index 0000000000..66334bb02a
--- /dev/null
+++ b/roles/mailman/templates/postorius.settings_local.py.j2
@@ -0,0 +1,34 @@
+#-*- coding: utf-8 -*-
+
+"""
+Django local settings for the postorious project.
+"""
+
+
+DEBUG = False
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = ()
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.postgresql_psycopg2',
+ 'NAME': 'postorius',
+ 'USER': 'postoriusapp',
+ 'PASSWORD': '{{ mailman_ps_db_pass }}',
+ 'HOST': 'localhost',
+ 'PORT': '',
+ }
+}
+
+# URL that handles the media served from STATIC_ROOT. Make sure to use a
+STATIC_URL = '/postorius/static/'
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+MEDIA_URL = '/postorius/media/'
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/postorius/static/admin/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = '{{ mailman_ps_cookie_key }}'