You want to self-host apps for fun or privacy - but not the ‘running servers in your garage’ type of self-hosted. In 2022 we live in a Golden Era of low-cost VPCs and hosting providers, and there has never been a better time for people looking to offload the frustrating parts of self-hosting, while still operating on a shoe-string budget (or free!).
Speaking of budgeting, you’re here because you want to host Actual and take control of your finances! These deployment instructions are available on the repo as well , but I wanted an excuse to go through the process of deploying onto Fly.io and documenting. Plus, now I can add pretty pictures, and who doesn’t love pretty pictures and see what they’re getting themselves into?
Your first step is to get the Actual server code on your machine and running.
git clone firstname.lastname@example.org:actualbudget/actual-server.git cd actual-server/ docker build -t actual-server . docker run -p 5006:5006 actual-server .... <lots of Docker output> ....
At this point, you should be able to navigate to localhost:5006 and see the Actual application! Awesome!
Now kill that process with
Ctrl+C and let’s put it somewhere with more longevity.
We need to take a quick detour to ensure you have an account with Fly.io .
flyctl CLI tool.
flyctl auth signup (for newbies), or
flyctl auth login (existing accounts).
⚠️ You will have to add credit card information to the account, so if that’s enough to keep you from using a free service 🤷- keep your usage to the free tier and you’ll have no issues.
We’re back on track! You should be back in the same
actual-server/ directory for the rest of the process. Deploying to Fly requires a few small tweaks to a config file, a couple commands, and then you’ll have a live app on the interwebs!
cp fly.template.toml fly.toml
flyctl launch --no-deploy
21:51:14:~/work/actual-server:(master) ▶ flyctl launch --no-deploy An existing fly.toml file was found for app actualbudget-otter ? Would you like to copy its configuration to the new app? Yes Creating app in /home/idk/work/actual-server Scanning source code Detected a Dockerfile app ? App Name (leave blank to use an auto-generated name): Automatically selected personal organization: Kevin ? Select region: ord (Chicago, Illinois (US)) Created app lively-meadow-7214 in organization personal Wrote config file fly.toml Your app is ready. Deploy with `flyctl deploy`
flyctl volumes create actualbudget_vol --size 1 -r ord
ℹ️ I set this to volume of 1 GB since I am deploying multiple apps on Fly, but the free tier supports up to 3GB for your account .
21:53:07:~/work/actual-server:(master) ▶ flyctl volumes create actualbudget_vol --size 1 -r ord ID: vol_<redacted> Name: actualbudget_vol App: lively-meadow-7214 Region: ord Zone: 4f52 Size GB: 1 Encrypted: true Created at: 07 May 22 01:53 UTC
Update the mounts section in the
source will be the name of your sweet new volume, and
destination is defined by Actual
. Now is also a great time to edit the app name - I got the fantastic
lively-meadow-7214, but not everyone will be that lucky.
[mounts] source="actualbudget_vol" destination="/data"
The big moment you’ve been waiting for - deployment! Run
flyctl deploy and watch the magic work.
21:55:35:~/work/actual-server:(master) ▶ flyctl deploy ==> Verifying app config --> Verified app config ==> Building image ==> Creating build context --> Creating build context done ==> Building image with Docker .... --> Pushing image done image: registry.fly.io/lively-meadow-7214:deployment-1651888549 image size: 242 MB ==> Creating release --> release v2 created --> You can detach the terminal anytime without stopping the deployment ==> Monitoring deployment 1 desired, 1 placed, 1 healthy, 0 unhealthy [health checks: 1 total, 1 passing] --> v0 deployed successfully
Now you have a live app running on Fly.io !
With a few commands and almost no thought required, I have a self-hosted Actual live and ready for use. Oh, the pretty pictures I promised!
The very first thing you’re greeted with is Actual prompting for server configuration, explained in more depth in the repo
. TL;DR You can just pick
Use this domain and not worry about it.
After that, I chose the option to fill Actual with demo data so I could play around and actually check out it’s features (see the image at top of page again).
I gotta hand it to the team at Fly, they’ve made it a very slick process for your first apps. Also thanks & congrats to @jlongster for building out a slick little tool and open-sourcing it for the community . Best of luck to them both.
Questions? Concerns? Big hugs? Let me know what you’re thinking on Twitter .
A simple guide to self-host a NocodDB Airtable alternative in just a few minutes, for free.
Let the nice robots at GitHub handle sending Venmo requests to your friends.
Ways to programmatically generate pages from data for Hugo. Automate your page creation.