Skip to content
Anderson Fabian Garcia Nieto edited this page Jul 9, 2026 · 6 revisions

Linker1 — Acortador de URLs Resiliente

Curso: Modelo Operativo de la Nube y Software Resiliente
Universidad: Escuela Colombiana de Ingeniería Julio Garavito
Equipo: @AnderssonProgramming · @Anderfg13 · @daniel-pm19 · @esteban0903 · @Juan-Jose-D
Repositorio: co-eiv-devsecops/linker1
Producción: https://1.n-la-c.app


¿Qué es Linker?

Linker1 es un acortador de URLs diseñado como laboratorio práctico para aplicar principios de software resiliente, DevSecOps y operación en la nube. La aplicación permite a los usuarios:

  • Acortar URLs: ingresa una URL larga y obtén un identificador corto de 8 caracteres (e.g. https://1.n-la-c.app/a3f2b1c0).
  • Aliases personalizados: opcionalmente define un alias legible (e.g. https://1.n-la-c.app/mi-enlace).
  • Redirección 301: al visitar un enlace corto, el usuario es redirigido permanentemente a la URL original.

Más allá de la funcionalidad, el verdadero objetivo es la infraestructura, el pipeline y las prácticas operativas que lo rodean.


Objetivo del Proyecto

Construir y operar una aplicación web en un entorno cloud real, aplicando los principios fundamentales del curso:

Área Objetivo
12-Factor App Diseñar la aplicación siguiendo las 12 mejores prácticas para software nativo en la nube
CI/CD Pipeline automatizado completo: build → test → package → deploy → validate → rollback
Cloud Architecture Despliegue en OCI con Bastion, Nginx reverse proxy y systemd
Observability Telemetría completa (logs, métricas, traces) con OpenTelemetry → Grafana Cloud
Feature Flags Releases controlados con LaunchDarkly, desacoplando deploy de release
DevSecOps Secrets management, branch protection, CODEOWNERS, security policies
Resilience Rollback automático, health checks, graceful degradation

Tecnologías Utilizadas

Backend

Tecnología Versión Propósito
Java 21 (Temurin) Lenguaje principal
Javalin 6.5.0 Framework HTTP ligero
SQLite 3.49.1 Base de datos embebida para almacenamiento de links
MySQL Connector/J 9.7.0 Healthcheck de backing service (SELECT 1)
Jackson 2.22.0 Serialización/deserialización JSON

Observabilidad

Tecnología Versión Propósito
OpenTelemetry SDK 1.63.0 Instrumentación manual (métricas, traces, logs)
OpenTelemetry OTLP Exporter Exportación vía protocolo http/protobuf
Logback 1.5.18 Framework de logging (SLF4J binding)
OTel Logback Appender 2.29.0-alpha Bridge de logs Logback → OpenTelemetry
Grafana Cloud Backend de observabilidad (Loki, Mimir, Tempo)

Feature Management

Tecnología Versión Propósito
LaunchDarkly Java SDK 7.8.0 Feature flags en tiempo real

Infraestructura

Tecnología Propósito
Oracle Cloud Infrastructure (OCI) Proveedor de nube (región sa-bogota-1)
Terraform Infraestructura como Código (IaC)
Nginx Reverse proxy (puerto 80 → 8080)
systemd Gestión del proceso de la aplicación
OCI Bastion Acceso SSH seguro a la VM (sin IP pública)

CI/CD y Calidad

Tecnología Propósito
GitHub Actions Workflows de CI/CD
Maven Build system y gestión de dependencias
JUnit 5 Framework de testing
Mockito Mocking para tests unitarios
JaCoCo Cobertura de código (umbral: 100% en líneas)
Newman (Postman) Tests de API automatizados contra producción
GitHub Packages Registro de artefactos Maven

Arquitectura de la Aplicación

Main (Composition Root)
 ├── Telemetry.createFromEnvironment()
 │        │
 │        ▼
 │   OpenTelemetry SDK (OTEL_* env vars → OTLP export)
 │
 ├── LinkRepository(conn)           ──→ SQLite
 ├── LinkService(repository)
 ├── FeatureFlags(ldClient)         ──→ LaunchDarkly
 │
 ├── RequestMetrics(meter)          ──┐
 ├── LinkSpans(tracer, meter)         ├──→ LinkRoutes
 ├── SystemMetrics(meter)           ──┘
 │
 ├── HealthCheck(tracer, mysqlConn) ──→ HealthRoutes
 │
 ├── StaticRoutes(featureFlags)
 └── Javalin → start(port)

Navegación de la Wiki

Página Descripción
12 Factor App Cómo el proyecto implementa cada uno de los 12 factores
CI CD Pipeline Flujo completo de integración y despliegue continuo
Cloud Architecture Arquitectura cloud en OCI, diagrama y componentes
Continuous Learning Aprendizaje continuo y experimentación del equipo
DevSecOps Practices Prácticas de seguridad integradas en el ciclo de desarrollo
Feature Flags Gestión de releases con LaunchDarkly
Observability Logs, métricas y traces con OpenTelemetry + Grafana
Postmortems Análisis post-incidente de problemas reales encontrados
Testing Strategy Estrategia de testing y cobertura de código

Clone this wiki locally