Introduction

Budgeting apps that live in the cloud make a lot of people nervous, and honestly, that's fair. You're typing in your bank balances, your rent, your credit card debt — stuff you'd rather not hand over to a company you've never met. Actual Budget skips that problem entirely by living on hardware you control. If you've already got a Proxmox VE box humming away in a closet or a rack, you can have your own private budgeting server running in about ten minutes.

This guide walks you through installing Actual Budget in an LXC container on Proxmox VE using the Community Scripts project — the same set of helper scripts that a lot of the self-hosting community leans on for quick, sane container setups. No Docker Compose files to hand-write, no fighting with npm dependencies on your own. You run one command, answer a couple of prompts, and you've got a working budgeting server.

What You Will Learn

By the end of this tutorial you'll know how to:

  • Create a dedicated LXC container for Actual Budget using the Community Scripts installer
  • Access the web interface and create your first budget file
  • Understand what's actually happening inside that container (ports, storage, the self-signed certificate)
  • Update Actual Budget safely when a new version ships
  • Fix the handful of errors people run into most often, and back the thing up properly

What Is This Feature?

Actual Budget is an open-source personal finance app built around envelope budgeting — the old cash-in-envelopes method, just digital. You assign every dollar of income to a category (rent, groceries, savings, whatever) before you spend it, instead of tracking spending after the fact and hoping it works out. It's the same philosophy behind YNAB, if you've used that before, except Actual is free and the server is something you host yourself.

We're running it inside an LXC container, which is Proxmox's lightweight alternative to a full virtual machine. Instead of emulating an entire computer, an LXC container shares the host's Linux kernel and just isolates the processes and filesystem. That means it starts in a second or two, uses a fraction of the RAM a VM would need, and is plenty for an app like Actual that isn't doing anything CPU-heavy. For something this small — basically a Node.js web server and a SQLite-backed budget file — an LXC container is the obvious choice over spinning up a whole VM.

The installer itself comes from the Community Scripts project (community-scripts/ProxmoxVE on GitHub, the continuation of the popular scripts tteck used to maintain). It's a big library of bash scripts that automate the boring parts of standing up self-hosted apps on Proxmox: creating the container, picking sane defaults, installing dependencies, and setting the app up to start on boot.

Why Would You Use It?

If you're already tracking your spending in a spreadsheet, or paying a subscription for an app that syncs your bank data to someone else's servers, self-hosting Actual Budget gets you a few real advantages.

Your financial data never leaves your network unless you decide to expose it. There's no monthly fee — Actual Budget is free software, full stop. And unlike a spreadsheet, it syncs properly across your phone, laptop, and desktop, with a real budgeting engine underneath instead of formulas you have to maintain yourself.

I'll be upfront about the tradeoff: Actual doesn't do automatic bank syncing out of the box the way Mint or YNAB does (there are unofficial bank-sync add-ons, but they're a separate project and not something this guide covers). You're either importing statements periodically or entering transactions by hand. For a lot of people that's actually a feature — it forces you to look at every transaction — but it's worth knowing going in.

Prerequisites

Before you start, make sure you've got the following:

  • A working Proxmox VE host — this guide was tested on Proxmox VE 9.2, running on Debian 13 "Trixie" under the hood, but any 8.x or 9.x install will work the same way
  • At least 4 GB of free storage and 2 GB of free RAM on the host — the container itself is small, but Proxmox needs headroom for the rest of your VMs and containers too
  • Root shell access to the Proxmox host, either through the web console's Shell button on your node or over SSH
  • Your Proxmox host needs outbound internet access, since the install script pulls packages from Debian's repositories and the Actual Budget package from npm
  • A rough idea of your network's IP range, so you can find the container once it's up

You don't need to know Node.js, npm, or anything about how Actual Budget is built internally. The script handles that layer for you.

Step-by-Step Tutorial

Step 1: Open a shell on your Proxmox host

Log into the Proxmox web interface, click your node in the left-hand tree, and click Shell in the top-right corner. This drops you into a root terminal on the host itself — not inside any VM or container.

Step 2: Run the Community Scripts installer

Paste this command in and hit enter:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/actualbudget.sh)"

This downloads the install script and runs it immediately. You'll see a text-based menu (it uses whiptail, the same UI toolkit the Debian installer uses). Choose Default Settings unless you specifically need to change the container's ID, hostname, or resource allocation — the defaults are sensible for almost everyone.

With default settings, the script creates an unprivileged Debian 13 container with 2 vCPU cores, 2048 MB of RAM, and a 4 GB disk. That's plenty of headroom; Actual Budget itself typically sits well under 200 MB of RAM at idle.

Step 3: Wait for the build to finish

The script updates the container's package list, installs Node.js, pulls the @actual-app/sync-server package, and configures it to run as a systemd service. This takes somewhere between two and five minutes depending on your internet connection and how fast your storage is. When it's done, you'll see a summary block with the container's IP address and the URL to access it.

Step 4: Open the web interface

Point your browser at:

https://<container-ip>:5006

Your browser is going to throw a warning — something like "Your connection is not private" or "This connection is not secure." That's expected. Recent versions of the script enable HTTPS by default using a self-signed certificate, which encrypts the connection but isn't signed by a certificate authority your browser trusts. Click through the warning (in Chrome it's AdvancedProceed; in Firefox it's AdvancedAccept the Risk and Continue).

Step 5: Create your first budget file

The first time you load the page, Actual asks you to set a server password. This single password protects access to the whole server — it's not a per-user login system, so treat it like you'd treat the password on a router: strong, unique, and stored in a password manager.

After that, click Create new file, give your budget a name, and you're looking at a blank budget ready for categories. If you're coming from another app, Actual can import directly from YNAB4, nYNAB, and Actual's own export format through the same screen.

Step 6: Add it to your other devices

Actual has native apps for desktop (Windows, macOS, Linux) and mobile (iOS, Android). Point them at the same https://<container-ip>:5006 address and your server password, and your budget syncs across every device automatically — no separate cloud account required.

Commands Explained

A few commands are worth understanding, both for the install and for maintaining the container afterward.

CommandWhat it does
pct listLists every LXC container on the host, along with its ID and running status. Run this on the Proxmox host to find the VMID the script assigned your new container.
pct enter <vmid>Drops you into a root shell inside the specified container, as if you'd SSH'd into it directly. Useful for poking around without setting up SSH access.
systemctl status actualbudgetRun inside the container. Shows whether the Actual Budget service is currently active, and prints the last few log lines — the first place to look if the web page won't load.
journalctl -u actualbudget -fAlso run inside the container. Streams the live log output from the service, which is where you'll see actual error messages if something's misbehaving.
pct exec <vmid> -- systemctl restart actualbudgetRestarts the service from the Proxmox host, without needing to enter the container first.

Common Errors

A few problems come up often enough that they're worth calling out ahead of time.

Browser refuses to load the page at all, no certificate warning shown. This is usually a firewall or network issue, not an Actual Budget problem. Double-check that the container actually got an IP address by running pct exec <vmid> -- ip a on the host, and confirm you're on the same network segment as your Proxmox host (or that routing between the two is in place).

"SharedArrayBuffer is not defined" error in the browser console. This used to be a common issue on older installs running over plain HTTP, because SharedArrayBuffer requires a secure context to work in modern browsers. Since the Community Scripts installer enables HTTPS with a self-signed certificate by default now, new installs shouldn't hit this — but if you migrated an older container or manually disabled HTTPS, this is the cause.

Mobile app won't connect, even though the browser works fine. Mobile apps are often stricter about certificate validation than desktop browsers, and some won't let you click through a self-signed cert warning at all. The fix is to put Actual behind a reverse proxy with a real Let's Encrypt certificate (see Best Practices below) rather than relying on the self-signed one for anything beyond your local browser.

Install script fails with a DNS or package download error. This means the container couldn't reach the internet during setup. Check that your Proxmox bridge (usually vmbr0) has a working gateway and DNS configured, and that nothing on your network is blocking outbound HTTPS.

Troubleshooting

If Actual Budget was working and then stopped, start with the service status:

pct enter <vmid>
systemctl status actualbudget

If it shows as failed, check the logs with journalctl -u actualbudget -n 50 and look for the actual error near the bottom — Node.js apps tend to print a stack trace that tells you exactly what went wrong, usually a missing file or a permissions issue on /opt/actualbudget-data.

If you forgot your server password, there isn't a "forgot password" link in the UI. You'll need to edit the config file directly inside the container, at /opt/actualbudget-data/config.json, or reset it following the steps in Actual's own documentation — back up that file first, since editing it by hand can break the server if you get the syntax wrong.

If the container itself won't start from the Proxmox GUI, check Datacenter → your node → the container → Summary for a memory or storage warning. A container that's out of disk space on its root volume will often fail to boot cleanly rather than giving you a clear error.

Best Practices

This is your financial data, so treat the container a little more carefully than you might a media server.

Take regular Proxmox VE backups of the container using the built-in vzdump scheduler (Datacenter → Backup), not just a manual export from inside Actual. If the whole container disappears, a backup job means you're back up in minutes instead of rebuilding from scratch.

Don't expose port 5006 directly to the internet through your router. If you want access from outside your home network, put it behind a reverse proxy (Nginx Proxy Manager or Caddy both work well) with a proper Let's Encrypt certificate, and consider requiring a VPN like WireGuard or Tailscale instead of opening the port publicly at all.

Keep the container updated by re-running the same install command periodically — the script detects an existing installation and offers to update it rather than creating a second container. And honestly, don't skip the server password. It's the only thing standing between anyone on your network and your entire financial history.

Frequently Asked Questions

Is Actual Budget really free, with no premium tier?

Yes. The core app and self-hosted server are fully open source under the MIT license, with no paid tier gating features.

Can I run this in a VM instead of an LXC container?

You can, but there's not much reason to. Actual Budget is a lightweight Node.js process — a full VM adds boot time and RAM overhead for no real benefit here.

Does it sync in real time across devices?

Syncing happens whenever a device has a network connection to your server, which for most home setups is effectively instant. It's not a live collaborative editor, but changes propagate within seconds.

Is my budget data encrypted?

Actual supports end-to-end encryption for your budget file if you enable it in the file settings, on top of the HTTPS connection to the server itself.

Can I import data from YNAB or a spreadsheet?

Actual has a built-in importer for YNAB4 and nYNAB exports. For a spreadsheet, you'll need to format it as a CSV matching Actual's expected columns and use the CSV import option.

Conclusion

Ten minutes and one command gets you a private, ad-free budgeting server that answers to nobody but you. That's a pretty good trade for something that used to mean either a monthly subscription or a spreadsheet you had to babysit yourself. Once it's running, the maintenance is minimal — check in on updates every so often, keep your backups current, and let the LXC container do what it's good at: sitting quietly in the background, doing one job well.