# Run PocketBase on fly.io

> Learn how to run PocketBase on fly.io with a Dockerfile, then attach a persistent volume with fly volumes create so your data survives deploys.

Author: Flavio Copes | Published: 2024-01-03 | Canonical: https://flaviocopes.com/run-pocketbase-on-flyio/

First set up fly.io. See [run an app on fly.io](https://flaviocopes.com/run-an-app-on-flyio/).

[Also see my Docker tutorials](https://flaviocopes.com/tags/docker/).

Create an empty folder, add this Dockerfile (update the PB_VERSION value to the latest version of PocketBase available):

```toml
FROM ubuntu:latest

ARG PB_VERSION=0.20.4

RUN apk add --no-cache \
    unzip \
    ca-certificates

# download and unzip PocketBase
ADD https://github.com/pocketbase/pocketbase/releases/download/v${PB_VERSION}/pocketbase_${PB_VERSION}_linux_amd64.zip /tmp/pb.zip

RUN unzip /tmp/pb.zip -d /pb/

# uncomment to copy the local pb_migrations dir into the image
# COPY ./pb_migrations /pb/pb_migrations

# uncomment to copy the local pb_hooks dir into the image
# COPY ./pb_hooks /pb/pb_hooks

EXPOSE 8080

# start PocketBase
CMD ["/pb/pocketbase", "serve", "--http=0.0.0.0:8080"]
```

Run `fly launch --build-only` to create and build the app but not deploy it, as we need to attach a volume to persist data across deploys (but first we need to initialize it and the `fly.toml` file)

Run `fly volumes create pb_data --size=1` to create the volume. Create it in the same region of the app

Now in `fly.toml` add:

```toml
[mounts]
  destination = "/pb/pb_data"
  source = "pb_data"
```

Now run `fly deploy --ha=false`

Pocketbase will be available at `https://<yourapp>.fly.dev/_/`

Only problem I had was internal connection URLs (.internal) in Fly, I haven’t found a way to make both IPv4 (used for external connection) work alongside IPv6 (used for internal connections), so in my app (also in Fly) I used external URL (hope to fix).
