8 de junio de 2021

Ejecutar API para entornos distintos

Ahora ya tenemos dos entornos y no parece cómodo estar cambiando los archivos de propiedades por ejemplo para ejecutar la API usando una BD u otra. Spring tiene la capacidad de activar perfiles que pueden modificar entre otras cosas los beans o propiedades que use la aplicación.

Esta entrada no tratará sobre usar perfiles, pero valiéndonos de ellos, vamos a ejecutar nuestra API apuntando a una BD o a otra en función del perfil/entorno donde queramos ejecutar.

Vamos a mantener el fichero de propiedades de desarrollo (el que usa H2) para el perfil por defecto y nos vamos a crear otro fichero llamado application-prod.properties para las propiedades que quiero sobrescribir para este perfil (y que tendrá las credenciales de Postgre).

El fichero application-prod.properties quedaría así:
spring.datasource.url=jdbc:postgresql://kandula.db.elephantsql.com:5432/usuario
spring.datasource.username=usuario
spring.datasource.password=password
spring.datasource.driver-class-name=org.postgresql.Driver

hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

logging.level.es.lanyu=INFO
Y ahora vamos a duplicar nuestra configuración de ejecución y le vamos a poner un nombre que quede claro que es para producción. En esta configuración vamos a añadir una propiedad a nuestra JVM que es la de spring.profiles.active=prod. En la casilla correspondiente añadimos esto precedido de -D:
-Dspring.profiles.active=prod

Si ejecutamos con la nueva configuración de ejecución esta propiedad va a estar establecida, pero nuestra ejecución de bootRun no la cogerá. Vamos a hacernos una tarea que coja ese valor y lo establezca en la tarea bootRun. Añadimos este código a nuestro build.gradle:

task cloneJvmProfile {
    ext.profile = System.getProperty("spring.profiles.active")
    if (profile != null) {
        println "Setting $profile profile in bootRun"
        bootRun.systemProperties.put("spring.profiles.active", profile)
    }
}

Ahora ya podemos ejecutar nuestra anterior configuración de ejecución en Eclipse para levantar la API apuntando a H2 o usar la nueva para apuntar a Postgre.

Del mismo modo ahora se puede establecer el perfil a usar en Heroku para que use el de producción y ya no tenemos que cambiar nuestros ficheros .properties. Nos vamos a nuestra app de Heroku > Settings > Config Vars y añadimos la clave valor siguiente:

SPRING_PROFILES_ACTIVE = prod

Puedes conseguir el código hasta aquí en su repositorio.

16 de febrero de 2021

Streaming con OBS en LAN

El objetivo de esta guía es hacer streaming de un equipo en una red LAN. Se va a usar un equipo con tarjeta gráfica NVIDIA (usando una GTX 750Ti, comprobar que tiene NVENC la tarjeta gráfica) y Ubuntu (probado en Ubuntu 18.04).

Se instala OBS: https://obsproject.com

Se ejecuta el asistente de OBS para ver configuración recomendada. Si detecta NVENC es que se puede codificar con la tarjeta NVIDIA, si no hay que instalar los drivers apropiados:

sudo ubuntu-drivers autoinstall

Con esto ya debería ejecutarse el asistente y salir NVENC.

Después hay que montarse un servidor web para servir el video. Uso nginx como en este post: https://obsproject.com/forum/threads/broadcasting-in-a-lan.20637

OBS uses the rtmp protocol to stream. This depends on servers to distribute the stream to the viewers, thats where nginx fits in. You can run it on any of the two machines and under windows just fine.

Lets say PC1 has the lan ip 192.168.0.5 and PC2 has .0.6, we run nginx on PC1 (with a simple configuration file that has one application called "live1" which awaits your stream). In OBS on PC1 we setup a livestream to a custom service and can use rtmp://127.0.0.1/live1 or rtmp://192.168.0.5/live1 for the server address.
As playpath use "camera" without the quotes. You probably already configured your scenes in OBS (added the Camera) so you could now start streaming.

On the second PC, load up VLC and use open network stream. As the address this time we have to use rtmp://192.168.0.5/live1/camera so we combine the network ip with the application and the playpath so VLC can request the stream from nginx. So after clicking Play, you should see your camera feed.
For nginx, I host a compiled package for Windows at http://rtmp.jack0r.com/ it comes with an example config file so is pretty much ready to go. (Has the live1 app already) Of course if you have a question, just post it below and if you want some more general guides about nginx check out: http://www.helping-squad.com/server/

En mi caso lo hago con docker:

  1. Instalar docker: https://docs.docker.com/engine/install/ubuntu
  2. Y uso esta imagen: https://hub.docker.com/r/tiangolo/nginx-rtmp
  3. Una vez arrancado el nginx voy a OBS a la Configuración de Emisión y elijo la opción Personalizado/Custom. En servidor pongo rtmp://127.0.0.1/live y en clave pongo el nombre de la escena para emitir (en el ejemplo pongo prueba)
  4. Luego en otro ordenador de la LAN abro VLC y uso la ubicación de red rtmp://<ip como 192.168.?.?>/live/<clave - así que ponemos prueba>
  5. El video me llega con retraso de algunos segundos pero se ve muy bien
  6. Habría que probar con las gráficas integradas a ver si es suficiente. Por ejemplo para un aula de informática con ordenadores donde es suficiente ver el código a pocos FPS y sin audio no debería haber problemas. Si se dispone de dos monitores en cada puesto es mejor que usar un proyector.

Compárteme

Entradas populares