No description
Find a file
2026-05-05 15:38:12 +02:00
cmd feat: build cobra-based stalwart upgrade CLI 2026-05-05 15:26:41 +02:00
internal/upgrader feat: build cobra-based stalwart upgrade CLI 2026-05-05 15:26:41 +02:00
go.mod feat: build cobra-based stalwart upgrade CLI 2026-05-05 15:26:41 +02:00
go.sum feat: build cobra-based stalwart upgrade CLI 2026-05-05 15:26:41 +02:00
LICENSE Update LICENSE 2026-05-05 15:38:12 +02:00
main.go feat: build cobra-based stalwart upgrade CLI 2026-05-05 15:26:41 +02:00
README.md feat: build cobra-based stalwart upgrade CLI 2026-05-05 15:26:41 +02:00

upgrade-stalwart

upgrade-stalwart is a Go CLI for checking and upgrading Stalwart Mail binaries installed under /opt/stalwart-mail.

It manages:

  • Stalwart Mail server (stalwartlabs/stalwart)
  • Stalwart CLI (stalwartlabs/cli)

Features

  • Uses GitHub Releases API (google/go-github/v85) to query latest releases.
  • Detects local installed versions from:
    • /opt/stalwart-mail/bin/stalwart
    • /opt/stalwart-mail/bin/stalwart-cli
  • Compares installed versions with latest release tags.
  • Selects Linux x86_64 artifacts:
    • stalwart-x86_64-unknown-linux-gnu.tar.gz
    • stalwart-cli-x86_64-unknown-linux-gnu.tar.xz
  • Downloads archives to temporary directories.
  • Extracts and validates expected binaries from the archives.
  • Performs safe replacement:
    • keeps backup copy of current binary (.bak.<timestamp>)
    • replaces only after successful download/extract/validation
    • sets mode 0755
  • Restarts systemd service after successful install (stalwart-mail.service by default).
  • Supports --dry-run mode (no download, no replacement, no chmod, no restart).

Requirements

  • Linux x86_64 host
  • Go 1.26+
  • Permissions to write under /opt/stalwart-mail/bin
  • Permissions to restart the target systemd service

GitHub Auth

If present, the CLI uses one of these environment variables for GitHub API authentication:

  • GITHUB_TOKEN
  • GH_TOKEN
  • GITHUB_AUTH_TOKEN

If none are set, it uses unauthenticated GitHub API requests.

Build

go mod tidy
go build -o upgrade-stalwart .

Install Example

Copy compiled binary to /usr/local/sbin/upgrade-stalwart:

sudo install -m 0755 ./upgrade-stalwart /usr/local/sbin/upgrade-stalwart

Usage

upgrade-stalwart [command]

Show versions only (no changes)

upgrade-stalwart check

Upgrade all supported components

upgrade-stalwart upgrade

Force reinstall latest releases

upgrade-stalwart upgrade --force

Upgrade using a manual release archive URL

Example:

upgrade-stalwart upgrade --url https://github.com/stalwartlabs/stalwart/releases/download/v0.16.4/stalwart-x86_64-unknown-linux-gnu.tar.gz

Use explicit service name

upgrade-stalwart upgrade --service stalwart-mail.service

Dry-run mode

upgrade-stalwart upgrade --dry-run

Show CLI version

upgrade-stalwart version

Flags

Global flags:

  • --install-root (default: /opt/stalwart-mail)
  • --service (default: stalwart-mail.service)
  • --dry-run

Upgrade flags:

  • --force
  • --url <download-url>

Exit Codes

  • 0 on success
  • non-zero on failure

Tests

Run unit tests:

go test ./...

Current tests cover:

  • semantic version extraction/comparison
  • release asset selection
  • archive-to-component inference