2016-04-13 07:22:04 +00:00
# gorush
2016-04-01 02:21:36 +00:00
2019-04-08 15:42:58 +00:00
A push notification micro server using [Gin ](https://github.com/gin-gonic/gin ) framework written in Go (Golang) and see the [demo app ](https://github.com/appleboy/flutter-gorush ).
2016-04-01 02:21:36 +00:00
2017-06-23 07:14:08 +00:00
[![GoDoc ](https://godoc.org/github.com/appleboy/gorush?status.svg )](https://godoc.org/github.com/appleboy/gorush)
2019-03-16 03:37:01 +00:00
[![Build Status ](https://cloud.drone.io/api/badges/appleboy/gorush/status.svg )](https://cloud.drone.io/appleboy/gorush)
2018-03-13 01:14:16 +00:00
[![Build status ](https://ci.appveyor.com/api/projects/status/ka4hvplssp1q2s5u?svg=true )](https://ci.appveyor.com/project/appleboy/gorush-fp5dh)
2017-06-23 07:14:08 +00:00
[![codecov ](https://codecov.io/gh/appleboy/gorush/branch/master/graph/badge.svg )](https://codecov.io/gh/appleboy/gorush)
[![Go Report Card ](https://goreportcard.com/badge/github.com/appleboy/gorush )](https://goreportcard.com/report/github.com/appleboy/gorush)
[![codebeat badge ](https://codebeat.co/badges/0a4eff2d-c9ac-46ed-8fd7-b59942983390 )](https://codebeat.co/projects/github-com-appleboy-gorush)
2017-12-29 01:53:09 +00:00
[![Codacy Badge ](https://api.codacy.com/project/badge/Grade/c82e0ed283474c5686d705ce64d004f7 )](https://www.codacy.com/app/appleboy/gorush?utm_source=github.com& utm_medium=referral& utm_content=appleboy/gorush& utm_campaign=Badge_Grade)
2017-06-23 07:14:08 +00:00
[![Docker Pulls ](https://img.shields.io/docker/pulls/appleboy/gorush.svg )](https://hub.docker.com/r/appleboy/gorush/)
2020-03-21 03:42:14 +00:00
[![microbadger ](https://images.microbadger.com/badges/image/appleboy/gorush.svg )](https://microbadger.com/images/appleboy/gorush "Get your own image badge on microbadger.com")
2017-05-12 04:09:33 +00:00
[![Release ](https://github-release-version.herokuapp.com/github/appleboy/gorush/release.svg?style=flat )](https://github.com/appleboy/gorush/releases/latest)
2020-03-21 03:42:14 +00:00
[![Netlify Status ](https://api.netlify.com/api/v1/badges/8ab14c9f-44fd-4d9a-8bba-f73f76d253b1/deploy-status )](https://app.netlify.com/sites/gorush/deploys)
2020-09-27 04:20:01 +00:00
[![Financial Contributors on Open Collective ](https://opencollective.com/gorush/all/badge.svg?label=financial+contributors )](https://opencollective.com/gorush)
2016-04-01 02:21:36 +00:00
2016-05-29 07:53:07 +00:00
## Contents
2019-03-16 03:37:01 +00:00
- [gorush ](#gorush )
- [Contents ](#contents )
- [Support Platform ](#support-platform )
- [Features ](#features )
- [Memory Usage ](#memory-usage )
- [Basic Usage ](#basic-usage )
- [Download a binary ](#download-a-binary )
- [Install from source ](#install-from-source )
- [Prerequisite Tools ](#prerequisite-tools )
- [Fetch from GitHub ](#fetch-from-github )
- [Command Usage ](#command-usage )
- [Send Android notification ](#send-android-notification )
2020-09-27 04:20:01 +00:00
- [Send Huawei (HMS) notification ](#send-huawei-hms-notification )
2019-03-16 03:37:01 +00:00
- [Send iOS notification ](#send-ios-notification )
- [Send Android or iOS notifications using Firebase ](#send-android-or-ios-notifications-using-firebase )
- [Run gorush web server ](#run-gorush-web-server )
- [Web API ](#web-api )
- [GET /api/stat/go ](#get-apistatgo )
- [GET /api/stat/app ](#get-apistatapp )
- [GET /sys/stats ](#get-sysstats )
- [GET /metrics ](#get-metrics )
- [POST /api/push ](#post-apipush )
- [Request body ](#request-body )
- [iOS alert payload ](#ios-alert-payload )
- [iOS sound payload ](#ios-sound-payload )
- [Android notification payload ](#android-notification-payload )
2020-09-27 04:20:01 +00:00
- [Huawei notification ](#huawei-notification )
2019-03-16 03:37:01 +00:00
- [iOS Example ](#ios-example )
- [Android Example ](#android-example )
2020-09-27 04:20:01 +00:00
- [Huawei Example ](#huawei-example )
2019-03-16 03:37:01 +00:00
- [Response body ](#response-body )
- [Run gRPC service ](#run-grpc-service )
- [Run gorush in Docker ](#run-gorush-in-docker )
- [Run gorush in Kubernetes ](#run-gorush-in-kubernetes )
- [Quick Start ](#quick-start )
- [Create the Service Controller for AWS ELB ](#create-the-service-controller-for-aws-elb )
- [Ingress Controller for AWS ALB ](#ingress-controller-for-aws-alb )
- [Clean up the gorush: ](#clean-up-the-gorush )
- [Run gorush in AWS Lambda ](#run-gorush-in-aws-lambda )
- [Build gorush binary ](#build-gorush-binary )
- [Deploy gorush application ](#deploy-gorush-application )
2020-03-21 04:25:17 +00:00
- [Without an AWS account ](#without-an-aws-account )
2019-03-16 03:37:01 +00:00
- [Stargazers over time ](#stargazers-over-time )
- [License ](#license )
2016-05-29 07:53:07 +00:00
2018-03-05 09:10:07 +00:00
< a href = "https://www.buymeacoffee.com/appleboy" target = "_blank" > < img src = "https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png" alt = "Buy Me A Coffee" style = "height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;" > < / a >
2016-04-12 14:45:37 +00:00
## Support Platform
2019-10-07 02:07:50 +00:00
- [APNS ](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html )
- [FCM ](https://firebase.google.com/ )
2020-09-04 03:01:21 +00:00
- [HMS ](https://developer.huawei.com/consumer/en/hms/ )
2016-04-12 14:45:37 +00:00
2020-03-21 04:25:17 +00:00
[A live demo on Netlify ](https://gorush.netlify.com/ ).
2016-05-29 07:53:07 +00:00
## Features
2016-04-07 08:09:43 +00:00
2019-10-07 02:07:50 +00:00
- Support [Firebase Cloud Messaging ](https://firebase.google.com/docs/cloud-messaging ) using [go-fcm ](https://github.com/appleboy/go-fcm ) library for Android.
- Support [HTTP/2 ](https://http2.github.io/ ) Apple Push Notification Service using [apns2 ](https://github.com/sideshow/apns2 ) library.
2020-09-04 03:01:21 +00:00
- Support [HMS Push Service ](https://developer.huawei.com/consumer/en/hms/huawei-pushkit ) using [go-hms-push ](https://github.com/msalihkarakasli/go-hms-push ) library for Huawei Devices.
2019-10-07 02:07:50 +00:00
- Support [YAML ](https://github.com/go-yaml/yaml ) configuration.
- Support command line to send single Android or iOS notification.
- Support Web API to send push notification.
- Support [HTTP/2 ](https://http2.github.io/ ) 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 ](https://en.wikipedia.org/wiki/YAML ) config.
- Support store app stat to memory, [Redis ](http://redis.io/ ), [BoltDB ](https://github.com/boltdb/bolt ), [BuntDB ](https://github.com/tidwall/buntdb ), [LevelDB ](https://github.com/syndtr/goleveldb ) or [BadgerDB ](https://github.com/dgraph-io/badger ).
- Support `p8` , `p12` or `pem` format of iOS certificate file.
- Support `/sys/stats` show response time, status code count, etc.
2019-12-07 23:33:26 +00:00
- Support for HTTP, HTTPS or SOCKS5 proxy.
2019-10-07 02:07:50 +00:00
- Support retry send notification if server response is fail.
- Support expose [prometheus ](https://prometheus.io/ ) metrics.
- Support install TLS certificates from [Let's Encrypt ](https://letsencrypt.org/ ) automatically.
- Support send notification through [RPC ](https://en.wikipedia.org/wiki/Remote_procedure_call ) protocol, we use [gRPC ](https://grpc.io/ ) as default framework.
- Support running in Docker, [Kubernetes ](https://kubernetes.io/ ) or [AWS Lambda ](https://aws.amazon.com/lambda ) ([Native Support in Golang](https://aws.amazon.com/blogs/compute/announcing-go-support-for-aws-lambda/))
2020-02-04 05:30:34 +00:00
- Support graceful shutdown that workers and queue have been sent to APNs/FCM before shutdown service.
2016-04-07 08:09:43 +00:00
2020-05-29 03:58:06 +00:00
See the default [YAML config example ](config/testdata/config.yml ):
2016-04-07 08:09:43 +00:00
2018-08-15 07:07:08 +00:00
[embedmd]:# (config/testdata/config.yml yaml)
2016-04-07 08:09:43 +00:00
```yaml
core:
2020-04-05 08:48:39 +00:00
enabled: true # enable httpd server
2017-07-31 08:37:56 +00:00
address: "" # ip address to bind (default: any)
2020-02-05 15:23:16 +00:00
shutdown_timeout: 30 # default is 30 second
2017-04-05 04:03:43 +00:00
port: "8088" # ignore this port number if auto_tls is enabled (listen 443).
2017-02-25 12:31:49 +00:00
worker_num: 0 # default worker number is runtime.NumCPU()
queue_num: 0 # default queue number is 8192
2016-04-10 05:06:34 +00:00
max_notification: 100
2017-04-12 02:59:40 +00:00
sync: false # set true if you need get error message from fail push notification in API response.
2019-09-06 07:48:42 +00:00
feedback_hook_url: "" # set a hook url if you need get error message asynchronously from fail push notification in API response.
2020-02-24 14:18:50 +00:00
feedback_timeout: 10 # default is 10 second
2016-04-07 08:09:43 +00:00
mode: "release"
ssl: false
cert_path: "cert.pem"
key_path: "key.pem"
2018-02-18 09:12:51 +00:00
cert_base64: ""
key_base64: ""
2019-12-07 23:30:24 +00:00
http_proxy: ""
2016-08-20 08:48:15 +00:00
pid:
2017-02-25 12:31:49 +00:00
enabled: false
2016-08-20 08:48:15 +00:00
path: "gorush.pid"
override: true
2017-04-05 04:03:43 +00:00
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
2016-04-07 08:09:43 +00:00
2017-07-24 10:58:30 +00:00
grpc:
2020-04-05 08:48:39 +00:00
enabled: false # enable gRPC server
2017-10-19 01:24:47 +00:00
port: 9000
2017-07-24 10:58:30 +00:00
2016-04-07 08:09:43 +00:00
api:
push_uri: "/api/push"
2016-04-15 02:24:39 +00:00
stat_go_uri: "/api/stat/go"
stat_app_uri: "/api/stat/app"
2016-04-15 07:05:23 +00:00
config_uri: "/api/config"
2016-06-26 04:31:38 +00:00
sys_stat_uri: "/sys/stats"
2017-01-21 08:08:30 +00:00
metric_uri: "/metrics"
2017-10-26 02:19:58 +00:00
health_uri: "/healthz"
2016-04-07 08:09:43 +00:00
android:
2016-04-11 13:32:40 +00:00
enabled: true
apikey: "YOUR_API_KEY"
2016-10-23 10:23:01 +00:00
max_retry: 0 # resend fail notification, default value zero is disabled
2016-04-07 08:09:43 +00:00
2020-09-04 03:01:21 +00:00
huawei:
enabled: true
2021-03-28 14:13:02 +00:00
appsecret: "YOUR_APP_SECRET"
2020-09-04 03:01:21 +00:00
appid: "YOUR_APP_ID"
max_retry: 0 # resend fail notification, default value zero is disabled
2016-04-07 08:09:43 +00:00
ios:
enabled: false
2016-06-12 11:09:41 +00:00
key_path: "key.pem"
2018-02-18 09:12:51 +00:00
key_base64: "" # load iOS key from base64 input
key_type: "pem" # could be pem, p12 or p8 type
2016-05-30 07:53:16 +00:00
password: "" # certificate password, default as empty string.
2016-04-07 08:09:43 +00:00
production: false
2020-04-23 13:02:53 +00:00
max_concurrent_pushes: 100 # just for push ios notification
2016-10-23 10:23:01 +00:00
max_retry: 0 # resend fail notification, default value zero is disabled
2017-10-25 08:49:23 +00:00
key_id: "" # KeyID from developer account (Certificates, Identifiers & Profiles -> Keys)
team_id: "" # TeamID from developer account (View Account -> Membership)
2016-04-07 08:09:43 +00:00
log:
format: "string" # string or json
2016-04-09 06:06:03 +00:00
access_log: "stdout" # stdout: output to console, or define log path like "log/access_log"
2016-04-07 08:09:43 +00:00
access_level: "debug"
2016-04-09 06:06:03 +00:00
error_log: "stderr" # stderr: output to console, or define log path like "log/error_log"
2016-04-07 08:09:43 +00:00
error_level: "error"
2016-05-16 14:02:24 +00:00
hide_token: true
2016-04-22 09:57:45 +00:00
stat:
2016-09-20 05:42:42 +00:00
engine: "memory" # support memory, redis, boltdb, buntdb or leveldb
2016-04-22 09:57:45 +00:00
redis:
addr: "localhost:6379"
password: ""
db: 0
2016-04-23 07:13:57 +00:00
boltdb:
2016-09-20 05:42:42 +00:00
path: "bolt.db"
2016-04-23 07:13:57 +00:00
bucket: "gorush"
2016-08-02 07:46:42 +00:00
buntdb:
2016-09-20 05:42:42 +00:00
path: "bunt.db"
leveldb:
path: "level.db"
2020-04-23 02:34:35 +00:00
badgerdb:
path: "badger.db"
2016-04-07 08:09:43 +00:00
```
2017-03-12 11:50:39 +00:00
## Memory Usage
2017-04-24 08:47:40 +00:00
Memory average usage: **28Mb** (the total bytes of memory obtained from the OS.)
2017-03-12 11:50:39 +00:00
2017-04-24 08:47:40 +00:00
![memory usage ](screenshot/memory.png )
2017-10-19 01:27:05 +00:00
Test Command (We use [bat ](https://github.com/astaxie/bat ) as default cli tool.):
2017-04-24 08:47:40 +00:00
```sh
2019-10-07 02:07:50 +00:00
for i in {1..9999999}; do bat -b.N=1000 -b.C=100 POST localhost:8088/api/push notifications:=@notification.json; sleep 1; done
2017-04-24 08:47:40 +00:00
```
2017-03-12 11:50:39 +00:00
2016-04-10 08:00:17 +00:00
## Basic Usage
2016-04-13 07:22:04 +00:00
How to send push notification using `gorush` command? (Android or iOS)
2016-04-10 08:00:17 +00:00
2016-04-12 06:01:48 +00:00
### Download a binary
2016-04-11 06:54:37 +00:00
2016-04-13 07:22:04 +00:00
The pre-compiled binaries can be downloaded from [release page ](https://github.com/appleboy/gorush/releases ).
2016-04-12 06:01:48 +00:00
2016-07-20 02:14:43 +00:00
With `Go` installed
2019-10-07 02:07:50 +00:00
```sh
go get -u -v github.com/appleboy/gorush
2016-07-20 02:14:43 +00:00
```
On linux
2016-12-13 14:33:40 +00:00
```sh
2020-07-15 08:42:00 +00:00
wget https://github.com/appleboy/gorush/releases/download/v1.13.0/gorush-v1.13.0-linux-amd64 -O gorush
2016-07-20 02:14:43 +00:00
```
On OS X
2016-12-13 14:33:40 +00:00
```sh
2020-07-15 08:42:00 +00:00
wget https://github.com/appleboy/gorush/releases/download/v1.13.0/gorush-v1.13.0-darwin-amd64 -O gorush
2016-07-20 02:14:43 +00:00
```
2016-12-13 14:33:40 +00:00
On Windows
```sh
2020-07-15 08:42:00 +00:00
wget https://github.com/appleboy/gorush/releases/download/v1.13.0/gorush-v1.13.0-windows-amd64.exe -O gorush.exe
2016-07-20 02:14:43 +00:00
```
2018-06-27 01:28:27 +00:00
On macOS, use Homebrew.
2019-10-07 02:07:50 +00:00
```sh
brew install --HEAD https://github.com/appleboy/gorush/raw/master/HomebrewFormula/gorush.rb
2018-06-27 01:28:27 +00:00
```
2018-10-15 03:56:29 +00:00
### Install from source
#### Prerequisite Tools
2019-10-07 02:07:50 +00:00
- [Git ](http://git-scm.com/ )
- [Go (at least Go 1.11) ](https://golang.org/dl/ )
2018-10-15 03:56:29 +00:00
#### Fetch from GitHub
2018-10-15 03:57:24 +00:00
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:
2018-10-15 03:56:29 +00:00
2019-10-07 02:07:50 +00:00
```sh
mkdir $HOME/src
cd $HOME/src
git clone https://github.com/appleboy/gorush.git
cd gorush
go install
2018-10-15 03:56:29 +00:00
```
2016-05-31 08:11:13 +00:00
### Command Usage
2019-10-07 02:07:50 +00:00
```sh
2016-11-06 00:42:03 +00:00
________ .__
/ _____ / ____ _______ __ __ ______ | |__
/ \ ___ / _ \\_ __ \| | \/ ___/| | \
\ \_\ \( < _ > )| | \/| | /\___ \ | Y \
\______ / \____/ |__| |____//____ >|___| /
\/ \/ \/
2016-05-31 08:11:13 +00:00
Usage: gorush [options]
Server Options:
2017-10-24 14:27:46 +00:00
-A, --address < address > Address to bind (default: any)
2016-05-31 08:11:13 +00:00
-p, --port < port > Use port for clients (default: 8088)
2017-10-24 14:27:46 +00:00
-c, --config < file > Configuration file path
2016-05-31 08:11:13 +00:00
-m, --message < message > Notification message
-t, --token < token > Notification token
2017-10-24 14:27:46 +00:00
-e, --engine < engine > Storage engine (memory, redis ...)
2017-01-21 08:08:30 +00:00
--title < title > Notification title
2019-12-07 23:33:26 +00:00
--proxy < proxy > Proxy URL (support http, https, or socks5)
2017-01-07 13:17:18 +00:00
--pid < pid path > Process identifier path
2017-10-24 14:27:46 +00:00
--redis-addr < redis addr > Redis addr (default: localhost:6379)
2016-05-31 08:11:13 +00:00
iOS Options:
2016-06-12 11:25:06 +00:00
-i, --key < file > certificate key file path
2016-05-31 08:11:13 +00:00
-P, --password < password > certificate key password
--ios enabled iOS (default: false)
--production iOS production mode (default: false)
Android Options:
2016-06-12 11:25:06 +00:00
-k, --apikey < api_key > Android API Key
2016-05-31 08:11:13 +00:00
--android enabled android (default: false)
2020-09-04 03:01:21 +00:00
Huawei Options:
2021-03-28 14:13:02 +00:00
-hk, --hmskey < hms_key > HMS App Secret
-hid, --hmsid < hms_id > HMS App ID
2020-09-04 03:01:21 +00:00
--huawei enabled huawei (default: false)
2016-05-31 08:11:13 +00:00
Common Options:
2017-10-24 14:27:46 +00:00
--topic < topic > iOS or Android topic message
2016-05-31 08:11:13 +00:00
-h, --help Show this message
-v, --version Show version
```
2016-04-12 06:01:48 +00:00
### Send Android notification
2016-04-10 08:00:17 +00:00
Send single notification with the following command.
```bash
2019-10-07 02:07:50 +00:00
gorush -android -m "your message" -k "API Key" -t "Device token"
2017-10-24 14:27:46 +00:00
```
Send messages to topics.
```bash
2019-10-07 02:07:50 +00:00
gorush --android --topic "/topics/foo-bar" \
2017-10-24 14:27:46 +00:00
-m "This is a Firebase Cloud Messaging Topic Message" \
-k your_api_key
2016-04-10 08:00:17 +00:00
```
2019-10-07 02:07:50 +00:00
- `-m` : Notification message.
- `-k` : [Firebase Cloud Messaging ](https://firebase.google.com/docs/cloud-messaging ) api key
- `-t` : Device token.
- `--title` : Notification title.
- `--topic` : Send messages to topics. note: don't add device token.
2019-12-07 23:33:26 +00:00
- `--proxy` : Set `http` , `https` or `socks5` proxy url.
2016-04-10 08:00:17 +00:00
2020-09-04 03:01:21 +00:00
### Send Huawei (HMS) notification
Send single notification with the following command.
```bash
2021-03-28 14:13:02 +00:00
gorush -huawei -title "Gorush with HMS" -m "your message" -hk "API Key" -hid "App ID" -t "Device token"
2020-09-04 03:01:21 +00:00
```
Send messages to topics.
```bash
gorush --huawei --topic "foo-bar" \
-title "Gorush with HMS" \
-m "This is a Huawei Mobile Services Topic Message" \
-hk "API Key" \
2021-03-28 14:13:02 +00:00
-hid "App ID"
2020-09-04 03:01:21 +00:00
```
- `-m` : Notification message.
- `-hk` : [Huawei Mobile Services ](https://developer.huawei.com/consumer/en/doc/development/HMS-Guides/Preparations ) 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.
2016-04-12 06:01:48 +00:00
### Send iOS notification
2016-04-10 08:00:17 +00:00
Send single notification with the following command.
```bash
2017-10-24 14:27:46 +00:00
$ gorush -ios -m "your message" -i "your certificate path" \
-t "device token" --topic "apns topic"
2016-04-10 08:00:17 +00:00
```
2019-10-07 02:07:50 +00:00
- `-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.
2016-04-10 08:00:17 +00:00
2016-04-10 08:23:02 +00:00
The default endpoint is APNs development. Please add `-production` flag for APNs production push endpoint.
```bash
2017-10-24 14:27:46 +00:00
$ gorush -ios -m "your message" -i "your certificate path" \
-t "device token" \
-production
2016-04-10 08:23:02 +00:00
```
2019-02-04 10:06:09 +00:00
### Send Android or iOS notifications using Firebase
2019-10-07 02:07:50 +00:00
2019-02-04 10:06:09 +00:00
Send single notification with the following command:
```bash
2019-10-07 02:07:50 +00:00
gorush -android -m "your message" -k "API key" -t "Device token"
2019-02-04 10:06:09 +00:00
```
2016-04-13 07:22:04 +00:00
## Run gorush web server
2016-04-11 07:13:13 +00:00
2020-05-29 03:58:06 +00:00
Please make sure your [config.yml ](config/testdata/config.yml ) exist. Default port is `8088` .
2016-04-11 07:13:13 +00:00
```bash
2017-10-23 05:03:54 +00:00
# for default config
$ gorush
# for custom config file
2016-04-13 07:22:04 +00:00
$ gorush -c config.yml
2016-04-11 07:13:13 +00:00
```
2016-04-15 02:24:39 +00:00
Get go status of api server using [httpie ](https://github.com/jkbrzt/httpie ) tool:
2016-04-11 07:13:13 +00:00
```bash
2019-10-07 02:07:50 +00:00
http -v --verify=no --json GET http://localhost:8088/api/stat/go
2016-04-11 07:13:13 +00:00
```
2016-04-12 14:45:37 +00:00
## Web API
2016-04-12 06:01:48 +00:00
2016-04-15 02:24:39 +00:00
Gorush support the following API.
2016-04-12 06:01:48 +00:00
2019-10-07 02:07:50 +00:00
- **GET** `/api/stat/go` Golang cpu, memory, gc, etc information. Thanks for [golang-stats-api-handler ](https://github.com/fukata/golang-stats-api-handler ).
- **GET** `/api/stat/app` show notification success and failure counts.
- **GET** `/api/config` show server yml config file.
2020-09-04 03:01:21 +00:00
- **POST** `/api/push` push ios, android or huawei notifications.
2016-04-12 06:01:48 +00:00
2016-04-15 02:24:39 +00:00
### GET /api/stat/go
Golang cpu, memory, gc, etc information. Response with `200` http status code.
```json
{
2016-04-15 02:49:39 +00:00
"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": [
2016-04-15 02:24:39 +00:00
0.326576,
0.227096
]
}
```
### GET /api/stat/app
2016-04-15 02:49:39 +00:00
Show success or failure counts information of notification.
2016-04-15 02:24:39 +00:00
```json
{
2016-09-30 02:49:52 +00:00
"version": "v1.6.2",
2016-04-15 02:49:39 +00:00
"queue_max": 8192,
"queue_usage": 0,
"total_count": 77,
"ios": {
"push_success": 19,
"push_error": 38
2016-04-15 02:24:39 +00:00
},
2016-04-15 02:49:39 +00:00
"android": {
"push_success": 10,
"push_error": 10
2020-09-04 03:01:21 +00:00
},
"huawei": {
"push_success": 3,
"push_error": 1
2016-04-15 02:24:39 +00:00
}
2016-04-15 02:49:39 +00:00
}
2016-04-15 02:24:39 +00:00
```
2016-06-26 04:31:38 +00:00
### GET /sys/stats
Show response time, status code count, etc.
```json
{
"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
}
```
2017-01-21 08:08:30 +00:00
### GET /metrics
Support expose [prometheus ](https://prometheus.io/ ) metrics.
![metrics screenshot ](screenshot/metrics.png )
2016-04-12 14:45:37 +00:00
### POST /api/push
2016-04-12 06:01:48 +00:00
Simple send iOS notification example, the `platform` value is `1` :
```json
{
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 1,
"message": "Hello World iOS!"
}
]
}
```
Simple send Android notification example, the `platform` value is `2` :
```json
{
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 2,
"message": "Hello World Android!"
}
]
}
```
2019-10-07 02:07:50 +00:00
2020-09-04 03:01:21 +00:00
Simple send Huawei notification example, the `platform` value is `3` :
```json
{
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 3,
"title": "Gorush with HMS",
"message": "Hello World Huawei!"
}
]
}
```
2019-02-04 10:06:09 +00:00
Simple send notification on Android and iOS devices using Firebase, the `platform` value is `2` :
2019-10-07 02:07:50 +00:00
2019-02-04 10:06:09 +00:00
```json
{
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 2,
"message": "This notification will go to iOS and Android platform via Firebase!"
}
]
}
```
2016-04-12 06:01:48 +00:00
2016-04-12 14:45:37 +00:00
Send multiple notifications as below:
```json
{
"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"],
2020-09-04 03:01:21 +00:00
"platform": 3,
"message": "Hello World Huawei!",
"title": "Gorush with HMS"
2016-04-12 14:45:37 +00:00
},
.....
]
}
```
2020-09-04 03:01:21 +00:00
See more example about [iOS ](#ios-example ), [Android ](#android-example ) or [Huawei ](#huawei-example )
2016-04-13 02:06:21 +00:00
### Request body
2019-10-04 12:40:26 +00:00
The Request body must have a notifications array. The following is a parameter table for each notification.
2016-04-12 14:45:37 +00:00
2016-10-23 14:01:08 +00:00
| name | type | description | required | note |
|-------------------------|--------------|---------------------------------------------------------------------------------------------------|----------|---------------------------------------------------------------|
2019-09-06 07:48:42 +00:00
| notif_id | string | A unique string that identifies the notification for async feedback | - | |
2016-10-23 14:01:08 +00:00
| tokens | string array | device tokens | o | |
2020-09-04 03:01:21 +00:00
| platform | int | platform(iOS,Android) | o | 1=iOS, 2=Android (Firebase), 3=Huawei (HMS) |
2016-12-24 08:06:05 +00:00
| message | string | message for notification | - | |
2016-10-23 14:01:08 +00:00
| 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. | - | |
2018-08-28 03:14:02 +00:00
| sound | interface{} | sound type | - | |
2020-09-04 03:01:21 +00:00
| 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 ](#huawei-notification ) |
2016-10-23 14:01:08 +00:00
| retry | int | retry send notification if fail response from server. Value must be small than `max_retry` field. | - | |
2017-10-24 14:27:46 +00:00
| topic | string | send messages to topics | | |
2020-09-04 03:01:21 +00:00
| image | string | image url to show in notification | - | only Android and Huawei |
2019-09-06 07:48:42 +00:00
| api_key | string | api key for firebase cloud message | - | only Android |
2016-10-23 14:01:08 +00:00
| 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 |
2020-09-04 03:01:21 +00:00
| huawei_collapse_key | int | a key integer for collapsing notifications | - | only Huawei See the [detail ](#huawei-notification ) |
2016-10-23 14:01:08 +00:00
| delay_while_idle | bool | a flag for device idling | - | only Android |
2017-06-01 03:56:10 +00:00
| time_to_live | uint | expiration of message kept on FCM storage | - | only Android |
2020-09-04 03:01:21 +00:00
| huawei_ttl | string | expiration of message kept on HMS storage | - | only Huawei See the [detail ](#huawei-notification ) |
2016-10-23 14:01:08 +00:00
| 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 |
2017-06-01 03:56:10 +00:00
| notification | string array | payload of a FCM message | - | only Android. See the [detail ](#android-notification-payload ) |
2020-09-04 03:01:21 +00:00
| huawei_notification | string array | payload of a HMS message | - | only Huawei. See the [detail ](#huawei-notification ) |
| app_id | string | hms app id | - | only Huawei. See the [detail ](#huawei-notification ) |
| bi_tag | string | Tag of a message in a batch delivery task | - | only Huawei. See the [detail ](#huawei-notification ) |
| fast_app_target | int | State of a mini program when a quick app sends a data message. | - | only Huawei. See the [detail ](#huawei-notification ) |
2016-10-23 14:01:08 +00:00
| expiration | int | expiration for notification | - | only iOS |
| apns_id | string | A canonical UUID that identifies the notification | - | only iOS |
2020-03-15 12:36:20 +00:00
| collapse_id | string | An identifier you use to coalesce multiple notifications into a single notification for the user | - | only iOS |
2019-09-23 15:36:38 +00:00
| push_type | string | The type of the notification. The value of this header is alert or background. | - | only iOS |
2016-10-23 14:01:08 +00:00
| 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 ](#ios-alert-payload ) |
2018-08-15 03:47:15 +00:00
| mutable_content | bool | enable Notification Service app extension. | - | only iOS(10.0+). |
2018-08-28 03:14:02 +00:00
| 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 |
2016-04-13 03:15:24 +00:00
### iOS alert payload
2016-04-13 02:06:21 +00:00
2016-10-23 14:01:08 +00:00
| name | type | description | required | note |
|----------------|------------------|--------------------------------------------------------------------------------------------------|----------|------|
2016-12-24 08:06:05 +00:00
| title | string | Apple Watch & Safari display this string as part of the notification interface. | - | |
| body | string | The text of the alert message. | - | |
2016-11-26 06:42:49 +00:00
| subtitle | string | Apple Watch & Safari display this string as part of the notification interface. | - | |
2016-10-23 14:01:08 +00:00
| 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. | - | |
2016-04-13 02:06:21 +00:00
2017-06-01 03:56:10 +00:00
See more detail about [APNs Remote Notification Payload ](https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/PayloadKeyReference.html ).
2016-04-13 02:06:21 +00:00
2018-08-28 03:14:02 +00:00
### 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:
```json
{
"sound": {
"critical": 1,
"name": "default",
2018-08-28 03:37:36 +00:00
"volume": 2.0
2018-08-28 03:14:02 +00:00
}
}
```
2016-04-13 03:15:24 +00:00
### Android notification payload
2016-04-12 14:45:37 +00:00
2016-10-23 14:01:08 +00:00
| 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. | - | |
2016-04-13 02:06:21 +00:00
2017-06-01 03:56:10 +00:00
See more detail about [Firebase Cloud Messaging HTTP Protocol reference ](https://firebase.google.com/docs/cloud-messaging/http-server-ref#send-downstream ).
2016-04-13 00:56:02 +00:00
2020-09-04 03:01:21 +00:00
### Huawei notification
* app_id: app id from huawei developer console
* huawei_data: mapped to data
* huawei_notification: mapped to notification
* huawei_ttl: mapped to ttl
* huawei_collapse_key: mapped to collapse_key
* bi_tag:
* fast_app_target:
See more detail about [Huawei Mobulse Services Push API reference ](https://developer.huawei.com/consumer/en/doc/development/HMS-References/push-sendapi ).
2016-04-13 03:15:24 +00:00
### iOS Example
Send normal notification.
```json
2017-10-24 14:27:46 +00:00
{
2016-04-13 03:15:24 +00:00
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 1,
2016-12-24 08:10:57 +00:00
"message": "Hello World iOS!"
2016-04-13 03:15:24 +00:00
}
]
2017-10-24 14:27:46 +00:00
}
2016-04-13 03:15:24 +00:00
```
2016-12-24 08:10:57 +00:00
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.
2016-04-13 03:15:24 +00:00
```json
2017-10-24 14:27:46 +00:00
{
2016-04-13 03:15:24 +00:00
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 1,
2016-12-24 08:10:57 +00:00
"badge": 5,
"alert": {
"title" : "Game Request",
"body" : "Bob wants to play poker",
"action-loc-key" : "PLAY"
}
}
]
2017-10-24 14:27:46 +00:00
}
2016-12-24 08:10:57 +00:00
```
The following payload specifies that the device should display an alert message, plays a sound, and badges the app’ s icon.
```json
2017-10-24 14:27:46 +00:00
{
2016-12-24 08:10:57 +00:00
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 1,
"message": "You got your emails.",
2016-04-13 03:15:24 +00:00
"badge": 9,
2018-08-28 03:14:02 +00:00
"sound": {
"critical": 1,
"name": "default",
"volume": 1.0
}
2016-04-13 03:15:24 +00:00
}
]
2017-10-24 14:27:46 +00:00
}
2016-04-13 03:15:24 +00:00
```
Add other fields which user defined via `data` field.
```json
2017-10-24 14:27:46 +00:00
{
2016-04-13 03:15:24 +00:00
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 1,
"message": "Hello World iOS!",
"data": {
"key1": "welcome",
"key2": 2
}
}
]
2017-10-24 14:27:46 +00:00
}
2016-04-13 03:15:24 +00:00
```
2017-11-01 02:12:01 +00:00
Support send notification from different environment. See the detail of [issue ](https://github.com/appleboy/gorush/issues/246 ).
```diff
{
"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!"
2018-08-28 03:38:26 +00:00
}
2017-11-01 02:12:01 +00:00
]
}
```
2016-04-13 03:43:07 +00:00
### Android Example
Send normal notification.
```json
2017-10-24 14:27:46 +00:00
{
2016-04-13 03:43:07 +00:00
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 2,
"message": "Hello World Android!",
"title": "You got message"
}
]
2017-10-24 14:27:46 +00:00
}
2016-04-13 03:43:07 +00:00
```
Add `notification` payload.
```json
2017-10-24 14:27:46 +00:00
{
2016-04-13 03:43:07 +00:00
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 2,
"message": "Hello World Android!",
"title": "You got message",
"notification" : {
"icon": "myicon",
"color": "#112244"
}
}
]
2017-10-24 14:27:46 +00:00
}
2016-04-13 03:43:07 +00:00
```
Add other fields which user defined via `data` field.
```json
2017-10-24 14:27:46 +00:00
{
2016-04-13 03:43:07 +00:00
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 2,
"message": "Hello World Android!",
"title": "You got message",
"data": {
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
]
2017-10-24 14:27:46 +00:00
}
```
Send messages to topics
```json
{
"notifications": [
{
"to": "/topics/foo-bar",
"platform": 2,
"message": "This is a Firebase Cloud Messaging Topic Message"
}
]
}
2016-04-13 03:43:07 +00:00
```
2020-09-04 03:01:21 +00:00
### Huawei Example
Send normal notification.
```json
{
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 3,
"message": "Hello World Huawei!",
"title": "You got message"
}
]
}
```
Add `notification` payload.
```json
{
"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.
```json
{
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 3,
"huawei_data": "{'title' : 'Mario','message' : 'great match!', 'Room' : 'PortugalVSDenmark'}"
}
]
}
```
Send messages to topics
```json
{
"notifications": [
{
"topic": "foo-bar",
"platform": 3,
"message": "This is a Huawei Mobile Services Topic Message",
"title": "You got message"
}
]
}
```
2016-04-13 03:43:07 +00:00
### Response body
Error response message table:
2016-10-23 14:01:08 +00:00
| status code | message |
|-------------|--------------------------------------------|
| 400 | Missing `notifications` field. |
| 400 | Notifications field is empty. |
| 400 | Number of notifications(50) over limit(10) |
2016-04-13 03:43:07 +00:00
Success response:
```json
{
2017-04-10 04:03:36 +00:00
"counts": 60,
"logs": [],
"success": "ok"
}
```
2019-10-07 02:07:50 +00:00
If you need error logs from sending fail notifications, please set a `feedback_hook_url` . The server with send the failing logs asynchronously to your API as `POST` requests.
2019-09-06 07:48:42 +00:00
```diff
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
2019-10-07 02:07:50 +00:00
sync: false
2019-09-06 07:48:42 +00:00
- feedback_hook_url: ""
+ feedback_hook_url: "https://exemple.com/api/hook"
```
2019-10-17 15:19:25 +00:00
You can also switch to **sync** mode by setting the `sync` value as `true` on yaml config.
2017-04-10 04:03:36 +00:00
```diff
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
2019-10-07 02:07:50 +00:00
- sync: false
2017-04-10 04:03:36 +00:00
+ sync: true
```
See the following error format.
```json
{
"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"
}
],
2016-04-13 03:43:07 +00:00
"success": "ok"
}
```
2016-04-13 03:15:24 +00:00
2017-07-26 01:38:28 +00:00
## Run gRPC service
2017-11-01 02:16:05 +00:00
Gorush support [gRPC ](https://grpc.io/ ) service. You can enable the gRPC in `config.yml` , default as disabled. Enable the gRPC server:
```sh
2019-10-07 02:07:50 +00:00
GORUSH_GRPC_ENABLED=true GORUSH_GRPC_PORT=3000 gorush
2017-11-01 02:16:05 +00:00
```
The following example code to send single notification in Go.
2017-07-26 01:38:28 +00:00
2017-11-12 14:44:33 +00:00
[embedmd]:# (rpc/example/go/send/main.go go)
2017-07-26 01:38:28 +00:00
```go
package main
import (
2017-11-14 06:18:48 +00:00
"context"
2017-07-26 01:38:28 +00:00
"log"
2017-11-12 14:44:33 +00:00
"github.com/appleboy/gorush/rpc/proto"
2019-05-21 06:33:35 +00:00
structpb "github.com/golang/protobuf/ptypes/struct"
2017-07-26 01:38:28 +00:00
"google.golang.org/grpc"
)
const (
2017-10-19 01:24:47 +00:00
address = "localhost:9000"
2017-07-26 01:38:28 +00:00
)
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()
2017-11-12 14:44:33 +00:00
c := proto.NewGorushClient(conn)
2017-07-26 01:38:28 +00:00
2017-11-12 14:44:33 +00:00
r, err := c.Send(context.Background(), & proto.NotificationRequest{
2017-07-26 01:38:28 +00:00
Platform: 2,
Tokens: []string{"1234567890"},
Message: "test message",
2018-01-02 07:53:15 +00:00
Badge: 1,
Category: "test",
2018-01-04 03:31:03 +00:00
Sound: "test",
2020-09-27 04:11:20 +00:00
Priority: proto.Priority_High,
2018-01-03 09:08:28 +00:00
Alert: & proto.Alert{
2018-01-02 07:53:15 +00:00
Title: "Test Title",
Body: "Test Alert Body",
Subtitle: "Test Alert Sub Title",
2018-01-06 07:03:21 +00:00
LocKey: "Test loc key",
LocArgs: []string{"test", "test"},
2018-01-02 07:53:15 +00:00
},
2019-05-21 06:10:32 +00:00
Data: & structpb.Struct{
Fields: map[string]*structpb.Value{
"key1": {
Kind: & structpb.Value_StringValue{StringValue: "welcome"},
},
"key2": {
Kind: & structpb.Value_NumberValue{NumberValue: 2},
},
},
},
2017-07-26 01:38:28 +00:00
})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Success: %t\n", r.Success)
log.Printf("Count: %d\n", r.Counts)
}
```
2020-03-15 12:36:20 +00:00
See the Node.js example and see more detail frome [README ](rpc/example/node/README.md ):
2017-07-26 01:38:28 +00:00
[embedmd]:# (rpc/example/node/client.js js)
```js
var messages = require('./gorush_pb');
var services = require('./gorush_grpc_pb');
var grpc = require('grpc');
function main() {
2017-10-19 01:24:47 +00:00
var client = new services.GorushClient('localhost:9000',
2017-07-26 01:38:28 +00:00
grpc.credentials.createInsecure());
var request = new messages.NotificationRequest();
2018-01-03 09:08:28 +00:00
var alert = new messages.Alert();
2017-07-26 01:38:28 +00:00
request.setPlatform(2);
request.setTokensList(["1234567890"]);
request.setMessage("Hello!!");
2018-01-03 09:08:28 +00:00
request.setTitle("hello2");
request.setBadge(2);
request.setCategory("mycategory");
2018-01-04 03:31:03 +00:00
request.setSound("sound")
2018-01-03 09:08:28 +00:00
alert.setTitle("title");
request.setAlert(alert);
2018-01-10 01:36:27 +00:00
request.setThreadid("threadID");
request.setContentavailable(false);
2018-01-16 03:26:45 +00:00
request.setMutablecontent(false);
2017-07-26 01:38:28 +00:00
client.send(request, function (err, response) {
2018-01-03 09:08:28 +00:00
if(err) {
console.log(err);
} else {
console.log("Success:", response.getSuccess());
console.log("Counts:", response.getCounts());
}
2017-07-26 01:38:28 +00:00
});
}
main();
```
2017-11-14 06:18:48 +00:00
GRPC Health Checking example: See [document ](https://github.com/grpc/grpc/blob/master/doc/health-checking.md ).
[embedmd]:# (rpc/example/go/send/main.go go)
```go
package main
import (
"context"
"log"
"github.com/appleboy/gorush/rpc/proto"
2019-05-21 06:33:35 +00:00
structpb "github.com/golang/protobuf/ptypes/struct"
2017-11-14 06:18:48 +00:00
"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",
2018-01-02 07:53:15 +00:00
Badge: 1,
Category: "test",
2018-01-04 03:31:03 +00:00
Sound: "test",
2020-09-27 04:11:20 +00:00
Priority: proto.Priority_High,
2018-01-03 09:08:28 +00:00
Alert: & proto.Alert{
2018-01-02 07:53:15 +00:00
Title: "Test Title",
Body: "Test Alert Body",
Subtitle: "Test Alert Sub Title",
2018-01-06 07:03:21 +00:00
LocKey: "Test loc key",
LocArgs: []string{"test", "test"},
2018-01-02 07:53:15 +00:00
},
2019-05-21 06:10:32 +00:00
Data: & structpb.Struct{
Fields: map[string]*structpb.Value{
"key1": {
Kind: & structpb.Value_StringValue{StringValue: "welcome"},
},
"key2": {
Kind: & structpb.Value_NumberValue{NumberValue: 2},
},
},
},
2017-11-14 06:18:48 +00:00
})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Success: %t\n", r.Success)
log.Printf("Count: %d\n", r.Counts)
}
```
2016-04-13 07:22:04 +00:00
## Run gorush in Docker
2016-04-13 03:50:51 +00:00
2016-04-13 07:22:04 +00:00
Set up `gorush` in the cloud in under 5 minutes with zero knowledge of Golang or Linux shell using our [gorush Docker image ](https://hub.docker.com/r/appleboy/gorush/ ).
2016-04-13 03:50:51 +00:00
```bash
2019-10-07 02:07:50 +00:00
docker pull appleboy/gorush
docker run --name gorush -p 80:8088 appleboy/gorush
2016-04-13 03:50:51 +00:00
```
2016-10-16 08:08:29 +00:00
Run `gorush` with your own config file.
```bash
2019-10-07 02:07:50 +00:00
docker pull appleboy/gorush
docker run --name gorush -v ${PWD}/config.yml:/config.yml -p 80:8088 appleboy/gorush
2016-10-16 08:08:29 +00:00
```
2016-05-14 15:23:09 +00:00
Testing your gorush server using [httpie ](https://github.com/jkbrzt/httpie ) command.
2016-04-13 03:50:51 +00:00
```bash
2019-10-07 02:07:50 +00:00
http -v --verify=no --json GET http://your.docker.host/api/stat/go
2016-04-13 03:50:51 +00:00
```
![statue screenshot ](screenshot/status.png )
2017-06-07 14:11:05 +00:00
## Run gorush in Kubernetes
2017-09-22 03:22:10 +00:00
### Quick Start
2017-06-07 14:11:05 +00:00
2018-02-20 05:20:57 +00:00
Create namespace as `gorush` as `gorush` and then your configuration map:
2017-06-07 14:11:05 +00:00
```sh
2019-10-07 02:07:50 +00:00
kubectl create -f k8s/gorush-namespace.yaml
kubectl create -f k8s/gorush-configmap.yaml
2017-06-07 14:11:05 +00:00
```
2017-09-22 03:22:10 +00:00
Create redis service:
2017-06-07 14:11:05 +00:00
```sh
2019-10-07 02:07:50 +00:00
kubectl create -f k8s/gorush-redis-deployment.yaml
kubectl create -f k8s/gorush-redis-service.yaml
2017-06-07 14:11:05 +00:00
```
2017-09-22 14:35:05 +00:00
Create gorush deployment controller provides declarative updates for Pods and ReplicaSets:
2017-06-07 14:11:05 +00:00
```sh
2019-10-07 02:07:50 +00:00
kubectl create -f k8s/gorush-deployment.yaml
2017-09-22 14:35:05 +00:00
```
### Create the Service Controller for AWS ELB
```sh
2019-10-07 02:07:50 +00:00
kubectl create -f k8s/gorush-service.yaml
2017-06-07 14:11:05 +00:00
```
2017-09-22 03:22:10 +00:00
### Ingress Controller for AWS ALB
2017-06-07 14:11:05 +00:00
2017-09-22 14:30:56 +00:00
Update the following in `k8s/gorush-service.yaml`
```diff
- type: LoadBalancer
- # type: NodePort
+ # type: LoadBalancer
+ type: NodePort
```
Then start the AWS ALB by the follwong command.
2019-10-07 02:07:50 +00:00
```sh
kubectl create -f k8s/gorush-service.yaml
kubectl create -f k8s/gorush-aws-alb-ingress.yaml
2017-06-07 14:11:05 +00:00
```
### Clean up the gorush:
```sh
2019-10-07 02:07:50 +00:00
kubectl delete -f k8s
2017-06-07 14:11:05 +00:00
```
2018-01-23 08:48:37 +00:00
## Run gorush in AWS Lambda
2019-10-07 02:07:50 +00:00
![lambda ](./screenshot/lambda.png )
2018-01-24 01:22:51 +00:00
2018-01-23 08:48:37 +00:00
AWS excited to [announce Go as a supported language for AWS Lambda ](https://aws.amazon.com/blogs/compute/announcing-go-support-for-aws-lambda/ ). You’ re going to create an application that uses an [API Gateway ](https://aws.amazon.com/apigateway ) event source to create a simple Hello World RESTful API.
### Build gorush binary
Download source code first.
```sh
2019-10-07 02:07:50 +00:00
git clone https://github.com/appleboy/gorush.git
cd gorush & & make build_linux_lambda
2018-01-23 08:48:37 +00:00
```
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.
```sh
2019-10-07 02:07:50 +00:00
zip deployment.zip release/linux/lambda/gorush
2018-01-23 08:48:37 +00:00
```
Upload the `deployment.zip` via web UI or you can try the [drone-lambda ](https://github.com/appleboy/drone-lambda ) as the following command. it will zip your binary file and upload to AWS Lambda automatically.
```sh
$ 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
```
2020-03-21 04:25:17 +00:00
### Without an AWS account
Or you can deploy gorush to alternative solution like [netlify functions ](https://docs.netlify.com/functions/overview/ ). [Netlify ](https://www.netlify.com/ ) lets you deploy serverless Lambda functions without an AWS account, and with function management handled directly within Netlify. Please see the netlify.toml file:
```toml
[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
```
2017-11-02 14:58:35 +00:00
## Stargazers over time
[![Stargazers over time ](https://starcharts.herokuapp.com/appleboy/gorush.svg )](https://starcharts.herokuapp.com/appleboy/gorush)
2017-06-07 14:11:05 +00:00
2016-04-01 02:21:36 +00:00
## License
2019-10-07 02:07:50 +00:00
Copyright 2019 Bo-Yi Wu [@appleboy ](https://twitter.com/appleboy ).
2016-04-01 02:21:36 +00:00
Licensed under the MIT License.