2016-04-13 07:22:04 +00:00
# gorush
2016-04-01 02:21:36 +00:00
2016-06-26 04:31:38 +00:00
A push notification micro server using [Gin ](https://github.com/gin-gonic/gin ) framework written in Go (Golang).
2016-04-01 02:21:36 +00:00
2016-12-09 01:22:59 +00:00
[![GoDoc ](https://godoc.org/github.com/appleboy/gorush?status.svg )](https://godoc.org/github.com/appleboy/gorush) [![Build Status ](http://drone.wu-boy.com/api/badges/appleboy/gorush/status.svg )](http://drone.wu-boy.com/appleboy/gorush) [![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) [![ ](https://images.microbadger.com/badges/image/appleboy/gorush.svg )](https://microbadger.com/images/appleboy/gorush "Get your own image badge on microbadger.com")
2016-04-01 02:21:36 +00:00
2016-05-29 07:53:07 +00:00
## Contents
- [Support Platform ](#support-platform )
- [Features ](#features )
- [Basic Usage ](#basic-usage )
- [Download a binary ](#download-a-binary )
2016-05-31 08:11:13 +00:00
- [Command Usage ](#command-usage )
2016-05-29 07:53:07 +00:00
- [Send Android notification ](#send-android-notification )
- [Send iOS notification ](#send-ios-notification )
- [Run gorush web server ](#run-gorush-web-server )
- [Web API ](#web-api )
- [GET /api/stat/go ](#get-apistatgo )
- [GET /api/stat/app ](#get-apistatapp )
2016-06-27 05:19:51 +00:00
- [GET /sys/stats ](#get-sysstats )
2016-05-29 07:53:07 +00:00
- [POST /api/push ](#post-apipush )
- [Request body ](#request-body )
- [iOS alert payload ](#ios-alert-payload )
- [Android notification payload ](#android-notification-payload )
- [iOS Example ](#ios-example )
- [Android Example ](#Android-Example )
- [Response body ](#Response-body )
- [Run gorush in Docker ](#run-gorush-in-docker )
- [License ](#license )
2016-04-12 14:45:37 +00:00
## Support Platform
* [APNS ](https://developer.apple.com/library/ios/documentation/networkinginternet/conceptual/remotenotificationspg/Chapters/ApplePushService.html )
* [GCM ](https://developer.android.com/google/gcm/index.html )
2016-05-29 07:53:07 +00:00
## Features
2016-04-07 08:09:43 +00:00
* Support [Google Cloud Message ](https://developers.google.com/cloud-messaging/ ) using [go-gcm ](https://github.com/google/go-gcm ) library for Android.
* Support [HTTP/2 ](https://http2.github.io/ ) Apple Push Notification Service using [apns2 ](https://github.com/sideshow/apns2 ) library.
* Support [YAML ](https://github.com/go-yaml/yaml ) configuration.
2016-04-10 08:41:59 +00:00
* Support command line to send single Android or iOS notification.
2016-04-10 08:00:17 +00:00
* Support Web API to send push notification.
2016-04-12 07:04:25 +00:00
* Support zero downtime restarts for go servers using [endless ](https://github.com/fvbock/endless ).
2016-04-12 14:45:37 +00:00
* Support [HTTP/2 ](https://http2.github.io/ ) or HTTP/1.1 protocol.
2016-04-14 12:37:58 +00:00
* Support notification queue and multiple workers.
2016-04-15 02:24:39 +00:00
* Support `/api/stat/app` show notification success and failure counts.
2016-04-27 07:38:11 +00:00
* Support `/api/config` show your [YAML ](https://en.wikipedia.org/wiki/YAML ) config.
2016-09-20 05:42:42 +00:00
* Support store app stat to memory, [Redis ](http://redis.io/ ), [BoltDB ](https://github.com/boltdb/bolt ), [BuntDB ](https://github.com/tidwall/buntdb ) or [LevelDB ](https://github.com/syndtr/goleveldb ).
2016-06-12 07:56:13 +00:00
* Support `p12` or `pem` formtat of iOS certificate file.
2016-06-26 04:31:38 +00:00
* Support `/sys/stats` show response time, status code count, etc.
2016-07-29 01:45:42 +00:00
* Support for HTTP proxy to Google server (GCM).
2016-10-23 10:23:01 +00:00
* Support retry send notification if server response is fail.
2016-04-07 08:09:43 +00:00
2016-04-11 07:13:13 +00:00
See the [YAML config example ](config/config.yml ):
2016-04-07 08:09:43 +00:00
```yaml
core:
port: "8088"
2016-04-14 12:37:58 +00:00
worker_num: 8
queue_num: 8192
2016-04-10 05:06:34 +00:00
max_notification: 100
2016-04-07 08:09:43 +00:00
mode: "release"
ssl: false
cert_path: "cert.pem"
key_path: "key.pem"
2016-07-29 01:45:42 +00:00
http_proxy: "" # only working for GCM server
2016-08-20 08:48:15 +00:00
pid:
enabled: true
path: "gorush.pid"
override: true
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"
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
ios:
enabled: false
2016-06-12 11:09:41 +00:00
key_path: "key.pem"
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
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
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"
2016-04-07 08:09:43 +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
```
$ go get -u github.com/appleboy/gorush
```
On linux
2016-12-13 14:33:40 +00:00
```sh
2016-12-15 02:14:33 +00:00
$ wget https://github.com/appleboy/gorush/releases/download/v1.7.1/gorush-v1.7.1-linux-amd64 -O gorush
2016-07-20 02:14:43 +00:00
```
On OS X
2016-12-13 14:33:40 +00:00
```sh
2016-12-15 02:14:33 +00:00
$ wget https://github.com/appleboy/gorush/releases/download/v1.7.1/gorush-v1.7.1-darwin-amd64 -O gorush
2016-07-20 02:14:43 +00:00
```
2016-12-13 14:33:40 +00:00
On Windows
```sh
2016-12-15 02:14:33 +00:00
$ wget https://github.com/appleboy/gorush/releases/download/v1.7.1/gorush-v1.7.1-windows-amd64.exe -O gorush.exe
2016-07-20 02:14:43 +00:00
```
2016-05-31 08:11:13 +00:00
### Command Usage
```
2016-11-06 00:42:03 +00:00
________ .__
/ _____ / ____ _______ __ __ ______ | |__
/ \ ___ / _ \\_ __ \| | \/ ___/| | \
\ \_\ \( < _ > )| | \/| | /\___ \ | Y \
\______ / \____/ |__| |____//____ >|___| /
\/ \/ \/
2016-05-31 08:11:13 +00:00
Usage: gorush [options]
Server Options:
-p, --port < port > Use port for clients (default: 8088)
-c, --config < file > Configuration file
-m, --message < message > Notification message
-t, --token < token > Notification token
2016-07-29 01:45:42 +00:00
--proxy < proxy > Proxy URL (only for GCM)
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
--topic < topic > iOS topic
--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)
Common Options:
-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
2016-04-13 07:22:04 +00:00
$ gorush -android -m="your message" -k="API Key" -t="Device token"
2016-04-10 08:00:17 +00:00
```
* `-m` : Notification message.
* `-k` : [Google cloud message ](https://developers.google.com/cloud-messaging/ ) api key
* `-t` : Device token.
2016-07-29 01:45:42 +00:00
* `--proxy` : Set http proxy url. (only working for GCM)
2016-04-10 08:00:17 +00:00
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
2016-04-28 06:45:25 +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
```
* `-m` : Notification message.
2016-06-12 11:25:06 +00:00
* `-i` : Apple Push Notification Certificate path (`pem` or `p12` file).
2016-04-10 08:00:17 +00:00
* `-t` : Device token.
2016-04-28 06:45:25 +00:00
* `-topic` : The topic of the remote notification.
2016-05-30 07:53:16 +00:00
* `-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
2016-04-27 07:38:11 +00:00
$ gorush -ios -m="your message" -i="your certificate path" -t="device token" -production
2016-04-10 08:23:02 +00:00
```
2016-04-13 07:22:04 +00:00
## Run gorush web server
2016-04-11 07:13:13 +00:00
Please make sure your [config.yml ](config/config.yml ) exist. Default port is `8088` .
```bash
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
2016-04-15 02:24:39 +00:00
$ http -v --verify=no --json GET https://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
2016-04-15 02:24:39 +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.
2016-04-15 07:05:23 +00:00
* **GET** `/api/config` show server yml config file.
2016-04-12 06:01:48 +00:00
* **POST** `/api/push` push ios and android notifications.
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
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
}
```
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!"
}
]
}
```
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"],
"platform": 2,
"message": "Hello World!"
},
.....
]
}
```
2016-04-13 03:50:51 +00:00
See more example about [iOS ](#ios-example ) or [Android ](#android-example ).
2016-04-13 02:06:21 +00:00
### Request body
2016-04-12 14:45:37 +00:00
Request body must has a notifications array. The following is a parameter table for each notification.
2016-10-23 14:01:08 +00:00
| name | type | description | required | note |
|-------------------------|--------------|---------------------------------------------------------------------------------------------------|----------|---------------------------------------------------------------|
| tokens | string array | device tokens | o | |
| platform | int | platform(iOS,Android) | o | 1=iOS, 2=Android |
| message | string | message for notification | o | |
| 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 | string | sound type | - | |
| data | string array | extensible partition | - | |
| retry | int | retry send notification if fail response from server. Value must be small than `max_retry` field. | - | |
| api_key | string | Android api key | - | 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 |
| delay_while_idle | bool | a flag for device idling | - | only Android |
| time_to_live | uint | expiration of message kept on GCM storage | - | only Android |
| 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 GCM message | - | only Android. See the [detail ](#android-notification-payload ) |
| expiration | int | expiration for notification | - | only iOS |
| apns_id | string | A canonical UUID that identifies the notification | - | only iOS |
| topic | string | topic of the remote notification | - | 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 ](#ios-alert-payload ) |
2016-04-13 02:06:21 +00:00
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-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
2016-04-13 03:15:24 +00:00
See more detail about [APNs Remote Notification Payload ](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/TheNotificationPayload.html#//apple_ref/doc/uid/TP40008194-CH107-SW1 ).
2016-04-13 02:06:21 +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
See more detail about [GCM server reference ](https://developers.google.com/cloud-messaging/http-server-ref#send-downstream ).
2016-04-13 00:56:02 +00:00
2016-04-13 03:15:24 +00:00
### iOS Example
Send normal notification.
```json
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 1,
"message": "Hello World iOS!",
"title": "You got message"
}
]
```
The app icon be badged with the number `9` and that a bundled alert sound be played when the notification is delivered.
```json
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 1,
"message": "Hello World iOS!",
"title": "You got message",
"badge": 9,
"sound": "bingbong.aiff"
}
]
```
Add other fields which user defined via `data` field.
```json
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 1,
"message": "Hello World iOS!",
"title": "You got message",
"data": {
"key1": "welcome",
"key2": 2
}
}
]
```
2016-04-13 03:43:07 +00:00
### Android Example
Send normal notification.
```json
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 2,
"message": "Hello World Android!",
"title": "You got message"
}
]
```
Add `notification` payload.
```json
"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.
```json
"notifications": [
{
"tokens": ["token_a", "token_b"],
"platform": 2,
"message": "Hello World Android!",
"title": "You got message",
"data": {
"Nick" : "Mario",
"body" : "great match!",
"Room" : "PortugalVSDenmark"
}
}
]
```
### 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
{
"success": "ok"
}
```
2016-04-13 03:15:24 +00:00
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
2016-04-13 07:22:04 +00:00
$ docker pull appleboy/gorush
2016-05-25 05:21:07 +00:00
$ 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
$ docker pull appleboy/gorush
$ docker run --name gorush -v ${PWD}/config.yml:/config.yml -p 80:8088 appleboy/gorush
```
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
2016-04-15 02:24:39 +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 )
2016-04-01 02:21:36 +00:00
## License
Copyright 2016 Bo-Yi Wu [@appleboy ](https://twitter.com/appleboy ).
Licensed under the MIT License.