Skip to content

luisrebollo/WeatherApp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 

Repository files navigation

Weather APP

Luis Enrique Camaños Rebollo

Descripción

Esta WebApp es un proyecto que permite a los usuarios de esta aplicación a consultar el clima en una determinada ciudad, tomando dos elementos en cuenta, el nombre de la ciudad y el idioma de la respuesta.

Los elementos que comprenden esta aplicación son los siguientes:

  • Frontend
    • Ofrece una interfaz de usuario sencilla, en la que se puede ingresar el nombre de la ciudad, el idioma y se puede visualizar el historial de consultas que se han hecho
    • Desarrollado en HTML, CSS y JS
    • Mediante el fetch hace peticiones al servidor
    • Muestra el resultado en un formato agradable y actualiza el historial de consultas al instante
  • Backend
    • Se utilizó Go como lenguaje principal, con las librerías net/http y gorilla/mux para el enrutamiento
    • POST /api/weather: recibe la ciudad y el idioma, consulta API externa de clima, guarda consulta y responde con la información solicitada
    • GET /api/weather/history: devuelve el historial de las consultas registradas en la base de datos
  • API Externa
    • Se utilizó la API https://www.weatherapi.com, de la cual se obtiene la información requerida, se hace un parseo de la respuesta y se almacena en estructuras definidas
  • Base de datos
    • Utiliza MariaDB para almacenar los datos
    • La tabla principal se llama weather_queries con los siguientes elementos:
      • id: identificador autoincremental
      • city: ciudad de la consulta
      • temperature: temperatura registrada en la ciudad
      • description: condición climática
      • queried_at: timestamp de la petición
      • ip_address: dirección ip del usuario
  • Despliegue
    • Se utilizó el servicio de EC2 AWS y se aprovisionó una instancia t2.micro con un Ubuntu Linux

weatherapp.jpg

Esquema de proyecto

  • weather_app
    • cmd
      • main.go: orquestador
    • config
      • config.go: carga de parámetros
      • .env
    • internal
      • api
        • handlers.go: funciones que manejan las rutas HTTP
        • helpers.go: funciones auxiliares
        • routes.go: rutas para el frontend
      • db
        • db.go: paquete para interactuar con db real
      • mockdb
        • mockdb.go: simulador de interacción con db
      • models
        • models.go: estructuras definidas
      • weather
        • weather.go: consultas a API externa
    • web
      • app.js
      • index.html
      • styles.css

Instrucciones de instalación

  • Descomprime el archivo .zip y mueve la carpeta al directorio home

  • Instala los recursos necesarios para la correr la aplicación

    • Go
    sudo apt update
    sudo apt install golang-go -y
    go version
    • Mariadb
    sudo apt update
    sudo apt install mariadb-server mariadb-client -y
    sudo systemctl start mariadb
    sudo systemctl enable mariadb
    • Si no has configurado una contraseña, puedes entrar con:
    sudo mysql
    • Crea un nuevo usuario con las siguientes características

      • Nombre: weatheruser
      • Contraseña: safeinthebox
      CREATE USER 'weatheruser'@'%' IDENTIFIED BY 'safeinthebox';
      GRANT ALL PRIVILEGES ON weatherdb.* TO 'weatheruser'@'%';
      FLUSH PRIVILEGES;
    • Crea la tabla que almacenará los datos

    CREATE DATABASE weatherdb;
    • Ejecuta el comando para asignar los valores correspondientes
    USE weatherdb;
    
    CREATE TABLE IF NOT EXISTS weather_queries (
      id INT AUTO_INCREMENT PRIMARY KEY,
      city VARCHAR(255) NOT NULL,
      temperature FLOAT NOT NULL,
      description VARCHAR(255) NOT NULL,
      queried_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      ip_address VARCHAR(45)
    );
  • Revisa que las variables guardadas en el archivo .env son las correctas

WEATHER_API_KEY=""
WEATHER_BASE_URL="http://api.weatherapi.com/v1"
PORT="8080"
DB_USER="weatheruser"
DB_PASS="safeinthebox"
DB_HOST="localhost"
DB_NAME="weatherdb"
  • Entra al archivo main.go y cambia la dirección del archivo .env si es el caso
func initEnv(){    
	err := godotenv.Load("/home/ubuntu/weather_app/config/.env")    
	if err != nil{        
		log.Println("weather_app - config: ",err)    
		}
}
  • Compila el archivo dentro del directorio weather_app con el siguiente comando
go build -o weatherapp ./cmd/main.go
  • Para disponibilizar la aplicación y que sea persistente, mueve el archivo weatherapp.service a la carpeta donde se almacenan los demonios de Linux con el siguiente comando
	sudo mv weatherapp.service /etc/systemd/system
  • Inicializa el servicio con los siguientes comandos
sudo systemctl daemon-reload
sudo systemclt enable weatherapp.service
sudo systemctl start weatherapp.service
  • Verifica el estado del servicio ejecutando
sudo systemctl status weatherapp.service
  • Consulta los logs de la Web app con el siguiente comando
journalctl --unit weatherapp.service -f

image.png

  • Verifica que se estén guardando las peticiones accediendo a mariadb
mysql -u weatheruser -p weatherdb
SELECT * FROM weather_queries;

image.png

image.png

Mejoras

Para escalar esta webapp y soportar un mayor volumen de usuarios se recomienda lo siguiente:

  • Robustecimiento de infraestructura: Implementación de una VPC personalizada para la EC2 con el objetivo de aislar y proteger la red interna de la EC2
  • Balanceo de carga: configuración de un LoadBalancer para repartir peticiones entre múltiples instancias de la aplicación, de esta forma se mejorará la disponibilidad y se reducirán los cuellos de botella
  • Escalado automático: implementar la configuración de Auto Scaling para aumentar o disminuir instancias de acuerdo a la demanda de tráfico del sitio
  • HTTPS: implementar https en los headers para mayor seguridad
  • Replicación de base de datos: implementar replicas de lectura de la base de datos en caso de consultas masivas y que no dependan de un solo nodo

About

This is a simple weather wep app

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published