The tooling and long-running processes an application needs beyond its web server: Composer, Git, PM2 processes, Python app control, and custom services.
Getting here: Servers → a server → Applications → an application → Services
What appears depends on the application's technology. A Laravel application shows Composer; a Node application shows PM2 processes; a Python application shows its own restart control.
1. Composer
PHP dependency management, for Laravel, Magento, WordPress and other PHP stacks.
Install puts Composer on the server for this application, confirming with Composer installed successfully.
Composer Version — choose Composer v1 or Composer v2.
Update Composer Settings applies a version change.
Uninstall removes it — Composer uninstalled successfully.
Failures report the reason (Failed to install Composer) rather than leaving you with a half-installed tool.
2. Git
Version control on the server.
Install and Uninstall, with the same confirmation pattern — Git installed successfully, Failed to install Git.
Git is needed for deployments that pull from a repository. An application created from a Git repo generally has it already; install it here if you added the repository later.
3. PM2 processes — Node.js applications
PM2 keeps Node processes running, restarts them if they crash, and starts them again after a reboot. This section manages them.
Adding a process
Start Process takes:
| Field | Example | What it is |
|---|---|---|
| Process name | myapp-backend, laravel-worker | The name PM2 knows it by |
| Command / script | server.js | What to run |
Both are required — Process name and command are required.
Name processes for what they do. myapp-backend and myapp-worker are manageable in a list; index and index-2 are not.
Managing processes
Each process shows a live status:
| Status | Meaning |
|---|---|
| online | Running |
| stopped | Not running |
Controls per process:
- Restart process — after a deploy or a configuration change
- Stop process — Already stopped if it was not running
- Delete process — removes it from PM2 entirely
View logs / Hide logs shows that process's output, with Refresh logs to pull the latest. No log output or No logs available when there is nothing yet.
Status is read from PM2 on the server, not from what the panel last did — Failed to sync live status means it could not reach PM2, so what you are seeing may be stale.
Why processes stop unexpectedly
A crashed process is usually a code error, a missing environment variable, or a port already in use. The logs on this page are where the reason is, and reading them beats restarting repeatedly.
4. Python applications
For Django and Flask applications.
Python version — 3.11, 3.12, 3.13 (Latest) — selectable per application.
Restart restarts the application, confirming Python app restarted successfully or reporting Failed to restart Python app.
Restart after changing code, dependencies or environment variables. A Python application does not pick those up on its own the way an interpreted PHP page does.
5. Custom services
For anything the built-in options do not cover — a worker, a daemon, a listener.
Add Custom Service takes a service name and its content (the service definition). Both are required — Please provide both service name and content.
Edit Custom Service changes an existing one. Delete removes it, governed by its own permission (CustomService_Delete) separately from creating one.
On success: Service created and started successfully — note that it is started, not just defined.
Custom services are the escape hatch. Use them for a queue worker, a websocket server, an MQTT listener, or any process that must keep running and restart itself.
6. Common controls
Consistent across the tab:
| Control | What it does |
|---|---|
| Install / Uninstall | Add or remove the tool |
| Start / Stop / Restart | Control a running process |
| View logs / Hide logs | Show output inline |
| Refresh logs | Pull the latest |
| Edit / Delete | Change or remove a custom service |
Progress is always visible — Installing…, Starting…, Uninstalling…, Processing… — so a slow operation does not look like a frozen page.
Active / Inactive describe installed tooling; online / stopped describe running processes. The distinction matters: Composer is installed or not, a PM2 process is running or not.
7. Sensible practice
- Composer v2 unless a project pins v1.
- Name PM2 processes after their job, not their file.
- Read logs before restarting. A process that crashes on start will crash again; the reason is in the log.
- One process per job. A single process doing web serving and queue work cannot be restarted independently.
- Restart after deploying — Node and Python hold code in memory and will keep serving the old version otherwise.
- Delete processes you no longer use. A stopped process in the list is ambiguous; a deleted one is not.
8. Common problems
| Problem | Cause |
|---|---|
| Process shows stopped right after starting | It crashed — View logs for the reason |
| Process name and command are required | One of the two fields is empty |
| Failed to sync live status | The panel could not reach PM2; the status shown may be stale |
| Code deployed but old version still served | Node or Python process not restarted |
| Composer commands fail | Not installed, or the wrong version for the project |
| Deployment cannot clone | Git not installed |
| Please provide both service name and content | A custom service needs both |
| Custom service will not start | Its definition is wrong — check the content |
| Already stopped | Stop pressed on a process that was not running |
| No logs at all | The process never produced output, or never started |
9. How this relates to other tabs
| Tab | Scope |
|---|---|
| Services (this one) | Tooling and processes for this application |
| Other Services (server) | Shared infrastructure — RabbitMQ, OpenSearch, SMTP — for the whole server |
| Packages and Services (server) | System packages and system services |
| Cronjob | Scheduled tasks, as opposed to processes that run continuously |
The distinction that matters: a cron job runs and exits; a service keeps running. A queue worker belongs here, not in Cronjob.
Something here not matching what you see in the panel?
Tell us