Skip to content

fix: remove colon from title to appease build #2012

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 22, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions machines/guides-examples/one-app-per-user-why.html.markerb
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
---
title: One app per customer: why?
title: One app per customer - why?
layout: docs
order: 15
nav: machines
---

We recommend that you create one app, with one or more machines, **for each customer** you have. You'll gain a lot from this:

Check warning on line 8 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Machine] Use 'Machines' instead of ' machines'. Raw Output: {"message": "[Fly.Machine] Use 'Machines' instead of ' machines'.", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 8, "column": 55}}}, "severity": "INFO"}

* you'll be able to leverage Fly.io proxy’s load balancing

Check warning on line 10 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.WordList] Consider using 'use' instead of 'leverage'. Raw Output: {"message": "[Fly.WordList] Consider using 'use' instead of 'leverage'.", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 10, "column": 21}}}, "severity": "INFO"}
* the `fly.toml` config is app-level, so you can run Machines in different regions / different sizes in the same app
* your secrets live at the app level: a compromised user app cannot see other user apps' secrets; whereas if all user projects are mashed together in a mega-app, they all have access to everyone else's secrets (plus the `env` would be ginormous and unwieldy)

Check warning on line 12 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Spelling] Is 'else's' a typo? Raw Output: {"message": "[Fly.Spelling] Is 'else's' a typo?", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 12, "column": 196}}}, "severity": "INFO"}
* auto start / auto stop runs at the app level
* apps are easier to transfer between orgs if you ever need move things around
* there's a cleaner separation of concerns in logs
* apps get isolated networks (if you pass in a network name), and machines on the same app share a private network—more on this below!

Check warning on line 16 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Machine] Use 'Machines' instead of ' machines'. Raw Output: {"message": "[Fly.Machine] Use 'Machines' instead of ' machines'.", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 16, "column": 66}}}, "severity": "INFO"}
* each app can still scale independently—so if you've got a _very successful user_ who needs beefier machines, you can scale them up without affecting your other users

Check warning on line 17 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Machine] Use 'Machines' instead of ' machines'. Raw Output: {"message": "[Fly.Machine] Use 'Machines' instead of ' machines'.", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 17, "column": 101}}}, "severity": "INFO"}

A pattern where a single application has machines for all customers is _technically_ possible, but you'd lose the benefits of load balancing, and it would be challenging to make it resilient. Plus, our tooling is not really designed to list thousands of machines per app, so you'd get weird API behavior in some places.

Check warning on line 19 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Machine] Use 'Machines' instead of ' machines'. Raw Output: {"message": "[Fly.Machine] Use 'Machines' instead of ' machines'.", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 19, "column": 41}}}, "severity": "INFO"}

Check warning on line 19 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Machine] Use 'Machines' instead of ' machines'. Raw Output: {"message": "[Fly.Machine] Use 'Machines' instead of ' machines'.", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 19, "column": 254}}}, "severity": "INFO"}

## Isolated networks

Each Fly.io organization gets an isolated network that connects all machines in the organization using Wireguard. This is described in more detail [in our private networking docs](https://fly.io/docs/networking/private-networking/). This generally means that one can deploy, for example, one app for each service, and they will be able to connect to each other using the appropriate hostnames (`.internal` or `.flycast`) as explained in the document.

Check warning on line 23 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Machine] Use 'Machines' instead of ' machines'. Raw Output: {"message": "[Fly.Machine] Use 'Machines' instead of ' machines'.", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 23, "column": 68}}}, "severity": "INFO"}

Check failure on line 23 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Vale.Terms] Use 'WireGuard' instead of 'Wireguard'. Raw Output: {"message": "[Vale.Terms] Use 'WireGuard' instead of 'Wireguard'.", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 23, "column": 104}}}, "severity": "ERROR"}

Check warning on line 23 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Spelling] Is 'hostnames' a typo? Raw Output: {"message": "[Fly.Spelling] Is 'hostnames' a typo?", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 23, "column": 384}}}, "severity": "INFO"}

However, at application creation time, a `--network` parameter can be passed, to create a [custom private network](https://fly.io/docs/networking/custom-private-networks/) for that application. This subnet will not be connected to the organization’s, meaning this application will be isolated from others (although it can still provide a public internet-facing service as configured in `fly.toml`).

Check warning on line 25 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Fly.Spelling] Is 'subnet' a typo? Raw Output: {"message": "[Fly.Spelling] Is 'subnet' a typo?", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 25, "column": 200}}}, "severity": "INFO"}

The [Custom private networks](https://fly.io/docs/networking/custom-private-networks/#private-apps-with-flycast) document details a few ways an isolated app can talk to other applications in a controlled manner, including:

* Application A (non-isolated) can have a `.flycast` IP address in application B’s (isolated) subnet, so they can talk to each other over that IP address. You can do this using `fly ips allocate-v6 --private -a APP_A --network APP_B_NETWORK`. App A can then contact “app-b.flycast” directly.

Check failure on line 29 in machines/guides-examples/one-app-per-user-why.html.markerb

View workflow job for this annotation

GitHub Actions / Vale linter

[vale] reported by reviewdog 🐶 [Vale.Terms] Use 'Flycast' instead of 'flycast'. Raw Output: {"message": "[Vale.Terms] Use 'Flycast' instead of 'flycast'.", "location": {"path": "machines/guides-examples/one-app-per-user-why.html.markerb", "range": {"start": {"line": 29, "column": 45}}}, "severity": "ERROR"}
* Using the [fly-replay header](https://fly.io/docs/networking/dynamic-request-routing/), an application can direct requests to machines in another application, even if that one resides on a private subnet.
* If application B (isolated) exposes a public service, then other applications (isolated or not) can access it over the Internet using its public name.
* If application B (isolated) exposes a public service, then other applications (isolated or not) can access it over the Internet using its public name.
Loading