Actual Budget

Actual Budget
Photo by micheile henderson / Unsplash

So Firefly III is nice, but I just can't figure out what exactly the budget system is trying to do. I can set it to automatically add an amount each month to a budget, but it doesn't always actually add it. Plus it seems to change the amount randomly, almost if it is asking me for a monthly amount, then dividing that by the number of days in the month and then applying the amount per day to future months. So months with 30 days get a different amount than months with 31 days. Also if I do not spend anything towards a budget it stops adding to it, instead zeroing it out. I know they say it isn't able to work as a "bucket budget" but when you literally have a "bucket budget" in the application I'm not sure what kind of budget you are using. I came across Actual Budget and it looks like it is more my speed so I'm going to give it a try.

Create Virtual Machine

Steps performed on HV-03 via Windows Admin Center

  • I navigate to Virtual Machines
  • I click on Add and then New
    • Name: ACTUAL-01
    • Generation: 2 (Recommended)
    • Virtual Processors: 2
    • Memory: 2GB
    • Virtual Switch: Default External Switch
    • Storage: 30GB
    • Select Install an operating system later
    • I click on Create
  • I select ACTUAL01
  • I click on Settings
  • I navigate to Disk
    • I click Add Disk
    • I select Use an Existing Hard Disk
      • Path: c:\Images\Debian\debian-12.1.0-amd64-netinst.iso
    • I click Save disk settings
  • I move to Boot Order
    • DVD
    • Hard Disk
    • Network adapter
    • I click Save boot order
  • I navigate to Security
    • Enable Secure Boot: Yes
    • Template: Microsoft UEFI Certificate Authority
    • I click Save security settings
  • I click on Close
  • I click on Power and then Start

Install Operating System

Steps performed on ACTUAL-01 via console

  • I select Install
  • Select a language: English
  • Select your location: United States
  • Configure the keyboard: American English
  • Hostname: ACTUAL-01
  • Domain name: domain.local
  • I save my root password
  • Full name for the new user: david
  • I save my david password
  • Select your time zone: Eastern
  • Partitioning method: Guided - use entire disk
  • Partitioning scheme: All files in one partition
  • Finish partitioning and write changes to disk? yes
  • Scan extra installation media: no
  • Debian archive mirror country: United States
  • Debian archive mirror: deb.debian.org
  • Participate in the package usage survey? yes
  • Choose software to install:
    • SSH server
    • Standard system utilities
  • I select Continue
  • I remove the Debian ISO and reboot

Configure Operating System

Configure Sudo

Steps performed on ACTUAL-01

  • apt install sudo
  • /sbin/adduser david sudo
    • Adding user 'david' to group 'sudo' ...
    • Done.

Configure Network

Steps performed on ACTUAL-01

  • nano /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 10.10.10.XXX
gateway 10.10.10.254
netmask 255.255.255.0
  • I save the file interfaces
  • systemctl restart networking

Steps performed on DC-02 via Windows Admin Center

  • I navigate to DNS
  • I select domain.local
  • I click on Create a new DNS record
    • DNS record type: Host (A)
    • Record Name: ACTUAL
    • FQDN: ACTUAL.domain.local
    • IP Address: 10.10.10.XXX
    • Time to live: 3600
    • I click on Create

Configure SSH Key

Steps performed on desktop via Windows Terminal

  • ssh-keygen -t ed25519
  • Move-Item -Path c:\Users\david\filename* -Destination c:\Users\david\.ssh -Force
  • I open Windows Terminal's Settings
  • I open the JSON file
  • I add the following:
            {
                "colorScheme": "Ubuntu-ColorScheme",
                "commandline": "ssh -i \"~/.ssh/actual-01\" [email protected]",
                "experimental.retroTerminalEffect": false,
                "font": 
                {
                    "face": "Cascadia Code"
                },
                "guid": "{0caa0dad-35be-5f56-a8ff-XXXXXXXXXXXX}",
                "hidden": false,
                "name": "ACTUAL-01",
                "tabTitle": "ACTUAL-01"
            },
  • I confirm the GUID is unique and save the JSON file

Configure SSH

Steps performed on ACTUAL-01

  • mkdir /home/david/.ssh
  • name /home/david/.ssh/authorized_keys
  • I paste in the public key and save authorized_keys
  • chmod 600 /home/david/.ssh/authorized_keys
  • sudo nano /etc/ssh/sshd_config
    • PermitRootLogin no
    • PubkeyAuthentication yes
    • PubkeyAcceptedKeyTypes ssh-ed25519
    • PasswordAuthentication no
    • AuthorizedKeysFile /home/david/.ssh/authorized_keys
  • I save the sshd_config file
  • sudo sshd -t
  • sudo systemctl restart ssh

Install Actual Budget's Dependencies

Steps performed on ACTUAL-01

  • sudo apt install docker
  • sudo apt install docker-compose

Install Actual Budget

Steps performed on ACTUAL-01

  • sudo mkdir /apps
  • sudo mkdir /apps/actual
  • cd /apps/actual
  • sudo nano docker-compose.yml
version: '3'
services:
  actual_server:
    image: docker.io/actualbudget/actual-server:latest
    ports:
      # This line makes Actual available at port 5006 of the device you run the server on,
      # i.e. http://localhost:5006. You can change the first number to change the port, if you want.
      - '5006:5006'
    environment:
      # Uncomment any of the lines below to set configuration options.
      # - ACTUAL_HTTPS_KEY=/data/selfhost.key
      # - ACTUAL_HTTPS_CERT=/data/selfhost.crt
      - ACTUAL_UPLOAD_FILE_SYNC_SIZE_LIMIT_MB=20
      - ACTUAL_UPLOAD_SYNC_ENCRYPTED_FILE_SYNC_SIZE_LIMIT_MB=50
      - ACTUAL_UPLOAD_FILE_SIZE_LIMIT_MB=20
      # See all options and more details at https://actualbudget.github.io/docs/Installing/Configuration
      # !! If you are not using any of these options, remove the 'environment:' tag entirely.
    volumes:
      # Change './actual-data' below to the path to the folder you want Actual to store its data in on your server.
      # '/data' is the path Actual will look for its files in by default, so leave that as-is.
      - /apps/actual:/data
    restart: unless-stopped
  • I saved the file docker-compose.yml
  • sudo docker-compose up -d

I've got to run while the container is still pulling the image down. I'll have to check on it tomorrow to see if it is working.