Nomploy Nomad Packs

← All packs

snappymail v0.1.0

Apps

SnappyMail — a fast, lightweight, modern webmail client for your existing IMAP/SMTP mailboxes. A lean Roundcube alternative you point at any mail server. Deployed as a host-networked Nomad service with a persistent data volume.

nomad-pack run snappymail --registry nomploy
…or one line (add registry + run)
curl -fsSL https://packs.nomploy.com/install.sh | sh -s -- snappymail

Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.

1 task http 8888 1 volume image djmaze/snappymail:latest tracks :latest image bumped today
Variables 9
values.hcl

Save as values.hcl, edit, then run:

nomad-pack run snappymail -f values.hcl --registry nomploy
# The name of the Nomad job.
job_name = "snappymail"

# The Nomad namespace to deploy into.
namespace = "default"

# The datacenters to deploy to.
datacenters = ["*"]

# The SnappyMail container image. Pin a tag in production.
image = "djmaze/snappymail:latest"

# Host port for the SnappyMail web UI. The container's nginx is fixed at 8888, so keep this at 8888 unless you also change the image config.
port = 8888

# Maximum attachment upload size (UPLOAD_MAX_SIZE), e.g. 25M.
upload_max_size = "25M"

# Named volume for SnappyMail data and config (/var/lib/snappymail).
data_volume = "snappymail_data"

# Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []

# Resources for the SnappyMail task.
resources = {
    cpu    = 300
    memory = 256
  }
NameTypeDefaultDescription
job_name string
"snappymail"
The name of the Nomad job.
namespace string
"default"
The Nomad namespace to deploy into.
datacenters list
["*"]
The datacenters to deploy to.
image string
"djmaze/snappymail:latest"
The SnappyMail container image. Pin a tag in production.
port number
8888
Host port for the SnappyMail web UI. The container's nginx is fixed at 8888, so keep this at 8888 unless you also change the image config.
upload_max_size string
"25M"
Maximum attachment upload size (UPLOAD_MAX_SIZE), e.g. 25M.
data_volume string
"snappymail_data"
Named volume for SnappyMail data and config (/var/lib/snappymail).
constraints list
[]
Placement constraints. Pin to the node holding the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
resources object
{
    cpu    = 300
    memory = 256
  }
Resources for the SnappyMail task.
Back up this pack

This pack stores data in one Docker named volume: snappymail_data

restic

# Run on the node hosting this pack. Point restic at your repo first:
#   export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>"
#   export RESTIC_PASSWORD="<repo-password>"
#   export AWS_ACCESS_KEY_ID=<key>  AWS_SECRET_ACCESS_KEY=<secret>
restic backup \
  /var/lib/docker/volumes/snappymail_data/_data

rclone (sync to S3/R2)

rclone sync /var/lib/docker/volumes/snappymail_data/_data backup:<bucket>/snappymail_data

Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.

Readme

snappymail

SnappyMail — a fast, modern, lightweight webmail client for your existing IMAP/SMTP mailboxes. Clean UI, low resource use, two-factor auth, and per-domain configuration — a leaner alternative to Roundcube. It is a client, not a mail server: point it at any IMAP/SMTP provider.

Single host-networked Nomad service with a persistent data/config volume.

Deploy

nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run snappymail --registry=nomploy

Configure

Variable Default Description
port 8888 Web UI port. The container's nginx is fixed at 8888 — keep this unless you also change the image config.
upload_max_size 25M Max attachment upload size (UPLOAD_MAX_SIZE).
data_volume snappymail_data /var/lib/snappymail — config, domains, accounts.
image djmaze/snappymail:latest Container image. Pin a tag in production.
resources { cpu = 300, memory = 256 } Task resources.

First run: open the admin panel at /?admin. The generated admin password is written to _data_/_default_/admin_password.txt inside the data volume (nomad alloc fs or nomad alloc exec to read it). Log in, add your mail domain(s) with their IMAP/SMTP servers, then users sign in at the main URL with their mailbox credentials. Serves plain HTTP — front it with a reverse proxy for TLS. Pin the job to the node holding the volume with constraints.