---
title: "Deploy UVdesk"
description: "Open-source helpdesk with a ticket queue, support portal and knowledgebase"
category: "Other"
url: https://railway.com/deploy/uvdesk-helpdesk
---

# Deploy UVdesk

Open-source helpdesk with a ticket queue, support portal and knowledgebase

**[Deploy UVdesk on Railway](https://railway.com/template/uvdesk-helpdesk)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/uvdesk-helpdesk/manifest.json

- **Creator:** A3A
- **Category:** Other

## Template content

### uvdesk https://raw.githubusercontent.com/uvdesk/core-framework/v1.1.7/Resources/public/images/uvdesk-logo-symbol.svg

- **Source:** https://github.com/gridalpha/uvdesk-railway
- **Health check:** /healthz
- **Public domain:** Yes

### MySQL https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mysql.svg

- **Image:** mysql:9.4
- **Start command:** `docker-entrypoint.sh mysqld --innodb-use-native-aio=0 --disable-log-bin --performance_schema=0 --innodb-buffer-pool-size=1G`

### mailpit https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mailpit.svg

- **Image:** axllent/mailpit:latest
- **Health check:** /livez
- **Public domain:** Yes

## Documentation

# Deploy and Host UVdesk on Railway

UVdesk is an open-source helpdesk built by Webkul on Symfony and PHP. It gives a support team a shared ticket queue, a customer-facing support centre with a knowledgebase, agent roles and groups, saved replies, and automation rules that route or escalate tickets on their own. Teams reach for it when they want Zendesk-shaped support software without per-agent pricing, with the ticket history on their own infrastructure.

Self-host UVdesk on Railway and the stack arrives wired together. The template deploys three services: `uvdesk`, the Apache and PHP application serving the agent panel and the public support centre; `MySQL`, the managed database holding every ticket, thread, customer and setting; and `mailpit`, a capture-and-relay mail service so notifications work as soon as the deploy finishes. Browsers reach `uvdesk` over its public domain, the app talks to MySQL privately, and mail leaves through Mailpit's SMTP listener on 1025.

![Diagram of the UVdesk, MySQL and Mailpit services on Railway](https://res.cloudinary.com/rroe4rtk/image/upload/v1788798584/uvdesk-architecture.png)

## Getting Started with UVdesk on Railway

UVdesk normally opens on an installation wizard anyone who finds the URL can complete. This template closes that window: the container builds the schema, loads the default roles, ticket types, priorities and email templates, and creates your owner account before serving traffic. Set `UVDESK_ADMIN_EMAIL` and `UVDESK_ADMIN_PASSWORD` at deploy time — 8 to 32 characters — and those are your credentials. Nothing ships with a default password.

When the deploy is green, open `https://your-app.up.railway.app/en/member/login` and sign in as the owner. The panel opens on a module grid covering tickets, the knowledgebase and user management. To confirm the deployment end to end, open the support centre at `/en/customer/create-ticket/` in a second tab, submit a ticket as a customer, then switch back and watch it land in the agent queue. Open it and post a reply: it is stored against the thread and appears immediately. Then add agents under Users, and configure a mailbox in Settings so incoming email becomes tickets.

![UVdesk agent panel showing knowledgebase and user management modules](https://res.cloudinary.com/rroe4rtk/image/upload/v1788798586/uvdesk-agent-homepage.png)

![UVdesk ticket queue listing an open customer support ticket](https://res.cloudinary.com/rroe4rtk/image/upload/v1788798587/uvdesk-ticket-queue.png)

![Agent replying to a customer ticket inside UVdesk](https://res.cloudinary.com/rroe4rtk/image/upload/v1788798589/uvdesk-ticket-conversation.png)

## About Hosting UVdesk

UVdesk turns scattered support requests into one queue a team can work. A customer writes in through the web form, the support centre, or an email address you connect, and UVdesk opens a ticket with a threaded conversation, a priority, a type and a status. Agents reply, leave internal notes, hand tickets between groups and teams, and publish articles so common questions answer themselves. Self-hosting matters because those threads hold customer addresses and order numbers for years.

Key features:

- Threaded conversations with replies, forwards and private notes
- Public support centre with a searchable knowledgebase
- Email-to-ticket over IMAP, outbound replies through your own SMTP
- Agent roles, privileges, groups and teams for routing work
- Workflow automation and prepared responses for repeat requests
- A REST API and an extension framework

The architecture is deliberately small. `uvdesk` runs Apache with mod_php on one origin, `MySQL` is the single source of truth, and `mailpit` catches outbound mail so you can see what the helpdesk sends before pointing it at a real relay. A volume on `uvdesk` keeps attachments, uploads, sessions and the two config files the admin panel rewrites at runtime.

## Why Deploy UVdesk on Railway

Railway removes the server work self-hosting PHP usually means.

- Managed MySQL with backups, no database server to patch
- A persistent volume for attachments, uploads and sessions
- HTTPS and a public domain issued automatically
- Private networking between app, database and mail
- A health check that queries the database, not just Apache
- One-click redeploys when a new upstream release lands

## Common Use Cases

- A product team whose shared support inbox has outgrown itself
- An agency giving each client a branded support centre
- An internal IT desk fielding staff requests
- An online store handling order, refund and delivery queries

## Dependencies for UVdesk

- **UVdesk Community Skeleton v1.1.8** — built from [uvdesk/community-skeleton](https://github.com/uvdesk/community-skeleton) on `php:8.2-apache`, with the `imap`, `mailparse`, `mysqli`, `intl`, `gd` and `zip` extensions it requires
- **MySQL 9.4** (`mysql:9.4`) — tickets, threads, customers, agents and articles
- **Mailpit** (`axllent/mailpit:latest`) — SMTP on 1025, web inbox on 8025 behind basic auth

### Environment Variables Reference

| Variable | Purpose |
|---|---|
| `UVDESK_ADMIN_EMAIL` | Owner account created on first boot |
| `UVDESK_ADMIN_PASSWORD` | Password for it, 8–32 characters |
| `UVDESK_ADMIN_NAME` | Display name on the owner's replies |
| `DATABASE_URL` | MySQL connection string from the database service |
| `APP_SECRET` | Symfony signing key; changing it invalidates sessions |
| `UVDESK_SITE_URL` | Host used for ticket links in outgoing email |
| `UVDESK_MAILBOX_POLL_SECONDS` | Mailbox poll interval; `0` disables it |
| `UVDESK_REF` | Upstream release the image builds — bump to upgrade |
| `MP_UI_AUTH` | `user:password` protecting the Mailpit inbox |

### Deployment Dependencies

- Source: [uvdesk/community-skeleton](https://github.com/uvdesk/community-skeleton)
- Docs: [uvdesk.com](https://www.uvdesk.com/en/opensource/)
- Base image: [php:8.2-apache](https://hub.docker.com/_/php)
- Mail: [axllent/mailpit](https://hub.docker.com/r/axllent/mailpit)

## Hardware Requirements for Self-Hosting UVdesk

| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB | 2 GB |
| Storage | 5 GB volume | 10 GB+ as attachments grow |
| Runtime | PHP 8.1+, MySQL 5.7+ | PHP 8.2, MySQL 9 |

Memory bites first: PHP runs with a 512 MB per-request limit so large uploads and image processing do not fail, and MySQL wants headroom of its own. Storage grows with attachments, not tickets, so a queue full of screenshots fills a volume far faster than one full of text.

## Self-Hosting UVdesk

Upstream publishes no container image, so self-hosting means a source build. To run it locally with Composer, PHP and MySQL installed:

```
git clone https://github.com/uvdesk/community-skeleton.git
cd community-skeleton
composer install
php bin/console uvdesk:configure-helpdesk
```

That last command is interactive: it checks the connection, offers to create the schema, and prompts for the first super admin. For an unattended install — what this template does — call the two commands underneath it directly:

```
export DATABASE_URL="mysql://user:password@127.0.0.1:3306/uvdesk"
php bin/console uvdesk_wizard:database:migrate --no-interaction
php bin/console uvdesk_wizard:defaults:create-user \
  ROLE_SUPER_ADMIN "Helpdesk Owner" you@example.com "your-password" --no-interaction
```

Serve `public/` with Apache or nginx, front controller `public/index.php`. PHP 8.4 no longer bundles `imap`, which is why this template uses PHP 8.2.

## Is UVdesk Free?

UVdesk Community is free and open source — the skeleton under OSL-3.0, its bundles under MIT — with no agent limit and no paid tier gating features. Webkul sells a hosted SaaS product and paid add-on apps separately, but nothing here expires or phones home for a licence. On Railway you pay for compute, the database and the volume.

## FAQ

**What is UVdesk?**

UVdesk is an open-source helpdesk and ticketing system on Symfony and PHP, combining an agent panel, a customer support centre, a knowledgebase and email-to-ticket conversion in one self-hosted application.

**What does this Railway template deploy?**

Three services: the UVdesk application on Apache and PHP with a persistent volume, Railway's managed MySQL, and Mailpit for outbound mail. The app installs itself on first boot and creates your owner account, so the setup wizard is never exposed.

**Why does this template include MySQL and a mail service?**

UVdesk keeps every ticket, thread, customer, article and setting in MySQL — there is no file-based mode. The mail service is there because a helpdesk that cannot send a reply notification is half a product; Mailpit gives you a working SMTP endpoint and a visible inbox from day one, and swaps out for a real relay later.

**How do I set up email-to-ticket in self-hosted UVdesk?**

Sign in as the owner, open Settings, and add a mailbox with the IMAP host, username and password of the address that receives your support mail. Mailboxes are polled every five minutes and new messages become tickets; change `UVDESK_MAILBOX_POLL_SECONDS` to adjust that, or set `0` to turn polling off.

**How do I upgrade UVdesk to a newer release?**

Set the `UVDESK_REF` variable on the `uvdesk` service to the release tag you want and redeploy. The image rebuilds from that tag and reruns its migration step, a no-op when the schema is current. Take a database backup first, as with any schema change.

**Where are ticket attachments stored?**

On the volume mounted at `/data`, under `assets/` and `attachments/`, linked into the application's public directory. PHP execution is disabled for both paths, so an uploaded script cannot run. They survive redeploys, along with sessions and the mailbox configuration.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/uvdesk-helpdesk
