Deploy FreeScout
Zendesk alternative. Shared inbox and ticketing for customer support
MySQL
Just deployed
/var/lib/mysql
freescout
Just deployed
/data

Deploy and Host FreeScout on Railway
FreeScout is a free, open source help desk and shared mailbox that turns a support address such as support@yourcompany.com into a proper team inbox. Every customer email becomes a conversation with a status, an assignee and a full history, so two people never answer the same message twice. Written in PHP on the Laravel framework and licensed AGPL-3.0, it places no limit on agents, mailboxes or tickets — the thing that makes hosted help desks expensive as a team grows. Support teams, agencies and SaaS companies self-host FreeScout to keep customer conversations on infrastructure they control.
Deploy FreeScout on Railway and this template wires up the two services it needs: a FreeScout application service running nginx, PHP-FPM, a queue worker and a per-minute scheduler in one container, and a managed MySQL database holding conversations, customers, users and settings. A persistent volume at /data stores configuration, attachments, modules, sessions and cache, so nothing is lost when the container restarts. The application gets the public HTTPS domain; MySQL stays on Railway's private network. The scheduler is what makes this a help desk rather than a web form — it polls your mailboxes over IMAP, dispatches replies and sends digests, once a minute.

Getting Started with FreeScout on Railway
When the deploy finishes, open the generated Railway URL and you will land on the sign-in page. The first administrator is created during the initial boot from the ADMIN_EMAIL and ADMIN_PASS variables on the FreeScout service — open that service's Variables tab to read the generated password, sign in, then change it under your profile. FreeScout has no public registration route, so the instance is closed to strangers from the first request. Allow two to five minutes on the first boot while the schema is created.
Your first real action is creating a mailbox: Manage → Mailboxes → New Mailbox, entering the customer-facing address and a display name. In its settings, fill in Connection Settings (Incoming) with your IMAP host and credentials so mail is fetched, and Connection Settings (Outgoing) with SMTP details so replies reach customers — outgoing mail is not preconfigured and must point at your own provider. Then invite colleagues under Manage → Users. To confirm the deployment is healthy, open Manage → System → Status: it should report Protocol HTTPS, your MySQL version, every extension and folder permission OK, and a recent successful run of freescout:fetch-emails.

About Hosting FreeScout
A plain shared mailbox works until the team outgrows it: two agents reply to the same customer, someone forgets to follow up, and nobody can answer "how long are we taking to respond?"
Core features include:
- Shared mailboxes with unlimited agents, mailboxes and conversations
- Collision detection, showing when a colleague is replying
- Saved replies, notes, tags and custom folders for repetitive workflows
- Assignment and statuses (active, pending, closed, spam) with per-user queues
- Full-text search and customer profiles gathering past conversations
- A REST API, webhooks and a large module ecosystem — knowledge base, live chat, satisfaction ratings, time tracking, Slack and CRM add-ons
The architecture is deliberately small: one container serving the interface and running two background processes, one managed database, and one volume holding what must survive a redeploy — attachments and the encryption key in the configuration file.
Why Deploy FreeScout on Railway
Railway removes the server administration self-hosting normally implies:
- Managed MySQL with automatic private networking, no firewall rules to write
- A persistent volume for attachments, modules and configuration
- HTTPS and a public domain provisioned automatically
- Vertical scaling without migrating to a bigger VPS by hand
- No per-agent licensing — you pay for compute, not seats
Common Use Cases
- Running customer support for a SaaS product on
support@without per-seat fees - Giving an agency one shared inbox per client, each with its own team and signature
- Handling internal IT or HR queues where data must stay in your own infrastructure
Dependencies for FreeScout
- FreeScout application —
docker.io/nfrastack/freescout:latest, the image linked from FreeScout's own Docker documentation. Bundles nginx, PHP 8.5, the queue worker and scheduler, and creates the first admin on an empty database. - MySQL —
mysql:9.4, Railway's managed database. MySQL and MariaDB are FreeScout's best-tested engines. - Volume at
/data— configuration, attachments, modules and cache.
Environment Variables Reference
| Variable | Purpose |
|---|---|
APP_URL | Public URL; used in outgoing links and host validation |
ADMIN_EMAIL / ADMIN_PASS | First administrator, created only on an empty DB |
DB_* | Database driver, host, port, name and credentials |
SCHEDULER_TYPE | service runs worker and scheduler as long-lived processes |
FREESCOUT_APP_TRUSTED_PROXIES | ** trusts the full proxy chain so client IPs and HTTPS resolve |
FREESCOUT_MAIL_* | Optional SMTP settings for outgoing email |
Deployment Dependencies
- Source: https://github.com/freescout-help-desk/freescout
- Image: https://github.com/nfrastack/container-freescout
- Docs: https://github.com/freescout-help-desk/freescout/wiki
Hardware Requirements for Self-Hosting FreeScout
FreeScout is unusually light for a help desk, needing more room only as attachments accumulate.
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 512 MB | 2 GB |
| Storage | 5 GB volume | 20 GB+ for attachments |
| Database | MySQL 5.7+ / MariaDB 10.3+ | MySQL 9 |
| Runtime | PHP 8.1+ | PHP 8.5 |
Self-Hosting FreeScout
The image runs the whole application in one container. A minimal Docker Compose file mirroring the template:
services:
freescout:
image: docker.io/nfrastack/freescout:latest
ports: ["80:80"]
volumes: ["./data:/data"]
environment:
APP_URL: https://help.example.com
DB_TYPE: mysql
DB_HOST: db
DB_NAME: freescout
DB_USER: freescout
DB_PASS: change-me
ADMIN_EMAIL: admin@example.com
ADMIN_PASS: change-me-too
db:
image: mysql:9.4
volumes: ["./db:/var/lib/mysql"]
environment:
MYSQL_ROOT_PASSWORD: change-me-root
MYSQL_DATABASE: freescout
MYSQL_USER: freescout
MYSQL_PASSWORD: change-me
Any FreeScout setting passes through by prefixing it with FREESCOUT_; the prefix is stripped and the value written into the configuration file. Outgoing mail is the usual example:
FREESCOUT_MAIL_DRIVER=smtp
FREESCOUT_MAIL_HOST=smtp.yourprovider.com
FREESCOUT_MAIL_PORT=587
FREESCOUT_MAIL_ENCRYPTION=tls
FREESCOUT_MAIL_USERNAME=support@yourcompany.com
Installing from source means cloning the repository, running composer install, configuring .env, running php artisan migrate, and adding a crontab entry calling schedule:run every minute.
How Much Does FreeScout Cost to Self-Host?
FreeScout's core is free and open source under AGPL-3.0, with no agent limits, ticket limits or feature gating. The optional official modules are one-time purchases rather than subscriptions. On Railway you pay only for the compute, database and volume used — a few dollars a month for a small team, against roughly $20–$65 per user per month for Help Scout or $19–$115 per agent for Zendesk.
FAQ
What is FreeScout? A free, open source, self-hosted help desk and shared mailbox built with PHP and Laravel, widely used as a Zendesk and Help Scout alternative because it offers unlimited agents and conversations without a subscription.
What does this Railway template deploy?
A FreeScout application service with a persistent volume at /data, plus a managed MySQL database on Railway's private network. The application takes the public HTTPS domain and runs the queue worker and scheduler internally.
Why does the template include a MySQL database? FreeScout stores every conversation, thread, customer, user and setting relationally, and MySQL is what its developers test against most. The volume alongside it holds only files, so both are needed.
How do I connect my support email address to self-hosted FreeScout? Create a mailbox under Manage → Mailboxes, then fill in its incoming IMAP connection so mail is fetched and its outgoing SMTP connection so replies are delivered. Outgoing mail must point at your own provider.
How do I add more agents to FreeScout? Manage → Users → New User, then assign the account to the relevant mailboxes. There is no public sign-up page, so every account is created by an administrator, at no per-user charge.
Can I install FreeScout modules on Railway, and how do I upgrade?
Modules install into the /data volume and survive redeploys. To upgrade, redeploy to pull the current image — it detects the version change on boot and migrates automatically.
Template Content
MySQL
mysql:9.4freescout
nfrastack/freescout