Skip to content

Repository files navigation

OctoTify Logo

OctoTify

License

中文 | English


🚀 Overview

OctoTify is a message bus platform that bridges external systems (CI/CD, monitoring, custom apps) with multiple notification channels.

Version: 1.1.0

Supported Channels:

Channel Status Description
Feishu Feishu custom bot
Telegram Telegram bot push
Email SMTP email push
DingTalk DingTalk group bot with HMAC-SHA256 signature
Gotify Self-hosted Gotify notification server
WeCom 🚧 WeCom group bot (coming soon)
Webhook 🚧 Custom webhook (coming soon)

How it works:

  1. Create a Source in OctoTify — you get a unique push token
  2. Bind the Source to one or more Channels (Feishu group, Telegram bot, etc.)
  3. External systems push messages via POST /api/push/{token}
  4. OctoTify concurrently delivers messages to all bound channels

✨ Key Features

  • Decoupled Push — External systems push to a single token, no need to be aware of downstream channels
  • Flexible Routing — Bind/unbind channels anytime, one source → many destinations
  • Independent Fault Tolerance — One channel failing doesn't affect others, each channel has an independent 30-second timeout
  • Extensible by Design — Strategy pattern architecture, add new channels without modifying existing code
  • Full Audit Trail — Every push attempt is recorded, including status and error details

🚦 Quick Start

Docker Compose (Recommended)

Create docker-compose.yml:

services:
  octotify:
    image: loommii/octotify:latest
    container_name: octotify
    restart: unless-stopped
    ports:
      - "5233:5233"
    volumes:
      - octotify-data:/app/data

volumes:
  octotify-data:

Start:

docker compose up -d

Persistence recommendation: Use named volume octotify-data to persist the database and logs, preventing data loss when the container is removed.

After starting, visit http://localhost:5233.

Docker

docker run -d \
  --name octotify \
  -p 5233:5233 \
  -v octotify-data:/app/data \
  loommii/octotify:latest

From Source

Prerequisites:

  • Go 1.26+
  • Node.js 20+

Backend:

cd backend
go run cmd/server/main.go

Frontend:

cd frontend
pnpm install
pnpm dev:ele

Or use the startup scripts in the run/ directory.


📡 Push API

External systems push messages via the following endpoint:

POST /api/push/src019df95961e6743a85bb86bc1e42e181
Content-Type: application/json

{
  "title": "CI Build",
  "message": "Build #123 passed"
}

Response:

{
  "code": 0,
  "msg": "Success",
  "data": {
    "total": 2,
    "success": 2,
    "failed": 0,
    "results": [
      { "channel_id": 1, "channel_name": "Feishu", "message_id": 10, "success": true },
      { "channel_id": 2, "channel_name": "WeCom", "message_id": 11, "success": true }
    ]
  }
}

Except for JWT authentication failures which return HTTP 401, all business errors return HTTP 200, with the code field distinguishing error types.


🏗️ Architecture Overview

External System ──POST /api/push/{token}──→ OctoTify
                                                │
                                          Validate Source Token
                                                │
                                    Query associated Channels
                                                │
                              Concurrent push to each channel
                              (independent goroutine per channel, 30s timeout)
                                                │
                                    Record results → Return push summary

Backend uses Go + Gin, frontend uses Vue 3 + Vite, data storage uses SQLite, and the data access layer uses GORM Gen.


📋 Changelog

v1.2.0

New Features

  • Password step-up authentication for sensitive operations

UI Upgrade

  • Complete frontend overhaul with brand new UI and interaction experience

v1.1.1 (Security & Stability Fixes)

Security Fixes

  • Feishu webhook URL sanitized in logs to prevent credential leakage
  • Gotify app_token migrated to X-Gotify-Key header to avoid token exposure in URL logs
  • SMTP TLS certificate validation changed from hardcoded skip to user-configurable, eliminating MITM risk

Stability Improvements

  • SQLite WAL mode + busy_timeout to resolve SQLITE_BUSY errors under high concurrency
  • Container runtime switched to non-root user (USER app)

v1.1.0

New Channels

  • DingTalk channel with HMAC-SHA256 signature verification
  • Gotify self-hosted push channel

v1.0.0

Core Features

  • Source management with unique push token generation
  • Multi-channel push: Feishu, Telegram, Email
  • Flexible routing: one source to multiple channels
  • Push history and audit trail

Deployment

  • Docker Compose one-click deployment
  • SQLite database, ready to use out of the box

📚 Documentation

For detailed design docs, API specifications, and UML diagrams, see the docs directory:

Document Description
Architecture Project architecture, domain models, database design
API Specification API design rules, pagination, response format
Error Codes Error code definitions by module
UML Diagrams Use case, sequence, class, state, and activity diagrams

📝 Changelog

v1.1.0

New Channels:

  • Add DingTalk group bot with HMAC-SHA256 signature verification
  • Add Telegram bot push with optional HTTP proxy support
  • Add Email SMTP sender supporting port 465 (implicit TLS), 587 (STARTTLS), and 25 (plaintext)
  • Add Gotify self-hosted notification server with Markdown message format and priority support

Improvements:

  • Frontend channel form auto-normalizes numeric fields on submit
  • Added comprehensive E2E Playwright tests for all channels

loommii/OctoTify

About

A lightweight, self-hosted notification gateway. Send messages via a single API and relay them to multiple bot channels (Telegram, Discord, WeChat, etc.) like an octopus with many tentacles.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages