diff --git a/README.md b/README.md index 5ef1655..1936997 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,48 @@ # KOreader Sync Server -This is a KOreader sync server, implemented in Rust. It uses the crates *axum*, *redis*, *serde* and *serde_json*. +This is a KOreader sync server, implemented in Rust. It uses the crates *axum*, *sqlx*, *serde* and *serde_json*. ## Requirements -- Rust toolchain (≥ 1.63) for compilation -- A running Redis server +- Rust toolchain for compilation +- A running PostgreSQL server - Nginx (or Apache) webserver as a reverse proxy, since kosyncrs only listens locally and uses HTTP. ## Installation -Just compile it with `cargo build --release`. You can then copy the executable for example to `/usr/local/bin/`. If you want to start the service automatically, you can adapt the example systemd file for your needs. You can also use nginx as a reverse proxy, so that the sync server listens on port 443. +Just compile it with `cargo build --release`. You can then copy the executable for example to `/usr/local/bin/`. -## Todo -- Test, if it really works, and if it works reliably. Feedback is very welcome! -- Make it more configurable \ No newline at end of file +If you want to start the service automatically, you can adapt the example systemd file for your needs. Please pay particularly attention to the PG_URL environment variable.You have to adjust the database username and password. + +You can also use nginx as a reverse proxy, so that the sync server listens on port 443. An example file is provided. + +### Database setup +First, create a new database user and set a password: +``` +$ createuser -P kosync +``` + +Then, create a new database which is owned by the newly created user: +``` +$ createdb -O kosync kosync +``` + +Connect to the database (with psql) and create the database tables: +```sql +CREATE TABLE users ( + id BIGSERIAL PRIMARY KEY, + username TEXT NOT NULL, + password TEXT +); + +CREATE TABLE progresses ( + id BIGSERIAL PRIMARY KEY, + user_id BIGINT, + document TEXT UNIQUE NOT NULL, + progress TEXT NOT NULL, + percentage REAL NOT NULL, + device TEXT NOT NULL, + device_id TEXT NOT NULL, + timestamp BIGINT NOT NULL, + FOREIGN KEY (user_id) + REFERENCES users(id) ON DELETE CASCADE, + UNIQUE (user_id, document) +); +``` \ No newline at end of file