# 14-Aug-2024 – 26-Sep-2024 — leaving [Heroku](https://www.heroku.com/): Docker builds and [Fly.io](https://fly.io)

## build 17 — [commit 13cbf75](https://github.com/nbarrett/ngx-ramblers/commit/13cbf7547b5d0ace67aab848e57610b8068b0ced)

---

## The major deliverable

This six-week stretch was about one thing: being able to run every [NGX-Ramblers](https://ngx-ramblers.org.uk) group site without [Heroku](https://www.heroku.com/).

The new capability is a Docker image built by [GitHub Actions](https://github.com/nbarrett/ngx-ramblers/actions/workflows/build-push-and-deploy-ngx-ramblers-docker-image.yml). Each change is packaged once, tagged with the GitHub build number, and pushed so it can be started anywhere. That replaced Heroku's own build-and-release process, which we could no longer rely on. From 26 September 2024 a release is named by that build number; this note is build 17 ([commit 13cbf75](https://github.com/nbarrett/ngx-ramblers/commit/13cbf7547b5d0ace67aab848e57610b8068b0ced)). GitHub no longer keeps the original Actions run.

The image then runs on [Fly.io](https://fly.io). A site starts in a few hundred milliseconds when someone visits, and can sit idle the rest of the time. There is no need to ping it to keep it awake. On Fly's [pay as you go](https://fly.io/docs/about/pricing/) plan, usage under the monthly allowance is discounted to nothing, which is how a typical group site stays free to host. The same image can be rolled out to [staging](https://www.ngx-ramblers.org.uk) and then to every configured group, instead of each site being a separate Heroku app with its own build.

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/dcecea1e-edd7-4760-9df9-082d47295613.jpg)

*Docker image built in [GitHub Actions](https://github.com/nbarrett/ngx-ramblers/actions/workflows/build-push-and-deploy-ngx-ramblers-docker-image.yml), then started on [Fly.io](https://fly.io) — the path that replaced [Heroku](https://www.heroku.com/).*

## Other changes over the period

The rest of the period was smaller, visitor-facing work that happened alongside that move.

[Meetup](https://www.meetup.com/api/authentication/) changed how apps sign in, so Meetup posting was rebuilt to match their current login. Settings now live under [Admin → System Settings → External systems](https://ngx-ramblers.org.uk/admin/settings/system-settings?tab=external-systems "{{siteUrl}}"), with a button to view the OAuth clients. Groups that publish walks to Meetup needed this to keep posting.

Walk pages now show accessibility information, and the Additional details field from Walks Manager appears below the main walk information when a group uses it. Some walk icons that had stopped drawing were fixed.

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/6290b061-9ece-4602-b949-92d6637bdbe6.jpg)

*Additional details shown beneath the main walk information, [as on this Stag Walkers walk](https://stag-walkers.ngx-ramblers.org.uk/walks/100278622).*

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/85d85dfa-60be-4e46-b99d-e708fe07d14a.jpg)

*Accessibility information on a walk details page.*

Member Admin no longer locked up when editing a member. Bulk load no longer reset existing members' mailing-list subscriptions (only new members get the defaults). Committee and testing lists can be hidden from the member [email subscriptions](https://ngx-ramblers.org.uk/admin/profile/email-subscriptions "{{siteUrl}}") page so people cannot join them themselves. The bulk-delete control sits on the left of the member table so it stays in view when there are many lists.

## At a glance

- Sites are packaged as a Docker image by [GitHub Actions](https://github.com/nbarrett/ngx-ramblers/actions/workflows/build-push-and-deploy-ngx-ramblers-docker-image.yml), tagged with the build number
- That image runs on [Fly.io](https://fly.io) instead of [Heroku](https://www.heroku.com/), and the same image can be rolled out to every group site
- Unused machines sleep; keepalive pings are not needed, so a typical site stays on Fly's [pay as you go](https://fly.io/docs/about/pricing/) allowance
- Releases are numbered by GitHub build from this point; this note is build 17 ([commit 13cbf75](https://github.com/nbarrett/ngx-ramblers/commit/13cbf7547b5d0ace67aab848e57610b8068b0ced))
- Meetup posting uses Meetup's [current login](https://www.meetup.com/api/authentication/), configured under [System Settings → External systems](https://ngx-ramblers.org.uk/admin/settings/system-settings?tab=external-systems "{{siteUrl}}")
- Walk pages show accessibility information and Additional details
- Member Admin editing no longer locks up; bulk load keeps existing mailing-list subscriptions; some lists can be committee-only