feat: add Stalwart Mail Server and FoundationDB library packages #67

Merged
unkinben merged 1 commits from benvin/stalwart into master 2025-10-19 18:35:04 +11:00
31 changed files with 556 additions and 0 deletions

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,18 @@
FROM git.unkin.net/unkin/almalinux9-rpmbuilder:latest
# Create output directory for RPMs
RUN mkdir -p /app/dist
# Set working directory
WORKDIR /app
ARG PACKAGE_RELEASE
ENV PACKAGE_RELEASE=${PACKAGE_RELEASE}
ARG PACKAGE_VERSION
ENV PACKAGE_VERSION=${PACKAGE_VERSION}
# Copy resources from the context into the container
COPY resources /app/resources
# Default command to build RPMs
CMD /app/resources/build.sh

View File

@ -0,0 +1,9 @@
name: libfoundationdb
release: 1
version: 7.3.71
github: apple/foundationdb
build:
- distro: el/8
image: git.unkin.net/unkin/almalinux8-rpmbuilder:latest
- distro: el/9
image: git.unkin.net/unkin/almalinux9-rpmbuilder:latest

View File

@ -0,0 +1,10 @@
#!/usr/bin/bash
# Download the required library
curl -L -o /app/libfdb_c.so https://github.com/apple/foundationdb/releases/download/${PACKAGE_VERSION}/libfdb_c.x86_64.so
# Make the library readable
chmod 755 /app/libfdb_c.so
# Build the RPM
nfpm pkg --config /app/resources/nfpm.yaml --target /app/dist --packager rpm

View File

@ -0,0 +1,36 @@
# nfpm.yaml
name: libfoundationdb
version: ${PACKAGE_VERSION}
release: ${PACKAGE_RELEASE}
arch: amd64
platform: linux
section: default
priority: extra
description: "FoundationDB client library - Shared library for FoundationDB applications"
maintainer: FoundationDB Community
homepage: https://github.com/apple/foundationdb
license: Apache-2.0
disable_globbing: false
replaces:
- libfoundationdb
provides:
- libfoundationdb
- libfdb_c.so()(64bit)
# Files to include in the package
contents:
- src: /app/libfdb_c.so
dst: /usr/lib64/libfdb_c.so
file_info:
mode: 0755
owner: root
group: root
# Scripts to run during installation/removal
scripts:
postinstall: /app/resources/scripts/postinstall.sh

View File

@ -0,0 +1,4 @@
#!/usr/bin/env bash
# Update the dynamic linker cache to include the new library
ldconfig

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,18 @@
FROM git.unkin.net/unkin/almalinux9-rpmbuilder:latest
# Create output directory for RPMs
RUN mkdir -p /app/dist
# Set working directory
WORKDIR /app
ARG PACKAGE_RELEASE
ENV PACKAGE_RELEASE=${PACKAGE_RELEASE}
ARG PACKAGE_VERSION
ENV PACKAGE_VERSION=${PACKAGE_VERSION}
# Copy resources from the context into the container
COPY resources /app/resources
# Default command to build RPMs
CMD /app/resources/build.sh

View File

@ -0,0 +1,9 @@
name: stalwart-cli
release: 1
version: 0.13.4
github: stalwartlabs/stalwart
build:
- distro: el/8
image: git.unkin.net/unkin/almalinux8-rpmbuilder:latest
- distro: el/9
image: git.unkin.net/unkin/almalinux9-rpmbuilder:latest

View File

@ -0,0 +1,13 @@
#!/usr/bin/bash
# Download the required files
curl -L -o /app/stalwart-cli.tar.gz https://github.com/stalwartlabs/stalwart/releases/download/v${PACKAGE_VERSION}/stalwart-cli-x86_64-unknown-linux-gnu.tar.gz
# Extract the binary
tar -xzf /app/stalwart-cli.tar.gz -C /app
# Make the binary executable
chmod +x /app/stalwart-cli
# Build the RPM
nfpm pkg --config /app/resources/nfpm.yaml --target /app/dist --packager rpm

View File

@ -0,0 +1,31 @@
# nfpm.yaml
name: stalwart-cli
version: ${PACKAGE_VERSION}
release: ${PACKAGE_RELEASE}
arch: amd64
platform: linux
section: default
priority: extra
description: "Stalwart CLI - Command line interface for Stalwart Mail Server"
maintainer: Stalwart Labs
homepage: https://stalw.art
license: AGPL-3.0
disable_globbing: false
replaces:
- stalwart-cli
provides:
- stalwart-cli
# Files to include in the package
contents:
- src: /app/stalwart-cli
dst: /usr/bin/stalwart-cli
file_info:
mode: 0755
owner: root
group: root

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,18 @@
FROM git.unkin.net/unkin/almalinux9-rpmbuilder:latest
# Create output directory for RPMs
RUN mkdir -p /app/dist
# Set working directory
WORKDIR /app
ARG PACKAGE_RELEASE
ENV PACKAGE_RELEASE=${PACKAGE_RELEASE}
ARG PACKAGE_VERSION
ENV PACKAGE_VERSION=${PACKAGE_VERSION}
# Copy resources from the context into the container
COPY resources /app/resources
# Default command to build RPMs
CMD /app/resources/build.sh

View File

@ -0,0 +1,9 @@
name: stalwart-foundationdb
release: 1
version: 0.13.4
github: stalwartlabs/stalwart
build:
- distro: el/8
image: git.unkin.net/unkin/almalinux8-rpmbuilder:latest
- distro: el/9
image: git.unkin.net/unkin/almalinux9-rpmbuilder:latest

View File

@ -0,0 +1,13 @@
#!/usr/bin/bash
# Download the required files
curl -L -o /app/stalwart-foundationdb.tar.gz https://github.com/stalwartlabs/stalwart/releases/download/v${PACKAGE_VERSION}/stalwart-foundationdb-x86_64-unknown-linux-gnu.tar.gz
# Extract the binary
tar -xzf /app/stalwart-foundationdb.tar.gz -C /app
# Make the binary executable
chmod +x /app/stalwart-foundationdb
# Build the RPM
nfpm pkg --config /app/resources/nfpm.yaml --target /app/dist --packager rpm

View File

@ -0,0 +1,50 @@
# nfpm.yaml
name: stalwart-foundationdb
version: ${PACKAGE_VERSION}
release: ${PACKAGE_RELEASE}
arch: amd64
platform: linux
section: default
priority: extra
description: "Stalwart Mail Server with FoundationDB support - A modern, secure JMAP, IMAP and SMTP mail server"
maintainer: Stalwart Labs
homepage: https://stalw.art
license: AGPL-3.0
disable_globbing: false
replaces:
- stalwart-foundationdb
provides:
- stalwart-foundationdb
conflicts:
- stalwart
depends:
- libfoundationdb
# Files to include in the package
contents:
- src: /app/stalwart-foundationdb
dst: /opt/stalwart/bin/stalwart-foundationdb
file_info:
mode: 0755
owner: stalwart
group: stalwart
- src: /app/resources/stalwart-foundationdb.service
dst: /usr/lib/systemd/system/stalwart-foundationdb.service
file_info:
mode: 0644
owner: root
group: root
# Scripts to run during installation/removal
scripts:
preinstall: /app/resources/scripts/preinstall.sh
postinstall: /app/resources/scripts/postinstall.sh
preremove: /app/resources/scripts/preremove.sh
postremove: /app/resources/scripts/postremove.sh

View File

@ -0,0 +1,54 @@
#!/usr/bin/env bash
# Create default configuration if it doesn't exist
if [ ! -f /opt/stalwart/etc/config.toml ]; then
cat > /opt/stalwart/etc/config.toml << 'EOF'
# Stalwart Mail Server Configuration with FoundationDB
# This is a minimal configuration file. Please customize according to your needs.
# Full documentation: https://stalw.art/docs/
[server]
hostname = "localhost"
[server.listener.smtp]
bind = ["127.0.0.1:25"]
protocol = "smtp"
[server.listener.submission]
bind = ["127.0.0.1:587"]
protocol = "smtp"
[server.listener.imap]
bind = ["127.0.0.1:143"]
protocol = "imap"
[server.listener.http]
bind = ["127.0.0.1:8080"]
protocol = "http"
[storage]
data = "foundationdb"
fts = "foundationdb"
blob = "fs"
lookup = "foundationdb"
directory = "internal"
[store."foundationdb"]
type = "foundationdb"
cluster = "/etc/foundationdb/fdb.cluster"
[store."fs"]
type = "fs"
path = "/var/lib/stalwart/blobs"
[directory."internal"]
type = "internal"
store = "foundationdb"
EOF
chown stalwart:stalwart /opt/stalwart/etc/config.toml
chmod 600 /opt/stalwart/etc/config.toml
fi
# Reload systemd
systemctl daemon-reload

View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
# Reload systemd after service file removal
systemctl daemon-reload
# Note: We don't remove user data, logs, or configuration files
# to preserve user data in case of reinstallation

View File

@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Create stalwart user and group
if ! getent group stalwart >/dev/null; then
groupadd -r stalwart
fi
if ! getent passwd stalwart >/dev/null; then
useradd -r -g stalwart -d /opt/stalwart -s /sbin/nologin -c "Stalwart Mail Server" stalwart
fi
# Create required directories
mkdir -p /opt/stalwart/{bin,etc,data,logs}
mkdir -p /var/lib/stalwart
mkdir -p /var/log/stalwart
# Set ownership
chown -R stalwart:stalwart /opt/stalwart
chown -R stalwart:stalwart /var/lib/stalwart
chown -R stalwart:stalwart /var/log/stalwart

View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
# Stop and disable the service if it's running
if systemctl is-enabled stalwart-foundationdb.service >/dev/null 2>&1; then
systemctl stop stalwart-foundationdb.service
systemctl disable stalwart-foundationdb.service
fi

View File

@ -0,0 +1,26 @@
[Unit]
Description=Stalwart Mail Server with FoundationDB
After=network.target foundationdb.service
Requires=foundationdb.service
[Service]
Type=simple
User=stalwart
Group=stalwart
ExecStart=/opt/stalwart/bin/stalwart-foundationdb --config=/opt/stalwart/etc/config.toml
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=stalwart-foundationdb
# Security settings
NoNewPrivileges=true
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=strict
ReadWritePaths=/var/lib/stalwart /var/log/stalwart /opt/stalwart/data
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1 @@
1

18
rpms/stalwart/Dockerfile Normal file
View File

@ -0,0 +1,18 @@
FROM git.unkin.net/unkin/almalinux9-rpmbuilder:latest
# Create output directory for RPMs
RUN mkdir -p /app/dist
# Set working directory
WORKDIR /app
ARG PACKAGE_RELEASE
ENV PACKAGE_RELEASE=${PACKAGE_RELEASE}
ARG PACKAGE_VERSION
ENV PACKAGE_VERSION=${PACKAGE_VERSION}
# Copy resources from the context into the container
COPY resources /app/resources
# Default command to build RPMs
CMD /app/resources/build.sh

View File

@ -0,0 +1,9 @@
name: stalwart
release: 1
version: 0.13.4
github: stalwartlabs/stalwart
build:
- distro: el/8
image: git.unkin.net/unkin/almalinux8-rpmbuilder:latest
- distro: el/9
image: git.unkin.net/unkin/almalinux9-rpmbuilder:latest

View File

@ -0,0 +1,13 @@
#!/usr/bin/bash
# Download the required files
curl -L -o /app/stalwart.tar.gz https://github.com/stalwartlabs/stalwart/releases/download/v${PACKAGE_VERSION}/stalwart-x86_64-unknown-linux-gnu.tar.gz
# Extract the binary
tar -xzf /app/stalwart.tar.gz -C /app
# Make the binary executable
chmod +x /app/stalwart
# Build the RPM
nfpm pkg --config /app/resources/nfpm.yaml --target /app/dist --packager rpm

View File

@ -0,0 +1,47 @@
# nfpm.yaml
name: stalwart
version: ${PACKAGE_VERSION}
release: ${PACKAGE_RELEASE}
arch: amd64
platform: linux
section: default
priority: extra
description: "Stalwart Mail Server - A modern, secure JMAP, IMAP and SMTP mail server"
maintainer: Stalwart Labs
homepage: https://stalw.art
license: AGPL-3.0
disable_globbing: false
replaces:
- stalwart
provides:
- stalwart
conflicts:
- stalwart-foundationdb
# Files to include in the package
contents:
- src: /app/stalwart
dst: /opt/stalwart/bin/stalwart
file_info:
mode: 0755
owner: stalwart
group: stalwart
- src: /app/resources/stalwart.service
dst: /usr/lib/systemd/system/stalwart.service
file_info:
mode: 0644
owner: root
group: root
# Scripts to run during installation/removal
scripts:
preinstall: /app/resources/scripts/preinstall.sh
postinstall: /app/resources/scripts/postinstall.sh
preremove: /app/resources/scripts/preremove.sh
postremove: /app/resources/scripts/postremove.sh

View File

@ -0,0 +1,54 @@
#!/usr/bin/env bash
# Create default configuration if it doesn't exist
if [ ! -f /opt/stalwart/etc/config.toml ]; then
cat > /opt/stalwart/etc/config.toml << 'EOF'
# Stalwart Mail Server Configuration
# This is a minimal configuration file. Please customize according to your needs.
# Full documentation: https://stalw.art/docs/
[server]
hostname = "localhost"
[server.listener.smtp]
bind = ["127.0.0.1:25"]
protocol = "smtp"
[server.listener.submission]
bind = ["127.0.0.1:587"]
protocol = "smtp"
[server.listener.imap]
bind = ["127.0.0.1:143"]
protocol = "imap"
[server.listener.http]
bind = ["127.0.0.1:8080"]
protocol = "http"
[storage]
data = "sqlite"
fts = "sqlite"
blob = "fs"
lookup = "sqlite"
directory = "internal"
[store."sqlite"]
type = "sqlite"
path = "/var/lib/stalwart/stalwart.db"
[store."fs"]
type = "fs"
path = "/var/lib/stalwart/blobs"
[directory."internal"]
type = "internal"
store = "sqlite"
EOF
chown stalwart:stalwart /opt/stalwart/etc/config.toml
chmod 600 /opt/stalwart/etc/config.toml
fi
# Reload systemd
systemctl daemon-reload

View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
# Reload systemd after service file removal
systemctl daemon-reload
# Note: We don't remove user data, logs, or configuration files
# to preserve user data in case of reinstallation

View File

@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Create stalwart user and group
if ! getent group stalwart >/dev/null; then
groupadd -r stalwart
fi
if ! getent passwd stalwart >/dev/null; then
useradd -r -g stalwart -d /opt/stalwart -s /sbin/nologin -c "Stalwart Mail Server" stalwart
fi
# Create required directories
mkdir -p /opt/stalwart/{bin,etc,data,logs}
mkdir -p /var/lib/stalwart
mkdir -p /var/log/stalwart
# Set ownership
chown -R stalwart:stalwart /opt/stalwart
chown -R stalwart:stalwart /var/lib/stalwart
chown -R stalwart:stalwart /var/log/stalwart

View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
# Stop and disable the service if it's running
if systemctl is-enabled stalwart.service >/dev/null 2>&1; then
systemctl stop stalwart.service
systemctl disable stalwart.service
fi

View File

@ -0,0 +1,25 @@
[Unit]
Description=Stalwart Mail Server
After=network.target
[Service]
Type=simple
User=stalwart
Group=stalwart
ExecStart=/opt/stalwart/bin/stalwart --config=/opt/stalwart/etc/config.toml
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=stalwart
# Security settings
NoNewPrivileges=true
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=strict
ReadWritePaths=/var/lib/stalwart /var/log/stalwart /opt/stalwart/data
[Install]
WantedBy=multi-user.target