feat: add Python packaging metadata and a Nix flake
Build and publish container / build (pull_request) Successful in 7m8s

Package the proxy properly so it can be consumed outside a container, and
without downstream users vendoring a package definition into their own
configuration.

- pyproject.toml: setuptools metadata with a `legacy-email-proxy` console
  script. Runtime dependencies are read dynamically from requirements.txt, so
  the Docker build and the package cannot drift apart.
- proxy_server.run(): a synchronous entry point for the console script, since
  `main` is a coroutine and cannot be referenced by one directly. The
  `__main__` path is unchanged in behaviour.
- package.nix / flake.nix: the package, an overlay, and a dev shell. The test
  suite runs as part of the build, so `nix flake check` covers it.
- module.nix: a NixOS module exposing `services.legacy-email-proxy` with
  freeform `settings` (environment variables) and a separate `environmentFile`
  for credentials, so secrets stay out of the Nix store. Runs under
  DynamicUser with CAP_NET_BIND_SERVICE only while a listener needs a
  privileged port, and opens no firewall ports.

The Dockerfile and its CI workflow are deliberately untouched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Emma Thorpe
2026-08-21 13:05:34 +01:00
co-authored by Claude Opus 5
parent 4bde4f884d
commit fe540e1831
8 changed files with 353 additions and 1 deletions
+25
View File
@@ -0,0 +1,25 @@
[build-system]
requires = ["setuptools>=77"]
build-backend = "setuptools.build_meta"
[project]
name = "legacy-email-proxy"
version = "0.3.0"
description = "Unauthenticated POP3/SMTP front end proxied to authenticated IMAPS/SMTPS backends"
readme = "README.md"
requires-python = ">=3.12"
dynamic = ["dependencies"]
[project.scripts]
legacy-email-proxy = "proxy_server:run"
[project.urls]
Homepage = "https://code.emmathe.dev/lyrathorpe/legacy-email-proxy"
# requirements.txt stays the single source of runtime dependencies, so the
# Dockerfile and this file cannot drift apart.
[tool.setuptools.dynamic]
dependencies = { file = ["requirements.txt"] }
[tool.setuptools]
py-modules = ["proxy_server"]