mirror of
https://github.com/GothenburgBitFactory/taskchampion-sync-server.git
synced 2025-06-26 10:54:29 +02:00
165 lines
5.7 KiB
Markdown
165 lines
5.7 KiB
Markdown
TaskChampion Sync-Server
|
|
------------------------
|
|
|
|
TaskChampion is the task database [Taskwarrior][tw] uses to store and sync
|
|
tasks. This repository implements a sync server against which Taskwarrior
|
|
and other applications embedding TaskChampion can sync.
|
|
|
|
[tw]: https://github.com/GothenburgBitFactory/taskwarrior
|
|
|
|
## Status
|
|
|
|
This repository was spun off from Taskwarrior itself after the 3.0.0
|
|
release. It is still under development and currently best described as
|
|
a reference implementation of the Taskchampion sync protocol.
|
|
|
|
It is comprised of three crates:
|
|
|
|
- `taskchampion-sync-server-core` implements the core of the protocol
|
|
- `taskchmpaion-sync-server-sqlite` implements an SQLite backend for the core
|
|
- `taskchampion-sync-server` implements a simple HTTP server for the protocol
|
|
|
|
## Running the Server
|
|
|
|
The server is a simple binary that serves HTTP requests on a TCP port. The
|
|
server does not implement TLS; for public deployments, the recommendation is to
|
|
use a reverse proxy such as Nginx, haproxy, or Apache httpd.
|
|
|
|
### Using Docker-Compose
|
|
|
|
Every release of the server generates a Docker image in
|
|
`ghcr.io/gothenburgbitfactory/taskchampion-sync-server`. The tags include
|
|
`latest` for the latest release, and both minor and patch versions, e.g., `0.5`
|
|
and `0.5.1`.
|
|
|
|
The
|
|
[`docker-compose.yml`](https://raw.githubusercontent.com/GothenburgBitFactory/taskchampion-sync-server/refs/tags/v0.6.1/docker-compose.yml)
|
|
file in this repository is sufficient to run taskchampion-sync-server,
|
|
including setting up TLS certificates using Lets Encrypt, thanks to
|
|
[Caddy](https://caddyserver.com/).
|
|
|
|
You will need a server with ports 80 and 443 open to the Internet and with a
|
|
fixed, publicly-resolvable hostname. These ports must be available both to your
|
|
Taskwarrior clients and to the Lets Encrypt servers.
|
|
|
|
On that server, download `docker-compose.yml` from the link above (it is pinned
|
|
to the latest release) into the current directory. Then run
|
|
|
|
```sh
|
|
TASKCHAMPION_SYNC_SERVER_HOSTNAME=taskwarrior.example.com \
|
|
TASKCHAMPION_SYNC_SERVER_CLIENT_ID=your-client-id \
|
|
docker compose up
|
|
```
|
|
|
|
The `TASKCHAMPION_SYNC_SERVER_CLIENT_ID` limits the server to the given client
|
|
ID; omit it to allow all client IDs.
|
|
|
|
It can take a few minutes to obtain the certificate; the caddy container will
|
|
log a message "certificate obtained successfully" when this is complete, or
|
|
error messages if the process fails. Once this process is complete, configure
|
|
your `.taskrc`'s to point to the server:
|
|
|
|
```
|
|
sync.server.url=https://taskwarrior.example.com
|
|
sync.server.client_id=your-client-id
|
|
sync.encryption_secret=your-encryption-secret
|
|
```
|
|
|
|
The docker-compose images store data in a docker volume named
|
|
`taskchampion-sync-server_data`. This volume contains all of the task data, as
|
|
well as the TLS certificate information. It will persist over restarts, in a
|
|
typical Docker installation. The docker containers will start automatically on
|
|
system startup. See the docker-compose documentation for more information.
|
|
|
|
### Running the Binary
|
|
|
|
The server is configured with command-line options. See
|
|
`taskchampion-sync-server --help` for full details.
|
|
|
|
The `--listen` option specifies the interface and port the server listens on.
|
|
It must contain an IP-Address or a DNS name and a port number. This option is
|
|
mandatory, but can be repeated to specify multiple interfaces or ports. This
|
|
value can be specified in environment variable `LISTEN`, as a comma-separated
|
|
list of values.
|
|
|
|
The `--data-dir` option specifies where the server should store its data. This
|
|
value can be specified in the environment variable `DATA_DIR`.
|
|
|
|
By default, the server allows all client IDs. To limit the accepted client IDs,
|
|
specify them in the environment variable `CLIENT_ID`, as a comma-separated list
|
|
of UUIDs. Client IDs can be specified with `--allow-client-id`, but this should
|
|
not be used on shared systems, as command line arguments are visible to all
|
|
users on the system.
|
|
|
|
The server only logs errors by default. To add additional logging output, set
|
|
environment variable `RUST_LOG` to `info` to get a log message for every
|
|
request, or to `debug` to get more verbose debugging output.
|
|
|
|
## Building
|
|
|
|
### Building From Source
|
|
|
|
#### Installing Rust
|
|
|
|
TaskChampion Sync-Server build has been tested with current Rust stable
|
|
release version. You can install Rust from your distribution package or use
|
|
[`rustup`][rustup].
|
|
```sh
|
|
rustup default stable
|
|
```
|
|
|
|
The minimum supported Rust version (MSRV) is given in
|
|
[`Cargo.toml`](./Cargo.toml). Note that package repositories typically do not
|
|
have sufficiently new versions of Rust.
|
|
|
|
If you prefer, you can use the stable version only for installing TaskChampion
|
|
Sync-Server (you must clone the repository first).
|
|
```sh
|
|
rustup override set stable
|
|
```
|
|
|
|
[rustup]: https://rustup.rs/
|
|
|
|
#### Installing TaskChampion Sync-Server
|
|
|
|
To build TaskChampion Sync-Server binary simply execute the following
|
|
commands.
|
|
```sh
|
|
git clone https://github.com/GothenburgBitFactory/taskchampion-sync-server.git
|
|
cd taskchampion-sync-server
|
|
cargo build --release
|
|
```
|
|
|
|
After build the binary is located in
|
|
`target/release/taskchampion-sync-server`.
|
|
|
|
### Building the Container
|
|
|
|
To build the container execute the following commands.
|
|
```sh
|
|
source .env
|
|
docker build \
|
|
--build-arg RUST_VERSION=${RUST_VERSION} \
|
|
--build-arg ALPINE_VERSION=${ALPINE_VERSION} \
|
|
-t taskchampion-sync-server .
|
|
```
|
|
|
|
Now to run it, simply exec.
|
|
```sh
|
|
docker run -t -d \
|
|
--name=taskchampion \
|
|
-p 8080:8080 \
|
|
taskchampion-sync-server
|
|
```
|
|
|
|
This start TaskChampion Sync-Server and publish the port to host. Please
|
|
note that this is a basic run, all data will be destroyed after stop and
|
|
delete container. You may also set `DATA_DIR`, `CLIENT_ID`, or `LISTEN` with `-e`, e.g.,
|
|
|
|
```sh
|
|
docker run -t -d \
|
|
--name=taskchampion \
|
|
-e LISTEN=0.0.0.0:9000 \
|
|
-p 9000:9000 \
|
|
taskchampion-sync-server
|
|
```
|