Deploy Personal Management System
Private web app for your notes, contacts, passwords and finances
Just deployed
mailpit
Just deployed
/data
Just deployed
Just deployed
/data
mariadb
Just deployed
/var/lib/mysql
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.

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.

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 onphp:8.3-fpm-bookworm, nginx and php-fpm together; owns the schema, uploads and JWT keypair.frontend— the SPA repo built with Node 18, served bynginx:1.27-alpine.scheduler— the backend image withPMS_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, axllent/mailpit
- Docs: 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.
Template Content
