Railway

Deploy FreeScout

Zendesk alternative. Shared inbox and ticketing for customer support

Deploy FreeScout

Just deployed

/var/lib/mysql

Just deployed

/data

FreeScout logo

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.

FreeScout Railway architecture

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.

FreeScout new conversation composer with a file attachment FreeScout conversation thread showing a support reply FreeScout shared mailbox listing an assigned conversation

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 applicationdocker.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.
  • MySQLmysql: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

VariablePurpose
APP_URLPublic URL; used in outgoing links and host validation
ADMIN_EMAIL / ADMIN_PASSFirst administrator, created only on an empty DB
DB_*Database driver, host, port, name and credentials
SCHEDULER_TYPEservice 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

Hardware Requirements for Self-Hosting FreeScout

FreeScout is unusually light for a help desk, needing more room only as attachments accumulate.

ResourceMinimumRecommended
CPU1 vCPU2 vCPU
RAM512 MB2 GB
Storage5 GB volume20 GB+ for attachments
DatabaseMySQL 5.7+ / MariaDB 10.3+MySQL 9
RuntimePHP 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

More templates in this category

View Template
Rocky Linux
[Jul'26] Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀

codestorm
41
View Template
Foundry Virtual Tabletop
A Self-Hosted & Modern Roleplaying Platform

Lucas
71
View Template
Letta Code Remote
Run a Letta Code agent 24/7. No inbound ports, just deploy.

Letta
51