# Changelog
# 2.0.0 - 2026-11-08
A new library under the same name. The server only needs SSH and systemd: the deploy
brings uv, Python and the app, with no sudo and no system packages, the same on any
distribution. Everything lives in ~/.pyeasydeploy on the server.
# Changed (breaking)
connect(Host(...))is gone. Functions take an immutableServer(address,user,auth,port) and the library keeps one SSH connection perServerinside.fabric_connection(server)returns it, for anything the library does not do.sudo_passwordis gone: nothing needs sudo.- The interpreter comes from uv, not from
/usr/bin:ensure_uv(server)uploads the latest uv (or the one aturl), andensure_python(uv, "3.13")installs Python with it.get_python_instances,get_target_python_instance,get_any_python_instanceandPythonInstanceare gone. - Apps are deployed from their
uv.lockwithdeploy_app(python, App(...)): each deploy is a new release with its own venv,currentpoints at it, and the two newest are kept. Itsenvironmentsets the app's variables. Withpackage, only whatuv.lockpoints to in the workspace is uploaded. A command that cannot start makes the deploy fail.create_venv,delete_venv,run_in_venv, the fourinstall_*functions,upload_file,upload_directoryandDEFAULT_IGNOREare gone. - Apps run as systemd user services instead of supervisord, and their output goes to the
systemd journal:
app_status,app_logs,restart_appandstop_app. Enabling lingering once, as root, is the only setup.SupervisorService,Optionand thesupervisor_*functions are gone. pytypehintis pinned to==1.2.3.
# Fixed
- Removals can no longer escape their folder: every path is normalized and must be
strictly inside
~/.pyeasydeploy, where 1.x checked a list of system roots that/usr/../etcor a home directory got past. - The key path of a
Keyexpands~.
# Added
examples/: a small HTTP app with itsuv.lock, and thedeploy.pythat deploys it.
# 1.0.4 - 2026-09-29
# Changed
- Documentation only: the README's Documentation list links each page on the documentation site, so readers on GitHub and PyPI land there. The code is the same as 1.0.3.
# 1.0.3 - 2026-09-29
# Changed
- Documentation only. The README becomes a short entrance to the documentation site,
https://offerrall.github.io/pyeasydeploy/, and
docs/overview.mdholds the introduction: what each step of a deploy does, and what the server needs. - A new
docs/reference.mdlists every public name.get_python_instances,delete_venv,install_package_from_github,supervisor_start,supervisor_stop,has_sudo_password,require_sudo,check_supervisor_installedandcreate_supervisor_configwere documented nowhere; the guide's examples import what they use. RELEASING.mdmoves todocs/releasing.md. The "Changed in 0.1.5" note leaves the guide for its 0.1.5 entry here, and the changelog headings carry their release dates.pyproject.toml: the description matches the package docstring, and[project.urls]gainsDocumentation.
The code is the same as 1.0.2.
# 1.0.2 - 2026-09-29
# Added
- The
LICENSEfile with the MIT text thatpyproject.tomldeclares, shipped in the package. The code is the same as 1.0.1.
# 1.0.1 - 2026-09-29
# Changed
pytypehintis pinned to the exact version this release is tested with,==1.2.1, instead of>=1.2: a new pytypehint can no longer change what an installed pyeasydeploy does. The code is the same as 1.0.0.
# 1.0.0 - 2026-09-29
The models are rebuilt on pytypehint: deeply immutable, keyword-only, and validated from their types when built. What reaches the server (commands, files, their order) is the same as in 0.1.6.
# Changed (breaking)
- Python 3.11 or newer, and
pytypehintas a dependency. connect_to_host(host, user, password=..., key_filename=..., sudo_password=..., port=...)is nowconnect(Host(address=..., user=..., auth=..., sudo_password=..., port=...)), whereauthisPassword(value=...)orKey(path=...): exactly one, by type.VenvPython(venv_name, python_instance, venv_path)is nowVenv(python=..., path=...);create_venv(conn, python, path)takes those names.SupervisorService.extrais a tuple ofOption(key=..., value=...), written in that order, instead of a dict. A key given twice is rejected.- Models take keyword arguments only. Invalid values raise
SchemaTypeErrorandSchemaValueError(subclasses ofTypeErrorandValueError), naming the field.
# Fixed
- The README is
README.md, aspyproject.tomlsays: built on Linux, 0.1.6 had no long description. - The PyPI badge showed another package's version.
# Added
- Tests, and releases published to PyPI from GitHub releases.
- The documentation split into
docs/.
# 0.1.5 - 2026-08-04
# Changed
create_venvdeletes an existing environment and builds a new one. Passrecreate=Falseto reuse it.