sync-node/README.md
2023-12-05 23:36:02 -07:00

2.7 KiB

Sync Node

Sync Node is a general-purpose backend sync server. It is designed to augment local-first software by simply providing an endpoint with which to sync data across devices and/or between users. Note that Sync Node does not concern itself with end-to-end encryption; this is by design. Nothing is stopping you from encrypting the data before submitting it to Sync Node, and in fact it's encouraged to do so. Key management and encryption are exercises left to the clients, however. If your use case requires a more "batteries included" approach to end-to-end encryption, consider using something like etebase instead.

Configuration

Configuration is handled exclusively through the following environment variables:

Environment Variable Default Value
PORT 8080
STATIC_ROOT ./data

Goals

  1. Provide a general-purpose backend that requires little-to-no configuration to enable syncing for local-first applications.
  2. Minimize resource usage on the server
  3. Maximize longevity of the project
  4. Simplify installation/updates

Data Model

erDiagram
    sync_account }|--o{ account_permission: ""
    sync_account ||--|{ sync_session: ""
    sync_account ||--o| password_reset_token: ""
    sync_store }|--|{ account_permission: ""
    sync_account {
        string id PK "The user name/email. Should be hashed for privacy."
        string password "The user password. Should be hashed for security."
        string key_salt UK "The salt used to hash key names"
    }
    account_permission {
        string sync_account_id PK, FK "The user identifier"
        string store_key PK, FK "The key to the store to which this permission is granted"
        string permission "The permission granted. Should be one of READ, WRITE, OWN"
    }
    sync_store {
        string(8000) store_key PK
        string store_file "The path on disk where the data for the associated key is stored"
        string(64) store_token "A token used to ensure that the client has the most recent copy of the data"
        string(8000) store_meta "Optional metadata to be associated with the store_file"
    }
    password_reset_token {
        string id PK, FK "The user identifier"
        string token UK
        int expiration "The timestamp for the expiration of the password reset token, in milliseconds since Unix Epoch"
    }
    sync_session {
        string token PK
        string id FK "The user identifier"
        int expiration "The timestamp for the expiration of the session token, in milliseconds since Unix Epoch"
    }