Published on Apr 28 2026 in

This plugin provides a convenient web interface for managing Python virtual environments and deploying Python applications directly from DirectAdmin.

Features

See screenshots below.

Prerequisites

Before using the plugin, you should have multiple Python versions available and Phusion Passenger installed.

Below is a quick guide to launching your first Python application with the plugin.

Installation has been tested on RHEL 8 and RHEL 9 derivatives, including AlmaLinux and Rocky Linux.

Installation

You will receive the plugin download URL in your activation email.

  1. In DirectAdmin, go to: Extra Features → Plugin Manager

  2. Install the plugin.

  3. Log in as admin and open the plugin. Initially, you should see configuration details, but no installed Python versions.

Installing Python Versions with PyEnv

The plugin includes a helper script:

/usr/local/directadmin/plugins/python/bin/install_pyenv.sh

PyEnv supports over a thousand Python versions:

/opt/pyenv/bin/pyenv install --list

To choose which versions to install:

nano /usr/local/directadmin/plugins/python/bin/install_pyenv.sh

Uncomment or add the versions you need, or simply keep the defaults.

Then run:

/usr/local/directadmin/plugins/python/bin/install_pyenv.sh

Installation may take several minutes.

Once completed, upgrade pip versions if recommended by the installer.

Refresh the Config tab in the plugin. Installed Python versions should now appear and be ready for use.

Installing Passenger

Install Passenger using the included script:

/usr/local/directadmin/plugins/python/bin/install_passenger.sh

Passenger can also be used for Node.js and Ruby applications.

The installation may take a few minutes. Warnings during the process are usually normal.

If installation fails, run it in debug mode:

DEBUG=1 /usr/local/directadmin/plugins/python/bin/install_passenger.sh

The installer will apply a patch that places spawned processes in user’s cgroups splice so that DirectAdmin resource limits cover Passenger’s children.

CloudLinux Compatibility

The plugin can detect and import virtual environments created under CloudLinux.

By default, it uses:

python-selector.json

This can be changed in:

conf.php

Creating Your First Python Application

Create a new application from the plugin interface.

Typically, you only need to configure:

Virtual Environment Ready

After creation, the plugin prepares a virtual environment and a starter application.

You can already visit the assigned URL and see the default response.

Example Commands

Use the Examples tab to quickly install popular Python applications.

For example, choose Radicale and select the newly created virtual environment to generate customized installation commands.

Starting the Application

Start the app by:

touch tmp/restart.txt

or use the plugin’s Start/Stop controls.

The Start/Stop function also enables or disables .htaccess redirection to Passenger.

Passenger processes usually remain active for some time after use and shut down automatically after inactivity.

Accessing the Application

Visit your application’s URL.

For Radicale, log in using the credentials shown in the example.

Rebuild modes

Each application has up to three rebuild controls in the Actions column. A rebuild recreates the virtualenv from scratch and reinstalls packages — the app itself and its files are never touched.

🔴 Rebuild from imported packages

Visible only when an application was previously imported from CloudLinux (or another provider). During import a snapshot of the original package list is saved as exported_requirements.txt. This file is never overwritten — it is a permanent restore point.

Use this when: a strict or loose rebuild has broken something and you want to return to the exact state the application was in when it was first imported.

Packages are reinstalled at the exact versions recorded in exported_requirements.txt.

🟠 Rebuild — exact versions

Available for every application at any time. Before rebuilding, a snapshot of the currently installed packages with their exact versions is saved as requirements.last_strict_rebuild_try, overwriting any previous snapshot from this mode.

Use this when: you want to do a clean rebuild without changing anything — fixing a corrupted virtualenv while keeping every package at its current version.

Packages are reinstalled at exact versions taken from the live environment at the moment the rebuild is triggered.

🟢 Rebuild — latest compatible

Available for every application at any time. Before rebuilding, a snapshot of the currently installed packages (with versions, for reference) is saved as requirements.last_loose_rebuild_try, overwriting any previous snapshot from this mode.

Use this when: you want to refresh packages to the latest versions that pip can resolve — for example after a Python point-release, or to pick up security patches automatically.

Packages are reinstalled without version constraints, allowing pip to resolve the newest compatible versions.

Snapshot files

All snapshot files are stored inside the application’s virtualenv directory and can be inspected or downloaded from the file manager:

File Written by Contents
exported_requirements.txt Import (once, never overwritten) Exact versions from original environment
requirements.last_strict_rebuild_try 🟠 Rebuild — exact versions Exact versions at time of last strict rebuild
requirements.last_loose_rebuild_try 🟢 Rebuild — latest compatible Versions recorded before last loose rebuild

If a loose rebuild produces an incompatible result, use 🟠 to roll back to the last known-good exact state, or 🔴 to go all the way back to the imported baseline.

Logs

Global Passenger log:

/var/log/passenger.log

Per-application logs are stored in the path configured in application settings.

Coming Next

A dedicated Node.js plugin is planned next.

Notes

Language Translations

To add your own language:

  1. Copy an existing language directory from:
/usr/local/directadmin/plugins/python/lang
  1. Rename it to your language code.

  2. Translate strings inside:

messages.po
  1. For translating the menu, follow instructions in the HOWTO file inside the lang directory.

Feedback

Feature suggestions and feedback are welcome in the comments section or via the contact form available on the plugin’s Config page.