Files
sharedinbox/stalwart-dev/start
T
Thomas GüttlerandClaude Sonnet 4.6 22db4a2dd6 Add Nix flake, .envrc, Taskfile, and Stalwart dev server
- flake.nix: Flutter 3.41.6, Android SDK, Stalwart, GTK3/build
  tools for Linux desktop, go-task
- .envrc: copied from sharedinbox — use flake + dotenv_if_exists
- Taskfile.yml: analyze, test, integration, codegen, run tasks
- stalwart-dev/: IMAP+SMTP dev server reused from sharedinbox
- test/integration/imap_sync_test.dart: login, list mailboxes,
  send via SMTP and receive via IMAP
- pubspec.yaml: add flutter_secure_storage

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-16 07:40:34 +02:00

75 lines
2.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# Starts a Stalwart instance for local development and integration tests.
#
# By default it uses STALWART_PORT from the environment. When STALWART_PORT=0
# or STALWART_RANDOM_PORTS=1, three free random ports are chosen and written to
# STALWART_TMPDIR/ports.env for other scripts to source.
set -euo pipefail
command -v stalwart >/dev/null || {
echo "stalwart not in PATH — run inside nix develop"
exit 1
}
command -v ss >/dev/null || {
echo "ss not in PATH — cannot verify Stalwart ports"
exit 1
}
if [ "${STALWART_RANDOM_PORTS:-0}" = "1" ] || [ "${STALWART_PORT:-0}" = "0" ]; then
command -v python3 >/dev/null || {
echo "python3 not in PATH — cannot choose random Stalwart ports"
exit 1
}
read -r STALWART_PORT STALWART_IMAP_PORT STALWART_SMTP_PORT < <(
python3 - <<'PY'
import socket
ports = []
for _ in range(3):
sock = socket.socket()
sock.bind(("127.0.0.1", 0))
ports.append(str(sock.getsockname()[1]))
sock.close()
print(" ".join(ports))
PY
)
else
: "${STALWART_PORT:?STALWART_PORT is not set — run this inside nix develop}"
STALWART_IMAP_PORT="${STALWART_IMAP_PORT:-$((STALWART_PORT + 1))}"
STALWART_SMTP_PORT="${STALWART_SMTP_PORT:-$((STALWART_PORT + 2))}"
fi
export STALWART_PORT STALWART_IMAP_PORT STALWART_SMTP_PORT
export STALWART_URL="http://127.0.0.1:${STALWART_PORT}"
TMPDIR="${STALWART_TMPDIR:-/tmp/stalwart-dev-${STALWART_PORT}}"
mkdir -p "$TMPDIR"
for port in "$STALWART_PORT" "$STALWART_IMAP_PORT" "$STALWART_SMTP_PORT"; do
ss -ltnH "sport = :$port" | grep -q . && {
echo "Stalwart port $port is already in use"
exit 1
}
done
cat >"${TMPDIR}/ports.env" <<EOF
export STALWART_PORT=${STALWART_PORT}
export STALWART_IMAP_PORT=${STALWART_IMAP_PORT}
export STALWART_SMTP_PORT=${STALWART_SMTP_PORT}
export STALWART_URL=${STALWART_URL}
EOF
echo "Stalwart ports: JMAP=${STALWART_PORT} IMAP=${STALWART_IMAP_PORT} SMTP=${STALWART_SMTP_PORT}" >&2
echo "Stalwart is running in the foreground. Press Ctrl+C to stop." >&2
echo "Connection info written to ${TMPDIR}/ports.env" >&2
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
sed -e "s|127.0.0.1:8080|127.0.0.1:${STALWART_PORT}|" \
-e "s|127.0.0.1:1430|127.0.0.1:${STALWART_IMAP_PORT}|" \
-e "s|127.0.0.1:1025|127.0.0.1:${STALWART_SMTP_PORT}|" \
-e "s|/tmp/stalwart-dev|${TMPDIR}|" \
"${REPO_ROOT}/stalwart-dev/config.toml" >"${TMPDIR}/config.toml"
exec stalwart --config "${TMPDIR}/config.toml"