A push notification server written in Go (Golang).

Overview

gorush

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

GoDoc Build Status Build status codecov Go Report Card codebeat badge Codacy Badge Docker Pulls microbadger Release Netlify Status Financial Contributors on Open Collective

Contents

Buy Me A Coffee

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.

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
  sync: false # set true if you need get error message from fail push notification in API response.
  feedback_hook_url: "" # set a hook url if you need get error message asynchronously from fail push notification in API response.
  feedback_timeout: 10 # default is 10 second
  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: true
  apikey: "YOUR_API_KEY"
  appid: "YOUR_APP_ID"
  max_retry: 0 # resend fail notification, default value zero is disabled

ios:
  enabled: false
  key_path: "key.pem"
  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

stat:
  engine: "memory" # support memory, redis, boltdb, buntdb or leveldb
  redis:
    addr: "localhost:6379"
    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)

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.13.0/gorush-v1.13.0-linux-amd64 -O gorush

On OS X

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

On Windows

wget https://github.com/appleboy/gorush/releases/download/v1.13.0/gorush-v1.13.0-windows-amd64.exe -O gorush.exe

On macOS, use Homebrew.

brew install --HEAD https://github.com/appleboy/gorush/raw/master/HomebrewFormula/gorush.rb

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

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 API Key
    -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",
  "queue_max": 8192,
  "queue_usage": 0,
  "total_count": 77,
  "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

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

  • 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.

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. 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"

You can also switch to sync mode by setting the sync value as true on yaml config.

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.Priority_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.Fatalf("could not greet: %v", err)
	}
	log.Printf("Success: %t\n", r.Success)
	log.Printf("Count: %d\n", r.Counts)
}

See the Node.js example and see more detail frome 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.Priority_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.Fatalf("could not greet: %v", err)
	}
	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:/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.

Issues
  • ios notification is not working with title.

    ios notification is not working with title.

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

    This is working.

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

    but this is not working with title.

    Merry Xmas! Thanks for your support again

    bug 
    opened by davidtian719 20
  • Failed pushes never dispatch to the hook URL

    Failed pushes never dispatch to the hook URL

    Hey, I did have some failed push notifications:

    time="2019/12/21 - 02:40:12" level=error msg="| failed-push | android [**********Y:xxxxxxxxxx.....**********] | <MESSAGE> | Error Message: unregistered device"
    

    And I did set the env vars GORUSH_CORE_SYNC as false and the GORUSH_CORE_FEEDBACK_HOOK_URL with the API hook URL, but the failed event is never dispatched to my hook API. Do I need to configure another stuff?

    bug 
    opened by Pantani 13
  • Error on init, not respecting enable option

    Error on init, not respecting enable option

    Hello,

    I'm new to the program but I was trying to setup a simple POC. I'm using docker and mounting the config file from the host. I grabbed the config file from the example showed in this repo, but I'm getting this error: gorush | {"level":"fatal","msg":"Missing Huawei API Key","time":"2021-05-09T16:30:29Z"}

    I thought... okay fair enough I didn't configure any API Key for Huawei, so I went to my config file and disable huawei:

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

    Re-create the container and still getting same problem. I have the feeling that it ignored completely the enabled option. I also tried to remove completely the section without much luck.

    Any help will be appreciated if this is not a bug (which I believe it is) 🙃

    bug 
    opened by guanana 12
  • POST api/push result success but no push notification send

    POST api/push result success but no push notification send

    i was test with command : gorush -ios -m="xx" -t="xxx" -i="xxx" push notificaiton was sent success and display on device DEBU[2017/03/01 - 07:22:14] Start push notification for iOS INFO[2017/03/01 - 07:22:14] | succeeded-push | ios [5441204dd930405440733e8821d425262e16414dc7d8] test

    but when i try to use web api. it result success but do not got any notificaiton on device. { "success": "ok" }

    log: INFO[2017/03/01 - 07:27:42] | header | POST /api/push 14.188.3.41 application/x-www-form-urlencoded Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 [GIN] 2017/03/01 - 07:27:42 | 200 | 215.432µs | 14.188.3.41 | POST /api/push

    opened by namkazt 12
  • Sudden drop in throughput

    Sudden drop in throughput

    Hi. We just started testing the Gorush, and faced with a weird issue: sometimes it works well and sends about 5.000 pushes. Then it drops the speed to the about 50-80 messages/sec. Any ideas why this can happen? Logs are clear (only the BadDevideToken happens, but that's from Apple and seems to be a "valid error"). The same history using any redis or memory backends.

    Screenshot_20200221_162705

    enhancement 
    opened by setevoy2 10
  • Android Notifications

    Android Notifications

    When using the cli tool I get

    GCM server error: error sending request to GCM HTTP server: error unmarshaling json from body: invalid character '<' looking for beginning of value

    Does anybody has the same issue?

    opened by imateev 10
  • Concurrent ios pushes

    Concurrent ios pushes

    Runs client.Push concurrently for iOS pushes, drastically increases performance of gorush. I have tested this along with ensuring logs are return in sync mode and that retries are made. It all seems ok. (Although maybe Im missing something??)

    Resolves (hopefully) #470

    enhancement 
    opened by McPo 9
  • Expand environment variables in yaml

    Expand environment variables in yaml

    We meet again @appleboy 😄 Thanks for writing this server!

    This PR adds the capability to expand environment variables in the YAML config e.g

    core:
      port: "${GORUSH_PORT}"
    

    This is similar to how docker-compose allows it This should also address the request at #180

    opened by pazams 9
  • Not working IOS push notifications when failed push

    Not working IOS push notifications when failed push

    When sending a push notification to IOS, the request hangs and there is no response, it does not write logs and does not help in sync: true. In v1.11.2 release it is OK!

    bug 
    opened by mayken 8
  • Always response count is 0 in latest verison

    Always response count is 0 in latest verison

    Hi, @appleboy I am trying to use latest version. but it is not working fine as like older version.

    {
      "notifications": [
        {
          "tokens": ["11671c2e7da3***********e37ba5d3e6a617be"],
          "platform": 1,
          "message": "Hello World",
          "topic":"com.xxx.xxxx"
        }
      ]
    }
    

    Response is always like this.

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

    I set already "sync" by "true" in config.yml. I checked latest version(Mac&Windows version) with latest config.yml style. but as you can see it is not working correctly, My test older version(1.7.4) is working fine. What is the issue?

    bug 
    opened by davidtian719 8
  • Segmentation fault in boltdb

    Segmentation fault in boltdb

    It seems like my gorush instance fails with a segmentation fault in boltdb related code. It happens right after I trigger a notification to a iOS device. I suspect it's happening because the permissions to access the bolt.db database file are not correct. When I change the permissions back I am able to send notifications correctly.

    Here is the stacktrace of the error:

    Jun 22 15:06:48 notify gorush[3824]: panic: runtime error: invalid memory address or nil pointer dereference
    Jun 22 15:06:48 notify gorush[3824]: [signal SIGSEGV: segmentation violation code=0x1 addr=0x40 pc=0x9eb916]
    Jun 22 15:06:48 notify gorush[3824]: goroutine 13 [running]:
    Jun 22 15:06:48 notify gorush[3824]: github.com/appleboy/gorush/vendor/github.com/asdine/storm.(*DB).Get(0x0, 0xc4201b70da, 0x6, 0xb7b660, 0xc4209873b0, 0xb52bc0, 0xc4209873a0, 0xc420988ba0, 0xc4201191d8)
    Jun 22 15:06:48 notify gorush[3824]: /srv/app/src/github.com/appleboy/gorush/vendor/github.com/asdine/storm/storm.go:142 +0x26
    Jun 22 15:06:48 notify gorush[3824]: github.com/appleboy/gorush/storage/boltdb.(*Storage).getBoltDB(0xc4201778c0, 0xcc47ef, 0x18, 0xc4209873a0)
    Jun 22 15:06:48 notify gorush[3824]: /srv/app/src/github.com/appleboy/gorush/storage/boltdb/boltdb.go:51 +0x10d
    Jun 22 15:06:48 notify gorush[3824]: github.com/appleboy/gorush/storage/boltdb.(*Storage).GetIosSuccess(0xc4201778c0, 0xc42097ec40)
    Jun 22 15:06:48 notify gorush[3824]: /srv/app/src/github.com/appleboy/gorush/storage/boltdb/boltdb.go:96 +0x66
    Jun 22 15:06:48 notify gorush[3824]: github.com/appleboy/gorush/storage/boltdb.(*Storage).AddIosSuccess(0xc4201778c0, 0x1)
    Jun 22 15:06:48 notify gorush[3824]: /srv/app/src/github.com/appleboy/gorush/storage/boltdb/boltdb.go:63 +0x2b
    Jun 22 15:06:48 notify gorush[3824]: github.com/appleboy/gorush/gorush.PushToIOS(0xc42003c780, 0x1, 0x4, 0x1, 0xc4200ec760, 0x14, 0x0, 0x0, 0x0, 0x0, ...)
    Jun 22 15:06:48 notify gorush[3824]: /srv/app/src/github.com/appleboy/gorush/gorush/notification.go:442 +0x76a
    Jun 22 15:06:48 notify gorush[3824]: github.com/appleboy/gorush/gorush.startWorker()
    Jun 22 15:06:48 notify gorush[3824]: /srv/app/src/github.com/appleboy/gorush/gorush/notification.go:231 +0x104
    Jun 22 15:06:48 notify gorush[3824]: created by github.com/appleboy/gorush/gorush.InitWorkers
    Jun 22 15:06:48 notify gorush[3824]: /srv/app/src/github.com/appleboy/gorush/gorush/notification.go:222 +0x1da
    Jun 22 15:06:48 notify systemd[1]: gorush.service: main process exited, code=exited, status=2/INVALIDARGUMENT
    Jun 22 15:06:48 notify systemd[1]: Unit gorush.service entered failed state.
    
    bug 
    opened by hellais 8
  • [Snyk] Upgrade google-protobuf from 3.20.0 to 3.20.1

    [Snyk] Upgrade google-protobuf from 3.20.0 to 3.20.1

    Snyk has created this PR to upgrade google-protobuf from 3.20.0 to 3.20.1.

    merge advice :information_source: Keep your dependencies up-to-date. This makes it easier to fix existing vulnerabilities and to more quickly identify and fix newly disclosed vulnerabilities when they affect your project.


    • The recommended version is 2 versions ahead of your current version.
    • The recommended version was released 23 days ago, on 2022-04-21.
    Release notes
    Package name: google-protobuf
    • 3.20.1 - 2022-04-21

      PHP

      • Fix building packaged PHP extension (#9727)
      • Fixed composer.json to only advertise compatibility with PHP 7.0+. (#9819)

      Ruby

      • Disable the aarch64 build on macOS until it can be fixed. (#9816)

      Other

      • Fix versioning issues in 3.20.0
    • 3.20.1-rc.1 - 2022-04-06
    • 3.20.0 - 2022-04-01

      2022-03-25 version 3.20.0 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)

      Ruby

      • Dropped Ruby 2.3 and 2.4 support for CI and releases. (#9311)
      • Added Ruby 3.1 support for CI and releases (#9566).
      • Message.decode/encode: Add recursion_limit option (#9218/#9486)
      • Allocate with xrealloc()/xfree() so message allocation is visible to the
        Ruby GC. In certain tests this leads to much lower memory usage due to more
        frequent GC runs (#9586).
      • Fix conversion of singleton classes in Ruby (#9342)
      • Suppress warning for intentional circular require (#9556)
      • JSON will now output shorter strings for double and float fields when possible
        without losing precision.
      • Encoding and decoding of binary format will now work properly on big-endian
        systems.
      • UTF-8 verification was fixed to properly reject surrogate code points.
      • Unknown enums for proto2 protos now properly implement proto2's behavior of
        putting such values in unknown fields.

      Java

      • Revert "Standardize on Array copyOf" (#9400)
      • Resolve more java field accessor name conflicts (#8198)
      • Don't support map fields in DynamicMessage.Builder.{getFieldBuilder,getRepeatedFieldBuilder}
      • Fix parseFrom to only throw InvalidProtocolBufferException
      • InvalidProtocolBufferException now allows arbitrary wrapped Exception types.
      • Fix bug in FieldSet.Builder.mergeFrom
      • Flush CodedOutputStream also flushes underlying OutputStream
      • When oneof case is the same and the field type is Message, merge the
        subfield. (previously it was replaced.)’
      • Add @ CheckReturnValue to some protobuf types
      • Report original exceptions when parsing JSON
      • Add more info to @ deprecated javadoc for set/get/has methods
      • Fix initialization bug in doc comment line numbers
      • Fix comments for message set wire format.

      Kotlin

      • Add test scope to kotlin-test for protobuf-kotlin-lite (#9518)
      • Add orNull extensions for optional message fields.
      • Add orNull extensions to all proto3 message fields.

      Python

      • Dropped support for Python < 3.7 (#9480)
      • Protoc is now able to generate python stubs (.pyi) with --pyi_out
      • Pin multibuild scripts to get manylinux1 wheels back (#9216)
      • Fix type annotations of some Duration and Timestamp methods.
      • Repeated field containers are now generic in field types and could be used
        in type annotations.
      • Protobuf python generated codes are simplified. Descriptors and message
        classes' definitions are now dynamic created in internal/builder.py.
        Insertion Points for messages classes are discarded.
      • has_presence is added for FieldDescriptor in python
      • Loosen indexing type requirements to allow valid index() implementations
        rather than only PyLongObjects.
      • Fix the deepcopy bug caused by not copying message_listener.
      • Added python JSON parse recursion limit (default 100)
      • Path info is added for python JSON parse errors
      • Pure python repeated scalar fields will not able to pickle. Convert to list
        first.
      • Timestamp.ToDatetime() now accepts an optional tzinfo parameter. If
        specified, the function returns a timezone-aware datetime in the given time
        zone. If omitted or None, the function returns a timezone-naive UTC datetime
        (as previously).
      • Adds client_streaming and server_streaming fields to MethodDescriptor.
      • Add "ensure_ascii" parameter to json_format.MessageToJson. This allows smaller
        JSON serializations with UTF-8 or other non-ASCII encodings.
      • Added experimental support for directly assigning numpy scalars and array.
      • Improve the calculation of public_dependencies in DescriptorPool.
      • [Breaking Change] Disallow setting fields to numpy singleton arrays or repeated fields to numpy
        multi-dimensional arrays. Numpy arrays should be indexed or flattened explicitly before assignment.

      Compiler

      • Migrate IsDefault(const std::string*) and UnsafeSetDefault(const std::string*)
      • Implement strong qualified tags for TaggedPtr
      • Rework allocations to power-of-two byte sizes.
      • Migrate IsDefault(const std::string*) and UnsafeSetDefault(const std::string*)
      • Implement strong qualified tags for TaggedPtr
      • Make TaggedPtr Set...() calls explicitly spell out the content type.
      • Check for parsing error before verifying UTF8.
      • Enforce a maximum message nesting limit of 32 in the descriptor builder to
        guard against stack overflows
      • Fixed bugs in operators for RepeatedPtrIterator
      • Assert a maximum map alignment for allocated values
      • Fix proto1 group extension protodb parsing error
      • Do not log/report the same descriptor symbol multiple times if it contains
        more than one invalid character.
      • Add UnknownFieldSet::SerializeToString and SerializeToCodedStream.
      • Remove explicit default pointers and deprecated API from protocol compiler

      Arenas

      • Change Repeated*Field to reuse memory when using arenas.
      • Implements pbarenaz for profiling proto arenas
      • Introduce CreateString() and CreateArenaString() for cleaner semantics
      • Fix unreferenced parameter for MSVC builds
      • Add UnsafeSetAllocated to be used for one-of string fields.
      • Make Arena::AllocateAligned() a public function.
      • Determine if ArenaDtor related code generation is necessary in one place.
      • Implement on demand register ArenaDtor for InlinedStringField

      C++

      • Enable testing via CTest (#8737)
      • Add option to use external GTest in CMake (#8736)
      • CMake: Set correct sonames for libprotobuf-lite.so and libprotoc.so (#8635) (#9529)
      • Add cmake option protobuf_INSTALL to not install files (#7123)
      • CMake: Allow custom plugin options e.g. to generate mocks (#9105)
      • CMake: Use linker version scripts (#9545)
      • Manually *struct Cord fields to work better with arenas.
      • Manually destruct map fields.
      • Generate narrower code
      • Fix #9378 by removing
        shadowed cached_size field
      • Remove GetPointer() and explicit nullptr defaults.
      • Add proto_h flag for speeding up large builds
      • Add missing overload for reference wrapped fields.
      • Add MergedDescriptorDatabase::FindAllFileNames()
      • RepeatedField now defines an iterator type instead of using a pointer.
      • Remove obsolete macros GOOGLE_PROTOBUF_HAS_ONEOF and GOOGLE_PROTOBUF_HAS_ARENAS.

      PHP

      • Fix: add missing reserved classnames (#9458)
      • PHP 8.1 compatibility (#9370)

      C#

      • Fix trim warnings (#9182)
      • Fixes NullReferenceException when accessing FieldDescriptor.IsPacked (#9430)
      • Add ToProto() method to all descriptor classes (#9426)
      • Add an option to preserve proto names in JsonFormatter (#6307)

      Objective-C

      • Add prefix_to_proto_package_mappings_path option. (#9498)
      • Rename proto_package_to_prefix_mappings_path to package_to_prefix_mappings_path. (#9552)
      • Add a generation option to control use of forward declarations in headers. (#9568)
    from google-protobuf GitHub release notes
    Commit messages
    Package name: google-protobuf
    • 616a7ef Updated CHANGES.txt for 3.20.1 (#9826)
    • 296c1fd Update protobuf version (#9820)
    • 6387f95 fix: move composer.json out of root to avoid confusion (#9819)
    • 653de45 Disable the aarch64 build on macOS because it is broken. (#9816)
    • acd24bc Add disallowment of setting numpy singleton arrays and multi-dimensio… (#9788)
    • 26d11fd -Dsurefire.failIfNoSpecifiedTests=false (#9761)
    • 044cb7f -DfailIfNoSpecifiedTests=false (#9753)
    • 7db4eca Update changelogs for 3.20.1-rc1
    • 803e371 Update protobuf version
    • 5edc844 Merge pull request #9727 from mlocati/build-packaged-php-extension
    • d24edbc Update protobuf version
    • e097b36 Merge pull request #9714 from JasonLunn/3.20.x
    • 31a6482 Implement `respond_to?` in RubyMessage (#9677)
    • 7fa212b Fix NPE during encoding and add regression test for issue 9507.

    Compare


    Note: You are seeing this because you or someone else with access to this repository has authorized Snyk to open upgrade PRs.

    For more information:

    🧐 View latest project report

    🛠 Adjust upgrade PR settings

    🔕 Ignore this dependency or unsubscribe from future upgrade PRs

    opened by snyk-bot 0
  • Fixes #661: iOS interruption level support

    Fixes #661: iOS interruption level support

    Fixes #661

    Adds support for interruption-level on iOS push notifications.

    Possible values are defined here.

    Details about interruption-level might be found here.

    Tested with a device with iOS > 15, the notification alert created by iOS informs the user that it is a time-sensitive notification and prompts him if he wants to leave it on or turn it off as on the print below attached.

    Image from iOS

    opened by SpaWn2KiLl 0
  • Fix vulnerabilities: CVE-2020-35864 and GHSA-ppj4-34rq-v8j9

    Fix vulnerabilities: CVE-2020-35864 and GHSA-ppj4-34rq-v8j9

    As reported by grype, this fixes CVE-2020-35864 and GHSA-ppj4-34rq-v8j9.

    Current container:

    % syft appleboy/gorush --output json | grype  
     ✔ Loaded image            
     ✔ Parsed image            
     ✔ Cataloged packages      [102 packages]
    
    [0001]  WARN some package(s) are missing CPEs. This may result in missing vulnerabilities. You may autogenerate these using: --add-cpes-if-none
    NAME                                 INSTALLED  FIXED-IN   TYPE       VULNERABILITY        SEVERITY 
    busybox                              1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391       Critical  
    github.com/google/flatbuffers        v1.12.0               go-module  CVE-2020-35864       High      
    github.com/prometheus/client_golang  v1.10.0               go-module  CVE-2022-21698       High      
    github.com/tidwall/gjson             v1.6.8     1.9.3      go-module  GHSA-ppj4-34rq-v8j9  High      
    google.golang.org/protobuf           v1.28.0               go-module  CVE-2015-5237        High      
    google.golang.org/protobuf           v1.28.0               go-module  CVE-2021-22570       High      
    libcrypto1.1                         1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778        High      
    libcrypto1.1                         1.1.1l-r7             apk        CVE-2021-4160        Medium    
    libretls                             3.3.4-r2   3.3.4-r3   apk        CVE-2022-0778        High      
    libssl1.1                            1.1.1l-r7             apk        CVE-2021-4160        Medium    
    libssl1.1                            1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778        High      
    ssl_client                           1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391       Critical  
    zlib                                 1.2.11-r3  1.2.12-r0  apk        CVE-2018-25032       High     
    

    After libs update:

    % syft spawn2kill/gorush --output json | grype
     ✔ Loaded image            
     ✔ Parsed image            
     ✔ Cataloged packages      [102 packages]
    [0001]  WARN some package(s) are missing CPEs. This may result in missing vulnerabilities. You may autogenerate these using: --add-cpes-if-none
    NAME                                 INSTALLED  FIXED-IN   TYPE       VULNERABILITY   SEVERITY 
    busybox                              1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391  Critical  
    github.com/prometheus/client_golang  v1.10.0               go-module  CVE-2022-21698  High      
    google.golang.org/protobuf           v1.28.0               go-module  CVE-2015-5237   High      
    google.golang.org/protobuf           v1.28.0               go-module  CVE-2021-22570  High      
    libcrypto1.1                         1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778   High      
    libcrypto1.1                         1.1.1l-r7             apk        CVE-2021-4160   Medium    
    libretls                             3.3.4-r2   3.3.4-r3   apk        CVE-2022-0778   High      
    libssl1.1                            1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778   High      
    libssl1.1                            1.1.1l-r7             apk        CVE-2021-4160   Medium    
    ssl_client                           1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391  Critical  
    zlib                                 1.2.11-r3  1.2.12-r0  apk        CVE-2018-25032  High    
    
    opened by SpaWn2KiLl 0
  • Fixes #676: Update dockerfile; Update alpine base images; Fix multiple CVEs

    Fixes #676: Update dockerfile; Update alpine base images; Fix multiple CVEs

    Fixes #676 by updating alpine base image.

    Current image:

    % syft appleboy/gorush --output json | grype                                                                     
     ✔ Loaded image            
     ✔ Parsed image            
     ✔ Cataloged packages      [102 packages]
    
    [0001]  WARN some package(s) are missing CPEs. This may result in missing vulnerabilities. You may autogenerate these using: --add-cpes-if-none
    NAME                                 INSTALLED  FIXED-IN   TYPE       VULNERABILITY        SEVERITY 
    busybox                              1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391       Critical  
    github.com/google/flatbuffers        v1.12.0               go-module  CVE-2020-35864       High      
    github.com/prometheus/client_golang  v1.10.0               go-module  CVE-2022-21698       High      
    github.com/tidwall/gjson             v1.6.8     1.9.3      go-module  GHSA-ppj4-34rq-v8j9  High      
    google.golang.org/protobuf           v1.28.0               go-module  CVE-2015-5237        High      
    google.golang.org/protobuf           v1.28.0               go-module  CVE-2021-22570       High      
    libcrypto1.1                         1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778        High      
    libcrypto1.1                         1.1.1l-r7             apk        CVE-2021-4160        Medium    
    libretls                             3.3.4-r2   3.3.4-r3   apk        CVE-2022-0778        High      
    libssl1.1                            1.1.1l-r7             apk        CVE-2021-4160        Medium    
    libssl1.1                            1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778        High      
    ssl_client                           1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391       Critical  
    zlib                                 1.2.11-r3  1.2.12-r0  apk        CVE-2018-25032       High  
    

    After alpine image update:

    % syft spawn2kill/gorush --output json | grype
     ✔ Loaded image            
     ✔ Parsed image            
     ✔ Cataloged packages      [102 packages]
    [0001]  WARN some package(s) are missing CPEs. This may result in missing vulnerabilities. You may autogenerate these using: --add-cpes-if-none
    NAME                           INSTALLED  FIXED-IN  TYPE       VULNERABILITY        SEVERITY 
    github.com/google/flatbuffers  v1.12.0              go-module  CVE-2020-35864       High      
    github.com/tidwall/gjson       v1.6.8     1.9.3     go-module  GHSA-ppj4-34rq-v8j9  High      
    google.golang.org/protobuf     v1.28.0              go-module  CVE-2021-22570       High      
    google.golang.org/protobuf     v1.28.0              go-module  CVE-2015-5237        High      
    
    opened by SpaWn2KiLl 0
  • Update alpine base image - Fix CVEs

    Update alpine base image - Fix CVEs

    Currently, the base image being used is plugins/base:{os-arch} as defined here but it is not being properly maintened, it is using an old alpine image that have multiple security vulnerabilities, some of them even CRITICAL:

    busybox                        1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391       Critical 
    libcrypto1.1                   1.1.1l-r7             apk        CVE-2021-4160        Medium    
    libcrypto1.1                   1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778        High      
    libretls                       3.3.4-r2   3.3.4-r3   apk        CVE-2022-0778        High      
    libssl1.1                      1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778        High      
    libssl1.1                      1.1.1l-r7             apk        CVE-2021-4160        Medium    
    ssl_client                     1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391       Critical  
    zlib                           1.2.11-r3  1.2.12-r0  apk        CVE-2018-25032       High
    

    Dockerfiles should be changed to use alpine images directly and install ca-certificates instead of using plugins/base.

    opened by SpaWn2KiLl 0
  • Fix CVE-2022-21698

    Fix CVE-2022-21698

    Same as openfaas/of-watchdog#134

    Latest gorush version:

    % syft appleboy/gorush --output json | grype  
     ✔ Loaded image            
     ✔ Parsed image            
     ✔ Cataloged packages      [102 packages]
    
    [0001]  WARN some package(s) are missing CPEs. This may result in missing vulnerabilities. You may autogenerate these using: --add-cpes-if-none
    NAME                                 INSTALLED  FIXED-IN   TYPE       VULNERABILITY        SEVERITY 
    busybox                              1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391       Critical  
    github.com/google/flatbuffers        v1.12.0               go-module  CVE-2020-35864       High      
    github.com/prometheus/client_golang  v1.10.0               go-module  CVE-2022-21698       High      
    github.com/tidwall/gjson             v1.6.8     1.9.3      go-module  GHSA-ppj4-34rq-v8j9  High      
    google.golang.org/protobuf           v1.28.0               go-module  CVE-2021-22570       High      
    google.golang.org/protobuf           v1.28.0               go-module  CVE-2015-5237        High      
    libcrypto1.1                         1.1.1l-r7             apk        CVE-2021-4160        Medium    
    libcrypto1.1                         1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778        High      
    libretls                             3.3.4-r2   3.3.4-r3   apk        CVE-2022-0778        High      
    libssl1.1                            1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778        High      
    libssl1.1                            1.1.1l-r7             apk        CVE-2021-4160        Medium    
    ssl_client                           1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391       Critical  
    zlib                                 1.2.11-r3  1.2.12-r0  apk        CVE-2018-25032       High  
    

    After fix:

    % syft spawn2kill/gorush --output json | grype
     ✔ Loaded image            
     ✔ Parsed image            
     ✔ Cataloged packages      [102 packages]
    
    [0001]  WARN some package(s) are missing CPEs. This may result in missing vulnerabilities. You may autogenerate these using: --add-cpes-if-none
    NAME                           INSTALLED  FIXED-IN   TYPE       VULNERABILITY        SEVERITY 
    busybox                        1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391       Critical  
    github.com/google/flatbuffers  v1.12.0               go-module  CVE-2020-35864       High      
    github.com/tidwall/gjson       v1.6.8     1.9.3      go-module  GHSA-ppj4-34rq-v8j9  High      
    google.golang.org/protobuf     v1.28.0               go-module  CVE-2015-5237        High      
    google.golang.org/protobuf     v1.28.0               go-module  CVE-2021-22570       High      
    libcrypto1.1                   1.1.1l-r7             apk        CVE-2021-4160        Medium    
    libcrypto1.1                   1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778        High      
    libretls                       3.3.4-r2   3.3.4-r3   apk        CVE-2022-0778        High      
    libssl1.1                      1.1.1l-r7  1.1.1n-r0  apk        CVE-2022-0778        High      
    libssl1.1                      1.1.1l-r7             apk        CVE-2021-4160        Medium    
    ssl_client                     1.34.1-r3  1.34.1-r5  apk        CVE-2022-28391       Critical  
    zlib                           1.2.11-r3  1.2.12-r0  apk        CVE-2018-25032       High      
    
    opened by SpaWn2KiLl 0
Releases(v1.15.0)
Owner
Bo-Yi Wu
I really believe committing every day on an open source project is the best practice.
Bo-Yi Wu
Simple push notification system (android/fcm, apns/slideshow) written by Golang

Golang Push Notification Simple system push notification for android/fcm and apn

Hoàng Hải 0 Dec 20, 2021
Uniqush is a free and open source software system which provides a unified push service for server side notification to apps on mobile devices.

Homepage Download Blog/News @uniqush Introduction Uniqush (\ˈyü-nə-ku̇sh\ "uni" pronounced as in "unified", and "qush" pronounced as in "cushion") is

Uniqush 1.3k May 11, 2022
The Xiaomi message push service is a system-level channel on MIUI and is universal across the platform, which can provide developers with stable, reliable, and efficient push services.

Go-Push-API MiPush、JiPush、UMeng MiPush The Xiaomi message push service is a system-level channel on MIUI and is universal across the platform, which c

houseme 4 Apr 24, 2022
Go-notification - Realtime notification system with golang

Realtime notification system Used Apache kafka gRPC & PROTOBUF MongoDB restapi w

vishalvishnu 2 Feb 16, 2022
Golang push server cluster

gopush-cluster gopush-cluster is a go push server cluster. Features light weight high performance pure golang implementation message expired offline m

Terry.Mao 2k May 16, 2022
Bark is an iOS App which allows you to push customed notifications to your iPhone.

Bark is an iOS App which allows you to push customed notifications to your iPhone.

Feng 1.3k May 9, 2022
Arjuns-urgent-notification-backend - A simple Golang app that handles form JSON POST requests

Arjun's Urgent Notification Backend This is intended to let people urgently noti

Kome Fumi 0 Jan 7, 2022
An little library to create notification files with golang.

notifile With this no library you can easily create notification files for your Go projects. These must then be stored in the directory you specify so

echGo 1 Feb 10, 2022
Chanify is a safe and simple notification tools. This repository is command line tools for Chanify.

Chanify is a safe and simple notification tools. For developers, system administrators, and everyone can push notifications with API.

Chanify 837 May 10, 2022
cisasntyi: check iphone stock and send notification to your iphone

for buy iphone 13 notification cisasntyi: check iphone stock and send notification to your iphone install Bark app in your iphone first before you run

seaZhang 46 Nov 26, 2021
ntfy is a super simple pub-sub notification service. It allows you to send desktop notifications via scripts.

ntfy ntfy (pronounce: notify) is a super simple pub-sub notification service. It allows you to send desktop and (soon) phone notifications via scripts

Philipp C. Heckel 2.1k May 12, 2022
Namecoin calendar notification daemon (ICS, CalDAV)

nccald nccald is a simple daemon to provide calendar notifications for Namecoin name expirations. The daemon periodically queries a Namecoin Core inst

Hugo Landau 0 Dec 11, 2021
websocket based messaging server written in golang

Guble Messaging Server Guble is a simple user-facing messaging and data replication server written in Go. Overview Guble is in an early state (release

Sebastian Mancke 151 Jan 23, 2022
golang long polling library. Makes web pub-sub easy via HTTP long-poll server :smiley: :coffee: :computer:

golongpoll Golang long polling library. Makes web pub-sub easy via an HTTP long-poll server. New in v1.1 Deprecated CreateManager and CreateCustomMana

J Cuga 593 May 14, 2022
A user friendly RabbitMQ library written in Golang.

TurboCookedRabbit A user friendly RabbitMQ library written in Golang to help use streadway/amqp. Based on my work found at CookedRabbit. Work Recently

Tristan (HouseCat) Hyams 94 May 3, 2022
It's client library written in Golang for interacting with Linkedin Cruise Control using its HTTP API.

go-cruise-control It's client library (written in Golang) for interacting with Linkedin Cruise Control using its HTTP API. Supported Cruise Control ve

Banzai Cloud 1 Jan 10, 2022
Messagebus - Simple Message Bus Written in Golang

MessageBus Simple Message Bus Written in Golang How to Use go get gopkg.io/Usada

Usada Pekora 2 Apr 21, 2022
Scalable real-time messaging server in language-agnostic way

Centrifugo is a scalable real-time messaging server in language-agnostic way. Centrifugo works in conjunction with application backend written in any

Centrifugal 6k May 18, 2022
Server-sent live updates: protocol and reference implementation

Protocol and Reference Implementation Mercure is a protocol allowing to push data updates to web browsers and other HTTP clients in a convenient, fast

Kévin Dunglas 2.7k May 12, 2022