Serviço Go multiusuário para acompanhar cursos e turmas disponíveis no SENAI-SP e avisar cada usuário pelo Telegram conforme seus próprios filtros.
- scraping de cursos, cidades, unidades e turmas do portal SENAI-SP;
- filtros e assinaturas multiusuário persistidos em SQLite;
- configuração self-service pelo bot em conversa privada;
- busca compartilhada para filtros equivalentes;
- baseline configurável: somente futuros ou incluir cursos atuais;
- outbox transacional com retry para notificações Telegram;
- dashboard administrativo autenticado e protegido por CSRF;
- API HTTP administrativa para filtros, cursos e configurações.
- Go 1.25.12+
- Gorilla Mux
- Templ
- Goquery
- SQLite (
modernc.org/sqlite) - Robfig Cron
go mod tidy
go test ./...
go vet ./...
go build ./cmd/serverGere um hash bcrypt para a senha administrativa e inicie o servidor:
export SENAI_TRACK_ADMIN_PASSWORD_HASH="$(htpasswd -bnBC 12 '' 'troque-esta-senha' | tr -d ':\n')"
go run ./cmd/serverO servidor escuta em :8020, cria courses.db e exige login no dashboard. Configure o token do bot no painel e use /start em uma conversa privada com o bot.
A imagem oficial é publicada no GitHub Container Registry:
docker pull ghcr.io/brook-sys/senai-courses-track:latestExecução direta com persistência:
docker run -d \
--name senai-courses-track \
--restart unless-stopped \
-p 8020:8020 \
-e SENAI_TRACK_ADMIN_PASSWORD_HASH='$2y$12$...' \
-v senai-courses-data:/data \
ghcr.io/brook-sys/senai-courses-track:latestOu com Compose:
docker compose up -d
docker compose ps
docker compose logs -fO dashboard fica disponível em http://localhost:8020 e o healthcheck em
http://localhost:8020/healthz.
| Variável | Padrão no container | Descrição |
|---|---|---|
SENAI_TRACK_ADDR |
:8020 |
Endereço HTTP do servidor. |
SENAI_TRACK_DB_PATH |
/data/courses.db |
Caminho persistente do SQLite. |
SENAI_TRACK_ADMIN_PASSWORD_HASH |
obrigatório | Hash bcrypt da senha do dashboard. |
SENAI_TRACK_SECURE_COOKIES |
false |
Use true quando o dashboard estiver atrás de HTTPS. |
TZ |
America/Sao_Paulo |
Fuso horário do container. |
O container roda sem privilégios como UID/GID 10001 e persiste os dados no
volume /data.
O workflow .github/workflows/container.yml executa formatação, testes, vet e
build. Em pushes para main e tags v*, publica imagens multi-arquitetura para
linux/amd64 e linux/arm64, com tags latest, branch, SHA e versão.
O banco SQLite e os logs não são versionados. O token do Telegram, IDs, sessões e filtros ficam no banco local e não devem ser adicionados ao Git. O bot aceita configuração somente em chats privados; /privacidade descreve os dados armazenados e /excluirconta remove a conta do usuário.