No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Heroku para el despliegue del proyecto

19/21
Recursos

Es momento de preparar tu aplicaci贸n para un entorno productivo. Subiremos la web a un servidor para que est茅 disponible el acceso desde cualquier parte del mundo.

Rust y Docker

Comencemos 鈥渄ockerizando鈥 la aplicaci贸n que hemos creado en Rust. Para esto, luego de instalar Docker en tu ordenador, generaremos algunos archivos necesarios en la ra铆z del proyecto.

Paso 1. Dockerizaci贸n

  • Archivo .dockerignore para que Docker ignore algunos archivos o directorios.
target/
  • Archivo Dockerfile para construir la imagen de Docker.
# STAGE 1: Creamos contenedor para compilar la aplicaci贸n
FROM ubuntu:20.04

# Variable para evitar bloqueos en la terminal al construir el contenedor
ENV DEBIAN_FRONTEND=noninteractive

## Dependencias necesarios del Sistema Operativo
RUN apt-get update && apt-get install curl pkg-config libssl-dev build-essential libpq-dev -y

## Instalamos Rust
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
ENV PATH="/root/.cargo/bin:${PATH}"

## Preparamos directorio principal del proyecto
WORKDIR /app
COPY ./ /app

## Compilamos la aplicaci贸n
RUN cargo clean
RUN cargo build --release


# STAGE 2: Como el primer contenedor es muy pesado y no lo necesitamos, creamos otro solo para exponer la aplicaci贸n
FROM ubuntu:20.04

# Variable para evitar bloqueos en la terminal al construir el contenedor
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install curl pkg-config libssl-dev build-essential libpq-dev -y
WORKDIR /app

## Copiamos desde el otro contenedor, los archivos de la aplicaci贸n
COPY --from=0 /app/target/release/rust-backend /app
COPY /templates/ /app/templates
COPY /statics/ /app/statics

## Corremos la aplicaci贸n
CMD ./rust-backend
  • Archivo docker-compose.yml para configurar y levantar el contenedor con m谩s facilidad.
version: '3'
services:
  rust-backend:           # Nombre de la imagen
    build: .              # Seleccionamos el Dockerfile en la ra铆z del proyecto
    image: rust-backend
    env_file:             # Leemos variables de entorno
      - .env
    ports:
      - "8080:8080"       # El primer puerto es para ingresar desde el navegador, el segundo el puerto configurado en el .env

NOTA: Docker Compose es una herramienta que viene junto a Docker. Nos servir谩 para correr m煤ltiples contenedores juntos y de forma m谩s f谩cil.

Paso 2. Preparar servidor HTTP

Antes de probar el contenedor, prepara tu aplicaci贸n con una nueva variable de entorno para configurar din谩micamente el puerto en el que escuchar谩 el servidor HTTP.

# .env
DATABASE_URL=postgres://zspkplmxcqqpuo:d7e...
PORT=8080
// main.rs
// Traemos la variable de entorno y la convertimos a entero
let port = env::var("PORT").expect("La variable de entorno PORT no existe.");
let port: u16 = port.parse().unwrap();

// Configuramos el puerto dinamicamente
HttpServer::new(move || { /* ... */ }).bind(("0.0.0.0", port)).unwrap().run().await

TIP: Para evitar otros inconvenientes, configura el host de tu aplicaci贸n como 0.0.0.0 para que funcione tanto en local, como con Docker y posteriormente en Heroku.

Paso 3. Lanzar la aplicaci贸n

Teniendo Docker listo, vamos a probar el contenedor de forma local con el comando sudo docker-compose up -d. Este proceso tardar谩 varios minutos la primera vez que lo ejecutes.

Una vez finalizado, si todo ha ido bien, podr谩s ingresar a tu aplicaci贸n corriendo en Docker desde localhost:8080 (o con el puerto que hayas definido en el docker-compose.yml).

隆Felicidades! Tu aplicaci贸n est谩 lista para ser desplegada en Heroku.


Contribuci贸n creada por Kevin Fiorentino con aportes de Sebasti谩n Franco Gomez.

Aportes 7

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

Esto puede pasarle a los que trabajamos en WSL.

Si en alg煤n momento de la creaci贸n del Docker te aparece este men煤

Y no importa que input le des, simplemente no sigue y tienes que reiniciar el proceso, puede que alguna de estas opciones te sirva.

Antes de todo, este problema se da porque la interfaz de WSL choca con el 鈥渕en煤鈥 de tzdata, as铆 que tenemos 2 opciones: Configurar el timezone desde el archivo Dockerfile o directamente ignorar los men煤s interactivos. Personalmente apliqu茅 la segunda por facilidad pero entiendo que esto puede generar problemas a largo plazo.

La primer opci贸n es a帽adir la configuraci贸n del timezone antes de hacer los apt-get, dado que en dicho momento es que se genera la interfaz que nos bloquea.

Despu茅s de definir la versi贸n de Ubuntu (en ambos casos, recuerda que ese proceso se hace 2 veces) coloca inmediatamente las instrucciones


ENV TZ=America/Bogota #O la timezone que quieras
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

Repito, debe ponerse las 2 veces debajo de la definici贸n de la versi贸n de Ubuntu, sino te vas a chocar con el mismo men煤 muchos minutos despues de haber empezado la build.

La segunda opci贸n es desactivar los men煤s interactivos, esto se hace con la instrucci贸n


DEBIAN_FRONTEND=noninteractive

De esta manera se ignoran todos los men煤s interactivos e internamente se resuelven las elecciones.

Dejo de respuesta todos los comandos.

鈥淣o deberia tardar nada鈥 Ese debe ser el equivalente de los doctores de 鈥淣o te dolera鈥 XD
La segunda vez ya tenia las imagenes, pero la compilaci贸n tenia que hacerla toda de nuevo.

heroku ya no es gratis, recomiendo rail, que es gratis y te da una base de datos

Falto aclara que NO se necesita instalar Docker en WSL. Solo en Windows y autom谩ticamente lo puede usar desde la consola WSL Ubuntu.

En el caso de Windows 10 Pro, versi贸n 22H2 es posible que necesites asegurarte de tener la versi贸n m谩s reciente de WSL (WSL 2) para el mejor rendimiento y compatibilidad con Docker. Aqu铆 est谩n los pasos para actualizar a WSL 2:

  1. Habilitar el subsistema Windows para Linux (WSL) y la plataforma de m谩quina virtual
    Abre una ventana de PowerShell como administrador y ejecuta los siguientes comandos:
    bash
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

  1. Actualizar WSL a la versi贸n 2
    En la misma ventana de PowerShell, ejecuta el siguiente comando:
wsl --set-default-version 2

  1. Instalar una distribuci贸n de Linux
    Ve a la Microsoft Store, busca la distribuci贸n de Linux que prefieres (por ejemplo, Ubuntu) y haz clic en 鈥淚nstalar鈥.
  2. Instalar Docker Desktop
    鈥 Descarga e instala Docker Desktop desde el sitio oficial de Docker.
    鈥 Una vez instalado, abre Docker Desktop y ve a Settings > General.
    鈥 Aseg煤rate de que la opci贸n 鈥淓nable WSL 2 Features鈥 est谩 seleccionada.
    鈥 Luego ve a la secci贸n Resources > WSL Integration en Docker Desktop Settings y selecciona la distribuci贸n de Linux que deseas usar con Docker.
  3. Comprobar la instalaci贸n
    Puedes verificar que Docker est茅 funcionando correctamente ejecutando el siguiente comando en tu terminal de Linux:
sudo docker run hello-world

Este comando descargar谩 y ejecutar谩 la imagen de Docker hello-world. Si todo est谩 configurado correctamente, deber铆as ver un mensaje que indica que tu instalaci贸n de Docker funciona correctamente.
Ten en cuenta que el rendimiento y la compatibilidad pueden variar en funci贸n de la versi贸n exacta de Windows y del hardware de tu sistema.
![](

Recomiendo quitar el Cargo.lock del .dockerignore. Este archivo NO debe ser ignorado, ya que puede provocar que se instalen otras versiones de las dependencias en el contenedor y que algo no funcione.
Los archivos *.lock, en cualquier gestor de dependencias, no debe ignorarse ni por Git ni por Docker.

Si usas Ubuntu en WSL y no sabes c贸mo instalar Docker, seguir los pasos del siguiente enlace:

https://docs.docker.com/engine/install/ubuntu/#set-up-the-repository

Antes de ejecutar sudo docker run hello-world correr sudo service docker start