2016-04-13 07:22:04 +00:00
# gorush
2016-04-01 02:21:36 +00:00
2016-04-07 08:09:43 +00:00
A push notification server using [Gin ](https://github.com/gin-gonic/gin ) framework written in Go (Golang).
2016-04-01 02:21:36 +00:00
2016-04-13 07:22:04 +00:00
[![GoDoc ](https://godoc.org/github.com/appleboy/gorush?status.svg )](https://godoc.org/github.com/appleboy/gorush) [![Build Status ](https://travis-ci.org/appleboy/gofight.svg?branch=master )](https://travis-ci.org/appleboy/gofight) [![Coverage Status ](https://coveralls.io/repos/github/appleboy/gorush/badge.svg?branch=master )](https://coveralls.io/github/appleboy/gorush?branch=master) [![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/ee01d852-b5e8-465a-ad93-631d738818ff )](https://codebeat.co/projects/github-com-appleboy-gorush)
2016-04-01 02:21:36 +00:00
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-04-07 08:09:43 +00:00
## Feature
* 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-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-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"
api:
push_uri: "/api/push"
stat_go_uri: "/api/status"
android:
2016-04-11 13:32:40 +00:00
enabled: true
apikey: "YOUR_API_KEY"
2016-04-07 08:09:43 +00:00
ios:
enabled: false
pem_cert_path: "cert.pem"
pem_key_path: "key.pem"
production: false
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-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
### 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-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-13 07:22:04 +00:00
$ gorush -ios -m="your message" -i="API Key" -t="Device token"
2016-04-10 08:00:17 +00:00
```
* `-m` : Notification message.
* `-i` : Apple Push Notification Certificate path (`pem` file).
* `-t` : Device token.
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-13 07:22:04 +00:00
$ gorush -ios -m="your message" -i="API Key" -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
```
Test status of api server using [httpie ](https://github.com/jkbrzt/httpie ) tool:
```bash
$ http -v --verify=no --json GET https://localhost:8088/api/status
```
2016-04-12 14:45:37 +00:00
## Web API
2016-04-12 06:01:48 +00:00
2016-04-13 07:22:04 +00:00
gorush support the following API.
2016-04-12 06:01:48 +00:00
* **GET** `/api/status` Golang cpu, memory, gc, etc information. Thanks for [golang-stats-api-handler ](https://github.com/fukata/golang-stats-api-handler ).
* **POST** `/api/push` push ios and android notifications.
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.
|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||
2016-04-13 03:15:24 +00:00
|title|string|notification title|-||
|priority|string|Sets the priority of the message.|-|`normal` or `high` |
2016-04-12 14:45:37 +00:00
|content_available|bool|data messages wake the app by default.|-||
2016-04-13 02:06:21 +00:00
|sound|string|sound type|-||
2016-04-13 03:15:24 +00:00
|data|string array|extensible partition|-||
2016-04-12 14:45:37 +00:00
|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|int|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|
2016-04-13 03:15:24 +00:00
|notification|string array|payload of a GCM message|-|only Android. See the [detail ](#android-notification-payload )|
2016-04-12 14:45:37 +00:00
|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|
2016-04-13 03:15:24 +00:00
|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
|name|type|description|required|note|
|-------|-------|--------|--------|---------|
2016-04-13 03:15:24 +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-04-13 02:06:21 +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.|-||
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:
|status code|message|
|-------|-------|
|400|Missing `notifications` field.|
|400|Notifications field is empty.|
|400|Number of notifications(50) over limit(10)|
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
$ docker run -name gorush -p 80:8088 appleboy/gorush
2016-04-13 03:50:51 +00:00
```
2016-04-13 07:22:04 +00:00
Testing your gorush server.
2016-04-13 03:50:51 +00:00
```bash
$ http -v --verify=no --json GET http://your.docker.host/api/status
```
![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.