# CloudPanel — Python dependencies
#
# Installed into the panel virtualenv during installation:
#   /usr/local/CloudPanel/venv/bin/pip install -r /usr/local/CloudPanel/requirements.txt
#
# Target runtime: CPython 3.14 on Ubuntu 26.04 LTS (3.12 on the 24.04 fallback).
# Ubuntu 26.04 ships Python 3.14 as the system interpreter and the panel venv
# is built from it, so EVERY compiled pin here must have a cp314 manylinux
# wheel -- or the installer must ship the -dev packages it needs to compile.
# Verify a pin with:
#   pip download NAME==VER --no-deps --only-binary=:all:
#     --python-version 314 --implementation cp --abi cp314
#     --platform manylinux2014_x86_64 -d /tmp
# Every pin is exact: a hosting control panel must install identically on every
# customer server, and an unexpected minor bump in a crypto or DB driver is an
# outage, not a feature.
#
# Build prerequisites on Ubuntu (handled by install/):
#   build-essential python3-dev pkg-config libssl-dev libffi-dev
#   default-libmysqlclient-dev zlib1g-dev libjpeg-dev
# NOT libmariadb-dev: it Conflicts with libmysqlclient-dev, which
# default-libmysqlclient-dev already pulled in to build mysqlclient.

# --- Web framework -----------------------------------------------------------
Django==5.2.17
djangorestframework==3.18.1
django-cors-headers==4.9.0

# --- Database ----------------------------------------------------------------
# mysqlclient talks to MariaDB 11.4 (panel schema, PowerDNS schema, root
# provisioning connection). It publishes NO Linux wheels at any version and
# always compiles, so default-libmysqlclient-dev + pkg-config +
# build-essential must be installed BEFORE pip runs. 2.2.8 is the first
# release supporting 3.14; 2.3.0 is deliberately avoided (it turns
# concurrent connection use into a hard error under the panel's threads).
mysqlclient==2.2.8
sqlparse==0.6.0

# --- Application server ------------------------------------------------------
# gunicorn runs behind the OpenLiteSpeed reverse proxy on 127.0.0.1:8090.
# uvicorn serves TWO different things: it is only needed for the main panel
# if that is ever switched to the ASGI entry point (cloudpanel.asgi), and it
# is what runs webTerminal/service.py's small, separate ASGI app today (see
# systemd/cloudpanel-terminal.service) -- --ws wsproto there selects the
# pure-Python WebSocket backend below instead of uvicorn's optional
# 'websockets' extra, which this project does not install.
gunicorn==23.0.0
uvicorn==0.53.0

# --- Web terminal (webTerminal/service.py) -----------------------------------
# wsproto: pure-Python WebSocket protocol implementation; passed to uvicorn as
# `--ws wsproto`. h11 is wsproto's own HTTP/1.1 dependency for the opening
# handshake -- both py3-none-any, no compiled code anywhere in this stack.
# pyte: pure-Python VT100/xterm terminal emulator (LGPL-3.0) that renders the
# site user's shell session server-side; wcwidth is its own dependency for
# East-Asian/combining-character column widths. paramiko (below) is the SSH
# client the same service uses to reach sshd on 127.0.0.1.
h11==0.16.0
wsproto==1.3.2
wcwidth==0.9.1
pyte==0.8.2

# --- Background jobs (backups, SSL issuance, remote transfers) ----------------
# kombu and billiard are celery's own C-adjacent dependencies and the usual
# breakage point on a new interpreter; pinned to the pair celery 5.6.3 was
# released against, both of which have cp314 wheels.
celery==5.6.3
kombu==5.6.2
billiard==4.3.0
redis==5.2.1
hiredis==3.4.1

# --- Authentication and cryptography ----------------------------------------
# argon2-cffi backs Django's Argon2PasswordHasher (panel account passwords).
# bcrypt is required for legacy hash verification and by paramiko.
# cffi is the C-ABI bridge argon2-cffi-bindings loads at import time and a
# hard requirement of cryptography. 2.0.0 is the first release with a cp314
# wheel; unpinned, a resolver may pick an older one that has to compile.
cffi==2.1.1
argon2-cffi==25.1.0
argon2-cffi-bindings==26.1.0
bcrypt==5.0.0
cryptography==50.0.1
pyotp==2.10.0
qrcode==8.2
Pillow==12.3.0

# --- Remote access and storage backends --------------------------------------
# paramiko: SFTP backup destinations, remote server transfers, and (as of
# webTerminal/sshbridge.py) the browser terminal's own SSH client -- always to
# 127.0.0.1, as a website's own system user, never as root.
# boto3: S3 / S3-compatible backup destinations.
# PyNaCl is paramiko's Ed25519 backend and a compiled extension. Pinned
# because 1.6.2 is the first release with a cp314 wheel -- left unpinned it
# can resolve to 1.5.0, which would build from source and need libsodium.
PyNaCl==1.6.2
paramiko==3.5.1
boto3==1.43.98
botocore==1.43.98
# google-api-python-client + google-auth: Google Drive backup destinations.
# A service-account key is used (no interactive OAuth consent, nothing to
# refresh by hand on an unattended node). google-auth-httplib2 is the transport
# adapter the Drive client builds on and is not pulled in implicitly.
# Optional at runtime: plogical.backupUtilities.googleDriveAvailable() reports
# their absence and the panel hides the destination type instead of crashing.
google-api-python-client==2.185.0
google-auth==2.44.0
google-auth-httplib2==0.2.0

# --- DNS ---------------------------------------------------------------------
# dnspython verifies delegation and DNS-01 challenges before issuing certs.
dnspython==2.8.0

# --- HTTP client and system introspection ------------------------------------
# requests: acme.sh helpers, license/update checks, webhook notifications.
# psutil: CPU, memory, disk and per-process stats for the dashboard.
requests==2.34.2
urllib3==2.8.0
certifi==2026.7.22
psutil==7.2.2

# --- Date, time and serialisation helpers ------------------------------------
python-dateutil==2.9.0.post0
pytz==2024.2
PyYAML==6.0.3

# anthropic: Claude API client for the AI Website Builder (siteBuilder app).
# Pinned to the 1.x line; 1.x moved to httpx2 and dropped Python < 3.10.
# Check PyPI before bumping this: a version that was never published makes the
# venv stage of the installer fail, and that takes the whole install down.
anthropic==1.7.0

# anthropic's compiled transitive dependencies. install.sh ships no Rust
# toolchain, so a version without a cp314 wheel would try to build one and
# fail; both of these have one.
jiter==0.17.0
pydantic==2.13.5
