diff --git a/happy-path/aim.html.markerb b/happy-path/aim.html.markerb deleted file mode 100644 index 8b573ae330..0000000000 --- a/happy-path/aim.html.markerb +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: What is this deep dive demo? -layout: docs -nav: demo -order: 2 ---- - -To get the deep dive demo up and running on Fly.io, all you need is an empty directory and either Node or Ruby installed. But here are some more details about what the deep dive demo app actually is. - -The important thing to note is that this is all very straightforward stuff using industry standard components that you can run on your laptop, a VPS, AWS EC2, Google Compute Engine, or Azure. - -## Web Dictaphone -- Fly.io edition - -The deep dive demo is based on [MDN's Web Dictaphone](https://github.com/mdn/dom-examples/tree/main/media/web-dictaphone+external). -You can play with a [live demo hosted on GitHub](https://mdn.github.io/dom-examples/media/web-dictaphone/+external). The Web Dictaphone app is about as basic of an HTML form as you can get, and it has the added bonus of providing the ability to generate as many media files as you want using only your voice. - -Your own app might have many forms, and more complex forms, but the dictaphone app demonstrates the the basic flow. - -The basic Web Dictaphone is client side only, requiring a web server that can deploy static assets (HTML, CSS, JS, images), like NGINX, Apache HTTPd, or Caddy. Storing the data in databases for our deep dive demo requires a server that can handle HTTP GET, POST, PUT, and DELETE requests. The choice of server varies depending on the language or framework. - -The demo uses the following: - -* A [PostgreSQL](https://www.postgresql.org/+external) relational database to store the names of the audio clips -* A [Tigris bucket](https://www.tigrisdata.com/+external) to store the the audio files -* [Upstash for Redis](https://fly.io/docs/upstash/redis/) and [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API+external) to handle the connections for the realtime requirement - -## Demo flavors - -Our deep dive demo comes in two flavors (so far): - -- Node.js ([node-dictaphone](https://github.com/fly-apps/node-dictaphone+external) GitHub repo) -- Rails ([rails-dictaphone](https://github.com/fly-apps/rails-dictaphone+external) GitHub repo) - -### Node.js - -The Node.js flavor of the deep dive demo uses an [Express.JS](https://expressjs.com/+external) server. - -If you're looking for specific code: - -* The code to handle the clips and audio files is in [app.js](https://github.com/fly-apps/node-dictaphone/blob/main/app.js) -* The realtime implementation code is in [pubsub.js](https://github.com/fly-apps/node-dictaphone/blob/main/pubsub.js) - -### Rails - -The Rails flavor of the deep dive demo uses a [Puma](https://github.com/puma/puma+external) server. - -If you're looking for specific code: - -* The code to handle the clips and audio files is in [app/controller/clipController.rb](https://github.com/fly-apps/rails-dictaphone/blob/main/app/controllers/clips_controller.rb) -* The realtime implementation code is primarily in [ActionCable](https://guides.rubyonrails.org/action_cable_overview.html), so all that is needed is one line in [app/models/clip.rb](https://github.com/fly-apps/rails-dictaphone/blob/6bdf4f639640c9fb55530546dbbed682b65a7df9/app/models/clip.rb#L2) -and one line in [app/views/layouts/application.html.erb](https://github.com/fly-apps/rails-dictaphone/blob/6bdf4f639640c9fb55530546dbbed682b65a7df9/app/views/layouts/application.html.erb#L9) - ---- - -**Next:** Now that you know what you're about to deploy, the next step is running [`fly launch`](../fire/). diff --git a/happy-path/application.html.markerb b/happy-path/application.html.markerb index e25a3f976e..67e1d79f63 100644 --- a/happy-path/application.html.markerb +++ b/happy-path/application.html.markerb @@ -5,16 +5,14 @@ nav: demo order: 4 --- -Your demo app is running by default on two [Machines](https://fly.io/docs/machines/). +Your demo app is running by default on two [Fly Machines](/docs/machines/), our fast-launching VMs. -Both Machines stop when not in use, and [autostart](https://fly.io/docs/launch/autostop-autostart/) when a new request comes in. -This is entirely configurable. You can chose to [suspend](https://community.fly.io/t/new-feature-in-preview-suspend-resume-for-machines/20672) instead of stop, configure a [minimum number](https://fly.io/docs/reference/configuration/#the-http_service-section) of Machines to leave running, or even decide never to stop Machines at all. +Both Machines stop when not in use, and automatically when a new request comes in. [Autostop/autostart](/docs/launch/autostop-autostart/) is entirely configurable. You can chose to suspend instead of stop, configure a minimum number of Machines to keep running, or even decide never to stop Machines at all. -Familiarize yourself with the [fly.toml](https://fly.io/docs/reference/configuration/) config file. Make a change there -- or in fact to any part of your application -- and run `fly deploy`. +The purpose of two Machines is twofold: redundancy and scalability. If one Machine goes down, the other can continue on. If both are available, when your app has higher traffic, both can be started to handle requests. You can [vertically scale](/launch/scale-machine/) the CPU and RAM on Machines. -The purpose of two Machines is twofold: redundancy and scalability. If the Machine hosting one goes down, the other can continue on. If both are available, in times of high use both can be started to handle requests. -You can [vertically scale](https://fly.io/docs/launch/scale-machine/) the CPU and RAM on each Machine. +You can also [horizontally scale](/docs/launch/scale-count/) the number of Machines. You can scale out to different regions with the `fly scale count` command too. If you have a co-worker on another continent, create a Machine there. -You can also [horizontally scale](https://fly.io/docs/launch/scale-count/) to more Machines. Be sure to scroll down on that page far enough to see how to scale to multiple [regions](https://fly.io/docs/reference/regions/). If you have a co-worker on another continent, create a Machine there. +Familiarize yourself with the [fly.toml](/docs/reference/configuration/) config file. Make a change there--or to any part of your app--and run `fly deploy` to update your app. -All this is made possible by [Anycast](https://fly.io/docs/networking/services/), a [load balancing proxy](https://fly.io/docs/reference/fly-proxy/), and [DNS certificates](https://fly.io/docs/networking/custom-domain/). Be sure to read that last link if you're interested in custom domains. +Your Fly App takes advantage of [Anycast routing](/doc/networking/services/), a [load-balancing proxy](/docs/reference/fly-proxy/), and [private networking](/docs/networking/private-networking/). You can also create [DNS certificates for custom domains](/docs/networking/custom-domain/). diff --git a/happy-path/index.html.markerb b/happy-path/index.html.markerb index d2d1314911..06dcfd7b49 100644 --- a/happy-path/index.html.markerb +++ b/happy-path/index.html.markerb @@ -2,20 +2,67 @@ title: Deep dive demo layout: docs nav: demo -toc: false +toc: true --- -You probably landed on this page because somebody recommended Fly.io to you. You're curious, and you want to know more before you commit. +Welcome to our deep dive demo, where you can explore Fly.io more thoroughly, but in a time-boxed way. In one hour or less: get a fully-functioning app running in the first few minutes, and then have enough time left over to understand what you just did, explore how the pieces fit together, and even integrate in AI functionality that makes use of GPUs. -If you came from our [Speedrun](https://fly.io/speedrun) or [Getting started](https://fly.io/docs/getting-started/) pages, maybe you want to not only be up and running fast, you want to feel confident that you're making a good decision; choosing a platform that can both support you now, and scale with you later on as you grow. +## Goals of the deep dive -Maybe you're concerned about lock in. You want to know that you can -use services from other places and even eject entirely and move your entire -application elsewhere if things don't work out. +It's really just one goal: -If you want to explore more deeply but in a time-boxed way, then you're in the right place. You should be up and running within minutes, and have enough of the hour left over to spend some time understanding what you just did and run a few commands and see what they do. +**Help you find out if Fly.io is the right place for you.** -If you don't get a good feeling within an hour, you're out of here. If you do get a good feeling, then consider -sticking around to experiment and learn more about features that interest you. And when you're done, you can delete everything and launch the application that you brought here to launch. +If you came from our [Speedrun](https://fly.io/speedrun) or [Getting started](https://fly.io/docs/getting-started/) pages, maybe you want to go beyond `hello world` and explore the platform so you can feel confident that you're choosing a platform that can support you now, and scale with you later on as you grow. -**Next:** [Beyond `hello fly`](/docs/happy-path/ready/) +Maybe you're concerned about lock in. You want to use services from other places and even eject entirely and go elsewhere if things don't work out. + +If you don't get a good feeling within an hour, you're out of here. If you do get a good feeling, then stick around and try launching the app that you brought here to launch. + +## Beyond `hello fly` + +Our deep dive assumes that you're not satisfied by a `hello fly`, or even a `hello fly` with a database application. You know that a real-world application has at a minimum the following components: + +* An HTML form and a database; typically a relational database. +* The ability to handle media files or documents, generally using S3. +* A multi-user and realtime component, where changes made by one person in one location are reflected instantly in the browser of another person. + +To get a fully-functional app running smoothly, you need a whole bunch of things; things like Anycast routing, load balancers, DNS certificates, WebSockets, an internal private network, a relational database, an object store, and an in-memory database. And the knowledge to to connect them all together. + +We take a lot of this work off your plate with our [Fly Proxy routing](/docs/reference/fly-proxy/) and out-of-the-box [private networking](/docs/networking/private-networking/). + +Usually, set up for a complete app typically takes a _minimum_ of an afternoon's worth of work, even if you're familiar with a cloud platform. There is almost always a surprise, and often several. We can't promise no surprises, but we can show you how we'll partner with you to handle some of the dev ops complexities of working in a public cloud. + +## So what is this deep dive demo app? + +The deep dive demo uses industry standard components that you can run on your laptop, a VPS, AWS EC2, Google Compute Engine, or Azure. + +### Web Dictaphone -- Fly.io edition + +The deep dive demo is based on [MDN's Web Dictaphone](https://github.com/mdn/dom-examples/tree/main/media/web-dictaphone+external). +You can play with a [live demo hosted on GitHub](https://mdn.github.io/dom-examples/media/web-dictaphone/+external). The Web Dictaphone app is about as basic of an HTML form as you can get, and it has the added bonus of providing the ability to generate as many media files as you want using only your voice. + +The basic Web Dictaphone is client side only, requiring a web server that can deploy static assets (HTML, CSS, JS, images), like NGINX, Apache HTTPd, or Caddy. Storing the data in databases for our deep dive demo requires a server that can handle HTTP GET, POST, PUT, and DELETE requests. The choice of server varies depending on the language or framework. + +### Other demo components + +The demo includes the following components: + +* A [PostgreSQL](https://www.postgresql.org/+external) relational database to store the names of the audio clips +* A [Tigris bucket](https://www.tigrisdata.com/+external) to store the the audio files +* [Upstash for Redis](https://fly.io/docs/reference/redis/) and [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API+external) to handle the connections for the realtime requirement + +## Available runtimes + +Our deep dive demo comes in two flavors (so far): + +- **Node.js** + - [node-dictaphone](https://github.com/fly-apps/node-dictaphone+external) GitHub repo + - For details about implementation-specific files and app logic, see [Node.js deep dive demo](/docs/happy-path/nodejs/). +- **Rails** + - [rails-dictaphone](https://github.com/fly-apps/rails-dictaphone+external) GitHub repo + - For details about implementation-specific files and app logic, see [Rails deep dive demo](/docs/happy-path/rails/). + +--- + +**Next:** [Launch the demo](/docs/happy-path/launch-deep-dive/) diff --git a/happy-path/fire.html.markerb b/happy-path/launch-deep-dive.html.markerb similarity index 55% rename from happy-path/fire.html.markerb rename to happy-path/launch-deep-dive.html.markerb index 6ced9689a7..b54eb02787 100644 --- a/happy-path/fire.html.markerb +++ b/happy-path/launch-deep-dive.html.markerb @@ -7,7 +7,9 @@ order: 3 This is the point where you might expect to see that the marketing hype promised by [Speedrun](https://fly.io/speedrun) doesn't quite cut it. But the fact is that Fly.io is built for an excellent developer experience (DX) for full stack applications with both realtime time and object storage requirements. -There are only two steps. +**Step 0:** To get set up to run the deep dive demo on Fly.io, all you need to do is install Ruby or Node and create an empty project directory. + +After that there are only two steps. **Step 1:** [Install flyctl](https://fly.io/docs/flyctl/install/). @@ -20,31 +22,30 @@ fly launch --from https://github.com/fly-apps/node-dictaphone fly launch --from https://github.com/fly-apps/rails-dictaphone ``` -If you are new to Fly.io, the second step will take you to a page where you can register before continuing. +If you're new to Fly.io, the second step will take you to a page where you can register before continuing. -The `fly launch` output describes what you'll be getting for the app, and gives you an opportunity to tweak the settings (suggestion: Don't. The defaults are fine for this demo and we'll walk you through how to adjust them later). And then it will build and assemble and wire up your app. +The `fly launch` output describes what you'll be getting for the app, and gives you an opportunity to tweak the settings. (Suggestion: Don't. The defaults are fine for this demo and we'll walk you through how to adjust them later.) And then it will build and assemble and wire up your app. Take your time and play with it. Open the application in multiple browser windows. Send a link to a friend on another continent and watch your browser update in realtime. -And then relax. We promised you it would be less than an hour. You're already up and running. If you are so inclined, try bringing up this exact same application on another cloud provider. We don't mind. In fact, we encourage it. Just please don't count the time you spent there against the hour budget we asked you to allot to this activity. +And then relax. We promised you it would be less than an hour. You're already up and running. If you are so inclined, try bringing up this exact same application on another cloud provider. We don't mind. In fact, we encourage it. Just please don't count the time you spent there against the hour you set aside for this demo! -### What You Get +## Explore the result of `fly launch` -Once you're back and/or rested up, explore app and add-on components. Feel free to review the following in any order, or chose to skip ahead: +Once you're back and/or rested up, explore the app and add-on components. Feel free to review the following in any order, or chose to skip ahead: - * [The Fly App](../application/) - * [PostgreSQL](../postgresql/) + * [Your Fly App](../application/) + * [PostgreSQL database](../postgresql/) * [Tigris Object Storage](../tigris/) * [Upstash Redis](../redis/) -### Runtimes +## Runtimes -Optional, but deeper dives are provided for each runtime: +Optional, but details are provided for each runtime: * [Node.js](../nodejs/) * [Rails](../rails/) -### Next +--- -- As an extra treat, you can add some AI functionality: in this case speech recognition using [Whisper](../whisper/). -- When you're all done, visit the [recap](../recap). \ No newline at end of file +**Next:** Add [OpenAI Whisper](../whisper/) speech recognition as a bonus. diff --git a/happy-path/nodejs.html.markerb b/happy-path/nodejs.html.markerb index 58e6044041..ed4044b995 100644 --- a/happy-path/nodejs.html.markerb +++ b/happy-path/nodejs.html.markerb @@ -1,13 +1,14 @@ --- -title: Node.js demo +title: Node.js demo reference layout: docs nav: demo --- -Source is on [GitHub](https://github.com/fly-apps/node-dictaphone). + + +The Node.js demo source is on [GitHub](https://github.com/fly-apps/node-dictaphone). `fly launch` will provide a [`Dockerfile`](https://docs.docker.com/reference/dockerfile/) - and a [`fly.toml`](https://fly.io/docs/reference/configuration/). As your application - changes, you can run `npx @flydotio/dockerfile` to produce updated Dockerfiles. + and a [`fly.toml`](https://fly.io/docs/reference/configuration/) config file. When you make changes to your application, you can run `npx @flydotio/dockerfile` to produce updated Dockerfiles. How the pieces are put together: @@ -32,7 +33,7 @@ How the pieces are put together: * The [express-ws](https://github.com/HenningM/express-ws?tab=readme-ov-file#express-ws-) module is used for [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) support. * The [redis](https://github.com/redis/node-redis?tab=readme-ov-file#node-redis) module - is used to access Redis. The `REDIS_URL` secret isused to access the database. + is used to access Redis. The `REDIS_URL` secret issued to access the database. Key points of logic: @@ -48,4 +49,4 @@ Key points of logic: replaced with new contents. * When the `WHISPER_URL` secret is set, `PUT` requests will cause the audio clips to be passed to the Whisper server, and responses will be used to update the - PostgreSQL database. The code for this is [here](https://github.com/fly-apps/node-dictaphone/blob/1e84a4dece6888dfc68880d146b46511d47391b3/app.js#L102-L129). \ No newline at end of file + PostgreSQL database. The code for this is in [app.js](https://github.com/fly-apps/node-dictaphone/blob/1e84a4dece6888dfc68880d146b46511d47391b3/app.js#L102-L129). diff --git a/happy-path/postgresql.html.markerb b/happy-path/postgresql.html.markerb index af07306b59..f024c823de 100644 --- a/happy-path/postgresql.html.markerb +++ b/happy-path/postgresql.html.markerb @@ -5,10 +5,10 @@ order: 5 nav: demo --- -Fly Postgres is deployed as a separate app, and that app comes initially configured with a single [Fly Postgres](https://fly.io/docs/postgres/) Machine. That's fine for development, but for production you need redundancy and scalability. With a [few commands](https://fly.io/docs/postgres/advanced-guides/high-availability-and-global-replication/) you can create an HA cluster in your primary region and read-only replicas elsewhere. +Fly Postgres is deployed as a separate app, and that app comes initially configured with a single [Fly Postgres](/docs/postgres/) Machine. That's fine for development, but for production you need redundancy and scalability. With a [few commands](/docs/postgres/advanced-guides/high-availability-and-global-replication/) you can create an HA cluster in your primary region and read-only replicas elsewhere. -If you're interested in a managed offering, [Supabase Postgres](https://fly.io/docs/supabase/) is in public alpha. +If you're interested in a managed offering, [Supabase Postgres](/docs/supabase/) is in public alpha. -And there is no lock in here. We have a list of [recommended external providers](https://fly.io/docs/postgres/getting-started/what-you-should-know/#recommended-external-providers), but you're free to host your database literally anywhere. +And there is no lock in here. We have a list of [recommended external providers](/docs/postgres/getting-started/what-you-should-know/#recommended-external-providers), but you're free to host your database literally anywhere. -Before moving on, one last observation on the relational database. While you want and need your application to be on the internet, you are much better off if your relational database is NOT directly exposed to the internet, but can only be accessed via your application. That’s the value of an [internal private network](https://fly.io/docs/networking/private-networking/). The private connection from the demo app to the Postgres app was configured automatically for you. +Before moving on, one last observation on the relational database. While you want and need your application to be on the internet, you are much better off if your relational database is NOT directly exposed to the internet, but can only be accessed via your application. That’s the value of an [internal private network](/docs/networking/private-networking/). The private connection from the demo app to the Postgres app was configured automatically for you. diff --git a/happy-path/rails.html.markerb b/happy-path/rails.html.markerb index 962b7ece16..2498618c52 100644 --- a/happy-path/rails.html.markerb +++ b/happy-path/rails.html.markerb @@ -1,14 +1,14 @@ --- -title: Rails demo +title: Rails demo reference layout: docs nav: demo --- -Source is on [GitHub](https://github.com/fly-apps/rails-dictaphone/). +The Rails source is on [GitHub](https://github.com/fly-apps/rails-dictaphone/). `fly launch` will provide a [`Dockerfile`](https://docs.docker.com/reference/dockerfile/) - and a [`fly.toml`](https://fly.io/docs/reference/configuration/). `fly launch` will - also work with Rails provided Dockerfiles. As your application changes, you can run - `bin/rails generate dockerfile` to generate updated dockerfiles. + and a [`fly.toml`](/docs/reference/configuration/) config file. `fly launch` will + also work with Rails-provided Dockerfiles. When you make changes to your application, you can run + `bin/rails generate dockerfile` to generate updated Dockerfiles. How the pieces are put together: diff --git a/happy-path/ready.html.markerb b/happy-path/ready.html.markerb deleted file mode 100644 index e34bf2935e..0000000000 --- a/happy-path/ready.html.markerb +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Beyond "hello fly" -layout: docs -nav: demo -toc: false -order: 1 ---- - -If you're not satisfied by a `hello world`, or even a `hello world` with a database application, it's because you know that a real-world application has at a minimum the following components: - -* An HTML form and a database; typically a relational database. -* The ability to handle media files or documents, generally using S3. -* A multi-user and realtime component, where changes made by one person in one location are reflected instantly in the browser of another person. - -While this doesn't seem like a big ask, experience shows that to get a fully-functional app running smoothly, you need a whole bunch of things; here are a few examples: Anycast routing, load balancers, DNS certificates, WebSockets, an internal private network, a relational database, an object store, and an in-memory database. And the knowledge of how to connect them all together. - -Set up for a complete app typically takes a _minimum_ of an afternoon's worth of work, even by experts familiar with their target platform. With emphasis on the word _minimum_ as there is almost always a surprise, and often several. - -In the next few minutes you'll have all this up and running, and can leisurely explore how the pieces fit together. You'll even have enough time left over to integrate in AI functionality making use of GPUs. - ---- - -**Next:** [What is this deep dive demo anyway?](../aim/) diff --git a/happy-path/recap.html.markerb b/happy-path/recap.html.markerb index bccead31f4..702c69a0b9 100644 --- a/happy-path/recap.html.markerb +++ b/happy-path/recap.html.markerb @@ -6,20 +6,20 @@ toc: false order: 9 --- -We promised you that you could get through this in under an hour. -You successfully deployed a full-stack app with both object storage and realtime requirements, and then went on to add AI functionality. +We promised that you could get through this in under an hour. You successfully deployed a full-stack app with both object storage and realtime requirements, and then went on to add AI functionality. -Up front, we set some goals: +Up front, we set a goal: **Help you find out if Fly.io is the right place for you.** -* You want to not only be up and running quickly, you want to feel confident that you're making a good decision; choosing a platform that can both support you now, and scale with you later on as you grow. -* You want to know that you can still use services from other places and even eject entirely and move your entire -application elsewhere if things don't work out. +Fly.io can support your apps now, with flexible built-in features, and scale with you later as you grow, with low-level control of Machines and powerful compute in 35 [regions](/docs/reference/regions/). + +You're never locked in; you can always eject entirely and move your entire application elsewhere if things don’t work out. How did we do? Visit [community](https://community.fly.io/) and let us know. ## Learn more - * [Support](https://fly.io/docs/about/support/) - * [Pricing](https://fly.io/docs/about/pricing/) + * [Going to production](/docs/apps/going-to-production/) + * [Support](/docs/about/support/) + * [Pricing](/docs/about/pricing/) * [Application Monitoring by Sentry](../../reference/sentry/) * [Application Security by Arcjet](../../reference/arcjet/) diff --git a/happy-path/redis.html.markerb b/happy-path/redis.html.markerb index a88f2e353d..c798a1993b 100644 --- a/happy-path/redis.html.markerb +++ b/happy-path/redis.html.markerb @@ -5,7 +5,7 @@ nav: demo order: 7 --- -[Upstash Redis](https://fly.io/docs/upstash/redis/) is used by the deep dive demo app for its [pubsub](https://redis.io/docs/latest/commands/?group=pubsub) capabilities, but it can do [so much more](https://upstash.com/docs/redis/overall/rediscompatibility). +[Upstash Redis](/docs/upstash/redis/) is used by the deep dive demo app for its [pubsub](https://redis.io/docs/latest/commands/?group=pubsub+external) capabilities, but it can do [so much more](https://upstash.com/docs/redis/overall/rediscompatibility+external). In particular, Redis is useful for caching: diff --git a/happy-path/tigris.html.markerb b/happy-path/tigris.html.markerb index 0ea3c73ad3..3c14d6d7b5 100644 --- a/happy-path/tigris.html.markerb +++ b/happy-path/tigris.html.markerb @@ -7,6 +7,6 @@ order: 6 [Tigris](https://fly.io/docs/tigris/) is a globally distributed object storage service. It essentially requires no configuration, and seamlessly handles multi-regions. If you upload an audio file to a host in Virginia, you can access it from Amsterdam. Even better: subsequent accesses from regions other than the primary region are served locally. -Unlike relational databases, there may be reasons why you want to make your object store available via the internet. In this demo, the object store starts out private, but you can make it [public](https://fly.io/docs/tigris/#public-buckets) if you want. +Unlike relational databases, there may be reasons why you want to make your object store available via the internet. In this demo, the object store starts out private, but you can make it [public](/docs/tigris/#public-buckets) if you want. -And if you happen to have an existing S3 object store, check out [shadow buckets](https://fly.io/docs/tigris/#migrating-to-tigris-with-shadow-buckets) which enable you to incrementally migrate your data. +And if you happen to have an existing S3 object store, check out [shadow buckets](/docs/tigris/#migrating-to-tigris-with-shadow-buckets), which enable you to incrementally migrate your data. diff --git a/happy-path/whisper.html.markerb b/happy-path/whisper.html.markerb index 369e9f25ce..a88d2508cc 100644 --- a/happy-path/whisper.html.markerb +++ b/happy-path/whisper.html.markerb @@ -12,20 +12,20 @@ fly launch --attach --from https://github.com/rubys/cog-whisper fly deploy ``` -Next try capturing a new audio clip. It will be transcribed automatically. +Next try capturing a new audio clip. It will be transcribed automatically by OpenAI Whisper, an automatic speech recognition (ASR) program that converts speech into text. ## What just happened -You provisioned a new Machine, this time with an [L40S](https://www.nvidia.com/en-us/data-center/l40s/) GPU. +You provisioned a new Machine, this time with an [L40S](https://www.nvidia.com/en-us/data-center/l40s/+external) GPU. It will stop when not in use. It will restart when a new request comes in. -It is only available on the private network using [Flycast](https://fly.io/docs/networking/flycast/). +It is only available on the private network using [Flycast](/docs/networking/flycast/). -It runs [OpenAI Whisper](https://openai.com/index/whisper/) accessed via a [COG](https://github.com/replicate/cog) interface. +It runs [OpenAI Whisper](https://openai.com/index/whisper/+external) accessed via a [COG](https://github.com/replicate/cog+external) interface. This process involves taking audio clips from Tigris, passing them to Whisper, and updating Postgres with the results. The Node code for this is about [two dozen lines of code](https://github.com/fly-apps/node-dictaphone/blob/1e84a4dece6888dfc68880d146b46511d47391b3/app.js#L102-L129), and for Rails is about a [dozen](https://github.com/fly-apps/rails-dictaphone/blob/6bdf4f639640c9fb55530546dbbed682b65a7df9/app/jobs/whisper_transcribe_job.rb#L5-L16). -And, as always, no lock in here. You can opt to replace this with a machine hosted by [Replicate](https://replicate.com/) or elsewhere. +And, as always, there's no lock in. You can opt to replace this with a machine hosted by [Replicate](https://replicate.com/) or elsewhere. -**Next:** [Recap](/docs/happy-path/recap) +**Next:** [Recap](/docs/happy-path/recap) the deep dive diff --git a/partials/_demo_nav.html.erb b/partials/_demo_nav.html.erb index 5749c85b65..7a7bd212cb 100644 --- a/partials/_demo_nav.html.erb +++ b/partials/_demo_nav.html.erb @@ -10,31 +10,29 @@ path: "/docs/happy-path/", accordion: false, links: [ - { text: "Beyond \"hello fly\"", path: "/docs/happy-path/ready/" }, - { text: "What is this deep dive demo?", path: "/docs/happy-path/aim/" }, - { text: "Launch the demo", path: "/docs/happy-path/fire/" } + { text: "Launch the demo", path: "/docs/happy-path/launch-deep-dive/" } ] }, { title: "What You Get", open: true, links: [ - { text: "The Fly App", path: "/docs/happy-path/application/" }, - { text: "PostgreSQL", path: "/docs/happy-path/postgresql/" }, + { text: "Your Fly App", path: "/docs/happy-path/application/" }, + { text: "PostgreSQL database", path: "/docs/happy-path/postgresql/" }, { text: "Tigris Object Storage", path: "/docs/happy-path/tigris/" }, { text: "Upstash Redis", path: "/docs/happy-path/redis/" }, ] }, + { text: "Add OpenAI Whisper", path: "/docs/happy-path/whisper/", type: "singleton" }, + { text: "Recap", path: "/docs/happy-path/recap", type: "singleton" }, { - title: "Runtimes", + title: "Runtimes reference", open: true, links: [ { text: "Node.js", path: "/docs/happy-path/nodejs/" }, { text: "Rails", path: "/docs/happy-path/rails/" }, ] - }, - { text: "Add Whisper", path: "/docs/happy-path/whisper/", type: "singleton" }, - { text: "Recap", path: "/docs/happy-path/recap", type: "singleton" } + } ] %> <%= partial "/docs/partials/accordion_nav", locals: { nav: @nav } %>