- Go 84.6%
- HTML 13.7%
- Makefile 0.8%
- Dockerfile 0.7%
- Shell 0.2%
| .forgejo/workflows | ||
| .opencode | ||
| cmd | ||
| internal | ||
| migrations | ||
| openspec | ||
| templates | ||
| test | ||
| .gitignore | ||
| docker-compose.prod.yml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| entrypoint.sh | ||
| go.mod | ||
| go.sum | ||
| Makefile | ||
| README.md | ||
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
descriptionydc: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 sesionesgithub.com/justinas/alice- Composicion de middlewaregithub.com/justinas/nosurf- Proteccion CSRFgithub.com/go-playground/form- Parseo de formulariosgolang.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=falsepara que las cookies de sesion y CSRF funcionen correctamente sobre HTTP. Si se omite, el navegador rechazara las cookies CSRF por tener el flagSecure, 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
Secureson rechazadas por el navegador (excepto enlocalhost). Esto causa error 400 en el formulario de login porque el token CSRF no puede validarse. UsaSECURE_COOKIES=falseen entornos sin HTTPS. Los archivosdocker-compose.ymlydocker-compose.prod.ymlya 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:
- test — Ejecuta
go test -race -count=1 ./...en cada push y pull request. - lint — Ejecuta
go vet ./...en cada push y pull request. - 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 ramamaster, y solo si los jobstestylinthan 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:packageywrite: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.