Skip to content

Sumit189/letItGo

Repository files navigation

GitAds Sponsored

Sponsored by GitAds

LetItGo

LetItGo Logo

Status License Go Report Card Issues

Rejected by Ycombinator

LetItGo is a robust, distributed webhook scheduling system built in Go that allows for precise timing of API calls. Whether you need one-time or recurring webhook triggers, LetItGo provides a reliable solution with built-in retry mechanisms and encryption.

Table of Contents

Features

  • Scheduled Webhooks: Schedule one-time webhook calls at specific times with millisecond precision
  • Recurring Webhooks: Set up recurring webhooks using standard cron expressions
  • Natural Language Processing: Describe schedules in plain English (e.g., "next Monday at 3 PM", "tomorrow at noon")
  • Webhook Verification: Security verification for webhook endpoints with HMAC-SHA256 signatures
  • Payload Encryption: All payloads are encrypted at rest using AES-256 encryption
  • Retry Mechanisms: Configurable automatic retries for failed webhook calls with exponential backoff
  • Distributed Architecture: Kafka-based message passing between components for horizontal scaling
  • MongoDB Storage: Persistent storage of schedules and archives with TTL indexes
  • Redis Caching: High-performance caching for processed tasks to prevent duplicate delivery
  • Logging & Monitoring: Comprehensive logging and performance metrics

Architecture

LetItGo Architecture

LetItGo follows a microservices architecture with three main components:

  1. API Service: Handles HTTP requests for scheduling and webhook verification

    • Endpoint validation and security checks
    • Request processing and database operations
    • Response formatting and error handling
  2. Producer Service: Polls the database for pending schedules and publishes them to Kafka

    • Efficient batch processing of scheduled tasks
    • Pre-processing of payloads
    • Message serialization and delivery to Kafka
  3. Consumer Service: Consumes scheduled tasks from Kafka and executes webhooks

    • Concurrent webhook execution
    • Retry handling for failed attempts
    • Result tracking and archiving

Technologies Used

  • Go 1.23.2: Fast, efficient, and reliable backend processing
  • MongoDB: Document storage for schedule and archive data
  • Redis: In-memory caching and rate limiting
  • Apache Kafka: Message queue for reliable task distribution
  • AWS MSK: Managed Streaming for Kafka (for production deployments)
  • Docker & Docker Compose: Containerization and local development

Getting Started

Prerequisites

  • Docker and Docker Compose

That's it! All other dependencies (Go, MongoDB, Redis, Kafka) are handled by the Docker setup.

Environment Variables

Create a .env file in the project root with the following variables:

# Database Configuration
MONGODB_URI=mongodb://mongodb:27017
REDIS_ADDRESS=redis:6379
REDIS_PASSWORD=
REDIS_DB=0

# Messaging Configuration
KAFKA_BROKER=kafka:9092

# Application Configuration
ENVIRONMENT=development
PAYLOAD_ENCRYPTION_KEY=your-32-character-aes-key
WEBHOOK_SECRET_KEY=your-webhook-secret-key

# NLP Integration (Optional)
LLM_API_URL=your-llm-api-url
LLM_API_KEY=your-llm-api-key

Note: The hostnames (mongodb, redis, kafka) match the service names in docker-compose.yml for containerized deployments. For local development, use localhost instead.

Installation

Using Docker (Recommended)

  1. Clone the repository:
git clone https://github.com/sumit189/letItGo.git
cd letItGo
  1. Create the .env file from the example:
cp .env.example .env
  1. Customize environment variables in the .env file:
nano .env
  1. Build and run with Docker Compose:
docker-compose up -d

This will start all services including MongoDB, Redis, Zookeeper, Kafka, and all LetItGo services.

  1. Monitor the logs:
docker-compose logs -f
  1. To stop all services:
docker-compose down

API Usage

Schedule a Webhook

Schedule a one-time webhook to be triggered at a specific time:

curl -X POST http://localhost:8081/schedule \
  -H "Content-Type: application/json" \
  -d '{
    "webhook_url": "https://your-verified-endpoint.com/webhook",
    "method_type": "POST",
    "payload": {"key": "value"},
    "schedule_time": "2023-10-01T15:00:00Z"
  }'

Alternative with natural language time:

curl -X POST http://localhost:8081/schedule \
  -H "Content-Type: application/json" \
  -d '{
    "webhook_url": "https://your-verified-endpoint.com/webhook",
    "method_type": "POST",
    "payload": {"key": "value"},
    "time_as_text": "next Monday at 3 PM"
  }'

Response:

{
  "success": true,
  "message": "Webhook scheduled successfully",
  "data": {
    "id": "64f7a1b2c3d4e5f6a7b8c9d0",
    "webhook_url": "https://your-verified-endpoint.com/webhook",
    "schedule_time": "2023-10-01T15:00:00Z",
    "status": "pending"
  }
}

Schedule a Recurring Webhook

Set up a webhook that triggers according to a cron expression:

curl -X POST http://localhost:8081/schedule \
  -H "Content-Type: application/json" \
  -d '{
    "webhook_url": "https://your-verified-endpoint.com/webhook",
    "method_type": "POST",
    "payload": {"key": "value"},
    "cron_expression": "0 15 * * *"
  }'

Response:

{
  "success": true,
  "message": "Recurring webhook scheduled successfully",
  "data": {
    "id": "64f7a1b2c3d4e5f6a7b8c9d1",
    "webhook_url": "https://your-verified-endpoint.com/webhook",
    "cron_expression": "0 15 * * *",
    "next_run_time": "2023-10-01T15:00:00Z",
    "status": "pending"
  }
}

Verify a Webhook Endpoint

Before scheduling, verify that your webhook endpoint can receive calls properly:

curl -X POST http://localhost:8081/webhook/verify \
  -H "Content-Type: application/json" \
  -d '{
    "webhook_url": "https://your-endpoint.com/webhook",
    "method_type": "POST"
  }'

Your webhook endpoint needs to return the correct signature in the X-Webhook-Signature header.

Response:

{
  "success": true,
  "message": "Webhook endpoint verified successfully",
  "data": {
    "webhook_url": "https://your-endpoint.com/webhook",
    "verified": true,
    "verification_time": "2023-10-01T12:34:56Z"
  }
}

Deployment

For production deployment on Linux systems:

  1. Update the deployment script if needed:
nano deploy.sh
  1. Run the deployment script:
sudo ./deploy.sh

This will:

  • Copy binaries to /usr/local/bin/letItGo/
  • Create systemd service files
  • Enable and start the services

Production Considerations

  • Set appropriate values for retry limits and timeouts
  • Configure MongoDB replica set for high availability
  • Use a production-grade Kafka cluster (AWS MSK recommended)
  • Set up monitoring and alerting for the services
  • Configure proper logging retention policies

Security

Webhook Verification Process

  1. When a webhook endpoint is registered, LetItGo sends a verification request with a challenge token
  2. The endpoint must respond with a signature computed using HMAC-SHA256 with your webhook secret
  3. The signature must be returned in the X-Webhook-Signature header
  4. Only verified endpoints can receive webhook calls

Example webhook endpoint verification handler:

func handleWebhook(w http.ResponseWriter, r *http.Request) {
    payload, _ := io.ReadAll(r.Body)
    signature := computeHMAC(payload, "your-webhook-secret-key")
    
    w.Header().Set("X-Webhook-Signature", signature)
    w.WriteHeader(http.StatusOK)
}

func computeHMAC(message []byte, key string) string {
    h := hmac.New(sha256.New, []byte(key))
    h.Write(message)
    return hex.EncodeToString(h.Sum(nil))
}

Payload Encryption

  • All webhook payloads are encrypted at rest using AES-256 encryption
  • Encryption keys should be stored securely and rotated regularly
  • The system uses separate keys for payload encryption and webhook signature verification

Troubleshooting

Common Issues

Issue: Webhook calls are not being executed at the expected times. Solution: Check for time zone issues in your cron expressions or scheduled times. All times are processed in UTC.

Issue: MongoDB connection failures. Solution: Verify your MongoDB URI and ensure the database server is accessible from your application.

Issue: Kafka connection issues. Solution: Check Kafka broker settings and ensure the topic exists with proper permissions.

Issue: Webhook verification failures. Solution: Ensure your endpoint is correctly computing and returning the HMAC-SHA256 signature.

Logs

To view application logs:

# For Docker deployment
docker-compose logs -f api
docker-compose logs -f producer
docker-compose logs -f consumer

# For manual installation
tail -f logs/api.log
tail -f logs/producer.log
tail -f logs/consumer.log

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Coding Standards

  • Follow Go best practices and code style
  • Add comments to explain complex logic
  • Write tests for new features
  • Update documentation as needed
  • Use proper error handling and logging
  • Ensure backward compatibility when making changes

Support

If you find this package useful, consider buying me a coffee:

Buy Me A Coffee

Acknowledgements

Contact

Sumit Paul - @SumitPaul18_9
Project Link: https://github.com/sumit189/letItGo

About

Liteweight scheduler in Go

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages