No description
  • Go 84.6%
  • HTML 13.7%
  • Makefile 0.8%
  • Dockerfile 0.7%
  • Shell 0.2%
Find a file
Jesus Marin 2bf4d05185
All checks were successful
CI / test (push) Successful in 1m17s
CI / lint (push) Successful in 56s
CI / docker (push) Successful in 1m30s
initial commit
2026-05-08 14:10:34 -04:00
.forgejo/workflows initial commit 2026-05-08 14:10:34 -04:00
.opencode initial commit 2026-05-08 14:10:34 -04:00
cmd initial commit 2026-05-08 14:10:34 -04:00
internal initial commit 2026-05-08 14:10:34 -04:00
migrations initial commit 2026-05-08 14:10:34 -04:00
openspec initial commit 2026-05-08 14:10:34 -04:00
templates initial commit 2026-05-08 14:10:34 -04:00
test initial commit 2026-05-08 14:10:34 -04:00
.gitignore initial commit 2026-05-08 14:10:34 -04:00
docker-compose.prod.yml initial commit 2026-05-08 14:10:34 -04:00
docker-compose.yml initial commit 2026-05-08 14:10:34 -04:00
Dockerfile initial commit 2026-05-08 14:10:34 -04:00
entrypoint.sh initial commit 2026-05-08 14:10:34 -04:00
go.mod initial commit 2026-05-08 14:10:34 -04:00
go.sum initial commit 2026-05-08 14:10:34 -04:00
Makefile initial commit 2026-05-08 14:10:34 -04:00
README.md initial commit 2026-05-08 14:10:34 -04:00

LowEndMonitor

Monitor RSS para buscar ofertas en los foros LowEndTalk y LowEndSpirit. La aplicacion monitorea periodicamente los feeds RSS de ofertas de ambos foros y busca publicaciones que coincidan con palabras clave definidas por el usuario.

Caracteristicas

  • Monitoreo automatico de feeds RSS de LowEndTalk y LowEndSpirit
  • Busqueda por palabras clave en los campos description y dc:creator
  • Deduplicacion de publicaciones por GUID
  • Dashboard web protegido con autenticacion
  • Gestion de palabras clave, publicaciones y usuarios
  • Herramienta CLI para gestion de usuario administrador
  • Contenerizacion con Docker/Podman

Stack Tecnologico

  • Lenguaje: Go 1.26
  • Base de datos: SQLite (driver: modernc.org/sqlite)
  • Frontend: HTML Templates de Go + Bootstrap 5.3.8 (via CDN)
  • Librerias:
    • github.com/alexedwards/scs/v2 - Manejo de sesiones
    • github.com/justinas/alice - Composicion de middleware
    • github.com/justinas/nosurf - Proteccion CSRF
    • github.com/go-playground/form - Parseo de formularios
    • golang.org/x/crypto - Hashing bcrypt

Requisitos

  • Go 1.26+
  • golang-migrate CLI (para ejecutar migraciones)
  • Docker/Podman (opcional, para despliegue en contenedor)

Desarrollo

Estructura del proyecto

.
├── cmd/lowendmonitor/    # Punto de entrada de la aplicacion
├── internal/
│   ├── config/           # Configuracion via variables de entorno
│   ├── feed/             # Logica de RSS: fetch, parseo, matching, servicio
│   ├── handler/          # Handlers HTTP (auth, dashboard, keywords, posts, users)
│   ├── middleware/       # Middleware (sesiones, CSRF, autenticacion)
│   ├── models/           # Structs de dominio
│   ├── repository/       # Acceso a datos (SQLite)
│   └── scheduler/        # Programador de monitoreo periodico
├── migrations/           # Archivos de migracion SQL
├── templates/            # Templates HTML
│   ├── auth/             # Templates de autenticacion
│   └── dashboard/        # Templates del dashboard
├── Dockerfile
├── docker-compose.yml
├── entrypoint.sh
├── Makefile
└── README.md

Instalacion

# Clonar el repositorio
git clone <repo-url>
cd lowendmonitor

# Instalar dependencias
go mod download

Base de datos - Migraciones

Las migraciones se ejecutan externamente usando golang-migrate. Asegurate de tener el CLI instalado con el driver sqlite (pure Go):

# Instalar golang-migrate con soporte para SQLite (pure Go, sin CGO)
make install-migrate

# O manualmente:
go install -tags 'sqlite' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
# Crear directorio de datos
mkdir -p data

# Ejecutar migraciones
make migrate-up

# O manualmente:
migrate -database "sqlite://data/lowendmonitor.db?x-migrations-table=schema_migrations" -path migrations up

Ejecucion en desarrollo

# Usando Make
make run

# O manualmente
go run ./cmd/lowendmonitor

La aplicacion estara disponible en http://localhost:8080.

Nota sobre desarrollo local: Al ejecutar la aplicacion sin HTTPS (localhost o IP de red), es necesario configurar SECURE_COOKIES=false para que las cookies de sesion y CSRF funcionen correctamente sobre HTTP. Si se omite, el navegador rechazara las cookies CSRF por tener el flag Secure, y el formulario de login devolvera error 400.

SECURE_COOKIES=false make run

Usuario Administrador

La aplicacion no incluye un usuario administrador predefinido. Debes crear el primer usuario administrador usando la herramienta CLI:

En desarrollo local:

# Compilar la aplicacion
make build

# Ejecutar migraciones
make migrate-up

# Crear el usuario administrador (interactivo)
make admin-setup

El comando solicitara:

  • Nombre de usuario (presiona Enter para usar "admin")
  • Contrasena (no se mostrara al escribir, minimo 8 caracteres)
  • Confirmacion de contrasena

En contenedor Docker/Podman:

# Iniciar los servicios
docker compose up -d

# Crear el usuario administrador (requiere -it para terminal interactiva)
docker compose exec lowendmonitor /app/lowendmonitor-admin setup

El comando lowendmonitor-admin setup solo funciona si no existe ningun usuario administrador en la base de datos. Si ya existe un admin, mostrara un mensaje indicandolo.

Compilacion

make build
# El binario se genera en bin/lowendmonitor

Tests y linting

make test   # Ejecuta todos los tests
make lint   # Ejecuta golangci-lint (requiere golangci-lint instalado)

Variables de entorno

Variable Descripcion Valor por defecto
PORT Puerto del servidor HTTP 8080
DATABASE_PATH Ruta al archivo SQLite data/lowendmonitor.db
POLL_INTERVAL_MINUTES Intervalo de monitoreo en minutos 60
ENABLE_SCHEDULER Habilitar/deshabilitar el monitor automatico true
SECURE_COOKIES Cookies de sesion y CSRF solo via HTTPS true

Nota sobre SECURE_COOKIES: Si la aplicacion se accede via HTTP sin HTTPS (IP local, red domestica), las cookies con flag Secure son rechazadas por el navegador (excepto en localhost). Esto causa error 400 en el formulario de login porque el token CSRF no puede validarse. Usa SECURE_COOKIES=false en entornos sin HTTPS. Los archivos docker-compose.yml y docker-compose.prod.yml ya estan preconfigurados para cada caso.

Despliegue con Docker/Podman

Produccion con Docker Compose (recomendado)

La imagen Docker se construye automaticamente en cada push a master via Forgejo Actions y se publica en git.jesusmarin.dev/angel/lowendmonitor:latest.

Sin HTTPS (acceso directo HTTP):

Usa docker-compose.yml que configura SECURE_COOKIES=false para que las cookies funcionen sobre HTTP:

docker compose up -d

Con HTTPS (detras de un reverse proxy como nginx, caddy, traefik):

Usa docker-compose.prod.yml que mantiene SECURE_COOKIES=true (default) para maxima seguridad:

docker compose -f docker-compose.prod.yml up -d

Desarrollo (build local)

# Construir e iniciar
docker compose -f docker-compose.yml up -d --build

Usando Docker directamente

# Construir la imagen
docker build -t lowendmonitor .

# Ejecutar
docker run -d \
  -p 8080:8080 \
  -v lowendmonitor_data:/app/data \
  -e ENABLE_SCHEDULER=true \
  -e POLL_INTERVAL_MINUTES=60 \
  --name lowendmonitor \
  lowendmonitor

Usando Podman

# Construir la imagen
podman build -t lowendmonitor .

# Ejecutar
podman run -d \
  -p 8080:8080 \
  -v lowendmonitor_data:/app/data \
  -e ENABLE_SCHEDULER=true \
  --name lowendmonitor \
  lowendmonitor

CI/CD con Forgejo Actions

El proyecto incluye un pipeline de CI/CD configurado en .forgejo/workflows/ci.yml que automatiza la ejecucion de tests, linting y la construccion/publicacion de imagenes Docker.

El pipeline se compone de tres jobs:

  1. test — Ejecuta go test -race -count=1 ./... en cada push y pull request.
  2. lint — Ejecuta go vet ./... en cada push y pull request.
  3. docker — Construye y publica la imagen Docker en el registro de contenedores de Forgejo (git.jesusmarin.dev). Este job solo se ejecuta en push a la rama master, y solo si los jobs test y lint han pasado correctamente.

Las imagenes se etiquetan como latest y sha-<hash> (basado en el hash del commit).

Configuracion del secreto FORGEJO_TOKEN

Para que el job docker pueda autenticarse contra el registro de contenedores, es necesario configurar un secreto llamado FORGEJO_TOKEN en el repositorio.

1. Generar un token en Forgejo:

  • Ve a Settings > Applications en tu instancia de Forgejo.
  • En la seccion Manage Access Tokens, haz clic en Generate Token.
  • Asigna un nombre descriptivo (ej. CI Docker).
  • Selecciona los scopes read:package y write:package.
  • Copia el token generado (solo se muestra una vez).

2. Agregar el token como secreto en el repositorio:

  • Ve a Settings > Actions > Secrets en el repositorio.
  • Haz clic en New Secret.
  • Nombre: FORGEJO_TOKEN
  • Valor: el token generado en el paso anterior.
  • Haz clic en Add Secret.

Una vez configurado el secreto, el pipeline de CI/CD funcionara automaticamente en cada push a master.

Notas sobre el scheduler

  • El scheduler se ejecuta en una goroutine en background dentro del contenedor
  • Para despliegues con multiples replicas, deshabilita el scheduler (ENABLE_SCHEDULER=false) y usa un cron externo en una sola instancia
  • El primer ciclo de monitoreo se ejecuta inmediatamente al iniciar, luego cada N minutos

Feeds RSS monitoreados

Foro URL del Feed
LowEndTalk https://lowendtalk.com/categories/offers/feed.rss
LowEndSpirit https://lowendspirit.com/categories/offers/feed.rss

Licencia

Este proyecto es de uso personal.