Fly.io allows users to deploy their applications to virtual machines in regions where their applications are mostly used. A Fly application can also be deployed to multiple regions.

You may want to move your Fly application to a new region if you experience performance issues, high latency, or data residency compliance problems. Placing your application closer to your users can reduce latency and improve response time.

Additionally, aligning your data storage with regional compliance requirements can prevent legal issues. Overall, these changes enhance the user experience with your application.

This article will cover how to smoothly move a Fly application that includes a single Fly Machine and an attached Fly Volume, from one Fly region to another using flyctl commands.

Prerequisites

Getting Started

To get started, you will have to verify if you already have flyctl installed and also get it authenticated.

How to Verify flyctl Installation

You can verify that you have flyctl installed using the command below. If not, use this guide to install it.

fly version

fly version Output of fly version

This shows the version you have installed.

How to Authenticate flyctl

Connect the terminal to your account via the CLI using:

fly auth login

When the browser opens up, login if you aren't already logged in and proceed to authenticate your CLI.

After authenticating your account, return to the CLI.

How to Confirm the Region of the Application

Navigate to the root folder of your project and run the following to determine the current region of your application:

fly status

fly status Output of fly status

The application's current region is lhr, the command shows additional information about the application, including the app name, owner, hostname, image, and machine details.

How to Verify the Number of Volumes Available

Run the following command to list all volumes:

fly volumes list

fly volumes list Output of fly volumes list

There should be only one volume that exists and it should be already attached to a machine. You can use this guide to create an application with a single machine with an attached volume.

How to Verify that the Volume is Attached to a Machine

To ensure the volume is attached to a machine, run:

fly machine list

fly machine list Output of fly machine list

From the output, you can determine if there is a volume attached to the machine.

List of Fly Regions

To determine the new region you want to move the Machine and volume to, use the following command to view the list of available regions:

fly platform regions

fly platform regions Output of fly platform regions

For this article, the machine and volume will be moved to the syd region.

Fork the Available Volume to a New Region

You can create a copy of an existing volume and place it into a new region by forking it using the current volume ID to create a fork:

fly volumes fork vol_4yj0k93z118j9x14 --region syd

Result:

fly volumes fork Output of fly volumes fork

This shows information about the newly created volume.

fly volumes list

fly volumes list Output of fly volumes list

The current state of the new forked volume in a new region will be in a hydrating state for a couple of minutes before it is changed to created.

fly volumes list

fly volumes list Output of fly volumes list

The image above shows current state after hydrating is complete.

You have successfully created a new volume in another region containing data from the volume existing in the old region.

How to Clone the Existing Machine

Fly possesses the clone feature to replicate a machine and you can make use of this by getting the ID of the existing machine.

fly machine list

fly machine list Output of fly machine list

After retrieving the ID of the machine, use the command below to clone the machine and attach the new volume using the same region as the newly created volume:

For example:

fly machine clone <machine id> --region <region code> --attach-volume <volume id>:<destination_mount_path>

It's important to note that the destination_mount_path has to be a different path other than / which is the root directory of the application. It should be a unique path /zata.

fly machine clone 5683977a624218 --region syd --attach-volume vol_vzkd2l6yxnk72p9v:/zata

fly machine clone Output of fly machine clone

You have successfully created a clone of the existing machine and attached the forked volume.

How to Verify the Volume Attachment

To check if the volume has been successfully attached:

fly volumes list

fly volumes list Output of fly volumes list

The volume is now attached to a machine.

To check if the machine has been successfully attached:

fly machine list

fly machine list Output of fly machine list

The machine now has a volume attached.

You have successfully moved the machine and volume to a new region.

How to View the Application Available Regions

Currently, the application exists in two different regions and you can view this using the following command:

fly scale show

fly scale show Output of fly scale show

The application is now running in lhr and syd.

How to Update the Remote fly.toml

Add the new region to the fly.toml file primary_region = 'syd', update the volume destination to destination = '/zata', and deploy the changes.

fly deploy

fly deploy Output of fly deploy

Once this is successful, the changes to the fly.toml file will be on the remote configuration.

How to Destroy the Old Machine

You have successfully moved your machine and attached volume to a new region and since we no longer need the machine in the old region lhr, you will have to clean it up. The first approach is to stop the machine using the ID.

Stop the Old Machine

fly machine stop <old_machine_id>

fly machine stop Output of fly machine stop

To confirm if it was successful, use:

fly machine list

fly machine list Output of fly machine list

The state of the machine has been updated to stopped

Destroy the Old Machine

fly machine destroy <old_machine_id>

fly machine destroy Output of fly machine destroy

Run the below command to verify if the machine still exists.

fly machine list

fly machine list Output of fly machine list

The machine in the old region has been successfully deleted.

How to Destroy the Unattached Volume

After successfully destroying the Machine, the volume attached to it is now unattached and can also be destroyed.

fly volumes list

fly volumes list Output of fly volumes list

Use the ID of the unattached volume and run the below command:

fly volumes destroy <old_volume_id>

fly volumes destroy Output of fly volumes destroy

The unattached volume has now been destroyed.

fly volumes list Output of fly volumes list

Only one volume exists and is attached to a machine in the new region.

How to Check the State of the Instance

Check the logs to see the state of the instance:

fly logs

The logs show the application is running without any issues.

Conclusion

Moving a Fly.io application to a new region involves forking the existing volume, cloning the existing machine with the forked volume to a new region, updating fly.toml, deploying the changes, and removing the old machine and volume.

Following these guidelines ensures a smooth and successful transition with minimal disruption.

If you have any questions you can always find me on X (formerly Twitter)

Resources: