GithubHelp home page GithubHelp logo

kamilr / server Goto Github PK

View Code? Open in Web Editor NEW

This project forked from pushbits/server

0.0 1.0 0.0 362 KB

A relay server for push notifications via Matrix (and a minimalistic alternative to Pushover and Gotify with a strong focus on security) 🚀📯

Home Page: https://pushbits.io

License: ISC License

Makefile 0.42% Go 98.82% Dockerfile 0.75%

server's Introduction

This software is currently in alpha phase.

PushBits

Receive your important notifications immediately, over Matrix.

PushBits enables you to send push notifications via a simple web API, and delivers them to your users.

Build status  License 

💡 About

PushBits is a relay server for push notifications. It enables you to send notifications via a simple web API, and delivers them to you through Matrix. This is similar to what Pushover and Gotify offer, but it does not require an additional app.

The vision is to have compatibility with Gotify on the sending side, while on the receiving side an established service is used. This has the advantages that

  • sending plugins written for Gotify (like those for Watchtower and Jellyfin) as well as
  • receiving clients written for Matrix can be reused.

Why Matrix instead of X?

This project totally would've used Signal if it would offer a proper API. Sadly, neither Signal nor WhatsApp come with an API (at the time of writing) through which PushBits could interact.

In Telegram there is an API to run bots, but these are limited in that they cannot create chats by themselves. If you insist on going with Telegram, have a look at webhook2telegram.

The idea of a federated, synchronized but yet end-to-end encrypted protocol is awesome, but its clients simply aren't really there yet. Still, if you haven't tried it yet, we'd encourage you to check it out.

🤘 Features

  • Multiple users and multiple channels (applications) per user
  • Compatibility with Gotify's API for sending messages
  • API and CLI for managing users and applications
  • Optional check for weak passwords using HIBP
  • Argon2 as KDF for password storage
  • Two-factor authentication, issue
  • Bi-directional key verification, issue

🚀 Installation

PushBits is meant to be self-hosted. That means you have to install it on your own server.

Currently, the only supported way of installing PushBits is via Docker or Podman. The image is hosted via ghcr.io.

⚠️ You are advised to install PushBits behind a reverse proxy and enable TLS. Otherwise, your credentials will be transmitted unencrypted.

⚙ Configuration

To see what can be configured, have a look at the config.sample.yml file inside the root of the repository.

Settings can optionally be provided via environment variables. The name of the environment variable is composed of a starting PUSHBITS_, followed by the keys of the setting, all joined with _. As an example, the HTTP port can be provided as an environment variable called PUSHBITS_HTTP_PORT.

To get started, here is a Docker Compose file you can use.

version: '2'

services:
    server:
        image: ghcr.io/pushbits/server:latest
        ports:
            - 8080:8080
        environment:
            PUSHBITS_DATABASE_DIALECT: 'sqlite3'
            PUSHBITS_ADMIN_MATRIXID: '@your/matrix/username:matrix.org' # The Matrix account on which the admin will receive their notifications.
            PUSHBITS_ADMIN_PASSWORD: 'your/pushbits/password' # The login password of the admin account. Default username is 'admin'.
            PUSHBITS_MATRIX_USERNAME: 'your/matrix/username' # The Matrix account from which notifications are sent to all users.
            PUSHBITS_MATRIX_PASSWORD: 'your/matrix/password' # The password of the above account.
        volumes:
            - /etc/localtime:/etc/localtime:ro
            - /etc/timezone:/etc/timezone:ro
            - ./data:/data

In this example, the configuration file would be located at ./data/config.yml on the host. The SQLite database would be written to ./data/pushbits.db. Don't forget to adjust the permissions of the ./data directory, otherwise PushBits will fail to operate.

📄 Usage

Now, how can you interact with the server? We provide a little CLI tool called pbcli to make basic API requests to the server. It helps you to create new users and applications. You will find further instructions in the linked repository.

At the time of writing, there is no fancy GUI built-in, and we're not sure if this is necessary at all. Currently, we would like to avoid front end development, so if you want to contribute in this regard we're happy if you reach out!

After you have created a user and an application, you can use the API to send a push notification to your Matrix account.

curl \
	--header "Content-Type: application/json" \
	--request POST \
	--data '{"message":"my message","title":"my title"}' \
	"https://pushbits.example.com/message?token=$PB_TOKEN"

Note that the token is associated with your application and has to be kept secret. You can retrieve the token using pbcli by running following command.

pbcli application show $PB_APPLICATION --url https://pushbits.example.com --username $PB_USERNAME

Message options

Messages can be specified in three different syntaxes:

  • text/plain
  • text/html
  • text/markdown

To set a specific syntax you need to set the extras parameter (inspired by Gotify's message extras):

curl \
	--header "Content-Type: application/json" \
	--request POST \
	--data '{"message":"my message with\n\n**Markdown** _support_.","title":"my title","extras":{"client::display":{"contentType": "text/markdown"}}}' \
	"https://pushbits.example.com/message?token=$PB_TOKEN"

HTML content might not be fully rendered in your Matrix client; see the corresponding Matrix specs. This also holds for Markdown, as it is translated into the corresponding HTML syntax.

Deleting a Message

You can delete a message, this will send a notification in response to the original message informing you that the message is "deleted".

To delete a message, you need its message ID which is provided as part of the response when you send the message. The ID might contain characters not valid in URIs. We hence provide an additional id_url_encoded field for messages; you can directly use it when deleting a message without performing encoding yourself.

curl \
	--request DELETE \
	"https://pushbits.example.com/message/${MESSAGE_ID}?token=$PB_TOKEN"

👮 Acknowledgments

The idea for this software and most parts of the initial source are heavily inspired by Gotify. Many thanks to jmattheis for his well-structured code.

💻 Development

The source code is located on GitHub. You can retrieve it by checking out the repository as follows.

git clone https://github.com/pushbits/server.git

Stargazers over time

Testing

Testing is essential for delivering good and reliable software. PushBits uses Go's integrated test features. Unfortunately, writing tests is quite time consuming and therefore not every feature and every line of code is automatically tested. Feel free to help us improve our tests.

To run tests for a single (sub)module you can simply execute the following command in the module's folder.

go test

To get the testing coverage for a module use the -cover flag.

go test -cover

To execute a single test use the -run flag.

go test -run "TestApi_getUser"

Running tests for all PushBits module is done like this:

make test

server's People

Contributors

cubicrootxyz avatar dependabot[bot] avatar eikendev avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.