Machines

You can use the Machines resource to create, stop, start, update, and delete Fly Machines. Fly Machines are fast-launching VMs on Fly.io. The Machine resource is the configuration and state for a Machine.

Machine properties

Property Description
id A stable identifier for the Machine.
name Unique name for the Machine. If omitted, one is generated for you.
state The state of the Machine.
region The region where the Machine resides, or the target region for the Machine on create. If omitted, the Machine is placed in the same region as your WireGuard peer connection (somewhere near you).
instance_id An identifier for the current running/ready version of the Machine. Every Update request potentially changes the instance_id.
private_ip The 6PN IPv6 address of the Machine, which is where it’s reachable to other Machines in the same organization and network_id.
config See the config object properties section. Object that defines the Machine configuration.
checks Object that provides the status of any configured health checks.
image_ref Object that defines the image details.
created_at Date and time the Machine was created.
updated_at Date and time the Machine was last updated.
events Array of objects that provide log of what’s happened with this Machine.
nonce The Machines lease nonce, if this Machine is currently leased. Also returned on Machine create if lease_ttl is provided.

List Machines

List all the Machines for an app.

Path parameters
app_name : string required

The name of the Fly App to list Machines for.

Query parameters
include_deleted : Boolean

If true, include deleted Machines in the response.

region : String

Filter by region. For example, to return only Machines in the yyz region: GET /v1/apps/my-app-name/machines?region=yyz

metadata.{key} : String

Filter by metadata key-value pair. For example, to return only Machines with metadata item "foo": "bar" : GET /v1/apps/my-app-name/machines?metadata.foo=bar

Responses
200 :

OK

GET/v1/apps/{app_name}/machines
curl -i -X GET \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines"
Status: 200 OK – Example response
[
  {
    "id": "a5c5de9ce64ca12",
    "name": "aged-wind-2649",
    "state": "started",
    "region": "ord",
    "image_ref": {
      "registry": "registry-1.docker.io",
      "repository": "rebelthor/sleep",
      "tag": "latest",
      "digest": "sha256:597c3e12f830132be2aa69b4c0deccb0657ea4253e6d59c6f38e41e9f69a0add"
    },
    "instance_id": "1RREBN3T5K95DK9IVP4XHTTPEY2",
    "private_ip": "fdaa:0:18:a7b:196:e274:9ce1:2",
    "created_at": "2023-10-31T02:30:10Z",
    "updated_at": "2023-10-31T02:35:26Z",
    "config": { /* Fly Machine Config */ },
    "events": [
      {
        "type": "start",
        "status": "started",
        "source": "flyd",
        "timestamp": 1698719726615
      },
      {
        "type": "launch",
        "status": "created",
        "source": "user",
        "timestamp": 1698719723203
      }
    ]
  },
  {
    "id": "9c487adb2596113",
    "name": "summer-sun-916",
    "state": "started",
    "region": "ord",
    "image_ref": {
      "registry": "registry.fly.io",
      "repository": "teamcoco",
      "digest": "sha256:5615ef423504d56ae345ccff9db54796d589965da953297f5785042df0628452"
    },

    ...

  }
]

Create a Machine

Given the name of a Fly App, create a Fly Machine, given the URI of a container image, in some region (or, by default, the region closest to you) on Fly.io’s platform. If successful, that Machine will boot up by default. Create a Machine without booting it by setting skip_launch.

You can configure the Machine characteristics, like its CPU and memory. You can also allow connections from the internet through the Fly Proxy by creating a Machine with services. Learn more about this behavior in the networking section.

Important: This request can fail, and you’re responsible for handling that failure. If you ask for a large Machine, or a Machine in a region we happen to be at capacity for, you might need to retry the request, or to fall back to another region. If you’re working directly with the Machines API, you’re taking some responsibility for your own orchestration!

The only required parameter in the body is image in the config object.

Path parameters
app_name : string required

The name of the Fly App to create a Machine for.

Responses
200 :

OK

POST/v1/apps/{app_name}/machines
curl -i -X POST \\
  -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
  "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines" \\
  -d '{
    "config": {
      "init": {
        "exec": [
          "/bin/sleep",
          "inf"
        ]
      },
      "image": "registry-1.docker.io/library/ubuntu:latest",
      "auto_destroy": true,
      "restart": {
        "policy": "always"
      },
      "guest": {
        "cpu_kind": "shared",
        "cpus": 1,
        "memory_mb": 256
      }
    }
  }'
Status: 200 OK – Example response
{
  "id": "1857156b526dd8",
  "name": "aged-thunder-7371",
  "state": "created",
  "region": "ord",
  "image_ref": {
    "registry": "registry-1.docker.io",
    "repository": "library/ubuntu",
    "tag": "latest",
    "digest": "sha256:c9cf959fd83770dfdefd8fb42cfef0761432af36a764c077aed54bbc5bb25368",
    "labels": {
      "org.opencontainers.image.ref.name": "ubuntu",
      "org.opencontainers.image.version": "22.04"
    }
  },
  "instance_id": "01HEPA330HZ37A78TK080NAK1M",
  "private_ip": "fdaa:ff:ff:a7b:195:e229:8038:2",
  "created_at": "2023-11-08T01:52:30Z",
  "updated_at": "2023-11-08T01:52:30Z",
  "config": {
    "init": {
      "exec": [
        "/bin/sleep",
        "inf"
      ]
    },
    "image": "registry-1.docker.io/library/ubuntu:latest",
    "auto_destroy": true,
    "restart": {
      "policy": "always"
    },
    "guest": {
      "cpu_kind": "shared",
      "cpus": 1,
      "memory_mb": 256
    },
    "dns": {}
  },
  "events": [
    {
      "type": "launch",
      "status": "created",
      "source": "user",
      "timestamp": 1699408350300
    }
  ]
}

Create a Machine with services

Create a Machine with services defined on app. Learn more about services and networking.

Path parameters
app_name : string required

The name of the Fly App to create a Machine for.

Responses
200 :

OK

POST/v1/apps/{app_name}/machines
curl -i -X POST \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines" \\
  -d '{
      "name": "my-app-name",
      "config": {
        "image": "flyio/fastify-functions",
        "env": {
          "APP_ENV": "production"
        "services": [
          {
            "ports": [
              {
                "port": 443,
                "handlers": [
                  "tls",
                  "http"
                ]
              },
              {
                "port": 80,
                "handlers": [
                  "http"
                ]
              }
            ],
            "protocol": "tcp",
            "internal_port": 8080
          }
        ],
        "checks": {
            "httpget": {
                "type": "http",
                "port": 8080,
                "method": "GET",
                "path": "/",
                "interval": "15s",
                "timeout": "10s"
                }
            }
        }
    }
}'
Status: 200 OK – Example response
{
  "id": "1857156b526dd8",
  "name": "aged-thunder-7371",
  "state": "created",
  "region": "ord",
  "image_ref": {
    "registry": "registry-1.docker.io",
    "repository": "library/ubuntu",
    "tag": "latest",
    "digest": "sha256:c9cf959fd83770dfdefd8fb42cfef0761432af36a764c077aed54bbc5bb25368",
    "labels": {
      "org.opencontainers.image.ref.name": "ubuntu",
      "org.opencontainers.image.version": "22.04"
    }
  },
  "instance_id": "01HEPA330HZ37A78TK080NAK1M",
  "private_ip": "fdaa:ff:ff:a7b:195:e229:8038:2",
  "created_at": "2023-11-08T01:52:30Z",
  "updated_at": "2023-11-08T01:52:30Z",
  "config": {
    "init": {
      "exec": [
        "/bin/sleep",
        "inf"
      ]
    },
    "image": "registry-1.docker.io/library/ubuntu:latest",
    "auto_destroy": true,
    "restart": {
      "policy": "always"
    },
    "guest": {
      "cpu_kind": "shared",
      "cpus": 1,
      "memory_mb": 256
    },
    "dns": {}
  },
  "events": [
    {
      "type": "launch",
      "status": "created",
      "source": "user",
      "timestamp": 1699408350300
    }
  ]
}

Wait for a Machine to reach a specified state

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to wait for.

Query parameters
instance_id : string

Filter for a specific Machine instance_id (version). Required when waiting for Machine to be in stopped state.

timeout : integer

The time, in seconds, to wait for the Machine to enter the specified state. Default is 60.

state : string enum

The Machine state to wait for. Values are: started, stopped, suspended, or destroyed. Default is started.

Responses
200 :

OK

400 :

Bad Request

408 :

Request Timeout

GET/v1/apps/{app_name}/machines/{machine_id}/wait
curl -i -X GET \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/73d8d46dbee589/wait?state=stopped&instance_id=01HMVXC16ED6SHK9452AF029Y7"
Status: 200 OK
{
  "ok": true
}

Get a Machine

Given the name of a Fly App and a Fly Machine ID, retrieve the details of that Machine.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to get.

GET/v1/apps/{app_name}/machines/{machine_id}
curl -i -X GET \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/73d8d46dbee589"
Status: 200 OK – Example response
{
    "id": "a5c5de9ce64ca12",
    "name": "aged-wind-2649",
    "state": "started",
    "region": "ord",
    "image_ref": {
      "registry": "registry-1.docker.io",
      "repository": "rebelthor/sleep",
      "tag": "latest",
      "digest": "sha256:597c3e12f830132be2aa69b4c0deccb0657ea4253e6d59c6f38e41e9f69a0add"
    },
    "instance_id": "1RREBN3T5K95DK9IVP4XHTTPEY2",
    "private_ip": "fdaa:0:18:a7b:196:e274:9ce1:2",
    "created_at": "2023-10-31T02:30:10Z",
    "updated_at": "2023-10-31T02:35:26Z",
    "config": { /* Fly Machine Config */ },
    "events": [
      {
        "type": "start",
        "status": "started",
        "source": "flyd",
        "timestamp": 1698719726615
      },
      {
        "type": "launch",
        "status": "created",
        "source": "user",
        "timestamp": 1698719723203
      }
    ]
}

Update a Machine

Given the name of a Fly App and a Fly Machine ID, update the configuration of the Machine. If the Machine is running and the request is successful, it will reboot; if the Machine isn’t running, and you don’t want it to start up, set skip_launch.

This is, in particular, how you would update the running image of a Machine (when you need to deploy new code), or roll back to a previous Machine release. It’s also how you’d vertically scale an application.

Important: This request can fail, and you’re responsible for handling that failure. If you ask for a large Machine, or a Machine in a region we happen to be at capacity for, you might need to retry the request, or to fall back to another region. If you’re working directly with the Machines API, you’re taking some responsibility for your own orchestration!

region and name are immutable and cannot be updated.

Note: You need to specify the entire Machine config to update a Machine; we don’t support partial updates. You can get the Machine you want to update, copy and modify the config and include it in the body of the update request. Refer to the Machine config object properties section for property descriptions.

Request headers
fly-machine-lease-nonce : string

The Machine lease nonce, a random value we provide that indicates that you currently hold the lease on this Machine. If the Machine is leased, and you don’t provide this header, the request to update the Machine will fail.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to update.

Responses
200 :

OK

400 :

Bad Request

POST/v1/apps/{app_name}/machines/{machine_id}
curl -i -X POST \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/73d8d46dbee589" \\
  -d '{
      "config": {
        "image": "flyio/fastify-functions",
        "guest": {
          "memory_mb": 512,
          "cpus": 2,
          "cpu_kind": "shared"
        },
        "env": {
          "APP_ENV": "production"
        },
        "services": [
          {
            "ports": [
              {
                "port": 443,
                "handlers": [
                  "tls",
                  "http"
                ]
              },
              {
                "port": 80,
                "handlers": [
                  "http"
                ]
              }
            ],
            "protocol": "tcp",
            "internal_port": 8080
          }
        ]
      }
    }'
Status: 200 OK – Example response
{
  "id": "73d8d46dbee589",
  "name": "lingering-moon-48",
  "state": "starting",
  "region": "cdg",
  "instance_id": "01G3SHPYE8XZ58GD4XRRF9CCKC",
  "private_ip": "fdaa:0:3ec2:a7b:5adc:6068:5b85:2",
  "config": {
    "env": null,
    "init": {
      "exec": null,
      "entrypoint": null,
      "cmd": null,
      "tty": false
    },
    "image": "flyio/fastify-functions",
    "metadata": null,
    "restart": {
      "policy": ""
    },
    "guest": {
      "cpu_kind": "",
      "cpus": 2,
      "memory_mb": 512
    }
  },
  "image_ref": {
    "registry": "registry-1.docker.io",
    "repository": "flyio/fastify-functions",
    "tag": "latest",
    "digest": "sha256:e15c11a07e1abbc50e252ac392a908140b199190ab08963b3b5dffc2e813d1e8",
    "labels": {
    }
  },
  "created_at": "2022-05-23T22:48:21Z"
}

Stop a Machine

Stopping a started Machine will shut down the Machine, but not destroy it. The Machine can be started again with machines/<machine_id>/start.

Stopping a suspended Machine will invalidate its snapshot, forcing it to perform a cold boot the next time it is started.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to stop.

Responses
200 :

OK

POST/v1/apps/{app_name}/machines/{machine_id}/stop
curl -i -X POST \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/73d8d46dbee589/stop"
Status: 200 OK
{
  "ok": true
}

Suspend a Machine

Suspending a Machine pauses the Machine and takes a snapshot of its state, including its memory. The next start operation will attempt (but is not guaranteed) to resume the Machine from the snapshot, rather than performing a cold boot.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to suspend.

Responses
200 :

OK

POST/v1/apps/{app_name}/machines/{machine_id}/suspend
curl -i -X POST \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/73d8d46dbee589/suspend"
Status: 200 OK
{
  "ok": true
}

Start a Machine

Start a Machine.

Stopped Machines that are restarted are completely reset to their original state so that they start clean on the next run.

Suspended Machines that are started attempt to resume from the snapshot taken when they were suspended. If this is not possible, then they will perform a cold boot, as though starting from the stopped state; however, their root file systems will not be reset.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to start.

Responses
200 :

OK

POST/v1/apps/{app_name}/machines/{machine_id}/start
curl -i -X POST \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/73d8d46dbee589/start"
Status: 200 OK – Example response
{
    "previous_state": "stopped",
    "migrated": false,
    "new_host": ""
}

Delete a Machine permanently

Delete a Machine. This action cannot be undone.

Given the name of a Fly App and the Machine ID of a Fly Machine, delete the Machine.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to delete.

Query parameters
force : boolean

Force stop the Machine if running.

DELETE/v1/apps/{app_name}/machines/{machine_id}/
curl -i -X DELETE \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/24d896dec64879?force=true"
Status: 200 OK
{
  "ok": true
}

Create a Machine lease

Create a lease for a specific Machine within an app using the details provided in the request body. Machine leases can be used to obtain an exclusive lock on modifying a Machine.

The Machine lease nonce is a random value we provide that indicates that you currently hold the lease on a Machine. To use the provided nonce from the create or get lease response, add the fly-machine-lease-nonce header to all subsequent API calls to the Machine for the duration of the lease. See Release a Machine lease.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to create a lease for.

Responses
201 :

Created

409 :

Conflict

POST/v1/apps/{app_name}/machines/{machine_id}/lease
curl -i -X POST \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/3d8d413b29d089/lease" \\
    -d '{
        "description": "",
        "ttl": 500
    }'
Status: 201 Created – Example response
{
  "status": "success",
  "data": {
    "nonce": "5c35f65c9f95",
    "expires_at": 1708569778,
    "owner": "hello@fly.io",
    "description": "",
    "version": "01HQ73A7BFFDF1B6WMGHFZZ4E7"
    }
}

Get a Machine lease

Retrieve the current lease of a specific Machine within an app. Machine leases can be used to obtain an exclusive lock on modifying a Machine.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to retrieve a lease for.

Responses
200 :

OK

404 :

Not Found

GET/v1/apps/{app_name}/machines/{machine_id}/lease
curl -i -X GET \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/3d8d413b29d089/lease"
Status: 200 OK - Example response
{
  "status": "success",
  "data": {
    "nonce": "5c35f65c9f95",
    "expires_at": 1708569778,
    "owner": "hello@fly.io",
    "description": "",
    "version": "01HQ73A7BFFDF1B6WMGHFZZ4E7"
    }
}

Release a Machine lease

Release the lease of a specific Machine within an app. Machine leases can be used to obtain an exclusive lock on modifying a Machine.

Request headers
fly-machine-lease-nonce : string

Required to release a lease. The Machine lease nonce, a random value provided in the response when you get or create a lease.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to release a lease for.

Responses
200 :

OK

400 :

Bad Request

DELETE/v1/apps/{app_name}/machines/{machine_id}/lease
curl -i -X DELETE \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" -H "fly-machine-lease-nonce: fed368b018e9" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/3d8d413b29d089/lease"
Status: 200 OK
{
    "status": "success",
    "data": {
                "ok": true
    }
}

Route requests away from or back to a Machine

Given the name of a Fly App and the Machine ID of a Fly Machine, instruct the Fly Proxy not to send requests to a Machine or to start sending requests again to a previously cordoned Machine.

You can also do this with a fresh Machine, all in one shot, using the skip_service_registration request field of a Machine Create request.

This is useful for bluegreen deployments: boot up a new, “green”, cordoned Machine running the new release (using skip_service_registration), make sure it’s healthy, then uncordon it and tear down the old, “blue” Machine.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to cordon or uncordon.

Responses
200 :

OK

POST/v1/apps/{app_name}/machines/{machine_id}/cordon
curl -i -X POST \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/73d8d46dbee589/cordon"
POST/v1/apps/{app_name}/machines/{machine_id}/uncordon
curl -i -X POST \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/73d8d46dbee589/uncordon"
Status: 200 OK
{
  "ok": true
}

Get a Machine’s metadata

Get the metadata defined in a specific Machine’s config.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to get the metadata for.

Responses
200 :

OK

GET/v1/apps/{app_name}/machines/{machine_id}/metadata
curl -i -X GET \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/9080e339b57798/metadata"
Status: 200 OK - Example response
{
  "fly_flyctl_version":"0.2.8",
  "fly_platform_version":"v2",
  "fly_process_group":"app",
  "fly_release_id":"Nj7oGMlVVpZ7JToybJoXLLjMl",
  "fly_release_version":"63"
}

Add or update Machine metadata

Add or update a metadata key-value pair on a specific Machine’s config.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to update the metadata for.

key : string required

A key for the metadata key-value pair to add or replace. Provide the value in the request body.

Responses
204 :

No content

POST/v1/apps/{app_name}/machines/{machine_id}/metadata/{key}
curl -i -X POST \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/9080e339b57798/metadata/foo-key" \\
    -d '{
        "value":"bar"
        }'
Status: 204 No content
no body

Delete Machine metadata

Delete a metadata key-value pair on a specific Machine’s config.

Path parameters
app_name : string required

The name of the Fly App the Machine belongs to.

machine_id : string required

The ID of the Machine to delete some metadata for.

key : string required

The key of the metadata to delete.

Responses
204 :

No content

DELETE/v1/apps/{app_name}/machines/{machine_id}/metadata/{key}
curl -i -X DELETE \\
    -H "Authorization: Bearer ${FLY_API_TOKEN}" -H "Content-Type: application/json" \\
    "${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/9080e339b57798/metadata/foo-key"
Status: 204 No content
no body

Notes on networking

Machines are closed to the public internet by default. To make them accessible via the associated application, you need to:

  • Allocate an IP address to the Fly App
  • Add one or more services to the Machine config with ports and handlers, as shown in Create a Machine with services.

For an application with a single Machine, all requests will be routed to that Machine. A Machine in the stopped state will be started up automatically when a request arrives.

For an application with multiple Machines with the same configuration, requests will be distributed across them. Warm-start behavior in this situation is not well-defined now, so should not be relied upon for apps with multiple Machines.

Requests to Machines with mixed configurations will be distributed across Machines whose configurations match the request. For example, if 3 out of 6 Machines have service configurations set to listen on port 80, requests to port 80 will be distributed amongst those 3.

Reaching Machines

Machines can be reached within the private network by hostname, in the format <id>.vm.<app-name>.internal.

For example, to reach a Machine with ID 3d8d413b29d089 on an app called my-app-name, use hostname 3d8d413b29d089.vm.my-app-name.internal.

Machine config object properties

Properties of the config object for Machine configuration. See Machine properties.

image: string - Required. The container registry path to the image that defines this Machine (for example, ”registry-1.docker.io/library/ubuntu:latest”).


auto_destroy: bool (false) - If true, the Machine destroys itself once it’s complete.


checks: An optional object that defines one or more named checks. The key for each check is the check name. The value for each check supports:

  • type: string (nil) - tcp or http.
  • port: int (nil) - The TCP port to connect to, likely should be the same as internal_port.
  • interval: int (nil) - The interval, in nanoseconds, between connectivity checks
  • timeout: int (nil) - The maximum time, in nanoseconds, a connection can take before being reported as failing its health check.
  • grace_period: int (nil) - How long to wait, in nanoseconds, before we start running health checks.
  • method: string (nil) - For http checks, the HTTP method to use to when making the request.
  • path: string (nil) - For http checks, the path to send the request to.
  • protocol: string (nil) - For http checks, whether to use http or https
  • tls_server_name: string (nil) - If the protocol is https, the hostname to use for TLS certificate validation
  • tls_skip_verify: bool (false) - For http checks with https protocol, whether or not to verify the TLS certificate
  • headers: {string: [string, string]} ({}) - For http checks, an array of objects with string field name and array of strings field values.

    An example of two checks:

            "checks": {
                "tcp-alive": {
                    "type": "tcp",
                    "port": 8080,
                    "interval": "15s",
                    "timeout": "10s"
                },
                "http-get": {
                    "type": "http",
                    "port": 8080,
                    "protocol": "http"
                    "method": "GET",
                    "path": "/",
                    "interval": "15s",
                    "timeout": "10s"
                }
            }
    

dns:

  • nameservers: Used for Fly Kubernetes.
  • searches: Used for Fly Kubernetes.
  • options: Used for Fly Kubernetes.
  • dns_forward_rules: Used for dedicated hosts.
  • skip_registration: boolean - If true, do not register the Machine’s 6PN IP with the internal DNS system.

env: {string:string} ({}) - An object filled with key/value pairs to be set as environment variables.


files: An optional array of objects defining files to be written within a Machine, one of raw_value or secret_name must be provided.

  • guest_path: string - The path in the Machine where the file will be written. Must be an absolute path.
  • raw_value: string - Contains the base64 encoded string of the file contents.
  • secret_name: string - The name of the secret containing the base64 encoded file contents.

    An example of two files:

            "files": [
                {
                    "guest_path": "/path/to/hello.txt",
                    "raw_value": "aGVsbG8gd29ybGQK"
                },
                {
                    "guest_path": "/path/to/secret.txt",
                    "secret_name": "SUPER_SECRET"
                }
            ]
    

guest: Configure the resources allocated for this Machine. An object with the following options:

  • cpu_kind: string (nil) - The type of CPU reservation to make (”shared”, ”performance", and so on).
  • gpu_kind: string (nil) - The type of GPU reservation to make.
  • host_dedication_id: The ID of the host dedication (group of dedicated hosts) on which to create this Machine. (beta)
  • cpus: int (nil) - The number of CPU cores this Machine should occupy when it runs. (default 1)
  • gpus: int (nil) - The number of GPU cores this Machine should occupy when it runs. (default 1)
  • kernel_args: Optional array of strings. Arguments passed to the kernel.
  • memory_mb: int (nil) - Memory in megabytes as multiples of 256 (default 256)

init: Arguments for init, which is Fly.io’s footprint inside your Machine, and controls how your own code gets run.

  • exec: string, string - The command line for the program to run once the Machine boots up. This overrides any other startup command line, either in our API or in your Docker container definition.
  • entrypoint: string, string - A command line to override the ENTRYPOINT of your Docker container; another way to define the program that is going to start up when your Machine boots up.
  • cmd: string, string - A command line to override the CMD of your Docker container; still another way to define the program that is going to start up when your Machine boots up.
  • kernel_args: Optional array of strings. Arguments passed to the kernel.
  • tty: bool (false) - Allocate a TTY for the process we start up.
  • swap_size_mb: int (nil) -Swap space to reserve for the Fly Machine in, you guessed it, megabytes.

metadata: {string:string} ({}) - An object filled with key/value pairs for the Machine metadata. We use metadata internally for routing, process groups, and clusters.


metrics: An optional object defining a metrics endpoint that Prometheus on Fly.io will scrape.

  • port: int - Required. The port that Prometheus will connect to.
  • path: string - Required. The path that Prometheus will scrape (e.g. /metrics).

mounts: An array of objects that reference previously created persistent volumes. Currently, you may only mount one volume per Machine.

  • volume: string - Required. The volume ID, visible in fly volumes list. For example vol_2n0l3vl60qpv635d.
  • path: string - Required. Absolute path on the Machine where the volume should be mounted. For example, /data.
  • name: string - The name of the Volume to attach.
  • extend_threshold_percent: int - The threshold of storage used on a volume, by percentage, that triggers extending the volume’s size by the value of add_size_gb.
  • add_size_gb: int - The increment, in GB, by which to extend the volume after reaching the auto_extend_size_threshold. Required with auto_extend_size_increment. Required with extend_threshold_percent.
  • size_gb_limit: int - The total amount, in GB, to extend a volume. Optional with auto_extend_size_increment. Optional with extend_threshold_percent.
  • encrypted: boolean - Volume is encrypted. Default true.

processes: An optional array of objects defining multiple processes to run within a Machine. The Machine will stop if any process exits without error.

  • entrypoint: An array of strings. The process that will run.
  • cmd: An array of strings. The arguments passed to the entrypoint.
  • env: An object filled with key/value pairs to be set as environment variables.
  • env_from : An array of objects that define environment variables from Machine fields. Used for Fly Kubernetes.
  • exec: An array of strings. The command to run for Machines in this process group on startup.
  • user: string (nil) - An optional user that the process runs under.
  • ignore_app_secrets: boolean - If true, only use the secrets provided at the process level. Default false.
  • secrets: An array of strings. Set the secrets in the environment of the Machine. env_var is required and is the name of the environment variable that will be set from the secret. It must be a valid environment variable name. name is optional and when provided is used to reference a secret name where the env_var is different from what was set as the secret name.

restart: Defines whether and how flyd restarts a Machine after its main process exits. Learn more about Machine restart policies. This object has the following options:

  • policy: string - Required. One of “no”, “on-failure”, or “always”.
  • max_retries: int (nil) - The maximum number of retries when the policy is “on-failure”.

schedule: string (nil) - Optionally one of hourly, daily, weekly, monthly. Runs Machine at the given interval. Interval starts at time of Machine creation.


services: An array of objects that define a single network service. Check the Machines networking section for more information.

  • protocol: string - Required. tcp or udp. Learn more about running raw TCP/UDP services.
  • internal_port: int - Required. Port the Machine listens on.
  • concurrency: Control Fly Proxy’s load balancing for this service.
    • type: string - connections (TCP) or requests (HTTP). Default is connections. Determines which kind of event we count for load balancing.
    • soft_limit: int (nil) - Ideal service concurrency. We will attempt to spread load to keep services at or below this limit. We’ll deprioritize a Machine to give other Machines a chance to absorb traffic. Defaults to 20 when unset.
    • hard_limit: int (nil) - Maximum allowed concurrency. The limit of events at which we’ll stop routing to a Machine altogether, and, if configured to do so, potentially start up existing Machines to handle the load. Defaults to unlimited when unset.
  • ports: MachinePort - An array of objects defining the service’s ports and associated handlers. Options:
    • port: int (nil) - The internet-exposed port to receive traffic on; if you want HTTP traffic routed to 8080/tcp on your Machine, this would be 80.
    • start_port, end-port: int (nil) - Like port`, but allocate a range of ports to route internally, for applications that want to occupy whole port ranges.
    • handlers: Array of protocol handlers for this port. How should the Fly Proxy handle and terminate this connection. Options include http, tcp, tls.
    • force_https: bool (false) - If true, force HTTP to HTTPS redirects.
    • http_options: Fiddly HTTP options (if you don’t know you need them, you don’t), including:
      • compress: bool (false) - If true, enable HTTP compression.
      • h2_backend: bool (false) - If true, inform Fly Proxy that your app supports HTTP/2 (h2c with prior knowledge), which enables HTTP/2 only workloads to work with the http handler.
      • response: Options for controlling HTTP response headers.
        • headers: ({“headers”: {string:string}} (nil)) HTTP headers to set on responses.
        • pristine: bool (false) - If true, do not add any Fly.io headers to HTTP responses. The following response headers won’t be added and won’t be modified if returned by the app: Server, Via, Fly-Request-Id, Fly-Cache-Status.
    • tls_options: Fiddly TLS options (if you don’t know you need to mess with these, you don’t need to), including:
      • alpn: string, string : ALPN protocols to present TLS clients (for instance, [“h2”, “http/1.1”]).
      • default_self_signed: bool (false) - If true, serve a self-signed certificate if no certificate exists.
      • versions: string, string : TLS versions to allow (for instance, [“TLSv1.2”, “TLSv1.3”]).
    • proxy_proto_options: Configure the version of the PROXY protocol that your app accepts. Version 1 is the default.
      • version: A string to indicate that the TCP connection uses PROXY protocol version 2. The default when not set is version 1.
  • autostart: bool (false) - If true, Fly Proxy starts Machines when requests for this service arrive.
  • autostop: string or bool (off) - One of off (or false), stop (or true), suspend. If stop, Fly Proxy stops Machines when this service goes idle. If suspend, Fly Proxy instead suspends Machines if possible and stops them if not.
  • min_machines_running: int (nil) - When autostart is true, the minimum number of Machines to keep running at all times in the primary region.

size: A named size for the VM, e.g. performance-2x or shared-cpu-2x. Note: guest and size are mutually exclusive.


standbys: Standbys enable a Machine to be a standby for another. In the event of a hardware failure, the standby Machine will be started. Only for Machines without services. Array of strings representing the Machine IDs of Machines watch (act as standby for).


statics: Optionally serve static files.

  • guest_path: string - Required. The path inside the Machines or object storage bucket where the files to serve are located.
  • url_prefix: string - Required. The URL prefix under which to serve the static files.
  • tigris_bucket: string - The Tigris bucket where the files to serve are located.
  • index_document: string - The name of the index document, served when a request is made to the root or any of its subfolders. Only works for statics hosted on Tigris

stop_config: MachineStopConfig (nil) - Configure graceful shutdown of the Machine.

  • signal: string (nil) - The name of the signal to send to the entrypoint process on the Machine to initiate shutdown.
  • timeout: int (nil) - How long in nanoseconds to wait, after signaling the entrypoint process, before hard-shutdown of the Machine.