Failed to start remote builder heartbeat: Timeout on EnsureMachineRemoteBuilder.machine

I have a CI that runs on push to my main branch (Continuous Deployment with Fly.io and GitHub Actions · Fly Docs). It suddenly starting falling with the following error:

Run flyctl deploy --config apps/caelus/fly.toml --dockerfile apps/caelus/Dockerfile --remote-only
==> Verifying app config
Validating apps/caelus/fly.toml
Platform: machines
✓ Configuration is valid
--> Verified app config
==> Building image
WARN Failed to start remote builder heartbeat: Timeout on EnsureMachineRemoteBuilder.machine

Error: failed to fetch an image or build from source: error connecting to docker: Timeout on EnsureMachineRemoteBuilder.machine

Error: Process completed with exit code 1.

This doesn’t appear to be a one-off issue. I tried to re-run it multiple times. I’m not sure what to do. Is this a bug? The Fly.io status page says everything is operational.

Debug output
DEBUG determined hostname: "fv-az313-814"
DEBUG determined working directory: "/home/runner/work/thatskyapplication/thatskyapplication"
DEBUG determined user home directory: "/home/runner"
DEBUG determined config directory: "/home/runner/.fly"
DEBUG ensured config directory exists.
DEBUG ensured config directory perms.
DEBUG cache loaded.
DEBUG config initialized.
DEBUG skipped querying for new release
DEBUG client initialized.
DEBUG app config loaded from apps/caelus/fly.toml
DEBUG --> POST https://api.fly.io/graphql

DEBUG {
  "query": "query ($appName: String!) { appbasic:app(name: $appName) { id name platformVersion organization { id slug paidPlan } } }",
  "variables": {
    "appName": "caelus"
  }
}


DEBUG {}
DEBUG <-- 200 https://api.fly.io/graphql (64.73ms)

DEBUG {
  "data": {
    "appbasic": {
      "id": "caelus",
      "name": "caelus",
      "platformVersion": "machines",
      "organization": {
        "id": "[censored]",
        "slug": "personal",
        "paidPlan": false
      }
    }
  }
}

==> Verifying app config
--> Verified app config
Validating apps/caelus/fly.toml
Platform: machines
✓ Configuration is valid
DEBUG --> POST https://api.fly.io/graphql

DEBUG {
  "query": "query ($appName: String!) { appcompact:app(name: $appName) { id name hostname deployed status appUrl platformVersion organization { id slug paidPlan } postgresAppRole: role { name } imageDetails { repository version } } }",
  "variables": {
    "appName": "caelus"
  }
}


DEBUG {}
DEBUG Starting task manager
DEBUG <-- 200 https://api.fly.io/graphql (51.53ms)

DEBUG {
  "data": {
    "appcompact": {
      "id": "caelus",
      "name": "caelus",
      "hostname": "caelus.fly.dev",
      "deployed": true,
      "status": "deployed",
      "appUrl": null,
      "platformVersion": "machines",
      "organization": {
        "id": "[censored]",
        "slug": "personal",
        "paidPlan": false
      },
      "postgresAppRole": null,
      "imageDetails": {
        "repository": "caelus",
        "version": null
      }
    }
  }
}

==> Building image
DEBUG --> POST https://api.fly.io/graphql

DEBUG {
  "query": "mutation($input: EnsureMachineRemoteBuilderInput!) { ensureMachineRemoteBuilder(input: $input) { machine { id state ips { nodes { family kind ip } } }, app { name organization { id slug } } } }",
  "variables": {
    "input": {
      "appName": "caelus",
      "organizationId": null
    }
  }
}


DEBUG {}
DEBUG trying remote docker daemon
DEBUG <-- 200 https://api.fly.io/graphql (56.63s)

DEBUG {
  "data": {
    "ensureMachineRemoteBuilder": null
  },
  "errors": [
    {
      "message": "Timeout on EnsureMachineRemoteBuilder.machine",
      "locations": [
        {
          "line": 1,
          "column": 98
        }
      ],
      "path": [
        "ensureMachineRemoteBuilder",
        "machine"
      ]
    }
  ]
}

DEBUG --> POST https://api.fly.io/graphql

WARN Failed to start remote builder heartbeat: Timeout on EnsureMachineRemoteBuilder.machine

DEBUG {
  "query": "\nmutation ResolverCreateBuild ($input: CreateBuildInput!) {\n\tcreateBuild(input: $input) {\n\t\tid\n\t\tstatus\n\t}\n}\n",
  "variables": {
    "input": {
      "appName": "caelus",
      "builderType": "remote",
      "clientMutationId": "",
      "imageOpts": {
        "buildArgs": {},
        "buildPacks": null,
        "builder": "",
        "builtIn": "",
        "builtInSettings": null,
        "dockerfilePath": "/home/runner/work/thatskyapplication/thatskyapplication/apps/caelus/Dockerfile",
        "extraBuildArgs": null,
        "imageLabel": "",
        "imageRef": "",
        "noCache": false,
        "publish": true,
        "tag": "registry.fly.io/caelus:deployment-[censored]",
        "target": ""
      },
      "machineId": "",
      "strategiesAvailable": [
        "Buildpacks",
        "Dockerfile",
        "Builtin"
      ]
    }
  },
  "operationName": "ResolverCreateBuild"
}

DEBUG {0xc000ebb140}
DEBUG <-- 200 https://api.fly.io/graphql (59.52ms)

DEBUG {
  "data": {
    "createBuild": {
      "id": "2569671",
      "status": "started"
    }
  }
}

DEBUG --> POST https://api.fly.io/graphql

DEBUG {
  "query": "mutation($input: EnsureMachineRemoteBuilderInput!) { ensureMachineRemoteBuilder(input: $input) { machine { id state ips { nodes { family kind ip } } }, app { name organization { id slug } } } }",
  "variables": {
    "input": {
      "appName": "caelus",
      "organizationId": null
    }
  }
}


DEBUG {}
DEBUG Trying 'Buildpacks' strategy

DEBUG no buildpack builder configured, skipping
DEBUG result image:<nil> error:<nil>

DEBUG Trying 'Dockerfile' strategy

DEBUG <-- 200 https://api.fly.io/graphql (59.95s)

DEBUG {
  "data": {
    "ensureMachineRemoteBuilder": null
DEBUG result image:<nil> error:error connecting to docker: Timeout on EnsureMachineRemoteBuilder.machine
  },

  "errors": [
    {
      "message": "Timeout on EnsureMachineRemoteBuilder.machine",
      "locations": [
        {
          "line": 1,
          "column": 98
        }
      ],
      "path": [
        "ensureMachineRemoteBuilder",
        "machine"
      ]
    }
  ]
}

DEBUG --> POST https://api.fly.io/graphql

DEBUG {
  "query": "\nmutation ResolverFinishBuild ($input: FinishBuildInput!) {\n\tfinishBuild(input: $input) {\n\t\tid\n\t\tstatus\n\t\twallclockTimeMs\n\t}\n}\n",
  "variables": {
    "input": {
      "appName": "caelus",
      "buildId": "2569671",
      "builderMeta": {
        "builderType": "",
        "buildkitEnabled": false,
        "dockerVersion": "",
        "platform": "",
        "remoteAppName": "",
        "remoteMachineId": ""
      },
      "clientMutationId": "",
      "finalImage": {
        "id": "",
        "sizeBytes": 0,
        "tag": ""
      },
      "logs": "error connecting to docker: Timeout on EnsureMachineRemoteBuilder.machine",
      "machineId": "",
      "status": "failed",
      "strategiesAttempted": [
        {
          "error": "",
          "note": "no buildpack builder configured, skipping",
          "result": "failed",
          "strategy": "Buildpacks"
        },
        {
          "error": "error connecting to docker: Timeout on EnsureMachineRemoteBuilder.machine",
          "note": "",
          "result": "failed",
          "strategy": "Dockerfile"
        }
      ],
      "timings": {
        "buildAndPushMs": 59953,
        "buildMs": 59953,
        "builderInitMs": 59953,
        "contextBuildMs": -1,
        "imageBuildMs": -1,
        "pushMs": -1
      }
    }
  },
  "operationName": "ResolverFinishBuild"
}

DEBUG {0xc000a06030}
DEBUG <-- 200 https://api.fly.io/graphql (46.17ms)

DEBUG {
  "data": {
    "finishBuild": {
      "id": "2569671",
      "status": "failed",
      "wallclockTimeMs": 60002
    }
  }
}

DEBUG Task manager done
Error: failed to fetch an image or build from source: error connecting to docker: Timeout on EnsureMachineRemoteBuilder.machine

Error: Process completed with exit code 1.

After several long hours, this issue has been resolved. No idea what happened, though.