Portfolio

Proyectos

Electrónica, domótica, automatización, sysadmin y desarrollo web.

Wiki Personal Self-Hosted con Outline

Homelab · Self-hosting

Wiki privada self-hosted sobre Proxmox con Docker Compose: Outline + Authentik + Nginx + MinIO. Acceso exclusivo vía Tailscale, sin exposición a internet público. Autenticación Google via OIDC.

DockerProxmoxOutlineAuthentikNginxTailscaleSelf-hostingLinux
Ver más ↓ Ver menos ↑

Problema

Necesitaba una base de conocimiento personal para documentar proyectos, configuraciones y procesos técnicos. Notion funcionaba, pero la dependencia de un SaaS externo para información crítica era un problema. Quería control total de los datos sin renunciar a una interfaz usable y colaboración en tiempo real.

Arquitectura

Usuario (red Tailscale)


   Nginx (reverse proxy + TLS)
   ├── outline.schoperena.com  ──▶  Outline (Node.js)
   └── auth.schoperena.com     ──▶  Authentik (identity provider)

                              ┌──────────┴──────────┐
                         PostgreSQL              Redis

                         Google OAuth

Outline depende de:
  ├── PostgreSQL  (datos)
  ├── Redis       (caché / sesiones)
  └── MinIO       (almacenamiento de archivos, S3-compatible)

El stack corre en un contenedor LXC dentro de Proxmox VE, administrado con Portainer sobre Docker Compose.

El problema con Gmail personal

Outline solo soporta Google OAuth nativo con cuentas de Google Workspace — el Gmail personal (@gmail.com) no funciona directamente. La solución fue agregar Authentik como identity provider OIDC intermedio:

Usuario → Google OAuth → Authentik (OIDC provider) → Outline

Esto permite usar una cuenta Gmail personal para autenticarse, con Authentik actuando como puente.

Acceso privado con Tailscale

El servidor no está expuesto a internet público. El acceso es exclusivamente a través de la red mesh de Tailscale, lo que evita la necesidad de reglas de firewall complejas o VPN tradicional. El dominio resuelve públicamente a la IP de Tailscale, invisible desde fuera de la red.

Problemas encontrados

ProblemaCausaSolución
Gmail no funciona con OAuth nativoOutline requiere WorkspaceAuthentik como OIDC intermediario
Variables de entorno no accesiblesPortainer no accede al filesystem del hostVariables environment: inline en el compose
Redirect loops con HTTPSOutline detrás de proxyFORCE_HTTPS: false + BEHIND_PROXY: true
URLs OIDC incorrectasSlug de aplicación en la rutaURLs sin slug: /application/o/authorize/

Resultado

Wiki personal operativa y accesible desde cualquier dispositivo en la red Tailscale. Todos los datos residen en infraestructura propia, con backups incluidos en el esquema general del servidor.

Hardening de Servidor Empresarial

Sysadmin · Seguridad

Auditoría y hardening completo de infraestructura Proxmox VE con VMs Windows y contenedores LXC: SSH hardening, Fail2ban, ZFS backups encriptados, firewall con política DROP y hardening Windows Server.

ProxmoxLinuxWindowsFail2banZFSSysadminSeguridadBackupsHomelab
Ver más ↓ Ver menos ↑

Contexto

El servidor Proxmox VE de la empresa llevaba tiempo funcionando sin una revisión de seguridad formal. Ante la creciente exposición a ransomware y la dependencia crítica del sistema para operaciones diarias, realicé una auditoría completa con checklist anti-ransomware de 15 puntos y apliqué medidas de hardening en todas las capas.

Resultado: 0% → 87% (13/15 puntos)

Infraestructura auditada

  • Servidor hipervisor: Proxmox VE
  • VMs Windows: servidores con software de gestión empresarial
  • Contenedores LXC: servicios internos (PDF, almacenamiento, gestión UPS)

Acceso y autenticación (Proxmox)

  • Usuario dedicado con sudo y autenticación exclusiva por clave SSH
  • Puerto SSH movido del default, con PasswordAuthentication no
  • Parámetros de hardening: AllowUsers, MaxAuthTries 3, timeout ClientAlive, banner
  • Fail2ban con jails activos para SSH y la interfaz web de Proxmox

Hardening de kernel

  • SYN cookies activados
  • ASLR nivel 2
  • dmesg_restrict y kptr_restrict habilitados
  • IPv6 y redirecciones IP desactivados

Backups y continuidad

  • ZFS auto-snapshots cada 15 minutos con retención de 48 horas
  • Backups encriptados a OneDrive con rclone crypt cubriendo todas las VMs y contenedores
  • Documento de Plan de Recuperación ante Desastres generado

Firewall

  • Política DROP a nivel de cluster Proxmox
  • Reglas específicas en host y por VM/CT individual

Hardening de contenedores LXC

  • Contenedores privilegiados migrados a no privilegiados
  • SSH desactivado en todos los contenedores
  • Capacidades innecesarias (nesting, keyctl) desactivadas donde no aplican

Limpieza de superficie de ataque

  • Eliminado cron job que clonaba y ejecutaba código desde un repositorio GitHub externo
  • Herramientas de administración duplicadas o innecesarias desinstaladas
  • Red overlay de terceros desinstalada y reemplazada por Tailscale

Hardening Windows (VMs)

  • Actualización a los últimos builds de seguridad disponibles + enrolamiento en ESU
  • Política de contraseñas: mínimo 10 caracteres, rotación 90 días, bloqueo tras 5 intentos
  • Bloqueo de inactividad: 600 segundos
  • Windows Firewall: DefaultInboundAction = Block en todos los perfiles
  • SMBv1 desactivado
  • Antivirus con actualización automática de definiciones

Resultado

La infraestructura pasó de no tener ninguna medida de hardening documentada a cubrir 13 de 15 controles del checklist anti-ransomware. Los 2 ítems restantes están planificados: migración a Windows 11 LTSC 2024 (antes de octubre 2026) y finalización de un servicio de almacenamiento interno en pruebas.

Plataforma Web SCH Auditores

Consultoría · Full Stack

Sitio web corporativo y panel CMS para una firma de contadores. SPA en React 19 con animaciones, sistema de novedades en Markdown, y panel de administración con Keystatic y autenticación OAuth. Deploy automático con GitHub Actions.

ReactViteTailwind CSSAstroKeystaticCMSGitHub ActionsConsultoría
Ver más ↓ Ver menos ↑

Contexto

Proyecto de desarrollo web para Santiago & Choperena Auditores, firma contable en Barranquilla. El objetivo era reemplazar su presencia web anterior con una plataforma moderna que el equipo de la firma pudiera administrar sin necesidad de conocimientos técnicos.

Solución

Una plataforma de dos capas: el sitio público y un panel de administración de contenidos (CMS).

Sitio público (SPA)

Construido con React 19 + Vite para carga rápida y navegación sin recargas. Incluye:

  • Animaciones de entrada con Framer Motion
  • Sección de Novedades con posts en Markdown (.md / .mdoc)
  • Routing con Wouter (ligero, sin dependencias pesadas de React Router)
  • Estilos con Tailwind CSS v4

Panel de administración (CMS)

El equipo de la firma puede crear y editar novedades directamente desde el navegador, sin tocar código:

  • Keystatic como CMS visual — interfaz limpia, archivos .md en el repositorio como fuente de verdad
  • Astro SSG para generar el panel estático
  • PHP + OAuth de GitHub para autenticación segura en hosting Apache compartido

CI/CD

Cada vez que se publica una novedad o se actualiza el sitio, un workflow de GitHub Actions ejecuta el build y despliega automáticamente.

Tecnologías

Frontend: React 19, Vite, Tailwind CSS v4, Framer Motion, Wouter
CMS / Admin: Astro, Keystatic, PHP (OAuth)
Infraestructura: GitHub Actions, hosting Apache
Datos: Archivos Markdown en el repositorio (Git como base de datos de contenido)

Resultado

Sitio en producción con deploy automatizado. El equipo de la firma gestiona el contenido de novedades de forma autónoma desde el panel visual, sin intervención técnica para publicaciones de rutina.

Calendario Tributario Interactivo

Python · RPi · En producción

Aplicación web generada con Python que calcula y muestra todos los vencimientos tributarios anuales de una firma contable, considerando días hábiles y festivos colombianos por municipio. Desplegada como kiosk en Raspberry Pi.

PythonRaspberry PiAutomatizaciónColombiaDomóticaKioskExcel
Ver más ↓ Ver menos ↑

Problema

Una firma contable maneja decenas de clientes con obligaciones tributarias ante diferentes entidades: DIAN, ICA de varios municipios (Barranquilla, Malambo, Soledad, Pensilvania, Puerto Colombia, entre otros). Cada entidad tiene su propio calendario de vencimientos, con fechas que varían según días hábiles y festivos colombianos.

Hacer ese seguimiento manualmente en hojas de cálculo generaba errores y consumía tiempo cada año.

Solución

Un pipeline Python que toma como única entrada un archivo Excel con los datos de los clientes y genera automáticamente una aplicación web completa — sin dependencias externas, funciona offline — con todos los vencimientos del año.

Pipeline de generación

  1. Lectura del Excel: los datos de clientes y sus obligaciones activas
  2. Cálculo de fechas: para cada obligación, calcula el vencimiento exacto considerando días hábiles, festivos nacionales y los calendarios específicos de cada municipio
  3. Generación del HTML: produce un archivo HTML autónomo con todos los datos embebidos
  4. Deploy automático: un script envía el HTML actualizado a la Raspberry Pi via SSH

Funcionalidades de la aplicación

  • Filtro por firma, búsqueda por empresa
  • Vista mensual y vista completa del año
  • Marcado de obligaciones completadas (persiste en localStorage)
  • Indicadores visuales de vencimientos próximos y vencidos
  • Funciona 100% offline — no requiere servidor, base de datos ni conexión a internet

Despliegue en Raspberry Pi (kiosk)

La Raspberry Pi conectada a un monitor en la oficina corre la aplicación en modo kiosk — pantalla completa, sin barra de navegación, inicio automático al encender. Incluye:

  • Servidor local en Python para servir el HTML
  • Script de instalación del kiosk (instalar_kiosk.sh)
  • Script de diagnóstico remoto (check_kiosk.sh)
  • Notificador de vencimientos próximos

Tecnologías

  • Generación: Python (pandas, openpyxl, jinja2)
  • Frontend: HTML + CSS + JavaScript vanilla (sin frameworks)
  • Hardware: Raspberry Pi 4 como servidor kiosk
  • Fuente de datos: Microsoft Excel (único archivo a editar manualmente)
  • Deploy: Bash + SSH (Linux/Mac) / PowerShell (Windows)

Resultado

En producción en la firma desde principios de 2025. Redujo el tiempo de preparación del calendario anual de días a minutos, y eliminó los errores de fechas en el seguimiento de obligaciones tributarias.

CachyOS SCH Setup

Linux · Bash

Script Bash modular de post-instalación para CachyOS/Arch Linux. Un solo comando configura terminal, temas, drivers de hardware, Secure Boot, bootloader y software de desarrollo y gaming.

BashArch LinuxCachyOSSysadminNVIDIASecure BootAutomatización

Estación de Monitoreo de Calidad del Aire

Hardware · IoT

Sistema embebido con sensores MQ135 y DHT11 sobre TTGO LoRa32 que mide CO₂, temperatura y humedad, transmite los datos por LoRa y los registra en Google Sheets vía Python.

ArduinoLoRaPythonGoogle Sheets APITTGO LoRa32IoT

Sistema de Domótica y Seguridad Residencial

Hardware · Domótica

Automatización completa de una vivienda: control de luces y persianas con Arduino, sensores PIR para detección de presencia, y sistema CCTV integrado con monitoreo desde app móvil.

ArduinoDomóticaSensores PIRCámaras IPWi-FiAutomatización
Ver más ↓ Ver menos ↑

Problema

Quería automatizar los sistemas básicos de una vivienda — iluminación, persianas y seguridad — usando hardware accesible, sin depender de plataformas propietarias de domótica que requieren suscripción o conectividad en la nube.

Solución

Diseñé e instalé un sistema modular con tres subsistemas integrados:

Automatización de iluminación y persianas

  • Arduino controla relés que accionan las luces por zonas
  • Motor con relé para el control de persianas (apertura/cierre programado)
  • Programación de horarios y escenas directamente en el firmware

Detección de presencia

  • Sensores PIR en puntos estratégicos de la vivienda
  • Alertas automáticas cuando se detecta movimiento fuera del horario configurado
  • Integración con el sistema de iluminación para encendido automático

Videovigilancia

  • Cámaras IP conectadas a la red local Wi-Fi
  • Acceso remoto al feed de video desde aplicación móvil
  • Grabación local ante eventos de movimiento

Tecnologías

  • Controlador: Arduino Mega
  • Actuadores: Módulos de relés, motor DC para persianas
  • Sensores: PIR (HC-SR501), sensores de puerta/ventana
  • Video: Cámaras IP TP-Link Tapo, app móvil integrada
  • Red: Router Wi-Fi doméstico, VLAN de IoT separada

Resultado

Sistema en funcionamiento continuo en vivienda real. La separación en VLAN dedicada para los dispositivos IoT mantiene la seguridad de la red principal aislada de los dispositivos embebidos.

© 2026 Sebastian Choperena Solano — Construido con Astrofy