• Stars
    star
    7,213
  • Rank 5,383 (Top 0.2 %)
  • Language
    Go
  • License
    MIT License
  • Created over 8 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A push notification server written in Go (Golang).

gorush

A push notification micro server using Gin framework written in Go (Golang) and see the demo app.

Run Lint and Testing GoDoc codecov Go Report Card codebeat badge Docker Pulls Netlify Status Financial Contributors on Open Collective

Contents

Support Platform

A live demo on Netlify.

Features

  • Support Firebase Cloud Messaging using go-fcm library for Android.
  • Support HTTP/2 Apple Push Notification Service using apns2 library.
  • Support HMS Push Service using go-hms-push library for Huawei Devices.
  • Support YAML configuration.
  • Support command line to send single Android or iOS notification.
  • Support Web API to send push notification.
  • Support HTTP/2 or HTTP/1.1 protocol.
  • Support notification queue and multiple workers.
  • Support /api/stat/app show notification success and failure counts.
  • Support /api/config show your YAML config.
  • Support store app stat to memory, Redis, BoltDB, BuntDB, LevelDB or BadgerDB.
  • Support p8, p12 or pem format of iOS certificate file.
  • Support /sys/stats show response time, status code count, etc.
  • Support for HTTP, HTTPS or SOCKS5 proxy.
  • Support retry send notification if server response is fail.
  • Support expose prometheus metrics.
  • Support install TLS certificates from Let's Encrypt automatically.
  • Support send notification through RPC protocol, we use gRPC as default framework.
  • Support running in Docker, Kubernetes or AWS Lambda (Native Support in Golang)
  • Support graceful shutdown that workers and queue have been sent to APNs/FCM before shutdown service.
  • Support different Queue as backend like NSQ, NATS or Redis streams, defaut engine is local Channel.

See the default YAML config example:

core:
  enabled: true # enable httpd server
  address: "" # ip address to bind (default: any)
  shutdown_timeout: 30 # default is 30 second
  port: "8088" # ignore this port number if auto_tls is enabled (listen 443).
  worker_num: 0 # default worker number is runtime.NumCPU()
  queue_num: 0 # default queue number is 8192
  max_notification: 100
  # set true if you need get error message from fail push notification in API response.
  # It only works when the queue engine is local.
  sync: false
  # set webhook url if you need get error message asynchronously from fail push notification in API response.
  feedback_hook_url: ""
  feedback_timeout: 10 # default is 10 second
  feedback_header:
  mode: "release"
  ssl: false
  cert_path: "cert.pem"
  key_path: "key.pem"
  cert_base64: ""
  key_base64: ""
  http_proxy: ""
  pid:
    enabled: false
    path: "gorush.pid"
    override: true
  auto_tls:
    enabled: false # Automatically install TLS certificates from Let's Encrypt.
    folder: ".cache" # folder for storing TLS certificates
    host: "" # which domains the Let's Encrypt will attempt

grpc:
  enabled: false # enable gRPC server
  port: 9000

api:
  push_uri: "/api/push"
  stat_go_uri: "/api/stat/go"
  stat_app_uri: "/api/stat/app"
  config_uri: "/api/config"
  sys_stat_uri: "/sys/stats"
  metric_uri: "/metrics"
  health_uri: "/healthz"

android:
  enabled: true
  apikey: "YOUR_API_KEY"
  max_retry: 0 # resend fail notification, default value zero is disabled

huawei:
  enabled: false
  appsecret: "YOUR_APP_SECRET"
  appid: "YOUR_APP_ID"
  max_retry: 0 # resend fail notification, default value zero is disabled

queue:
  engine: "local" # support "local", "nsq", "nats" and "redis" default value is "local"
  nsq:
    addr: 127.0.0.1:4150
    topic: gorush
    channel: gorush
  nats:
    addr: 127.0.0.1:4222
    subj: gorush
    queue: gorush
  redis:
    addr: 127.0.0.1:6379
    group: gorush
    consumer: gorush
    stream_name: gorush

ios:
  enabled: false
  key_path: ""
  key_base64: "" # load iOS key from base64 input
  key_type: "pem" # could be pem, p12 or p8 type
  password: "" # certificate password, default as empty string.
  production: false
  max_concurrent_pushes: 100 # just for push ios notification
  max_retry: 0 # resend fail notification, default value zero is disabled
  key_id: "" # KeyID from developer account (Certificates, Identifiers & Profiles -> Keys)
  team_id: "" # TeamID from developer account (View Account -> Membership)

log:
  format: "string" # string or json
  access_log: "stdout" # stdout: output to console, or define log path like "log/access_log"
  access_level: "debug"
  error_log: "stderr" # stderr: output to console, or define log path like "log/error_log"
  error_level: "error"
  hide_token: true
  hide_messages: false

stat:
  engine: "memory" # support memory, redis, boltdb, buntdb or leveldb
  redis:
    cluster: false
    addr: "localhost:6379" # if cluster is true, you may set this to "localhost:6379,localhost:6380,localhost:6381"
    password: ""
    db: 0
  boltdb:
    path: "bolt.db"
    bucket: "gorush"
  buntdb:
    path: "bunt.db"
  leveldb:
    path: "level.db"
  badgerdb:
    path: "badger.db"

Memory Usage

Memory average usage: 28Mb (the total bytes of memory obtained from the OS.)

memory usage

Test Command (We use bat as default cli tool.):

for i in {1..9999999}; do bat -b.N=1000 -b.C=100 POST localhost:8088/api/push notifications:[email protected]; sleep 1;  done

Basic Usage

How to send push notification using gorush command? (Android or iOS)

Install from homebrew

brew tap appleboy/tap
brew install gorush

Download a binary

The pre-compiled binaries can be downloaded from release page.

With Go installed

go get -u -v github.com/appleboy/gorush

On linux

wget https://github.com/appleboy/gorush/releases/download/v1.16.3/gorush-1.16.3-linux-amd64 -O gorush

On macOS (Intel amd64)

wget -c https://github.com/appleboy/gorush/releases/download/v1.16.3/gorush-1.16.3-darwin-amd64 -O gorush

On macOS (Apple arm64)

wget -c https://github.com/appleboy/gorush/releases/download/v1.16.3/gorush-1.16.3-darwin-arm64 -O gorush

Install from source

Prerequisite Tools

Fetch from GitHub

Gorush uses the Go Modules support built into Go 1.11 to build. The easiest way to get started is to clone Gorush in a directory outside of the GOPATH, as in the following example:

mkdir $HOME/src
cd $HOME/src
git clone https://github.com/appleboy/gorush.git
cd gorush
go install

or you can use the go get command to install the latest or specific version.

Note: such go get installation aren't guaranteed to work. We recommend using binary installation.

# Go 1.16+
go install github.com/appleboy/gorush@latest

# Go version < 1.16
go get -u github.com/appleboy/gorush@latest

Command Usage

  ________                              .__
 /  _____/   ____ _______  __ __  ______|  |__
/   \  ___  /  _ \\_  __ \|  |  \/  ___/|  |  \
\    \_\  \(  <_> )|  | \/|  |  /\___ \ |   Y  \
 \______  / \____/ |__|   |____//____  >|___|  /
        \/                           \/      \/

Usage: gorush [options]

Server Options:
    -A, --address <address>          Address to bind (default: any)
    -p, --port <port>                Use port for clients (default: 8088)
    -c, --config <file>              Configuration file path
    -m, --message <message>          Notification message
    -t, --token <token>              Notification token
    -e, --engine <engine>            Storage engine (memory, redis ...)
    --title <title>                  Notification title
    --proxy <proxy>                  Proxy URL (support http, https, or socks5)
    --pid <pid path>                 Process identifier path
    --redis-addr <redis addr>        Redis addr (default: localhost:6379)
iOS Options:
    -i, --key <file>                 certificate key file path
    -P, --password <password>        certificate key password
    --ios                            enabled iOS (default: false)
    --production                     iOS production mode (default: false)
Android Options:
    -k, --apikey <api_key>           Android API Key
    --android                        enabled android (default: false)
Huawei Options:
    -hk, --hmskey <hms_key>          HMS App Secret
    -hid, --hmsid <hms_id>           HMS App ID
    --huawei                         enabled huawei (default: false)
Common Options:
    --topic <topic>                  iOS or Android topic message
    -h, --help                       Show this message
    -V, --version                    Show version

Send Android notification

Send single notification with the following command.

gorush -android -m "your message" -k "API Key" -t "Device token"

Send messages to topics.

gorush --android --topic "/topics/foo-bar" \
  -m "This is a Firebase Cloud Messaging Topic Message" \
  -k your_api_key
  • -m: Notification message.
  • -k: Firebase Cloud Messaging api key
  • -t: Device token.
  • --title: Notification title.
  • --topic: Send messages to topics. note: don't add device token.
  • --proxy: Set http, https or socks5 proxy url.

Send Huawei (HMS) notification

Send single notification with the following command.

gorush -huawei -title "Gorush with HMS" -m "your message" -hk "API Key" -hid "App ID" -t "Device token"

Send messages to topics.

gorush --huawei --topic "foo-bar" \
  -title "Gorush with HMS" \
  -m "This is a Huawei Mobile Services Topic Message" \
  -hk "API Key" \
  -hid "App ID"
  • -m: Notification message.
  • -hk: Huawei Mobile Services api secret key
  • -t: Device token.
  • --title: Notification title.
  • --topic: Send messages to topics. note: don't add device token.
  • --proxy: Set http, https or socks5 proxy url.

Send iOS notification

Send single notification with the following command.

$ gorush -ios -m "your message" -i "your certificate path" \
  -t "device token" --topic "apns topic"
  • -m: Notification message.
  • -i: Apple Push Notification Certificate path (pem or p12 file).
  • -t: Device token.
  • --title: Notification title.
  • --topic: The topic of the remote notification.
  • --password: The certificate password.

The default endpoint is APNs development. Please add -production flag for APNs production push endpoint.

$ gorush -ios -m "your message" -i "your certificate path" \
  -t "device token" \
  -production

Send Android or iOS notifications using Firebase

Send single notification with the following command:

gorush -android -m "your message" -k "API key" -t "Device token"

Run gorush web server

Please make sure your config.yml exist. Default port is 8088.

# for default config
$ gorush
# for custom config file
$ gorush -c config.yml

Get go status of api server using httpie tool:

http -v --verify=no --json GET http://localhost:8088/api/stat/go

Web API

Gorush support the following API.

  • GET /api/stat/go Golang cpu, memory, gc, etc information. Thanks for golang-stats-api-handler.
  • GET /api/stat/app show notification success and failure counts.
  • GET /api/config show server yml config file.
  • POST /api/push push ios, android or huawei notifications.

GET /api/stat/go

Golang cpu, memory, gc, etc information. Response with 200 http status code.

{
  "time": 1460686815848046600,
  "go_version": "go1.6.1",
  "go_os": "darwin",
  "go_arch": "amd64",
  "cpu_num": 4,
  "goroutine_num": 15,
  "gomaxprocs": 4,
  "cgo_call_num": 1,
  "memory_alloc": 7455192,
  "memory_total_alloc": 8935464,
  "memory_sys": 12560632,
  "memory_lookups": 17,
  "memory_mallocs": 31426,
  "memory_frees": 11772,
  "memory_stack": 524288,
  "heap_alloc": 7455192,
  "heap_sys": 8912896,
  "heap_idle": 909312,
  "heap_inuse": 8003584,
  "heap_released": 0,
  "heap_objects": 19654,
  "gc_next": 9754725,
  "gc_last": 1460686815762559700,
  "gc_num": 2,
  "gc_per_second": 0,
  "gc_pause_per_second": 0,
  "gc_pause": [
    0.326576,
    0.227096
  ]
}

GET /api/stat/app

Show success or failure counts information of notification.

{
  "version": "v1.6.2",
  "busy_workers": 0,
  "success_tasks": 32,
  "failure_tasks": 49,
  "submitted_tasks": 81,
  "total_count": 81,
  "ios": {
    "push_success": 19,
    "push_error": 38
  },
  "android": {
    "push_success": 10,
    "push_error": 10
  },
  "huawei": {
    "push_success": 3,
    "push_error": 1
  }
}

GET /sys/stats

Show response time, status code count, etc.

{
  "pid": 80332,
  "uptime": "1m42.428010614s",
  "uptime_sec": 102.428010614,
  "time": "2016-06-26 12:27:11.675973571 +0800 CST",
  "unixtime": 1466915231,
  "status_code_count": { },
  "total_status_code_count": {
    "200": 5
  },
  "count": 0,
  "total_count": 5,
  "total_response_time": "10.422441ms",
  "total_response_time_sec": 0.010422441000000001,
  "average_response_time": "2.084488ms",
  "average_response_time_sec": 0.0020844880000000002
}

GET /metrics

Support expose prometheus metrics.

metrics screenshot

POST /api/push

Simple send iOS notification example, the platform value is 1:

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 1,
      "message": "Hello World iOS!"
    }
  ]
}

Simple send Android notification example, the platform value is 2:

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 2,
      "message": "Hello World Android!"
    }
  ]
}

Simple send Huawei notification example, the platform value is 3:

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 3,
      "title": "Gorush with HMS",
      "message": "Hello World Huawei!"
    }
  ]
}

Simple send notification on Android and iOS devices using Firebase, the platform value is 2:

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 2,
      "message": "This notification will go to iOS and Android platform via Firebase!"
    }
  ]
}

Send multiple notifications as below:

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 1,
      "message": "Hello World iOS!"
    },
    {
      "tokens": ["token_a", "token_b"],
      "platform": 2,
      "message": "Hello World Android!"
    },
    {
      "tokens": ["token_a", "token_b"],
      "platform": 3,
      "message": "Hello World Huawei!",
      "title": "Gorush with HMS"
    },
    .....
  ]
}

See more example about iOS, Android or Huawei

Request body

The Request body must have a notifications array. The following is a parameter table for each notification.

name type description required note
notif_id string A unique string that identifies the notification for async feedback -
tokens string array device tokens o
platform int platform(iOS,Android) o 1=iOS, 2=Android (Firebase), 3=Huawei (HMS)
message string message for notification -
title string notification title -
priority string Sets the priority of the message. - normal or high
content_available bool data messages wake the app by default. -
sound interface{} sound type -
data string array extensible partition - only Android and IOS
huawei_data string JSON object as string to extensible partition partition - only Huawei. See the detail
retry int retry send notification if fail response from server. Value must be small than max_retry field. -
topic string send messages to topics
image string image url to show in notification - only Android and Huawei
api_key string api key for firebase cloud message - only Android
to string The value must be a registration token, notification key, or topic. - only Android
collapse_key string a key for collapsing notifications - only Android
huawei_collapse_key int a key integer for collapsing notifications - only Huawei See the detail
delay_while_idle bool a flag for device idling - only Android
time_to_live uint expiration of message kept on FCM storage - only Android
huawei_ttl string expiration of message kept on HMS storage - only Huawei See the detail
restricted_package_name string the package name of the application - only Android
dry_run bool allows developers to test a request without actually sending a message - only Android
notification string array payload of a FCM message - only Android. See the detail
huawei_notification string array payload of a HMS message - only Huawei. See the detail
app_id string hms app id - only Huawei. See the detail
bi_tag string Tag of a message in a batch delivery task - only Huawei. See the detail
fast_app_target int State of a mini program when a quick app sends a data message. - only Huawei. See the detail
expiration int expiration for notification - only iOS
apns_id string A canonical UUID that identifies the notification - only iOS
collapse_id string An identifier you use to coalesce multiple notifications into a single notification for the user - only iOS
push_type string The type of the notification. The value of this header is alert or background. - only iOS
badge int badge count - only iOS
category string the UIMutableUserNotificationCategory object - only iOS
alert string array payload of a iOS message - only iOS. See the detail
mutable_content bool enable Notification Service app extension. - only iOS(10.0+).
name string sets the name value on the aps sound dictionary. - only iOS
volume float32 sets the volume value on the aps sound dictionary. - only iOS
interruption_level string defines the interruption level for the push notification. - only iOS(15.0+)

iOS alert payload

name type description required note
title string Apple Watch & Safari display this string as part of the notification interface. -
body string The text of the alert message. -
subtitle string Apple Watch & Safari display this string as part of the notification interface. -
action string The label of the action button. This one is required for Safari Push Notifications. -
action-loc-key string If a string is specified, the system displays an alert that includes the Close and View buttons. -
launch-image string The filename of an image file in the app bundle, with or without the filename extension. -
loc-args array of strings Variable string values to appear in place of the format specifiers in loc-key. -
loc-key string A key to an alert-message string in a Localizable.strings file for the current localization. -
title-loc-args array of strings Variable string values to appear in place of the format specifiers in title-loc-key. -
title-loc-key string The key to a title string in the Localizable.strings file for the current localization. -

See more detail about APNs Remote Notification Payload.

iOS sound payload

name type description required note
name string sets the name value on the aps sound dictionary. -
volume float32 sets the volume value on the aps sound dictionary. -
critical int sets the critical value on the aps sound dictionary. -

request format:

{
  "sound": {
    "critical": 1,
    "name": "default",
    "volume": 2.0
  }
}

Android notification payload

name type description required note
icon string Indicates notification icon. -
tag string Indicates whether each notification message results in a new entry on the notification center on Android. -
color string Indicates color of the icon, expressed in #rrggbb format -
click_action string The action associated with a user click on the notification. -
body_loc_key string Indicates the key to the body string for localization. -
body_loc_args string Indicates the string value to replace format specifiers in body string for localization. -
title_loc_key string Indicates the key to the title string for localization. -
title_loc_args string Indicates the string value to replace format specifiers in title string for localization. -

See more detail about Firebase Cloud Messaging HTTP Protocol reference.

Huawei notification

  1. app_id: app id from huawei developer console
  2. bi_tag:
  3. fast_app_target:
  4. huawei_data: mapped to data
  5. huawei_notification: mapped to notification
  6. huawei_ttl: mapped to ttl
  7. huawei_collapse_key: mapped to collapse_key

See more detail about Huawei Mobulse Services Push API reference.

iOS Example

Send normal notification.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 1,
      "message": "Hello World iOS!"
    }
  ]
}

The following payload asks the system to display an alert with a Close button and a single action button.The title and body keys provide the contents of the alert. The “PLAY” string is used to retrieve a localized string from the appropriate Localizable.strings file of the app. The resulting string is used by the alert as the title of an action button. This payload also asks the system to badge the app’s icon with the number 5.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 1,
      "badge": 5,
      "alert": {
        "title" : "Game Request",
        "body" : "Bob wants to play poker",
        "action-loc-key" : "PLAY"
      }
    }
  ]
}

The following payload specifies that the device should display an alert message, plays a sound, and badges the app’s icon.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 1,
      "message": "You got your emails.",
      "badge": 9,
      "sound": {
        "critical": 1,
        "name": "default",
        "volume": 1.0
      }
    }
  ]
}

Add other fields which user defined via data field.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 1,
      "message": "Hello World iOS!",
      "data": {
        "key1": "welcome",
        "key2": 2
      }
    }
  ]
}

Support send notification from different environment. See the detail of issue.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 1,
+     "production": true,
      "message": "Hello World iOS Production!"
    },
    {
      "tokens": ["token_a", "token_b"],
      "platform": 1,
+     "development": true,
      "message": "Hello World iOS Sandbox!"
    }
  ]
}

Android Example

Send normal notification.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 2,
      "message": "Hello World Android!",
      "title": "You got message"
    }
  ]
}

Add notification payload.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 2,
      "message": "Hello World Android!",
      "title": "You got message",
      "notification" : {
        "icon": "myicon",
        "color": "#112244"
      }
    }
  ]
}

Add other fields which user defined via data field.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 2,
      "message": "Hello World Android!",
      "title": "You got message",
      "data": {
       "Nick" : "Mario",
       "body" : "great match!",
       "Room" : "PortugalVSDenmark"
      }
    }
  ]
}

Send messages to topics

{
  "notifications": [
    {
      "to": "/topics/foo-bar",
      "platform": 2,
      "message": "This is a Firebase Cloud Messaging Topic Message"
    }
  ]
}

Huawei Example

Send normal notification.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 3,
      "message": "Hello World Huawei!",
      "title": "You got message"
    }
  ]
}

Add notification payload.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 3,
      "message": "Hello World Huawei!",
      "title": "You got message",
      "huawei_notification" : {
        "icon": "myicon",
        "color": "#112244"
      }
    }
  ]
}

Add other fields which user defined via huawei_data field.

{
  "notifications": [
    {
      "tokens": ["token_a", "token_b"],
      "platform": 3,
      "huawei_data": "{'title' : 'Mario','message' : 'great match!', 'Room' : 'PortugalVSDenmark'}"
    }
  ]
}

Send messages to topics

{
  "notifications": [
    {
      "topic": "foo-bar",
      "platform": 3,
      "message": "This is a Huawei Mobile Services Topic Message",
      "title": "You got message"
    }
  ]
}

Response body

Error response message table:

status code message
400 Missing notifications field.
400 Notifications field is empty.
400 Number of notifications(50) over limit(10)

Success response:

{
  "counts": 60,
  "logs": [],
  "success": "ok"
}

If you need error logs from sending fail notifications, please set a feedback_hook_url and feedback_header for custom header. The server with send the failing logs asynchronously to your API as POST requests.

core:
  port: "8088" # ignore this port number if auto_tls is enabled (listen 443).
  worker_num: 0 # default worker number is runtime.NumCPU()
  queue_num: 0 # default queue number is 8192
  max_notification: 100
  sync: false
- feedback_hook_url: ""
+ feedback_hook_url: "https://exemple.com/api/hook"
+ feedback_header:
+   - x-gorush-token:4e989115e09680f44a645519fed6a976

You can also switch to sync mode by setting the sync value as true on yaml config. It only works when the queue engine is local.

core:
  port: "8088" # ignore this port number if auto_tls is enabled (listen 443).
  worker_num: 0 # default worker number is runtime.NumCPU()
  queue_num: 0 # default queue number is 8192
  max_notification: 100
- sync: false
+ sync: true

See the following error format.

{
  "counts": 60,
  "logs": [
    {
      "type": "failed-push",
      "platform": "android",
      "token": "*******",
      "message": "Hello World Android!",
      "error": "InvalidRegistration"
    },
    {
      "type": "failed-push",
      "platform": "ios",
      "token": "*****",
      "message": "Hello World iOS1111!",
      "error": "Post https://api.push.apple.com/3/device/bbbbb: remote error: tls: revoked certificate"
    },
    {
      "type": "failed-push",
      "platform": "ios",
      "token": "*******",
      "message": "Hello World iOS222!",
      "error": "Post https://api.push.apple.com/3/device/token_b: remote error: tls: revoked certificate"
    }
  ],
  "success": "ok"
}

Run gRPC service

Gorush support gRPC service. You can enable the gRPC in config.yml, default as disabled. Enable the gRPC server:

GORUSH_GRPC_ENABLED=true GORUSH_GRPC_PORT=3000 gorush

The following example code to send single notification in Go.

package main

import (
  "context"
  "log"

  "github.com/appleboy/gorush/rpc/proto"

  structpb "github.com/golang/protobuf/ptypes/struct"
  "google.golang.org/grpc"
)

const (
  address = "localhost:9000"
)

func main() {
  // Set up a connection to the server.
  conn, err := grpc.Dial(address, grpc.WithInsecure())
  if err != nil {
    log.Fatalf("did not connect: %v", err)
  }
  defer conn.Close()
  c := proto.NewGorushClient(conn)

  r, err := c.Send(context.Background(), &proto.NotificationRequest{
    Platform: 2,
    Tokens:   []string{"1234567890"},
    Message:  "test message",
    Badge:    1,
    Category: "test",
    Sound:    "test",
    Priority: proto.NotificationRequest_HIGH,
    Alert: &proto.Alert{
      Title:    "Test Title",
      Body:     "Test Alert Body",
      Subtitle: "Test Alert Sub Title",
      LocKey:   "Test loc key",
      LocArgs:  []string{"test", "test"},
    },
    Data: &structpb.Struct{
      Fields: map[string]*structpb.Value{
        "key1": {
          Kind: &structpb.Value_StringValue{StringValue: "welcome"},
        },
        "key2": {
          Kind: &structpb.Value_NumberValue{NumberValue: 2},
        },
      },
    },
  })
  if err != nil {
    log.Println("could not greet: ", err)
  }

  if r != nil {
    log.Printf("Success: %t\n", r.Success)
    log.Printf("Count: %d\n", r.Counts)
  }
}

See the Node.js example and see more detail from README:

var messages = require('./gorush_pb');
var services = require('./gorush_grpc_pb');

var grpc = require('grpc');

function main() {
  var client = new services.GorushClient('localhost:9000',
    grpc.credentials.createInsecure());
  var request = new messages.NotificationRequest();
  var alert = new messages.Alert();
  request.setPlatform(2);
  request.setTokensList(["1234567890"]);
  request.setMessage("Hello!!");
  request.setTitle("hello2");
  request.setBadge(2);
  request.setCategory("mycategory");
  request.setSound("sound")
  alert.setTitle("title");
  request.setAlert(alert);
  request.setThreadid("threadID");
  request.setContentavailable(false);
  request.setMutablecontent(false);
  client.send(request, function (err, response) {
    if(err) {
      console.log(err);
    } else {
      console.log("Success:", response.getSuccess());
      console.log("Counts:", response.getCounts());
    }
  });
}

main();

GRPC Health Checking example: See document.

package main

import (
  "context"
  "log"

  "github.com/appleboy/gorush/rpc/proto"

  structpb "github.com/golang/protobuf/ptypes/struct"
  "google.golang.org/grpc"
)

const (
  address = "localhost:9000"
)

func main() {
  // Set up a connection to the server.
  conn, err := grpc.Dial(address, grpc.WithInsecure())
  if err != nil {
    log.Fatalf("did not connect: %v", err)
  }
  defer conn.Close()
  c := proto.NewGorushClient(conn)

  r, err := c.Send(context.Background(), &proto.NotificationRequest{
    Platform: 2,
    Tokens:   []string{"1234567890"},
    Message:  "test message",
    Badge:    1,
    Category: "test",
    Sound:    "test",
    Priority: proto.NotificationRequest_HIGH,
    Alert: &proto.Alert{
      Title:    "Test Title",
      Body:     "Test Alert Body",
      Subtitle: "Test Alert Sub Title",
      LocKey:   "Test loc key",
      LocArgs:  []string{"test", "test"},
    },
    Data: &structpb.Struct{
      Fields: map[string]*structpb.Value{
        "key1": {
          Kind: &structpb.Value_StringValue{StringValue: "welcome"},
        },
        "key2": {
          Kind: &structpb.Value_NumberValue{NumberValue: 2},
        },
      },
    },
  })
  if err != nil {
    log.Println("could not greet: ", err)
  }

  if r != nil {
    log.Printf("Success: %t\n", r.Success)
    log.Printf("Count: %d\n", r.Counts)
  }
}

Run gorush in Docker

Set up gorush in the cloud in under 5 minutes with zero knowledge of Golang or Linux shell using our gorush Docker image.

docker pull appleboy/gorush
docker run --name gorush -p 80:8088 appleboy/gorush

Run gorush with your own config file.

docker pull appleboy/gorush
docker run --name gorush -v ${PWD}/config.yml:/home/gorush/config.yml -p 80:8088 appleboy/gorush

Testing your gorush server using httpie command.

http -v --verify=no --json GET http://your.docker.host/api/stat/go

statue screenshot

Run gorush in Kubernetes

Quick Start

Create namespace as gorush as gorush and then your configuration map:

kubectl create -f k8s/gorush-namespace.yaml
kubectl create -f k8s/gorush-configmap.yaml

Create redis service:

kubectl create -f k8s/gorush-redis-deployment.yaml
kubectl create -f k8s/gorush-redis-service.yaml

Create gorush deployment controller provides declarative updates for Pods and ReplicaSets:

kubectl create -f k8s/gorush-deployment.yaml

Create the Service Controller for AWS ELB

kubectl create -f k8s/gorush-service.yaml

Ingress Controller for AWS ALB

Update the following in k8s/gorush-service.yaml

-  type: LoadBalancer
-  # type: NodePort
+  # type: LoadBalancer
+  type: NodePort

Then start the AWS ALB by the follwong command.

kubectl create -f k8s/gorush-service.yaml
kubectl create -f k8s/gorush-aws-alb-ingress.yaml

Clean up the gorush

kubectl delete -f k8s

Run gorush in AWS Lambda

lambda

AWS excited to announce Go as a supported language for AWS Lambda. You’re going to create an application that uses an API Gateway event source to create a simple Hello World RESTful API.

Build gorush binary

Download source code first.

git clone https://github.com/appleboy/gorush.git
cd gorush && make build_linux_lambda

you can see the binary file in release/linux/lambda/ folder

Deploy gorush application

we need to build a binary that will run on Linux, and ZIP it up into a deployment package.

zip deployment.zip release/linux/lambda/gorush

Upload the deployment.zip via web UI or you can try the drone-lambda as the following command. it will zip your binary file and upload to AWS Lambda automatically.

$ AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID \
  AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY \
  drone-lambda --region ap-southeast-1 \
  --function-name gorush \
  --source release/linux/lambda/gorush

Without an AWS account

Or you can deploy gorush to alternative solution like netlify functions. Netlify lets you deploy serverless Lambda functions without an AWS account, and with function management handled directly within Netlify. Please see the netlify.toml file:

[build]
  command = "./build.sh"
  functions = "release/linux/lambda"

[build.environment]
  GO_IMPORT_PATH = "github.com/appleboy/gorush"
  GO111MODULE = "on"

[[redirects]]
  from = "/*"
  to = "/.netlify/functions/gorush/:splat"
  status = 200

Stargazers over time

Stargazers over time

License

Copyright 2019 Bo-Yi Wu @appleboy.

Licensed under the MIT License.

More Repositories

1

ssh-action

GitHub Actions for executing remote ssh commands.
Dockerfile
3,247
star
2

gin-jwt

JWT Middleware for Gin framework
Go
2,545
star
3

scp-action

GitHub Action that copy files and artifacts via SSH.
Shell
824
star
4

telegram-action

GitHub Action that sends a Telegram message.
Dockerfile
660
star
5

react-recaptcha

A react.js reCAPTCHA for Google
JavaScript
633
star
6

CodeGPT

A CLI written in Go language that writes git commit messages or do a code review brief for you using ChatGPT AI (gpt-4, gpt-3.5-turbo model) and automatically installs a git prepare-commit-msg hook.
Go
521
star
7

gofight

Testing API Handler written in Golang.
Go
437
star
8

lambda-action

GitHub Action for Deploying Lambda code to an existing function
Go
315
star
9

easyssh-proxy

easyssh-proxy provides a simple implementation of some SSH protocol features in Go
Go
287
star
10

drone-ssh

Drone plugin for executing remote ssh commands
Go
222
star
11

go-fcm

Firebase Cloud Messaging Library for Golang
Go
212
star
12

gulp-compass

Compass plugin for gulp
JavaScript
174
star
13

golang-graphql-benchmark

benchmark of golang GraphQL framework.
Go
127
star
14

drone-scp

Copy files and artifacts via SSH using a binary, docker or Drone CI.
Go
117
star
15

CodeIgniter-reCAPTCHA

reCAPTCHA library for CodeIgniter
PHP
106
star
16

drone-on-kubernetes

Examples of how to run Drone on Kubernetes (AWS && GKE)
Shell
101
star
17

flutter-gorush

flutter demo app with gorush (push notification server)
Dart
95
star
18

docker-backup-database

Docker image to periodically backup your database (MySQL, Postgres, or MongoDB) to S3 or local disk.
Go
93
star
19

drone-telegram

Drone plugin for sending Telegram notifications
Go
89
star
20

jenkins-action

GitHub Action that trigger Jenkins job.
Dockerfile
83
star
21

CodeIgniter-Native-Session

codeigniter native session
PHP
82
star
22

nginx-image-resizer

Docker Container of real time image resizing and caching
Shell
81
star
23

html5-template-engine

html5 template engine with CoffeeScript, Compass, RequireJS.
CoffeeScript
80
star
24

drone-line

Sending line notifications using a binary, docker or Drone CI.
Go
79
star
25

discord-action

GitHub Action that sends a Discord message.
Dockerfile
76
star
26

npm-vs-yarn

npm vs yarn install speed testing.
Dockerfile
70
star
27

gin-lambda

running golang using gin framework in AWS Lambda & API Gateway
Go
65
star
28

drone-git-push

Drone plugin for deploying code using git push
Go
62
star
29

gitlab-ci-action

GitHub Action that trigger gitlab CI build.
Dockerfile
61
star
30

facebook-action

GitHub Action that sends a Facebook message.
Dockerfile
61
star
31

CodeIgniter-Log-Library

Store php error or exception logs into database.
PHP
60
star
32

macbook

Some tips and command for my MacOS.
59
star
33

CodeIgniter-Nexmo-Message

Class Nexmo Message handles the methods and properties of sending an SMS message.
PHP
48
star
34

graceful

graceful shutdown package when a service is turned off by software function
Go
48
star
35

drone-terraform-in-aws

drone infrastructure in AWS
HCL
47
star
36

Shell-Script

Shell Script on FreeBSD or Ubuntu
Shell
37
star
37

PHP-Git-Deploy

Git Deployment with PHP
PHP
36
star
38

drone-jenkins

Drone plugin for trigger Jenkins jobs.
Go
36
star
39

drone-discord

Drone plugin for sending message to Discord channel using Webhook
Go
35
star
40

CodeIgniter-App

Integrate RESTfull API, Base Model, Ion Auth module and template module
PHP
35
star
41

dotfiles

Bootstrap for your terminal on Linux or FreeBSD
Shell
33
star
42

golang-testing

Docker image includes golang coverage tools for testing.
Roff
29
star
43

codeigniter-docker

Like Laravel Homestead but for Docker with CodeIgniter Framework.
Shell
28
star
44

gh-pages-action

A GitHub Action to deploy a static site on GitHub Pages.
Shell
28
star
45

drone-lambda

Deploying Lambda code with drone CI to an existing function
Go
25
star
46

loadbalancer-algorithms

Load balancer Algorithms
Go
24
star
47

gin-status-api

Golang cpu, memory, gc, etc information api handler written in Go (Golang) for gin framework
Go
23
star
48

docker-multi-stage-build

Multi-Stage Docker Builds for Creating Tiny Go Images
Makefile
23
star
49

linkit-smart-7688-golang

Build static binary using golang for MT7688.
22
star
50

CodeIgniter-Google-URL-Shortener-API

CodeIgniter Google URL Shortener API
PHP
22
star
51

CodeIgniter-Template

A Lightweight Codeigniter Template Libray
PHP
21
star
52

codeigniter-facebook-php-sdk-v4

Intergrate facebook php sdk v4 with CodeIgniter Framewrok.
PHP
20
star
53

docker-ecr-action

Publish Docker Images to the Amazon Elastic Container Registry (ECR)
Dockerfile
19
star
54

flutter-docker

Unit testing for flutter in Docker
Dockerfile
19
star
55

com

This is an open source project for commonly used functions for the Go programming language.
Go
18
star
56

drone-gitlab-ci

Drone plugin for trigger gitlab-ci jobs.
Go
18
star
57

CodeIgniter-Gearman-Library

Gearman library for CodeIgniter PHP Framework
PHP
18
star
58

go-kkbox

KKBOX Open API SDK for Golang.
Go
17
star
59

jquery-migrate

shim repo for jQuery Migrate package
16
star
60

go-storage

storage interface for local disk or AWS S3 (or Minio) platform
Go
15
star
61

minify-tool

minify all html, css, js and optimize image files for web project.
Shell
15
star
62

drone-facebook

Drone plugin for sending Facebook notifications
Go
15
star
63

ansible-drone

Ansible role to configure drone (server and agent)
Jsonnet
15
star
64

server-configs

Linux Server Config
Nginx
14
star
65

drone-packer

drone plugin for build Automated Machine Images
Go
14
star
66

database-backup-action

GitHub Actions for periodically backup your database (MySQL, Postgres, or MongoDB) to S3 or local disk.
Roff
14
star
67

PHP-CodeIgniter-Framework-Taiwan

CodeIgniter 是一套小巧但功能强大的 PHP 框架,做為一個簡單而“優雅”的工具包,它是一套專為 PHP 開發者建立功能完善的 Web 應用程序。如果你是一個使用虛擬主機,並且為客戶所要求的期限而煩惱的開發人員,如果你已經厭倦那些難而且效率不高的框架
JavaScript
14
star
68

drone-sftp-cache

Drone plugin for caching artifacts to a central server using sftp
Go
13
star
69

jquery.slideShow

This simple slideshow plugin will provide your effect gallery
JavaScript
10
star
70

js-video-player

Integrate Dailymotion, Vimeo, Youtube API.
JavaScript
10
star
71

jquery-twzipcode

在網頁建立多組 3 碼台灣郵遞區號表單元素的 jQuery Plugin ─ 讀取快速、不需使用資料庫。
JavaScript
10
star
72

slush-html5-template

html5 template engine generator (RequireJS/CoffeeScript/Compass/jQuery/Mocha) for Slush.
CSS
10
star
73

go-spgateway

智付通金流串接
Go
9
star
74

drone-on-docker-compose

Drone running on docker-compose
9
star
75

php-i18n

PHP i18n Library
PHP
9
star
76

CodeIgniter-i18n

i18n library for CodeIgniter 2.1.x
PHP
8
star
77

go-jwt-server

JWT Token Server written in Go (Golang)
Go
8
star
78

git-hooks

Parse PHP error on php files and detect "console syntax" on javascript or coffee files before commit.
Shell
8
star
79

go-hello

hello world for go lang
Makefile
8
star
80

Codeigniter-Base-Model

CodeIgniter base CRUD model to remove repetition and increase productivity
PHP
7
star
81

livescript-gulp

A tiny wrapper around Gulp to run your gulpfile.ls.
JavaScript
7
star
82

appleboy.github.com

My Home Page
HTML
7
star
83

CodeIgniter-TextMagic-API

CodeIgniter Library for TextMagic API
PHP
7
star
84

backbone-template-engine

Backbone template engine with CoffeeScript, Compass, RequireJS.
ApacheConf
7
star
85

blog

My Chinese Blog
PHP
6
star
86

codegpt-action

GitHub Action for generating code review brief using ChatGPT AI (gpt-4, gpt-3.5-turbo model)
Shell
6
star
87

go-myallocator

Golang SDK for OTA's to easily integrate with the MyAllocator OTA BuildToUs API
Go
6
star
88

CodeIgniter-Plurk-API

A Plurk API Module for CodeIgniter
PHP
6
star
89

line-action

GitHub Action that sends a Line message.
Dockerfile
5
star
90

appleboy

5
star
91

go-mailer

send email package
Go
5
star
92

android-docker

Android Docker image
Shell
5
star
93

gin-revision-middleware

Revision middleware for Gin framework written in Go (Golang).
Go
5
star
94

sails-auth-ldap-example

Example SailsJS application with ldap authentication.
JavaScript
5
star
95

drone-minio

Drone plugin to upload or remove filesystems and object storage.
Go
5
star
96

detect

Golang library to detect the device platform given an user agent.
Go
4
star
97

laravel-elixir-cssfmt

Laravel Elixir CSSfmt Extension
JavaScript
4
star
98

golang-cli-example

CLI Example for Golang
Go
4
star
99

cacheman-promise

cacheman library with a promise interface
JavaScript
4
star
100

CodeIgniter-MY-Model

CodeIgniter base CRUD model
PHP
4
star