# KOreader Sync Server
This is a KOreader sync server, implemented in Rust. It uses the crates *axum*, *sqlx*, *serde* and *serde_json*.

## Requirements
- 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. 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 as user *kosync* (with psql) and create the database tables:
```sql
CREATE TABLE users (
  id BIGSERIAL PRIMARY KEY,
  username TEXT UNIQUE NOT NULL,
  password TEXT
);

CREATE TABLE progresses (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT NOT NULL,
  document TEXT 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)
);
```