Review fixes
Vasili Novikov authored
ca51dd3e

About

Pod is the open-source backend for Memri project.

It's written in Rust and provides an HTTP interface for use by the clients.

WARNING: NOT SECURE WITH PUBLIC IP!!!

The current version of Pod DOES NOT guarantee security yet, DO NOT use it for production or run it with a public IP.

  • When attempting to run with a public IP, Pod will give an error and refuse to start;
  • Setting the environment variable INSECURE_USE_PUBLIC_IP to any value will allow Pod to start even with a public IP (with the security implications above!).

Run in docker

To run Pod inside docker:

docker-compose build
docker-compose up

Local build/run

In order to build Pod locally, you need Rust and sqlcipher:

  • On MacOS: brew install rust sqlcipher
  • On ArchLinux: pacman -S --needed rust sqlcipher
  • On Ubuntu and Debian:
apt-get install libsqlcipher-dev
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  • Submit merge requests for your other OS :)

After this, you can run Pod with:

cargo run --release

Development

During development, you might want to have faster build turn-around.

Use this to incrementally compile the project (after installing cargo-watch):

cargo watch

To build (debug version):

cargo build

Run:

RUST_LOG=pod=debug,info cargo run

You can read about various components of the server:

HTTP API

Pod's API is documented in detail here.

Database

Pod uses SQLite database as its storage mechanism.

When running Pod, a file named pod.db will be created. You can use sqlite3 pod.db to browse the database locally. For example, .schema will display the current database schema.

If you want to fill the database with some example data, use:

sqlite3 data/db/pod.db < res/example_data.sql

Note that the current version of Pod DOES NOT use encryption. This part will be changed, and a manual import will be needed in the future.

Schema

In order to store items in the database, Pod needs to be aware of their types in advance. This information is stored in a "schema".

Understanding the schema

The schema is located in /res/autogenerated_database_schema.json. It lists all types that can be stored on Pod, and their properties.

Valid types for properties are, at the moment: Text, Integer, Real, Bool, DateTime. Please read /src/database_init.rs, "DatabaseColumnType" documentation for what the types mean and what can you store in them.

Changing the schema locally

If you want to make local changes to the schema while developing new functionality, you can edit the schema directly. It's located in /res/autogenerated_database_schema.json.

Simply re-start the Pod to apply the changes.

Contributing your schema

The schema is also used in iOS and other projects. To make it available universally, please submit your schema to the "schema" repository: https://gitlab.memri.io/memri/schema.

Changes made to "schema" repository will allow you to generate new definitions for other projects, and also for Pod. You can copy the newly generated JSON to Pod during development.

You can contribute to the schemas by making a Merge Requests for the "schema" repository. Please refer to that repo's documentation on how to work with it and do it best.