Deploying your Dart server applications around the
Deploying your Dart server applications around the
provider "about_me" {
name = "Mike Diarmid"
location = "Cheshire, England"
default = "CTO @ Invertase"
founder = "Invertase"
homepage = "https://invertase.io"
socials = {
twitter = "mikediarmid"
github = "salakar"
linkedin = "mikediarmid"
}
projects = {
melos = "melos.invertase.dev"
zapp = "zapp.run"
flutterfire = "github.com/firebase/flutterfire"
flutterfire_cli = "github.com/invertase/flutterfire_cli"
# TODO hide RN shame from bio, no one has to know
react_native_firebase = "rnfirebase.io"
notifee = "notifee.app"
}
}
$ terraform apply
about_me.tf [X]
CTO @ Invertase
import 'package:flutter/material.dart';
MaterialApp(
ThemeData(
name: "Majid Hajian",
location: "Oslo, Norway",
description: '''
Google Developer Expert
Passionate Software engineer,
Community Leader, Author and international Speaker
''',
main: "Head of DevRel at Invertase.io",
homepage: "https://www.majidhajian.com",
socials: {
twitter: "https://www.twitter.com/mhadaily",
github: "https://www.github.com/mhadaily"
},
author: {
Pluralsight: "www.pluralsight.com/authors/majid-hajian",
Apress: "Progressive Web App with Angular, Book",
PacktPub: "PWA development",
Udemy: "PWA development",
},
founder: "Softiware As (www.Softiware.com)"
devDependencies: {
tea: "Ginger",
mac: "10.14+",
},
community: {
FlutterVikings: "Orginizer",
FlutterCommunity: "Admin/Lead",
},
),
);
about_me.dart [X]
Head of DevRel @ Invertase
invertase.io
Why?
- Null-safe & type safe language
- Reduced errors at runtime
- Compiler effeciency
- Portability
$ dart compile exe lib/main.dart --output=myapp
~150mb
~10mb
- Growing ecosystem
- Dart Edge, Dart Frog, Serverpod & Shelf
- Same language as your apps, code reusability, and more...
How do we deploy
Dart on the Edge
Dart in the Cloud
Something else?
What are Edge Functions?
$ dart compile js lib/main.dart -o bundle.js
- Run close to your users = decreased latency
Serverless functions that run on Edge networks
Benefits
- Minimal to no cold boot times vs traditional serverless functions
- Cloudflare Workers, Vercel Edge, Deno Deploy, Supabase Functions
Downsides
- Runs on the JavaScript V8 runtime
- dart2js compilation required:
- DIY dart js interop layer required to interface with 100's of Web APIs
(can't use dart:HTML or dart:io)
- Stricter limits on compute usage & request processing time.
- Platforms provide powerful low-latency runtime APIs like KV & Storage
The easy (experimental) way
In the future
invertase.link/edge
$ edge new vercel_edge myproject
$ edge new supabase_functions myproject
$ edge new cloudflare_workers myproject
invertase.link/dart2wasm
FROM dart:stable AS build
WORKDIR /app
COPY pubspec.* ./
RUN dart pub get
# Copy app source code and AOT compile it.
COPY . .
# Ensure packages are still up-to-date.
RUN dart pub get --offline
RUN dart compile exe bin/server.dart -o bin/server
# Build minimal serving image from AOT-compiled
# `/server` and required system
# libraries and configuration files stored in
# `/runtime/` from the build stage.
FROM scratch
COPY --from=build /runtime/ /
COPY --from=build /app/bin/server /app/bin/
# Start server.
EXPOSE 8080
CMD ["/app/bin/server"]
Dockerfile [X]
import 'dart:io';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;
void main() async {
final handler =
const Pipeline()
.addMiddleware(logRequests())
.addHandler(_echoRequest);
final server = await shelf_io.serve(
handler,
InternetAddress.anyIPv4,
8080,
);
}
Response _echoRequest(Request request) =>
Response.ok('Hello at "${request.url}"!');
bin/server.dart [X]
Cloud Build
Artifact Registry
??
Cloud Run
Ready?
Kubernetes Engine
Artifact Registry
Cloud Run
Ready?
region1
Cloud Run
region2
Cloud Run
region3
...
Cloud Run
region30?
Load Balancer
resource "google_cloud_run_service" "dart_app" {
provider = google-beta
count = length(var.regions)
name = "cool-app-${var.regions[count.index]}"
location = var.regions[count.index]
# ...
template {
spec {
container_concurrency = var.config.container_concurrency
timeout_seconds = var.config.timeout_seconds
containers {
ports {
container_port = 8080
}
image = "TODO image artifact registry"
resources {
limits = {
cpu = var.config.cpu_limit
memory = var.config.memory_limit
}
}
}
}
}
}
$ terraform apply
cool_app_infra.tf [X]
variable "regions" {
type = list(string)
default = [
"us-central1",
"europe-west2", # ...more
]
}
variable "config" {
type = object({
timeout_seconds = number
container_concurrency = number
cpu_limit = string
memory_limit = string
})
default = {
timeout_seconds = 120
container_concurrency = 50
cpu_limit = "2"
memory_limit = "2048Mi"
}
}
cool_app_config.tf [X]
- automate end to end release and deployment?
- multiple environments?
- commit previews?
- cost?
globe.dev
Early access @ globe.dev
/slides
/github
invertase.link
Thank you!