# CyberPanel Plugin System Guide **Author:** master3395 **Version:** 1.0.0 **Last Updated:** 2026-01-04 --- ## Overview CyberPanel includes a plugin system that allows developers to extend the functionality of the control panel. Plugins can add new features, integrate with external services, and customize the user experience. This guide covers: - Installing and managing plugins - Developing your own plugins - Plugin structure and requirements - Using the testPlugin as a reference --- ## Table of Contents 1. [Plugin Installation](#plugin-installation) 2. [Plugin Management](#plugin-management) 3. [Plugin Development](#plugin-development) 4. [Plugin Structure](#plugin-structure) 5. [TestPlugin Reference](#testplugin-reference) 6. [Best Practices](#best-practices) 7. [Troubleshooting](#troubleshooting) --- ## Plugin Installation ### Prerequisites - CyberPanel installed and running - Admin access to CyberPanel - Server with appropriate permissions ### Installation Steps 1. **Access Plugin Manager** - Log into CyberPanel as administrator - Navigate to **Plugins** → **Installed Plugins** - Click **Upload Plugin** button 2. **Upload Plugin** - Select the plugin ZIP file - Click **Upload** - Wait for upload to complete 3. **Install Plugin** - After upload, the plugin will appear in the plugin list - Click **Install** button next to the plugin - Installation process will: - Extract plugin files to `/usr/local/CyberCP/` - Add plugin to `INSTALLED_APPS` in `settings.py` - Add URL routing to `urls.py` - Run database migrations (if applicable) - Collect static files - Restart CyberPanel service 4. **Verify Installation** - Plugin should appear in the installed plugins list - Status should show as "Installed" and "Enabled" - Click **Manage** or **Settings** to access plugin interface ### Manual Installation (Advanced) If automatic installation fails or you need to install manually: ```bash # 1. Extract plugin to CyberPanel directory cd /home/cyberpanel/plugins unzip plugin-name.zip cd plugin-name # 2. Copy plugin to CyberPanel directory cp -r plugin-name /usr/local/CyberCP/ # 3. Add to INSTALLED_APPS # Edit /usr/local/CyberCP/CyberCP/settings.py # Add 'pluginName', to INSTALLED_APPS list (alphabetically ordered) # 4. Add URL routing # Edit /usr/local/CyberCP/CyberCP/urls.py # Add before generic plugin route: # path('plugins/pluginName/', include('pluginName.urls')), # 5. Run migrations (if plugin has models) cd /usr/local/CyberCP python3 manage.py makemigrations pluginName python3 manage.py migrate pluginName # 6. Collect static files python3 manage.py collectstatic --noinput # 7. Set proper permissions chown -R cyberpanel:cyberpanel /usr/local/CyberCP/pluginName/ # 8. Restart CyberPanel systemctl restart lscpd ``` --- ## Plugin Management ### Accessing Plugins - **Plugin List**: Navigate to **Plugins** → **Installed Plugins** - **Plugin Settings**: Click **Manage** or **Settings** button for each plugin - **Plugin URL**: Typically `/plugins/pluginName/` or `/plugins/pluginName/settings/` ### Enabling/Disabling Plugins Plugins are automatically enabled after installation. To disable: - Some plugins may have enable/disable functionality in their settings - To fully disable, you can remove from `INSTALLED_APPS` (advanced) ### Uninstalling Plugins 1. Navigate to **Plugins** → **Installed Plugins** 2. Click **Uninstall** button (if available) 3. Manual uninstallation: - Remove from `INSTALLED_APPS` in `settings.py` - Remove URL routing from `urls.py` - Remove plugin directory: `rm -rf /usr/local/CyberCP/pluginName/` - Restart CyberPanel: `systemctl restart lscpd` --- ## Plugin Development ### Creating a New Plugin 1. **Create Plugin Directory Structure** ``` pluginName/ ├── __init__.py ├── models.py # Database models (optional) ├── views.py # View functions ├── urls.py # URL routing ├── forms.py # Forms (optional) ├── utils.py # Utility functions (optional) ├── admin.py # Admin interface (optional) ├── templates/ # HTML templates │ └── pluginName/ │ └── settings.html ├── static/ # Static files (CSS, JS, images) │ └── pluginName/ ├── migrations/ # Database migrations │ └── __init__.py ├── meta.xml # Plugin metadata (REQUIRED) └── README.md # Plugin documentation ``` 2. **Create meta.xml** ```xml Plugin Name Utility Plugin description 1.0.0 /plugins/pluginName/ /plugins/pluginName/settings/ ``` 3. **Create URLs (urls.py)** ```python from django.urls import re_path from . import views app_name = 'pluginName' # Important: Register namespace urlpatterns = [ re_path(r'^$', views.main_view, name='main'), re_path(r'^settings/$', views.settings_view, name='settings'), ] ``` 4. **Create Views (views.py)** ```python from django.shortcuts import render, redirect from functools import wraps def cyberpanel_login_required(view_func): """Custom decorator for CyberPanel session authentication""" @wraps(view_func) def _wrapped_view(request, *args, **kwargs): try: userID = request.session['userID'] return view_func(request, *args, **kwargs) except KeyError: from loginSystem.views import loadLoginPage return redirect(loadLoginPage) return _wrapped_view @cyberpanel_login_required def main_view(request): context = { 'plugin_name': 'Plugin Name', 'version': '1.0.0' } return render(request, 'pluginName/index.html', context) @cyberpanel_login_required def settings_view(request): context = { 'plugin_name': 'Plugin Name', 'version': '1.0.0' } return render(request, 'pluginName/settings.html', context) ``` 5. **Create Templates** - Templates should extend `baseTemplate/index.html` - Place templates in `templates/pluginName/` directory ```html {% extends "baseTemplate/index.html" %} {% load static %} {% load i18n %} {% block title %} Plugin Name Settings - {% trans "CyberPanel" %} {% endblock %} {% block content %}

Plugin Name Settings

{% endblock %} ``` 6. **Package Plugin** ```bash cd /home/cyberpanel/plugins zip -r pluginName.zip pluginName/ ``` --- ## Plugin Structure ### Required Files - **meta.xml**: Plugin metadata (name, version, description, URLs) - **__init__.py**: Python package marker - **urls.py**: URL routing configuration - **views.py**: View functions (at minimum, a main view) ### Optional Files - **models.py**: Database models - **forms.py**: Django forms - **utils.py**: Utility functions - **admin.py**: Django admin integration - **templates/**: HTML templates - **static/**: CSS, JavaScript, images - **migrations/**: Database migrations ### Template Requirements - Must extend `baseTemplate/index.html` (not `baseTemplate/base.html`) - Use Django template tags: `{% load static %}`, `{% load i18n %}` - Follow CyberPanel UI conventions ### Authentication Plugins should use the custom `cyberpanel_login_required` decorator: - Checks for `request.session['userID']` - Redirects to login if not authenticated - Compatible with CyberPanel's session-based authentication --- ## TestPlugin Reference The **testPlugin** is a reference implementation included with CyberPanel that demonstrates: - Basic plugin structure - Authentication handling - Settings page implementation - Clean URL routing - Template inheritance ### TestPlugin Location - **Source**: `/usr/local/CyberCP/testPlugin/` - **URL**: `/plugins/testPlugin/` - **Settings URL**: `/plugins/testPlugin/settings/` ### TestPlugin Features 1. **Main View**: Simple plugin information page 2. **Settings View**: Plugin settings interface 3. **Plugin Info API**: JSON endpoint for plugin information ### Examining TestPlugin ```bash # View plugin structure ls -la /usr/local/CyberCP/testPlugin/ # View meta.xml cat /usr/local/CyberCP/testPlugin/meta.xml # View URLs cat /usr/local/CyberCP/testPlugin/urls.py # View views cat /usr/local/CyberCP/testPlugin/views.py # View templates ls -la /usr/local/CyberCP/testPlugin/templates/testPlugin/ ``` ### Using TestPlugin as Template 1. Copy testPlugin directory: ```bash cp -r /usr/local/CyberCP/testPlugin /home/cyberpanel/plugins/myPlugin ``` 2. Rename files and update content: - Update `meta.xml` with your plugin information - Rename template files - Update views with your functionality - Update URLs as needed 3. Customize for your needs: - Add models if you need database storage - Add forms for user input - Add utilities for complex logic - Add static files for styling --- ## Best Practices ### Security - Always use `cyberpanel_login_required` decorator for views - Validate and sanitize all user input - Use Django's form validation - Follow CyberPanel security guidelines - Never expose sensitive information in templates or responses ### Code Organization - Keep files under 500 lines (split into modules if needed) - Use descriptive function and variable names - Add comments for complex logic - Follow Python PEP 8 style guide - Organize code into logical modules ### Templates - Always extend `baseTemplate/index.html` - Use CyberPanel's existing CSS classes - Make templates mobile-friendly - Use Django's internationalization (`{% trans %}`) - Keep templates clean and readable ### Database - Use Django migrations for schema changes - Add proper indexes for performance - Use transactions for multi-step operations - Clean up old data when uninstalling ### Testing - Test plugin installation process - Test all plugin functionality - Test error handling - Test on multiple CyberPanel versions - Test plugin uninstallation ### Documentation - Include README.md with installation instructions - Document all configuration options - Provide usage examples - Include troubleshooting section - Document any dependencies --- ## Troubleshooting ### Plugin Not Appearing in List - Check `meta.xml` format (must be valid XML) - Verify plugin directory exists in `/home/cyberpanel/plugins/` - Check CyberPanel logs: `tail -f /var/log/cyberpanel/error.log` ### Plugin Installation Fails - Check file permissions: `ls -la /usr/local/CyberCP/pluginName/` - Verify `INSTALLED_APPS` entry in `settings.py` - Check URL routing in `urls.py` - Review installation logs - Check Python syntax: `python3 -m py_compile pluginName/views.py` ### Plugin Settings Page Not Loading - Verify URL routing is correct - Check template path (must be `templates/pluginName/settings.html`) - Verify template extends `baseTemplate/index.html` - Check for JavaScript errors in browser console - Verify authentication decorator is used ### Template Not Found Error - Check template directory structure: `templates/pluginName/` - Verify template name in `render()` call matches file name - Ensure template extends correct base template - Check template syntax for errors ### Authentication Issues - Verify `cyberpanel_login_required` decorator is used - Check session is active: `request.session.get('userID')` - Verify user is logged into CyberPanel - Check redirect logic in decorator ### Static Files Not Loading - Run `python3 manage.py collectstatic` - Check static file URLs in templates - Verify static files are in `static/pluginName/` directory - Clear browser cache ### Database Migration Issues - Check migrations directory exists: `migrations/__init__.py` - Verify models are properly defined - Run migrations: `python3 manage.py makemigrations pluginName` - Apply migrations: `python3 manage.py migrate pluginName` ### Plugin Conflicts - Check for duplicate plugin names - Verify URL patterns don't conflict - Check for namespace conflicts in `urls.py` - Review `INSTALLED_APPS` for duplicate entries --- ## Plugin Examples ### Available Plugins 1. **testPlugin**: Reference implementation for plugin development 2. **discordWebhooks**: Server monitoring and notifications via Discord 3. **fail2ban**: Fail2ban security manager for CyberPanel ### Plugin Repository Community plugins are available at: - GitHub: https://github.com/master3395/cyberpanel-plugins --- ## Additional Resources - **CyberPanel Documentation**: https://cyberpanel.net/KnowledgeBase/ - **Django Documentation**: https://docs.djangoproject.com/ - **Plugin System Source**: `/usr/local/CyberCP/pluginInstaller/` - **Plugin Holder**: `/usr/local/CyberCP/pluginHolder/` --- ## Support For plugin development questions: - Check existing plugins for examples - Review CyberPanel source code - Ask in CyberPanel community forum - Create an issue on GitHub --- **Last Updated:** 2026-01-04 **Author:** master3395