Skip to content

upryzing/parrot

Repository files navigation

Upryzing's Backend (Parrot)

Stars Forks Pull Requests Issues Contributors License

The services and libraries that power the Revolt service.

Crate Path Description
core/config crates/core/config Core: Configuration Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/database crates/core/database Core: Database Implementation Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/files crates/core/files Core: S3 and encryption subroutines Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/models crates/core/models Core: API Models Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/permissions crates/core/permissions Core: Permission Logic Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/presence crates/core/presence Core: User Presence Crates.io Version Crates.io Version Crates.io Version Crates.io License
core/result crates/core/result Core: Result and Error types Crates.io Version Crates.io Version Crates.io Version Crates.io License
delta crates/delta REST API server License
bonfire crates/bonfire WebSocket events server License
services/dove crates/services/dove Proxy server License
services/pigeon crates/services/pigeon File server License
bindings/node crates/bindings/node Node.js bindings for the Revolt software License
daemons/pushd crates/daemons/pushd Push notification daemon server License

Minimum Supported Rust Version

Rust 1.76 or higher.

Caution

The events server has a significant performance regression between Rust 1.77.2 and 1.78.0 onwards, see issue #341.

Development Guide

Before contributing, make yourself familiar with our contribution guidelines and the technical documentation for this project.

Before getting started, you'll want to install:

  • Rust toolchain (rustup recommended)
  • Docker
  • Git
  • mold (optional, faster compilation)

A default.nix is available for Nix users! Just run nix-shell and continue.

As a heads-up, the development environment uses the following ports:

Service Port
MongoDB 27017
Redis 6379
MinIO 14009
Maildev 14025
14080
Revolt Web App 14701
RabbitMQ 5672
15672
crates/delta 14702
crates/bonfire 14703
crates/services/pigeon 14704
crates/services/dove 14705

Now you can clone and build the project:

git clone https://github.com/upryzing/parrot upryzing-backend
cd upryzing-backend
cargo build

A default configuration Revolt.toml is present in this project that is suited for development.

If you'd like to change anything, create a Revolt.overrides.toml file and specify relevant variables.

Tip

Use Sentry to catch unexpected service errors:

# Revolt.overrides.toml
[sentry]
api = "https://[email protected]/1"
events = "https://[email protected]/1"
files = "https://[email protected]/1"
proxy = "https://[email protected]/1"

Then continue:

# start other necessary services
docker compose up -d

# run everything together
./scripts/start.sh
# .. or individually
# run the API server
cargo run --bin upryzing-delta
# run the events server
cargo run --bin upryzing-bonfire
# run the file server
cargo run --bin upryzing-pigeon
# run the proxy server
cargo run --bin upryzing-dove
# run the push daemon (not usually needed in regular development)
cargo run --bin upryzing-pushd

# hint:
# mold -run <cargo build, cargo run, etc...>
# mold -run ./scripts/start.sh

You can start a web client by doing the following:

# if you do not have yarn yet and have a modern Node.js:
corepack enable

# clone the web client and run it:
git clone --recursive https://github.com/revoltchat/revite
cd revite
yarn
yarn build:deps
echo "VITE_API_URL=http://local.revolt.chat:14702" > .env.local
yarn dev --port 14701

Then go to http://local.revolt.chat:14701 to create an account/login.

When signing up, go to http://localhost:14080 to find confirmation/password reset emails.

Deployment Guide

Cutting new crate releases

Begin by bumping crate versions:

just patch # 0.0.X
just minor # 0.X.0
just major # X.0.0

Then commit the changes to package files.

Proceed to publish all the new crates:

just publish

Cutting new binary releases

Tag and push a new release by running:

just release

If you have bumped the crate versions, proceed to GitHub releases to create a changelog.

Testing

First, start the required services:

docker compose -f docker-compose.db.yml up -d

Now run tests for whichever database:

TEST_DB=REFERENCE cargo nextest run
TEST_DB=MONGODB cargo nextest run

License

Upryzing's backend is generally licensed under the GNU Affero General Public License v3.0.

Individual crates may supply their own licenses!