diff --git a/_posts/2022-11-21-gotosocial-on-fly-io.md b/_posts/2022-11-21-gotosocial-on-fly-io.md new file mode 100644 index 0000000..152df56 --- /dev/null +++ b/_posts/2022-11-21-gotosocial-on-fly-io.md @@ -0,0 +1,164 @@ +--- +permalink: "/{{ year }}/{{ month }}/{{ day }}/gotosocial-on-fly-io" +title: "Deploying GoToSocial on fly.io" +published_date: "2022-11-21 22:50:00 +0100" +layout: post.liquid +data: + route: blog +--- + +Everyone and their dog is getting on [ActivityPub]. +Yes, [me too][hachyderm], for now. +Mastodon is what everyone is going for, +but running an instance is kinda resource intensive +and I really don't want to be responsible for yet another service. + +Mastodon is not the only implementation of ActivityPub though. +[GoToSocial] is another. +So why not try it? +Let's deploy it on [fly.io]. + +[ActivityPub]: https://github.com/badboy/gotosocial-fly +[hachyderm]: https://hachyderm.io/@jer +[gotosocial]: https://gotosocial.org/ +[git]: https://github.com/badboy/gotosocial-fly +[fly.io]: https://fly.io/ + +We start by creating a new Fly app. +We stick to a generated name and put it into Frankfurt. + +```bash +$ mkdir -p Documents/gotosocial-fly +$ cd Documents/gotosocial-fly +$ fly launch +Creating app in /Users/jer/Documents/gotosocial-fly +Scanning source code +Could not find a Dockerfile, nor detect a runtime or framework from source code. Continuing with a blank app. +? Choose an app name (leave blank to generate one): +automatically selected personal organization: jer +? Choose a region for deployment: Frankfurt, Germany (fra) +Created app young-darkness-8503 in organization personal +Wrote config file fly.toml +``` + +GoToSocial is available on [Docker]. +We create a new `Dockerfile`, use the upstream image, add our configuration file and launch it. + + +```Dockerfile +FROM superseriousbusiness/gotosocial:latest + +WORKDIR /gotosocial/storage +WORKDIR /gotosocial +ADD config.yaml /gotosocial/ + +CMD ["--config-path", "/gotosocial/config.yaml"] +``` + +The GoToSocial Dockerfile already [specifies an entrypoint][entrypoint], +so it's enough to specify the additional arguments using `CMD`. + + +[docker]: https://hub.docker.com/r/superseriousbusiness/gotosocial +[entrypoint]: https://github.com/superseriousbusiness/gotosocial/blob/b153808472655cc73245ad60a2aa38bf04833367/Dockerfile#L47 + +Last thing missing is the configuration file. + +We create a `config.yaml` based on the [example]. +The full file [is in the repository][git-config.yaml]. +The important bits are the host, database config and disabling signup. +Pretty much everything else is left to the defaults. + +```toml +host: "young-darkness-8503.fly.dev" +db-type: "sqlite" +db-address: "/gotosocial/storage/sqlite.db" +accounts-registration-open: false +``` + +The host should be the random name `fly launch` chose earlier or your own domain when you add it to the app. + +[example]: https://github.com/superseriousbusiness/gotosocial/blob/b153808472655cc73245ad60a2aa38bf04833367/example/config.yaml +[git-config.yaml]: https://github.com/badboy/gotosocial-fly/blob/main/config.yaml + +Now we can deploy the app. + +``` +$ fly deploy +==> Verifying app config +--> Verified app config +==> Building image +(cut) +--> Pushing image done +image: registry.fly.io/young-darkness-8503:deployment-01GJE1E4HW25RAND71YG1637E5 +image size: 65 MB +==> Creating release +--> release v1 created + +--> You can detach the terminal anytime without stopping the deployment +==> Monitoring deployment + + 1 desired, 1 placed, 1 healthy, 0 unhealthy [health checks: 1 total, 1 passing] +--> v1 deployed successfully +``` + +The app was successfully deployed and should be reachable at [young-darkness-8503.fly.dev][flydev], +where we'll see ... not much: + +[flydev]: https://young-darkness-8503.fly.dev/ + +![GoToSocial deployed!](https://tmp.fnordig.de/blog/2022/gotosocial-deployed.png) + +What's missing is a user. +We need to create one using the command line tooling. +First SSH into the machine: + +``` +$ fly ssh console +Connecting to fdaa:0:252b:a7b:67:4911:d8ec:2... complete +/ # +``` + +Then we create a new user, confirm it and finally give it admin rights. +You can find these steps [in the GoToSocial docs](https://docs.gotosocial.org/en/latest/installation_guide/binary/#5-create-and-confirm-your-user) as well. + +``` +/ # /gotosocial/gotosocial --config-path /gotosocial/config.yaml admin account create --username jer +--email jer@example.org --password 'securePassword1' +(cut) +/ # /gotosocial/gotosocial --config-path /gotosocial/config.yaml admin account confirm --username jer +(cut) +/ # /gotosocial/gotosocial --config-path /gotosocial/config.yaml admin account promote --username jer +(cut) +``` + +The profile is now visible at . +GoToSocial doesn't come with its own web client, but we can use [Pinafore], +a small and fast web client (it does have an [admin interface] though). +We use the same domain to login, then use the email address and password from the `account create` command above. + +[pinafore]: https://pinafore.social/ +[admin interface]: https://young-darkness-8503.fly.dev/admin + +![First post from my own GoToSocial instance](https://tmp.fnordig.de/blog/2022/gotosocial-client.png) + +That post is also visible on young-darkness-8503 directly: + +[![First post visible on my own instance](https://tmp.fnordig.de/blog/2022/gotosocial-first-post.png)][first post] + + +[first post]: https://young-darkness-8503.fly.dev/@jer/statuses/01GJE2E4MDR2R0GEH1N9KPRKQH + +## What's next? + +This is a test deploy. +I'm not going to keep it up for forever. +At the very least I need a proper domain on it. +And then the storage should probably be on a [Fly volume][fly-volumes] +so it survives re-deploys. +GoToSocial is alpha software. +It sure is missing some features (though I really don't know what). +It might also have lots of bugs. +Decide for yourself if you want to run it! + +[fly-volumes]: https://fly.io/docs/reference/volumes