Dart - From scratch to deploy 🚀
Tags: dart, docker, cloud, spanish
Published: 2022-05-06 04:27:20

## Empecemos ✨
Creemos el proyecto desde 0.

> Si tienes configurado Flutter, dart ya debería estar en tu PATH también.

```sh
$ dart create server
```
Obtendrás algo como esto:
````dart
void main(List<String> arguments) {
  print('Hello world!');
}
```
Para este proyecto usaremos el poderoso server de [Shelf](https://pub.dev/packages/shelf).
```sh
$ dart pub add shelf
```
Agreguemos algo de código:
```dart
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;

void main() async {
  var server = await shelf_io.serve(
      (Request request) => Response.ok('Hello World!'), '0.0.0.0', 8080);

  print('Serving at http://${server.address.host}:${server.port}');
}
```
Entramos a [localhost:8080](http://localhost:8080/):
 ![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlhny9h16cpit2v279br.png)
## Preparemos Docker
> Esto no es un tutorial de docker así que no me detendré a explicarlo, eso daría para una serie de publicaciones 🤷‍♂️

### Dockerfile
```docker
FROM dart:stable AS build
WORKDIR /app
COPY pubspec.* ./
RUN dart pub get
COPY . .
RUN dart pub get --offline
RUN dart compile exe bin/server.dart -o bin/server
FROM scratch
COPY --from=build /runtime/ /
COPY --from=build /app/bin/server /app/bin/
CMD ["/app/bin/server"]
```
### .dockerignore
```.dockerignore
.dockerignore
resources
CHANGELOG.md
LICENSE
README.md
Dockerfile
build/
.dart_tool/
.git/
.github/
.gitignore
.packages
```
### docker-compose.yml
````yml
version: '3'
services:
  dart-server:
    build: .
    ports:
      - "8080:8080"
```
### Vamos a probarlo 🐛
````sh
$ docker compose up
```
Probamos de nuevo [localhost:8080](http://localhost:8080/) y todo normal.
### Preparativos 👩‍🚀👨‍🚀
Para esto usaremos [Github](https://github.com/) y [Railway](https://railway.app/) (Por qué son excelentes herramientas y son gratis).
> Railway nos dará un puerto para nuestra aplicación así que hay que hacer ese cambio.

- Actualizamos nuestro código.
```dart
import 'dart:io';

import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;

void main() async {
  var port = int.tryParse(Platform.environment['PORT'] ?? '') ?? 8080;
  var server = await shelf_io.serve(
      (Request request) => Response.ok('Hello World!'), '0.0.0.0', port);

  print('Serving at http://${server.address.host}:${server.port}');
}
```
- Lo subimos a [Github](https://github.com/ushieru/server).
- Inicializamos un nuevo proyecto con Github en Railway.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2m95jt2s56uz7o1n5ev.png)

- Elegimos el repositorio, Railway detectara nuestro **Dockerfile** y empezara a armarlo.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q3odn43tvxzky0igearf.png)

- Al terminar nos imprimirá el log de nuestra aplicación y nos dará un URL.
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kagfscx1smrmlmmsjiau.png)

### Y listo 🚀🚀
[Estamos online](https://server-production-35b3.up.railway.app/).

Te gusto la practica? intentamos con otro lenguaje?
Cuéntame en los comentarios y Happy Hacking 🧑‍💻🎉