Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ansible/playbook.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
- name: Deploy mailservers
hosts: mail
roles:
- opendkim
- dkim-milter
- opendmarc
- opendmarc-inbox
- sasl
Expand Down
14 changes: 14 additions & 0 deletions ansible/roles/dkim-milter/handlers/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
- name: Reload dkim-milter
ansible.builtin.service:
name: dkim-milter.service
state: restarted
tags:
- role::dkim-milter

- name: Restart dkim-milter
ansible.builtin.service:
name: dkim-milter.service
state: restarted
tags:
- role::dkim-milter
148 changes: 148 additions & 0 deletions ansible/roles/dkim-milter/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
---
- name: Install opendkim-tools
# Used currently to generate keys. Could theoretically replace this with dkimdo
# https://codeberg.org/glts/dkimdo
ansible.builtin.package:
name: opendkim-tools
state: present
tags:
- role::dkim-milter

- name: Pull dkim-milter AppImage from Uncle Christ
ansible.builtin.get_url:
checksum: sha256:{{ dkim_milter_package_root }}/sha256sums.txt
url: "{{ dkim_milter_package_root }}/dkim-milter"
dest: /usr/local/sbin/dkim-milter
owner: root
group: root
mode: 0o755
vars:
dkim_milter_version: 0.2.0-alpha.1
Copy link

Copilot AI Sep 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using an alpha version in production deployment could lead to instability issues. If Rust was used for this milter implementation, you'd benefit from memory safety guarantees and better error handling that could make alpha versions more reliable. Consider evaluating the stability of this alpha release or pinning to a stable version when available.

Copilot generated this review using guidance from repository custom instructions.
uncle_christ_package_root: https://git.jchri.st/api/packages/jc/generic
dkim_milter_package_root: "{{ uncle_christ_package_root }}/dkim-milter/{{ dkim_milter_version }}"
tags:
- role::dkim-milter
# https://codeberg.org/forgejo/forgejo/issues/6871
when:
- not ansible_check_mode

- name: Create dkim-milter user
ansible.builtin.user:
name: dkim-milter
home: /var/lib/dkim-milter
group: dkim-milter
create_home: false
system: true
shell: /usr/sbin/nologin
tags:
- role::dkim-milter

- name: Create dkim-milter directory
ansible.builtin.file:
path: /etc/dkim-milter
state: directory
owner: dkim-milter
group: dkim-milter
mode: 0o700
tags:
- role::dkim-milter

- name: Create dkim-milter keys directory
ansible.builtin.file:
path: /etc/dkim-milter/keys
state: directory
owner: dkim-milter
group: dkim-milter
mode: 0o700
tags:
- role::dkim-milter

- name: Template dkim-milter configuration file
ansible.builtin.template:
src: dkim-milter.conf.j2
dest: /etc/dkim-milter/dkim-milter.conf
owner: dkim-milter
group: dkim-milter
mode: 0o400
notify:
- Reload dkim-milter
tags:
- role::dkim-milter

- name: Template signing-keys file
ansible.builtin.copy:
content: |
{% for domain in dkim_milter_domains %}
{% set keyname = (domain | replace(".", "_")) %}
{{ keyname }} < /etc/dkim-milter/keys/{{ keyname }}.pem
{% endfor %}
{% for item in dkim_milter_extra_signings %}
{% set keyname = (item['domain'] | replace(".", "_")) %}
{{ keyname }} < /etc/dkim-milter/keys/{{ keyname }}.pem
Comment on lines +77 to +81
Copy link

Copilot AI Sep 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The key file path references {{ keyname }}.pem but the key generation task creates files in subdirectories like /etc/dkim-milter/keys/{{ item }}/{{ dkim_milter_selector }}.private. The path structure is inconsistent and will cause the milter to fail finding the keys.

Suggested change
{{ keyname }} < /etc/dkim-milter/keys/{{ keyname }}.pem
{% endfor %}
{% for item in dkim_milter_extra_signings %}
{% set keyname = (item['domain'] | replace(".", "_")) %}
{{ keyname }} < /etc/dkim-milter/keys/{{ keyname }}.pem
{{ keyname }} < /etc/dkim-milter/keys/{{ keyname }}/{{ dkim_milter_selector }}.private
{% endfor %}
{% for item in dkim_milter_extra_signings %}
{% set keyname = (item['domain'] | replace(".", "_")) %}
{{ keyname }} < /etc/dkim-milter/keys/{{ keyname }}/{{ dkim_milter_selector }}.private

Copilot uses AI. Check for mistakes.
{% endfor %}
dest: /etc/dkim-milter/signing-keys
owner: dkim-milter
group: dkim-milter
mode: 0o400
notify:
- Reload dkim-milter
tags:
- role::dkim-milter

- name: Template signing-senders file
ansible.builtin.copy:
content: |
# Sender expression Domain Selector Key name
{% for domain in dkim_milter_domains %}
{% set keyname = (domain | replace(".", "_")) %}
.{{ domain }} {{ domain }} {{ dkim_milter_selector }} {{ keyname }}
{% endfor %}
{% for item in dkim_milter_extra_signings %}
{% set keyname = (item['use_key'] | replace(".", "_")) %}
{% set domain = item['domain'] %}
.{{ domain }} {{ domain }} {{ dkim_milter_selector }} {{ keyname }}
{% endfor %}
dest: /etc/dkim-milter/signing-senders
owner: dkim-milter
group: dkim-milter
mode: 0o400
notify:
- Reload dkim-milter
tags:
- role::dkim-milter

- name: Generate dkim keys
become: true
become_user: dkim-milter
ansible.builtin.command: |
opendkim-genkey -D /etc/dkim-milter/keys/{{ item }} -d {{ item }} -s {{ dkim_milter_selector }}
with_items:
- "{{ dkim_milter_domains }}"
args:
creates: /etc/dkim-milter/keys/{{ item }}/{{ dkim_milter_selector }}.private
notify:
- Reload dkim-milter
tags:
- role::dkim-milter

- name: Template systemd service
ansible.builtin.template:
src: dkim-milter.service.j2
dest: /etc/systemd/system/dkim-milter.service
owner: root
group: root
mode: 0o444
register: dkim_milter_service
notify:
- Restart dkim-milter
tags:
- role::dkim-milter

- name: Start and enable dkim-milter
ansible.builtin.service:
name: dkim-milter.service
state: started
enabled: true
daemon_reload: "{{ dkim_milter_service is changed }}"
tags:
- role::dkim-milter
2 changes: 2 additions & 0 deletions ansible/roles/dkim-milter/templates/dkim-milter.conf.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
signing_keys = </etc/dkim-milter/signing-keys
signing_senders = </etc/dkim-milter/signing-senders
21 changes: 21 additions & 0 deletions ansible/roles/dkim-milter/templates/dkim-milter.service.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# {{ ansible_managed }}

[Unit]
Description=DKIM Milter
# Documentation=man:dkim-milter(8) man:dkim-milter.conf(5)
After=network-online.target nss-lookup.target
Wants=network-online.target

[Service]
User=dkim-milter
ExecStart=/usr/local/sbin/dkim-milter
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

# schizophrenia
Copy link

Copilot AI Sep 27, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The comment 'schizophrenia' is inappropriate and unprofessional. Consider removing it or replacing it with a clear explanation of why system protection is being configured.

Suggested change
# schizophrenia
# Restrict access to the system for security

Copilot uses AI. Check for mistakes.
ProtectSystem=full

[Install]
WantedBy=multi-user.target

# vim: ft=dosini.jinja2:
10 changes: 10 additions & 0 deletions ansible/roles/dkim-milter/vars/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
dkim_milter_domains:
- pydis.wtf
- pydis.com
- pythondiscord.com
- owlcorp.uk
dkim_milter_extra_signings:
- domain: int.pydis.wtf
use_key: pydis.wtf
dkim_milter_selector: lovelace
Loading