Situs ini dikemudikan dua tombol, seperti mesin pemiliknya. Membaca: j dan k menggulir, d dan u setengah layar, gg ke atas, G ke bawah, H dan L pindah jendela, ? membuka panduan. Spasi adalah kunci leader Neovim dan mengurus isi: Spasi lalu h beranda, r riset, p proyek, g gear, a tentang, / tag, atau Spasi lalu angka untuk melompat ke jendela bernomor itu. Home adalah prefix tmux dan mengurus jendela: Home lalu c membuka terminal, Home lalu & menutup jendela, Home lalu spasi ke jendela berikutnya. Saat fokus ada di papan ketik, h j k l memindahkan pilihan antar tombol dan Enter membukanya.

RisetR TentangA Gear — G untuk gear — papan ketik, terminal, editor, homelab.G
    ProyekP Tag — / seperti di vim: cari./
    ×
    Menu

    wa-bot-notif

    Layanan notifikasi WhatsApp — Go + whatsmeow.

    Ikhtisar

    Layanan notifikasi WhatsApp yang dibangun dengan Go dan whatsmeow. Menyediakan HTTP API ringkas untuk mengirim pesan, memeriksa kontak, dan menjalankan health check.

    API

    MethodPathAuthDeskripsi
    POST/sendBearerMengirim pesan WhatsApp
    GET/contactsBearerDaftar kontak yang tersinkronisasi
    GET/messagesBearerCache pesan terbaru (runtime memory)
    GET/healthzSelalu mengembalikan 200 OK
    GET/readyz200 saat WA terhubung, 503 jika tidak

    POST /send

    Request body:

    { "message": "hello", "userId": "628xxx", "groupId": "[email protected]" }

    Prioritas penentuan target: userIdgroupId → fallback ke env GROUP_JID.

    Response:

    { "success": true, "sent_to": "<jid>", "timestamp": "<RFC3339>" }

    Konfigurasi

    VariabelDefaultWajibDeskripsi
    AUTH_TOKENBearer token untuk seluruh endpoint berautentikasi
    PORT5000Port listen HTTP (1–65535)
    GROUP_JIDTarget pengiriman default saat request tidak menyertakan userId/groupId
    AUTH_DB_DSNfile:auth.db?_foreign_keys=onDSN SQLite untuk sesi WhatsApp
    LOGS_DB_DSNfile:logs.db?_foreign_keys=onDSN SQLite untuk audit log
    LOG_LEVELinfoLevel Zerolog: trace, debug, info, warn, error

    Salin .env.example menjadi .env, lalu isi AUTH_TOKEN dan GROUP_JID sebelum menjalankan untuk pertama kali.

    Menjalankan Secara Lokal

    Prasyarat

    • Go 1.25+
    • CGO toolchain
    • SQLite dev headers
      • macOS: Xcode Command Line Tools
      • Debian/Ubuntu: build-essential libsqlite3-dev

    Menjalankan layanan

    GOTOOLCHAIN=auto go run ./cmd/api

    Pemeriksaan saat pengembangan

    GOTOOLCHAIN=auto go test ./...
    GOTOOLCHAIN=auto go vet ./...
    GOTOOLCHAIN=auto gofmt -l .

    Docker

    cp .env.example .env
    # isi AUTH_TOKEN
    
    docker compose -f deploy/docker-compose.yml up --build -d
    docker compose -f deploy/docker-compose.yml logs -f api

    File SQLite dipersistensikan melalui Docker volume wa_bot_notif_data.

    Deployment shared-network

    Pada deployment shared-network, layanan dapat diakses di http://wa-bot-notif-api:5000 melalui network homelab_integration:

    docker network create homelab_integration

    Selanjutnya, atur INTEGRATION_NETWORK=homelab_integration di .env.

    Struktur Proyek

    .
    ├── cmd/api/          — entry point
    ├── internal/
    │   ├── config/       — env config loading + validation
    │   ├── httpapi/      — HTTP handlers
    │   ├── storage/      — SQLite audit log store
    │   └── wa/           — WhatsApp connection manager
    ├── deploy/           — Docker Compose
    ├── docs/ai/          — AI agent guidance and planning docs
    ├── Dockerfile
    └── go.mod

    Bacaan Lebih Lanjut

    Dokumentasi AI

    • AGENTS.md — entrypoint agent
    • docs/ai/README.md — indeks lengkap dokumentasi AI

    Deployment

    • docs/deploy.md — runbook deployment lengkap (lokal, Docker, homelab, WireGuard)

    Ditulis ulang dari TypeScript/Bun ke Go

    Versi pertamanya TypeScript di atas Bun. Yang berjalan sekarang tulisan ulang penuh dalam Go dengan whatsmeow, dan berkas lamanya dihapus, bukan ditinggalkan berdampingan.

    Beberapa hal yang ikut dibetulkan saat penulisan ulang itu, dan bukan sekadar dipindahkan bahasanya:

    • Galat yang ditelan diam-diam. Pola _ = ... di httpapi/server.go membuang nilai galat tanpa memeriksanya. Semuanya ditangani.
    • Perbandingan token yang bocor lewat waktu. Autentikasi bearer memakai crypto/subtle.ConstantTimeCompare, bukan ==. Perbandingan string biasa berhenti di karakter pertama yang berbeda, jadi lama-tidaknya ia mengembalikan jawaban ikut memberi tahu seberapa banyak tebakan yang benar.
    • Indeks yang belum ada. logs.timestamp dan unauthorized_logs.ip beserta timestamp-nya diberi indeks.
    • Log yang tumbuh selamanya. Penyimpanan log diberi retensi 30 hari lewat goroutine tersendiri.

    Log terstrukturnya pakai zerolog, menggantikan log bawaan.

    id en
    rss gh in