---
title: "Deploy Personal Management System"
description: "Private web app for your notes, contacts, passwords and finances"
category: "Other"
url: https://railway.com/deploy/personal-management-system
---

# Deploy Personal Management System

Private web app for your notes, contacts, passwords and finances

**[Deploy Personal Management System on Railway](https://railway.com/template/personal-management-system)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/personal-management-system/manifest.json

- **Creator:** A3A
- **Category:** Other
- **Total deploys:** 1

## Template content

### scheduler https://cdn.jsdelivr.net/gh/Volmarg/personal-management-system-front@main/public/logo-white.svg

- **Source:** https://github.com/gridalpha/personal-management-system-railway
- **Health check:** /healthz

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

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

### frontend https://cdn.jsdelivr.net/gh/Volmarg/personal-management-system-front@main/public/logo-white.svg

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

### backend https://cdn.jsdelivr.net/gh/Volmarg/personal-management-system-front@main/public/logo-white.svg

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

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

- **Image:** mariadb:11.5.2
- **Start command:** `/bin/sh -c 'mkdir -p /var/lib/mysql/data && exec docker-entrypoint.sh mariadbd --datadir=/var/lib/mysql/data --bind-address=:: --innodb-buffer-pool-size=512M --max-connections=100'`

## Documentation

# Deploy and Host Personal Management System on Railway

Personal Management System is an open-source personal CRM: one private web app holding the notes, contacts, passwords, appointments, receipts, files and photos most people scatter across a phone, a cloud drive and three note apps. Its author built it for daily personal use, not teams — sixteen modules, no per-seat billing, no telemetry, a database you own. Self-host Personal Management System when you want one searchable home for data you will not hand to another platform.

Deploy Personal Management System on Railway and you get the full split architecture, not a cut-down container. `frontend` serves the Vue single-page app, `backend` runs the Symfony API behind nginx and php-fpm, `scheduler` runs the recurring-payments job, `mariadb` stores everything, and `mailpit` catches outgoing mail so password resets work as soon as the deploy is green. The browser talks to `frontend` and `backend` over public domains; those reach `mariadb` and `mailpit` privately.

![Diagram of the five Personal Management System services on Railway](https://res.cloudinary.com/rroe4rtk/image/upload/f_auto,q_auto/v1789617457/personal-management-system-architecture.webp)

## Getting Started with Personal Management System on Railway

Set `PMS_ADMIN_EMAIL`, `PMS_ADMIN_USERNAME` and `PMS_ADMIN_PASSWORD` before you deploy — those become your account. There is no default password and no open registration window: first boot creates the account before the app accepts a request, so nobody can claim your instance. Open the `frontend` domain, sign in, and you land on the dashboard with every module in the left rail.

Start with Notes. Open **Notes → Categories**, create one, then add a note inside it; it is stored in MariaDB immediately. Passwords, Contacts and Payments work the same way, and anything in Passwords is encrypted at rest with a key unique to your deployment. Adding a note and reloading is the quickest whole-stack check — a record that survives went through the API and database.

To prove the mail path, open the `mailpit` domain (it asks for the `MP_UI_AUTH` credentials) and use **Forgot password**: the message lands in that inbox.

![Personal Management System achievements grouped by difficulty](https://res.cloudinary.com/rroe4rtk/image/upload/f_auto,q_auto/v1789617460/personal-management-system-achievements.webp)
![Two saved notes inside a Personal Management System notes category](https://res.cloudinary.com/rroe4rtk/image/upload/f_auto,q_auto/v1789617462/personal-management-system-notes-category.webp)
![Reading a stored note with edit and delete controls](https://res.cloudinary.com/rroe4rtk/image/upload/f_auto,q_auto/v1789617463/personal-management-system-note-detail.webp)

## About Hosting Personal Management System

The project describes itself as a CMS or CRM for your own life: one module per concern, each a small CRUD app over a shared database. Because it is one MariaDB schema, search spans modules and a backup is a single dump.

- **Notes** in nested categories, rich-text, with per-note locking
- **Passwords** encrypted at rest, with a copy-to-clipboard reveal
- **Contacts** grouped, with typed phone, email and messenger entries
- **Payments** — bills, recurring payments, prices, money owed, incomes and charts
- **Schedules and Calendar** for renewals and recurring obligations
- **Goals, Todo, Achievements**, **Job** hours, **Travels**, **Health**, **Issues**, **Reports**
- **Files, Images and Videos** with masonry galleries and thumbnails

The split is deliberate. `frontend` is a static bundle, redeployable without touching the API. `backend` owns the schema, the uploads volume and the signing keys. `scheduler` runs the hourly job in its own container, `mariadb` has its own volume, and `mailpit` supplies SMTP with no signup.

## Why Deploy Personal Management System on Railway

Railway runs the whole five-service topology from one click:

- MariaDB, uploads and the mail store each get a persistent volume
- Private networking keeps the database and SMTP off the public internet
- TLS and domains are issued automatically for the web tier
- Health checks cover the API, SPA, scheduler and inbox
- Both app images build from source, so you can fork them

## Common Use Cases

- **A private replacement for scattered personal data** — notes, receipts and passwords behind one login you control.
- **Household finance tracking** — bills, recurring payments, money owed and price history, charted over your own numbers.
- **A personal knowledge base with attachments** — notes alongside uploaded scans, photos and documents.
- **Renewal tracking** — insurance, car servicing and subscriptions, surfaced on the dashboard and notification bell.

## Dependencies for Personal Management System

- **`backend`** — [Volmarg/personal-management-system](https://github.com/Volmarg/personal-management-system) on `php:8.3-fpm-bookworm`, nginx and php-fpm together; owns the schema, uploads and JWT keypair.
- **`frontend`** — [the SPA repo](https://github.com/Volmarg/personal-management-system-front) built with Node 18, served by `nginx:1.27-alpine`.
- **`scheduler`** — the backend image with `PMS_ROLE=scheduler`, running the recurring-payments job.
- **`mariadb`** — `mariadb:11.5.2`. MariaDB specifically: several migrations use MariaDB-only DDL that MySQL rejects.
- **`mailpit`** — `axllent/mailpit:latest`. SMTP on 1025 for the app, a web inbox behind basic auth.

### Environment Variables Reference

| Variable | Service | Purpose |
|---|---|---|
| `APP_SECRET` | backend, scheduler | Signs JWTs, seeds the encryption key; never change it |
| `DATABASE_URL` | backend, scheduler | MariaDB connection string |
| `PMS_ADMIN_EMAIL` | backend | Email for the account created on first boot |
| `PMS_ADMIN_PASSWORD` | backend | Password for that account |
| `PMS_ADMIN_LOCK_PASSWORD` | backend | Second password for the lock screen |
| `MAILER_DSN` | backend, scheduler | SMTP endpoint; a real relay delivers mail |
| `PMS_BACKEND_URL` | frontend | Public origin the SPA calls |
| `PMS_SCHEDULER_INTERVAL_SECONDS` | scheduler | Seconds between job runs |
| `MP_UI_AUTH` | mailpit | `user:password` guarding the inbox |

### Deployment Dependencies

- Runtime: PHP 8.3 with intl, pdo_mysql, gd, zip, OPcache and APCu; Node 18 to build the SPA
- Images: [mariadb](https://hub.docker.com/_/mariadb), [axllent/mailpit](https://hub.docker.com/r/axllent/mailpit)
- Docs: [volmarg.github.io](https://volmarg.github.io)

## Hardware Requirements for Self-Hosting Personal Management System

| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB | 2 GB |
| Storage | 5 GB for MariaDB, 5 GB for uploads | Grow with your media library |
| Runtime | PHP 8.3, MariaDB 11.5 | Same |

The API is comfortable at 512 MB; the memory-hungry SPA build runs on Railway's builders, not on your service.

## Self-Hosting Personal Management System with Docker

Upstream ships a Docker Compose setup for local use. Clone the backend and start it:

```
git clone https://github.com/Volmarg/personal-management-system.git
cd personal-management-system
docker compose up -d
```

The frontend is a separate repository, built and served as static files:

```
git clone https://github.com/Volmarg/personal-management-system-front.git
cd personal-management-system-front
npm ci && npm run build
npx http-server ./dist --port 4001
```

Two values decide whether that pair talks to each other. `VITE_BACKEND_BASE_URL` in `.env.production` is baked into the bundle at build time, so it must point at the API before you build. And `src/config/prod/jwt.json` holds the public key the SPA checks every token against — generate a fresh API keypair and its public half must go in that file, or every login fails with an invalid-signature message. The template handles both.

## Is Personal Management System Free?

Yes. The project is MIT-licensed and free to self-host: no paid tier, no seat limits, no hosted edition. MariaDB and Mailpit are open source too. On Railway you pay only for the compute and volumes the five services use — small for a personal instance, growing with how much media you upload.

## FAQ

**What is Personal Management System?**
An open-source, self-hosted web app for personal data — notes, contacts, passwords, finances, schedules, files and images — in one place, on a database you control.

**What does this Railway template deploy?**
Five services: the Vue frontend, the Symfony API, a scheduler for the recurring-payments job, MariaDB 11.5, and Mailpit. The database, uploads and mail store each sit on a persistent volume.

**Why does the template include MariaDB rather than MySQL?**
Several migrations use MariaDB-only syntax such as `ADD COLUMN IF NOT EXISTS`, which MySQL rejects partway through the schema. MariaDB 11.5 is what upstream develops against.

**Do I need to configure SMTP before deploying?**
No. Mailpit ships with the template and captures everything the app sends, so password resets work immediately. Swap `MAILER_DSN` for a real relay to deliver mail to a real inbox.

**How do I create the first account in self-hosted Personal Management System?**
Not in the browser. Set `PMS_ADMIN_EMAIL`, `PMS_ADMIN_USERNAME` and `PMS_ADMIN_PASSWORD` before deploying and the account exists on first boot. Registration closes from that moment, because the app allows exactly one active user.

**Can I change APP_SECRET later?**
No. It is the JWT passphrase and the seed for the key encrypting your saved passwords, so changing it invalidates sessions and makes encrypted values unreadable. Set it once, back it up, leave it alone.

**How do I back up a self-hosted Personal Management System instance?**
Dump the MariaDB database and copy the backend volume, which holds every uploaded file plus the signing keys. Together they are a complete backup.


## 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/personal-management-system
