Deploy UVdesk
Open-source helpdesk with a ticket queue, support portal and knowledgebase
uvdesk
Just deployed
/data
MySQL
Just deployed
/var/lib/mysql
mailpit
Just deployed
/data
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.

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.



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 on
php:8.2-apache, with theimap,mailparse,mysqli,intl,gdandzipextensions 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
- Docs: uvdesk.com
- Base image: php:8.2-apache
- Mail: 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.
Template Content
