{"id":16179135,"url":"https://github.com/jonashackt/firefly-iii-ops","last_synced_at":"2026-01-19T06:33:14.616Z","repository":{"id":250157633,"uuid":"833582522","full_name":"jonashackt/firefly-iii-ops","owner":"jonashackt","description":"Having a look into personal finance management with Firefly III","archived":false,"fork":false,"pushed_at":"2025-06-03T09:02:16.000Z","size":152,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-03T19:46:30.276Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonashackt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-25T10:39:48.000Z","updated_at":"2025-06-03T09:02:17.000Z","dependencies_parsed_at":"2024-09-09T19:43:42.089Z","dependency_job_id":"5a98da9d-ad7b-4dc5-84b7-8176b77be8d7","html_url":"https://github.com/jonashackt/firefly-iii-ops","commit_stats":null,"previous_names":["jonashackt/firefly-iii-ops"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jonashackt/firefly-iii-ops","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonashackt%2Ffirefly-iii-ops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonashackt%2Ffirefly-iii-ops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonashackt%2Ffirefly-iii-ops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonashackt%2Ffirefly-iii-ops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonashackt","download_url":"https://codeload.github.com/jonashackt/firefly-iii-ops/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonashackt%2Ffirefly-iii-ops/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28562405,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T03:31:16.861Z","status":"ssl_error","status_checked_at":"2026-01-19T03:31:15.069Z","response_time":67,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-10T05:25:33.694Z","updated_at":"2026-01-19T06:33:14.608Z","avatar_url":"https://github.com/jonashackt.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# firefly-iii-ops\nHaving a look into personal finance management with Firefly III\n\n\nStumbled upon [firefly-iii](https://firefly-iii.org/) while migrating away from Apple products (Macs, iPhones, etc. - see https://github.com/jonashackt/mac-to-linux).\n\nI was looking for a multi-user, OpenSource-based, possibly self-hosted, personal and family finance management solution - which I can use together with my wife.\n\nThere are also other alternatives (see https://github.com/awesome-selfhosted/awesome-selfhosted#money-budgeting--management), but Firefly III seemed the most active developed solution to me.\n\n\u003e If you need some hints on how to find a suitable homeserver, have a look at this https://github.com/jonashackt/homeserver\n\n\n# Install Firefly III with Docker\n\n\u003e Be sure to have Docker installed, e.g. [I described it here, how to do it on Manjaro](https://github.com/jonashackt/mac-to-linux?tab=readme-ov-file#docker) \n\nhttps://docs.firefly-iii.org/how-to/data-importer/installation/docker/\n\nDownload the docker-compose.yml and `.env` files as described. Also change the db passwords and importer url values.\n\nThen run the compose install via:\n\n```shell\ndocker compose -f docker-compose.yml up -d --pull=always\n```\n\nNow access firefly iii on http://localhost\n\n\n# Update Firefly III with Docker\n\nSuper easy, see https://docs.firefly-iii.org/how-to/firefly-iii/upgrade/docker/\n\nJust run:\n\n```shell\ndocker compose -f docker-compose.yml up -d --pull=always\n```\n\n\n## Open port on your server\n\nSee https://www.digitalocean.com/community/tutorials/opening-a-port-on-linux\n\nIf you have an `ufw` based firewall (like on Manjaro), simply run\n\n```shell\nsudo ufw allow 4000\n```\n\nWhich also sustains reboots without further work.\n\nIf you choose the port `4000`, be sure to also change the `services:app:port` in the `docker-compose.yml` :\n\n```yaml\nservices:\n  app:\n    image: fireflyiii/core:latest\n    ...\n    ports:\n      - '4000:8080'\n    ...\n```\n\nRun `docker-compose down` and `up` again.\n\nNow access firefly iii can be found at http://localhost:4000\n\n\n\n## Accessing your local networks Firefly III from an Firefly supporting App\n\nThere are mutliple Apps that are able to use the Firefly API https://docs.firefly-iii.org/references/firefly-iii/third-parties/apps/\n\nEspecially the Abacus App https://github.com/victorbalssa/abacus (available for Android AND iPhone) looks really promising and is easy to configure to use your Firefly III installation.\n\nDownload the App from your Appstore and configure your local network's firefly url. Then log in using OAuth client token, provided by firefly at http://localhost:4000/profile\n\n\n## Tailscale: Make your homeserver available on the internet (for later app access)\n\nThere are multiple possibilities to make your homeserver accessible on the internet. See [this subreddit](https://www.reddit.com/r/synology/comments/otczia/is_there_an_actual_safe_way_to_access_my_nas_from/) for example.\n\nThey discuss VPN, reverse proxy, DynDNS or https://tailscale.com. I'd like to try the latter.\n\nWhich reads extremely great for me: https://tailscale.com/blog/how-tailscale-works \u0026 https://tailscale.com/blog/how-nat-traversal-works\n\n\n### Install tailscale on Manjaro\n\nhttps://tailscale.com/download/linux\n\nInstall the official client:\n\n```shell\npamac install tailscale\n```\n\nStart the `tailscaled` daemon as a system service:\n\n```shell\nsudo systemctl start tailscaled\n```\n\n\u003e To have tailscale start up with your homeserver booting, be sure to enable the systemctl service via\n\n```shell\nsudo systemctl enable tailscaled\n```\n\nConnect your server to tailscale.com\n\n```shell\nsudo tailscale up\n```\n\nNow use the link to authenticate your machine to your tailnet. That's it.\n\n\u003e You can also omit the default `key expiry` feature in tailscale, if you only connect trusted devices and don't want the connections to expire after 180 days. [See the docs](https://tailscale.com/kb/1028/key-expiry#disabling-key-expiry), you can disable it simply at the machines admin console at every single device: https://login.tailscale.com/admin/machines\n\n### Connect your (mobile) devices\n\nTo connect mobile devices, get the app from the app store and login via your IDP. Your mobile has automatically joined your tailnet.\n\nBy default tailscale MagicDNS is configured already. So if you add a machine having a hostname `myhomelab`, then all you need to access this machine is http://myhomelab! Pretty cool eh?!\n\n\n### Share your homeserver (or your full tailscale tailnet) with the other Firefly III users\n\n\u003e First you should create a `fun` DNS name for your tailnet. This can be done [in the `DNS` settings as described here](https://tailscale.com/kb/1217/tailnet-name#creating-a-fun-tailnet-name). With this you have a memorable url name rather than just a random number.ts.net\n\nIf it's your wife, you might just want here to join your tailnet anyways. If it's your kid, you might restrict access of devices a bit more. \n\nTo do the first, head over to https://login.tailscale.com/admin/users and click on `Invite external users` in the Invite users tab. Now share the link using mail or the link directly.\n\n\n### Tailscale magic dns sometimes not working (resolving): Using systemd-resolved\n\nI experienced random times, where the tailscale magic DNS aren't working as they should - this is [a documented issue with DNS and Tailscale on Linux systems](https://tailscale.com/kb/1188/linux-dns).\n\n\u003e There's a full summary article about this here https://tailscale.com/blog/sisyphean-dns-client-linux\n\nThe solution is to use systemd-resolved \u0026 NetworkManager and a specific symlink, which tells NetworkManager to use systemd-resolved instead of overriding `/etc/resolv.conf`.\n\nThe problem with Manjaro here: As per default, `systemd-resolved` is unused on Manjaro (it's service is still installed, but disabled) -[ but instead, `openresolv` is used](https://forum.manjaro.org/t/secure-conections-and-systemd-resolved/157998/4).\n\nAs [a Manjaro maintainer stated](https://forum.manjaro.org/t/secure-conections-and-systemd-resolved/157998/6):\n\n\u003e In any case - using systemd-resolved is the better option. One reason is the increased everyday use of VPN where using systemd-resolved solves a common issue where the resolv.conf is not reset correct when you disconnect your VPN.\n\n\u003e [The problem is the same with NordVPN on Manjaro](https://forum.manjaro.org/t/root-tip-how-to-nordvpn-on-manjaro/81016)\n\nI don't really get, why the Manjaro maintainer themselves say, systemd-resolved is the better option, but still provide openresolv but anyway. We want to solve the issue!\n\n[The solution](https://tailscale.com/kb/1188/linux-dns) is to backup the `resolve.conf`, enable `systemd-resolved` to take over the DNS game on Manjaro, uninstall `openresolv` \u0026 create the symlink for NetworkManager:\n\n```shell\n# backup the `resolve.conf`\nsudo mv /etc/resolv.conf /etc/resolv.conf.bak\n# enable `systemd-resolved` to take over the DNS game on Manjaro\nsudo systemctl enable systemd-resolved --now\n# uninstall `openresolv`\npamac remove openresolv\n# make symlink for NetworkManager which then uses systemd-resolved and doesn't take over the resolv.conf file\nsudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf\n``` \n\nAfter manually restarting all services as described in the tailscale docs (via `sudo systemctl restart systemd-resolved` etc), tailscale was still complaining about the Linux DNS configuration not beeing ok (and NetworkManager and systemd-resolved not beeing wired together correctly). But this problem was solved making a full system restart. Now `tailscale status` does not complain anymore!\n\n\n\n\n\n\n# Firefly recurring jobs with cron in Docker\n\nIf you visit the Standing Order page in Automation the first time, you might notice a blue message on the top stating that your cron job hasn't been running.\n\nHaving leveraged the Docker Compose setup, activating cron in Firefly is easy. Since a cron container is already present in the `docker-compose.yml`. But you need to alter it and add the command line token shown in the `Profile` section of the `Settings` page in Firefly III. For more info have a look into the docs https://docs.firefly-iii.org/how-to/firefly-iii/advanced/cron/#docker-compose\n\nSimply add your token in the cron container command instead of `REPLACEME`. After that you need to restart your Docker Compose stack via:\n\n```shell\ndocker compose -f docker-compose.yml up -d --pull=always\n```\n\n\u003e WARNING: A `docker compose restart` command isn't enough to change the container command! To this to work, [it needs a container rebuild. Which only works with a `docker compose up`.](https://www.reddit.com/r/docker/comments/sxz70d/comment/hxv1c9y/?utm_source=share\u0026utm_medium=web3x\u0026utm_name=web3xcss\u0026utm_term=1\u0026utm_content=share_button)  \n\nIn your `docker-compose.yml` you can also configure the time you want the firefly cron job to run. I wanted to change the default to everyday at 7am - so I configured `sh -c \"echo \\\"0 7 * * * wget -qO- http://...`. See https://crontab.guru/#0_7_*_*_* for other options.\n\n\n\n# Backup Firefly III\n\nhttps://docs.firefly-iii.org/how-to/firefly-iii/advanced/backup/ \u0026 https://github.com/firefly-iii/firefly-iii/issues/4270\n\nThere's a backup script [which can be downloaded as GitHub gist](https://gist.github.com/dawid-czarnecki/8fa3420531f88b2b2631250854e23381). Download it to the folder where your `docker-compose.yml` and `.env` files reside and enable it's execution:\n\n```shell\nchmod +x firefly-iii-backuper.sh\n```\n\n\u003e I got the warning `[WARNING]  The following files were not found in /home/homepike/firefly: .*.env. Skipping.\n`\n\u003e To add the `.env` files all correctly to the `.tar`, I changed the third line of the script as follows:\n\n```shell\n# From\nfiles_to_backup=(.*.env docker-compose.yml )\n\n# to this\nfiles_to_backup=(.env .db.env .importer.env docker-compose.yml )\n```\n\nNow all files got correctly backuped.\n\nFirst try to execute the script from your firefly dir and create a example backup:\n\n```shell\nbash firefly-iii-backuper.sh backup $(date '+%F').tar\n```\n\nYou can extract the `.tar` and have a look into it. It should contain the `docker-compose.yml`, versions and especially the `firefly_db.sql` file. In order to verify everything went correctly, try to restore the backup immediately after the backup ran:\n\n```shell\nbash firefly-iii-backuper.sh restore 2024-08-06.tar\n```\n\nIt should print something like this:\n\n```shell\n[INFO]  Restoring the following files: .db.env .importer.env docker-compose.yml\n[WARNING]  The upload volume exists. Overwriting.\n[INFO]  Restoring database\n```\n\n\n## Automatically encrypted backups to Cloud Provider using openssl, rclone, systemd Timers \u0026 Google Drive\n\nBacking up your database is great, but you should also place the backups on another machine to mitigate hardware failure. \n\nBut right before uploading our backups to a Cloud Provider, we should encrypt them.\n\n\n### Encrypting the `.tar` with openssl\n\nBut before syncing our backup with a Google Drive, we should encrypt it, right. Otherwise the whole homeserver thingy wouldn't make any sense. The simplest idea was to encrypt the already tared `.tar`. There are [several possibilities on how to encrypt our a `.tar` file](https://stackoverflow.com/questions/57817073/how-to-encrypt-after-creating-tar-archive), I chose `openssl` here:\n\n```shell\nopenssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000000 -salt -pass pass:mypassword -in 2024-08-06.tar -out 2024-08-06.tar.openssl\n```\n\nThis will also omit the warning `*** WARNING : deprecated key derivation used. Using -iter or -pbkdf2 would be better.` [as described here](https://unix.stackexchange.com/a/507132/140406).\n\nUnecryption is possible adding the `-d` parameter to the command:\n\n```shell\nopenssl enc -d -aes-256-cbc -md sha512 -pbkdf2 -iter 1000000 -salt -pass pass:mypassword -in 2024-08-06.tar -out 2024-08-06.tar.openssl\n```\n\n\u003e Only be sure to have the `-salt` parameter added also, since otherwise I ran into the infamous `\"error reading input file\" and \"bad magic number\"` errors.\n\nWe also need to have an unintended execution of the `openssl` command in place, since we want to execute it from within a cron job later. Therefore we use the `pass file:myfile.txt` parameter instead like this:\n\n```shell\n# Create password file \u0026 insert your password\nnano fireflybackup.txt\n\n# encrypt\nopenssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000000 -salt -pass file:fireflybackup.txt -in 2024-08-06.tar -out 2024-08-06.tar.openssl\n\n# decrypt\nopenssl enc -d -aes-256-cbc -md sha512 -pbkdf2 -iter 1000000 -salt -pass file:fireflybackup.txt -in 2024-08-06.tar.openssl -out 2024-08-06-decrypted.tar\n```\n\nThis will produce an encrypted `2024-08-06.tar.openssl`, which we can now sync with cron to our Google Drive.\n\n\n\n## Use rclone to sync encrypted tar to Google Drive\n\nIf you want to use your Google Drive, you could use [the Gnome Online Service connection described here](https://github.com/jonashackt/mac-to-linux/blob/main/README.md#google-drive-desktop-file-sync). BUT I wouldn't recommend, it wasn't a stable solution for unattendet backups at least for me.\n\nSo I looked for an alternative (I already stumbled upon it, but didn't have the time to look into it): https://github.com/rclone/rclone\n\nFirst you need to install and configure rclone.\n\nInstall on Manjaro via:\n\n```shell\npamac install rclone\n```\n\nIn order to configure Google Drive with rclone, just have a look into the docs: https://rclone.org/drive/\n\nStart with running:\n\n```shell\nrclone config\n```\n\nAn interactive config wizard will guide you.\n\nBe sure to create your own OAuth Client ID \u0026 key as stated in https://rclone.org/drive/#making-your-own-client-id (which is rather nasty to do and Google also introduced a new verification step, where they really review the application, which can take weeks :( But the good thing is: the OAuth Client ID \u0026 Key will work right away)\n\nIf everything went correctly, try to list the files in your Drive using the name of your remote:\n\n```shell\nrclone lsd jonasdrive:\n```\n\nNow to copy our encrypted tar via rclone, execute:\n\n```shell\nrclone copy $HOME/firefly/$(date '+%F').tar.openssl jonasdrive:firefly_backup\n```\n\n\n\n### Create backup script to do the encryption and sync with rclone\n\nBefore we can think of a scheduled timer to execute our backup, we need something to execute at all. Therefore let's create a small bash script that will do the encryption of our `.tar` file and sync the encrypted tar to Google Drive using rclone:\n\n```shell\n#!/usr/bin/env bash\nset -euo pipefail\n\necho \"### This backups Firefly III database and settings to GDrive\"\nfirefly_home=/home/homepike/firefly\ndate_hour_min=$(date '+%F-%H-%M')\n\necho \"##### Create backup as .tar\"\nbash $firefly_home/firefly-iii-backuper.sh backup $firefly_home/$date_hour_min.tar\n\necho \"##### Encrypt .tar using openssl \u0026 remove tar locally\"\nopenssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000000 -salt -pass file:$firefly_home/fireflybackup.txt -in $firefly_home/$date_hour_min.tar -out $firefly_home/$date_hour_min.tar.openssl\nrm $firefly_home/$date_hour_min.tar\n\necho \"##### Sync encrypted .tar to Google Drive with rclone \u0026 remove it locally\"\nrclone copyto $firefly_home/$date_hour_min.tar.openssl jonasdrive:firefly_backup/$date_hour_min.tar.openssl\nrm $firefly_home/$date_hour_min.tar.openssl\n\necho \"##### Retrieve file from Google Drive with rclone again\"\nrclone copyto jonasdrive:firefly_backup/$date_hour_min.tar.openssl $firefly_home/$date_hour_min.tar.openssl.drive\n\necho \"##### Decrypt encrypted tar from Google Drive to see it would work for restore \u0026 remove openssl.drive file\"\nopenssl enc -d -aes-256-cbc -md sha512 -pbkdf2 -iter 1000000 -salt -pass file:$firefly_home/fireflybackup.txt -in $firefly_home/$date_hour_min.tar.openssl.drive -out $firefly_home/$date_hour_min.drive.decrypt.tar\nrm $firefly_home/$date_hour_min.tar.openssl.drive\n\n```\n\nThe example script also copies the encrypted tar back again from google Drive and decrypts it also again, just to make sure the decryption would also work. It also removes any tmp files used throughout the process and just leaves the final `$firefly_home/$(date '+%F').drive.decrypt.tar` locally for the reference.\n\n\n\n\n## Use systemd Timers instead of cron\n\n[As the docs state we can use a cron job](https://docs.firefly-iii.org/how-to/firefly-iii/advanced/backup/#automated-backup-using-a-bash-script-and-crontab).\n\nBut the days where cron was the only alternative are long gone. As the Arch wiki states:\n\n\u003e \"...here are many cron implementations, but none of them are installed by default as the base system uses systemd/Timers instead.\"\n\nSee [the benefits section of the Arch wiki](https://wiki.archlinux.org/title/Systemd/Timers#As_a_cron_replacement) also.\n\nSo the way to \"use cron\" today is Systemd Timers: https://wiki.archlinux.org/title/Systemd/Timers\n\nTo list all started timers run the following:\n\n```shell\nsystemctl list-timers\n```\n\nSee also https://blog.jlcarveth.dev/systemd_timers \u0026 https://documentation.suse.com/sle-micro/6.0/html/Micro-systemd-working-with-timers/index.html\n\nIn order to create our own systemd based Timer to run our backup, we need 2 additional files:\n\n```shell\nfireflybackup.service   - the service that will run the backup script\nfireflybackup.timer     - the timer that activates and controls our service\nfireflybackup.sh        - our backup script\n```\n\n### Create `fireflybackup.service`\n\nLet's first create our `fireflybackup.service` file in `/etc/systemd/system`:\n\n```shell\n[Unit]\nDescription=Service for Firefly III Backup to Google Drive\nWants=fireflybackup.timer\n\n[Service]\nType=oneshot\nExecStart=/home/homepike/firefly/fireflybackup.sh\nUser=homepike\nGroup=homepike\n\n[Install]\nWantedBy=timers.target\n```\n\n\u003e For more information about systemd service files, have a look at https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files\n\nAs you may see, I added the `User=` and `Group=` configuration in the `[Service]` section [to have systemd execute my backup script as a user](https://serverfault.com/questions/957323/systemd-start-as-unprivileged-user-in-a-group), that is registered to access rclone or the Gnome Google Drive integration.\n\nCheck if your service configuration is correct by running:\n\n```shell\nsystemd-analyze verify /etc/systemd/system/fireflybackup.*\n```\n\nWe can now already test drive our systemd powered backup (without the timer) by running:\n\n```shell\nsudo systemctl start fireflybackup.service\n```\n\nThis should already reveal the power of systemd, where we can use the `status` command to look for the actual status of our backup service:\n\n```shell\n$ sudo systemctl start fireflybackup.service \nWarning: The unit file, source configuration file or drop-ins of fireflybackup.service changed on disk. Run 'systemctl daemon-reload' to reload units.\n\n$ systemctl status fireflybackup.service\nWarning: The unit file, source configuration file or drop-ins of fireflybackup.service changed on disk. Run 'systemctl daemon-reload' to reload units.\n○ fireflybackup.service - Service for Firefly III Backup to Google Drive\n     Loaded: loaded (/etc/systemd/system/fireflybackup.service; disabled; preset: disabled)\n     Active: inactive (dead)\n\nAug 07 15:25:07 pikeserver fireflybackup.sh[433709]: the input device is not a TTY\nAug 07 15:25:07 pikeserver fireflybackup.sh[433642]: [INFO]  Backing up App \u0026 database version numbers.\nAug 07 15:25:07 pikeserver fireflybackup.sh[433642]: [INFO]  Backing up database\nAug 07 15:25:07 pikeserver fireflybackup.sh[433642]: [INFO]  Backing up upload volume\nAug 07 15:25:08 pikeserver fireflybackup.sh[433640]: ##### Encrypt .tar using openssl\nAug 07 15:25:09 pikeserver fireflybackup.sh[433640]: ##### Sync encrypted .tar to Google Drive\nAug 07 15:25:09 pikeserver fireflybackup.sh[433640]: ##### Retrieve file from Google Drive again\nAug 07 15:25:12 pikeserver fireflybackup.sh[433640]: ##### Decrypt encrypted tar from Google Drive to see it would work for restore\nAug 07 15:25:13 pikeserver systemd[1]: fireflybackup.service: Deactivated successfully.\nAug 07 15:25:13 pikeserver systemd[1]: Finished Service for Firefly III Backup to Google Drive.\n```\n\n### Create `fireflybackup.timer`\n\nNow that we have the service defined, let's define our `fireflybackup.timer` also in `/etc/systemd/system/`:\n\n```shell\n[Unit]\nDescription=Timer unit for fireflybackup.service\nRequires=fireflybackup.service\n\n[Timer]\nUnit=fireflybackup.service\nOnCalendar=*-*-* 10:00:00\nOnBootSec=5min\n\n[Install]\nWantedBy=timers.target\n```\n\nI wanted my backup to run every day at 10am and 5min after boot (if I would boot :D ).\n\n\u003e To configure the `OnCalender` to your time needed, there's also a handy command `systemd-analyze calendar weekly`, `systemd-analyze calendar minutely` etc. See https://wiki.archlinux.org/title/Systemd/Timers#Realtime_timer for more info\n\nCheck if your timer configuration is correct by running:\n\n```shell\nsystemd-analyze verify /etc/systemd/system/fireflybackup.*\n```\n\nIf that brings no errors, let's start our timer (as we're already used to from systemd services):\n\n```shell\nsudo systemctl start fireflybackup.timer\n```\n\nYou can now check your Google Drive if the encrypted tar was synced correctly.\n\nSince we want to enable our backup to really run regardless of reboots, enable the service as follows:\n\n```shell\nsudo systemctl enable fireflybackup.timer\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonashackt%2Ffirefly-iii-ops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonashackt%2Ffirefly-iii-ops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonashackt%2Ffirefly-iii-ops/lists"}