# Reference

Every public name, importable from pyeasydeploy. Models take keyword arguments only, are deeply immutable, and raise SchemaTypeError or SchemaValueError (subclasses of TypeError and ValueError) naming the field when a value is invalid. Every function that talks to the server takes the connection first; most also take verbose=True, which prints each step.

# Models

Name Fields Notes
Host address, user, auth, sudo_password=None, port=22 A server. auth is a Password or a Key. sudo uses sudo_password, or the SSH password when auth is a Password.
Password value SSH password, not empty.
Key path An SSH private key file on your machine, e.g. "~/.ssh/id_ed25519".
PythonInstance version, executable An interpreter on the server. version looks like "3" or "3.11"; executable is an absolute path.
Venv python, path A virtual environment on the server, bound to the PythonInstance that created it. path is absolute.
SupervisorService name, command, directory=None, user=None, autostart=True, autorestart=True, stdout_logfile, stderr_logfile, environment=None, extra=() A supervisord [program:name] entry. Fields set to None are left out of the file. The log files default to /var/log/supervisor/%(program_name)s.log and %(program_name)s_err.log.
Option key, value One supervisord option for SupervisorService.extra, written as key=value. value is a one-line str, an int or a bool (written true/false).

# Connection

Function Does
connect(host) An SSH connection (a Fabric Connection) to a Host. Lazy: a wrong password shows up on the first command.
has_sudo_password(conn) Whether the connection has a sudo password.
require_sudo(conn, what="this operation") Raises PermissionError at once if sudo would hang waiting for a password.

# Remote Python

Function Does
get_python_instances(conn) The python3 interpreters in /usr/bin, newest first. RuntimeError if there is none.
get_target_python_instance(conn, target_version) The newest interpreter matching target_version by components: "3.1" matches 3.1 only, "3" any 3.x. RuntimeError listing the available versions if none matches.
get_any_python_instance(conn) The newest python3 interpreter.

# Venvs

Function Does
create_venv(conn, python, path, recreate=True) Creates a Venv at path with uv installed in it and returns it. By default an existing venv there is removed first; recreate=False reuses it.
delete_venv(conn, venv) Removes the venv's directory.
run_in_venv(conn, venv, command, hide=False) Runs a shell command with the venv's bin/ first in PATH. The command reaches the remote shell as is. Returns Fabric's result.

# Packages

All four take use_uv=True (False installs with pip) and force=False (True passes --force-reinstall).

Function Does
install_packages(conn, venv, packages) Installs requirement specifiers from PyPI, e.g. ["fastapi", "requests>=2.31"].
install_local_package(conn, venv, local_package_dir) Uploads a local package (pyproject.toml or setup.py at its root) to a temporary directory and installs it with its dependencies.
install_package_from_github(conn, venv, github_repo_url) Installs from a repository the server can clone itself.
install_package_from_private_github(conn, venv, github_repo_url, branch=None) Clones on your machine with your git credentials, then uploads the source and installs it.

# Files

Both remove the destination first, and refuse system roots such as /, /etc, /home, /usr or /var with ValueError.

Name Does
upload_file(conn, local_file, remote_file, mode=None) Replaces remote_file with the local file, creating its parents. mode (e.g. 0o600) sets its permissions.
upload_directory(conn, local_dir, remote_dir, ignore=None, mode=None) Replaces remote_dir with a copy of local_dir. ignore holds name patterns; None means DEFAULT_IGNORE, [] uploads everything. mode applies to every file.
DEFAULT_IGNORE The name patterns skipped by default: .git, .venv, venv, __pycache__, .vscode, .idea, .pytest_cache, .mypy_cache, .ruff_cache, *.pyc, *.pyo, *.db, *.sqlite, *.sqlite3, .DS_Store.

# Services

All of these need sudo, except check_supervisor_installed and create_supervisor_config. Arch and Debian-based servers are supported, detected from /etc/os-release.

Function Does
install_supervisor(conn) Installs, enables and starts supervisord. Safe to run again.
check_supervisor_installed(conn) Whether supervisorctl is on the server.
create_supervisor_config(service) The INI text for a SupervisorService: the named fields that are not None, then extra in order. Local, touches no server.
deploy_supervisor_service(conn, service) Writes the service's configuration, replacing any with the same name, and reloads supervisord. It starts if autostart is set; a running service whose configuration changed is restarted.
supervisor_start(conn, service_name) supervisorctl start.
supervisor_stop(conn, service_name) supervisorctl stop.
supervisor_restart(conn, service_name) supervisorctl restart.
supervisor_status(conn, service_name=None) supervisorctl status of one service, or of all when service_name is None.