This version of the doc is no longer supported. Please check out the stable docs for the latest in Juju.

Backing Up and Restoring Juju

It is always a good idea to keep backups, and it is possible to back up both the Juju client environment and any Juju controllers to be able to reconnect to running cloud environments. Both the backing up and restore procedures for each are detailed below.

The Juju client

It is easy to forget that your client environment needs to be backed up. Aside from things like the 'credentials.yaml' file, which you may be able to recreate, it contains unique files such as Juju's SSH keys, which are vital to be able to connect to a running instance. In order to also save any additional configuration files (such as the files used by running models) it is usually best to simply back up the entire Juju directory (~/.local/share/juju).

Note: On Windows systems, the Juju directory is in a different place (usually C:\Users\<username>\AppData\Roaming\Juju. Also, although tar is available for Windows, you may prefer to use a more Windows-centric backup application.

A simple backup of the Juju client directory

As the Juju directory is simply just another directory on your filesystem, you may wish to include it in any regular backup procedure you already have. For a simple backup on an Ubuntu system, you can just use tar to create an archive of the directory:

cd ~
tar -cpzf juju-client-$(date "+%Y%m%d-%H%M%S").tar.gz .local/share/juju 

This command datestamps the created file for easy identification. You may, of course, call it what you wish.

Note: As mentioned previously, the files in this backup include the keys Juju uses to connect to running environments. Anybody who has access to this backup will be able to connect to and use your controllers/models, so a further step of encrypting this backup file may be advisable.

Restoring ~/.local/share/juju

For Ubuntu, restoring your Juju client settings is a simple matter of extracting the archive you created above.

cd ~
tar xzf juju-yymmdd-hhmmss.tar.gz 

Note: This command will extract the contents of the archive and overwrite any existing files in the Juju directory. Please be sure that this is what you want!

The Juju controller

Juju provides commands for recovering a controller in case of failure. The current state is held within the 'controller' model. Therefore, all backup commands need to operate within that model, either by using the '--model controller' argument with each command, or by ensuring you're within the 'controller' model prior to using a backup command (i.e.juju switch controller). In addition, if there are mulitple cloud environments, and thus multiple controllers, ensure you are operating on the proper controller. The backup commands allow you to create, restore and manage backup files containing the controller configuration, keys, and environment data. If the controller or its host machine later fails, you can recreate the controller from the backup file. For environments with high availability enabled, see the relevant section below.

Creating a backup file

Use the create-backup command to create a new backup file:

juju create-backup [--filename=FILENAME] [-m | --model] [--no-download]

The create-backup command generates an archive file for the current environment, along with metadata about that file. Unless you issue the --no-download argument, the archive will be both stored on your controller and downloaded to your client as a 'tar.gz' file.

The backup name combines the date and time of a backup with a unique model identifier. The downloaded filename can be changed by using the --filename argument, but this won't change the name of the backup on the server.

Examples:

juju create-backup -m controller
juju switch controller; juju create-backup
juju create-backup --filename backup.tar.gz

Note that creating a backup may take a long time.

Managing Backups

As each backup is stored on the controller, you can manage backups from whatever client you can connect from, and fetch previous backups if the originally downloaded file has gone astray. You can use the following commands to manage and restore your backups:

juju backups

usage: juju backups [-m | --model]

The backups command will display the names of all the backups currently available on the controller.

juju backups

The output will look something like the following:

20160428-172122.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4
20160429-083238.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4
20160429-091444.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4
20160429-091622.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4
20160429-092034.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4

The appended alphanumeric string is not actually random gibberish, but is a model identifier for the instance the backup was created on. This information is not normally useful to the end user, but it does help give all backup files a unique name.

juju download-backup

usage: juju download-backup [--filename=FILENAME] [-m | --model] <ID>

The download-backup command will fetch the backup specified from the environment and download it for local storage. The <ID> is the identifier for the backup, as shown in the output of the create-backup and backups commands. If the --filename argument is used, the backup is downloaded to the current directory using the name from the argument.

Examples:

juju download-backup 20160429-092034.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4

will return the following file:

juju-backup-20160429-092034.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4.tar.gz

Using --filename to change the name of the download:

juju download-backup --filename backup.tar.gz 
20160429-092034.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4

will return:

backup.tar.gz

juju show-backup

usage: juju show-backup [-m | --model] <ID>

This command outputs the complete metadata record for the specified backup.

For example:

juju show-backup 20160429-092034.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4

will result in output such as:

backup ID:       "20160429-092034.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4"
checksum:        "7ChuK/4IWCzd4XysP9j0UMFRCL8="
checksum format: "SHA-1, base64 encoded"
size (B):        45565185
stored:          2016-04-29 09:20:59 +0000 UTC
started:         2016-04-29 09:20:34 +0000 UTC
finished:        2016-04-29 09:20:50 +0000 UTC
notes:           ""
model ID:        "e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4"
machine ID:      "0"
created on host: "juju-e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4-machine-0"
juju version:    2.0

juju remove-backup

usage: juju remove-backup [-m | --model] <ID>

If you wish to remove a particular backup file from the controller (perhaps to save space!), you can use the remove-backup command with the appropriate ID:

juju remove-backup 20160429-092034.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4

After a short time, you should see a confirmation:

successfully removed: 20160429-092034.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4

juju upload-backup

usage: juju upload-backup [-m | --model] <filename>

As well as downloading backups from the controller, it is also possible to upload them. This can be useful either to break up the process of restoring from a backup (upload the file, then restore using the ID), or in the case where backups have been removed from the state server. On completion, the command will return all the metadata for the uploaded backup file.

Examples:

juju upload-backup backup.tar.gz

will result in output such as:

backup ID:       "20160429-092034.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4"
checksum:        "7ChuK/4IWCzd4XysP9j0UMFRCL8="
checksum format: "SHA-1, base64 encoded"
size (B):        45565185
stored:          2016-04-29 10:46:22 +0000 UTC
started:         2016-04-29 09:20:34 +0000 UTC
finished:        2016-04-29 10:32:35 +0000 UTC
notes:           ""
model ID:        "e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4"
machine ID:      "0"
created on host: "juju-e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4-machine-0"
juju version:    2.0

The metadata of uploaded files will reflect the time it was stored, but should also determine the correct date and time for when the backup was started/completed. It's this date and time that's used to name the backup on the controller.

Note: The filename you use to store local backups does not matter, but the uploaded file is expected to be a gzipped tar file (e.g. a .tgz or .tar.gz file)

Restoring from a backup

usage: juju restore-backup --id=<ID> | --file=<filname> [-b] [-m | --model] [--upload-tools] [--constraints=<string>]

If the controller is still operational it can be restored from one of the stored backups by specifying the ID:

juju restore-backup --id=20160429-091622.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4

It is also possible to restore from a local backup file by instead specifying the filename. This will then be uploaded to the controller and used to restore it:

juju restore-backup --file=backup.tar.gz

In the case that the original controller no longer exists, it is possible to re-bootstrap the environment and restore the backup to the new controller. To do this, use the '-b' switch:

juju restore-backup -b --file=backup.tar.gz

When re-bootstrapping, you can upload a local version of the tools with the --upload-tools argument, just as you might with the original bootstrap procedure. It is also possible to specify constraints for the newly created bootstrap node, for example:

juju restore-backup -b --constraints="mem=4G" --file=backup.tar.gz

Read the constraints reference page for more information on the constraints which may be used.

HA (High Availability)

As stated in Juju HA, high availability, in general terms, indicates that a Juju environment has 3 or more (up to 7) redundant controllers. In the normal course of operation, this means that requiring a backup is less likely. As long as one of the original controller remains, the others can be replaced by simply running the juju enable-ha command again.

The contemplated case for HA backup/restore is when you have lost all your controllers and need to recover a basic setup in order to be able to perform the juju enable-ha step again.

Backups on HA

When you perform a backup on a Juju installation which has multiple redundant controllers, the initial controller will be chosen to perform the backup.

As an example, the following environment has 3 active controllers. Running the command:

juju status

... will return something similar to:

[Services] 
NAME       STATUS EXPOSED CHARM 

[Units] 
ID      WORKLOAD-STATUS JUJU-STATUS VERSION MACHINE PORTS PUBLIC-ADDRESS MESSAGE 

[Machines] 
ID         STATE   DNS          INS-ID                               SERIES AZ 

0          started 10.55.61.153 f9bcfde5-a071-4892-aa05-16212256a125 trusty nova 
1          started 10.55.61.86  899bd5c0-7b00-4ae5-bf09-fab206bf9b43 trusty nova 
2          started 10.55.61.89  7d997259-31e5-4390-a14d-2d054685e2cd trusty nova 

Performing a backup on this environment, will be based on the first controller, machine 0:

juju create-backup

...should return:

20160429-124813.e94566bc-d02d-4a14-8ec2-e2dbed2f2ec4
downloading to juju-backup-20160429-124813.tar.gz

As with backing up a non-HA environment, the backup file is stored on the controller and automatically downloaded, or you can specify further options as stated above.

Restoring on HA

Please note that a restore must take place when you have lost all your redundant controllers. If that is not the case, simply issuing the juju enable-ha command will be enough to create a new controller replica on your environment.

For performing a restore-backup, the only check performed by the utility is to make sure that the initial controller is not up.

WARNING: If your Juju environment still contains an existing controller, restoring a backup will overwrite its data or remove them.

To restore an initial bootstrap environment, the procedure is the same as for non-HA environments:

juju restore-backup  -b --file=backup.tar.gz

Once this step is completed, you will have a single controller running. To recover the rest of the controller replicas, all that remains is to reissue the command:

juju enable-ha -n 3

This will create additional controllers based on the restored one.