Mayank Chhabra
ae0791cac2
|
4 years ago | |
---|---|---|
.. | ||
.updateignore | 4 years ago | |
00-run.sh | 4 years ago | |
01-run.sh | 4 years ago | |
02-run.sh | 4 years ago | |
03-run.sh | 4 years ago | |
README.md | 4 years ago |
README.md
Over-The-Air (OTA) Updates
How over-the-air updates work on Umbrel.
Execution Flow
-
New developments across the any/entire fleet of Umbrel's services (bitcoind, lnd, dashboard, middleware, etc) are made, which maintain their own independent version-control and release-schedule. Subsequently, their new docker images are built, tagged and pushed to Docker Hub.
-
The newly built and tagged images are updated in the main repository's (i.e. this repo)
docker-compose.yml
file. -
Any new developments to the main repository (i.e. this repo) are made, eg. adding a new directory or a new config file.
-
To prepare a new release of Umbrel, called
vX.Y.Z
, a PR is opened that updates the version in bothREADME.md
andinstall-box.sh
, and updatesinfo.json
file to:
{
"version": "X.Y.Z",
"name": "Umbrel vX.Y.Z",
"notes": "This release contains a number of bug fixes and new features.",
"requires": ">=A.B.C"
}
-
Once the PR is merged, the master branch is immediately tagged
vX.Y.Z
and released on GitHub. -
Thus the new
info.json
will automatically be available athttps://raw.githubusercontent.com/getumbrel/umbrel/master/info.json
. This is what triggers the OTA update. -
When the user opens his
umbrel-dashboard
, it periodically pollsumbrel-manager
to check for new updates. -
umbrel-manager
fetches the latestinfo.json
from umbrel's main repo's master branch usingGET https://raw.githubusercontent.com/getumbrel/umbrel/master/info.json
, compares it'sversion
with theversion
of the local$UMBREL_ROOT/info.json
file, and exits if both the versions are same. -
If fetched
version
> localversion
,umbrel-manager
checks if localversion
satisfies therequires
condition in the fetchedinfo.json
. -
If not,
umbrel-manager
computes the minimum satisfactory version, calledL.M.N
, required for update. Eg, for"requires": ">=1.2.2"
the minimum satisfactory version would be1.2.2
.umbrel-manager
then makes aGET
request tohttps://raw.githubusercontent.com/getumbrel/umbrel/vL.M.N/info.json
and repeats step 8 and 9 until localversion
< fetchedversion
AND localversion
fulfills the fetchedrequires
condition. -
umbrel-manager
then returns the satisfyinginfo.json
toumbrel-dashboard
. -
umbrel-dashboard
then alerts the user regarding the available update, and after the user consents, it makes aPOST
request toumbrel-manager
to start the update process. -
umbrel-manager
adds theupdateTo
key to$UMBREL_ROOT/statuses/update-status.json
(a file used to continuosly update the user with the update status and progress) with the update release tag.
{
...
"updateTo": "vX.Y.Z"
...
}
-
umbrel-manager
then creates an update signal file on the mounted host OS volume ($UMBREL_ROOT/events/signals/update
) and returnsOK
to theumbrel-dashboard
. -
karen
is triggered (obviously) as soon as$UMBREL_ROOT/events/signals/update
is touched/updated, and immediately runs theupdate
trigger script$UMBREL_ROOT/events/triggers/update
as root. -
$UMBREL_ROOT/events/triggers/update
clones releasevX.Y.Z
from github in$UMBREL_ROOT/.umbrel-vX.Y.Z
. -
$UMBREL_ROOT/events/triggers/update
then executes all of the following update scripts from the new release$UMBREL_ROOT/.umbrel-vX.Y.Z
one-by-one:
$UMBREL_ROOT/.umbrel-vX.Y.Z/bin/update/00-run.sh
: Pre-update preparation script (does things like making a backup)$UMBREL_ROOT/.umbrel-vX.Y.Z/bin/update/01-run.sh
: Install update script (installs the update)$UMBREL_ROOT/.umbrel-vX.Y.Z/bin/update/02-run.sh
: Post-update script (used to run unit-tests to make sure the update was successfully installed)$UMBREL_ROOT/.umbrel-vX.Y.Z/bin/update/03-run.sh
: Success script (runs after the updated has been successfully downloaded and installed)
All of the above scripts continuously update $UMBREL_ROOT/statuses/update-status.json
with the progress of update, which the dashboard periodically fetches every 2s via umbrel-manager
to keep the user updated.
Further improvements
- OTA updates should not trust GitHub, they should verify signed checksums before installing
- Catch any error during the update and restore from the backup
- Restore from backup on power-failure