Сервер синхронизации для Taskwarrior

Опубликовано 9 сент. 2025 г.

Недавно мы с тобой тыкали TaskWarrior, как оказалось эта штука прям многим зашла, особенно после кастомизации. Но вопрос с синхронизацией остался открытым. Давай его сегодня попробуем закрыть.

Как это будет я и сам не знаю, буду настраивать и писать этот пост. Возможно мы наступим в гавно, а может у нас всё получится. Поехали!

ЧИТАТЬ ПЕРВЫМ В ТЕЛЕГРАМ

Раньше для синхронизации использовался taskd, но чтобы его правильно настроить и вообще добиться работоспособности, приходилось знатно поебаться и поплясать с бубном. Даже официальная документация заводила в тупик.

Время шло и наконец пришло. Теперь для синхронизации задач используется Taskchampion, taskd отправился на помойку. И да, это теперь официальный способ синхронизации, а не изобретение волонтеров.

Давай попробуем ЭТО собрать в кучу.

Подключаемся к серверу и выполняем:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
export PATH="$HOME/.cargo/bin:$PATH"
sudo apt install build-essential pkg-config libssl-dev libsqlite3-dev -y
cd /tmp
git clone https://github.com/GothenburgBitFactory/taskchampion-sync-server.git
cd taskchampion-sync-server

export OPENSSL_NO_VENDOR=1
export OPENSSL_DIR=/usr
export OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu
export OPENSSL_INCLUDE_DIR=/usr/include/openssl
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig
export LIBSQLITE3_SYS_USE_PKG_CONFIG=1

cargo build --release -v

Ждем пока всё это дело соберется в бинарник.

Инструкций по сборке я не нашел, поэтому составлял набор команд методом тыка. Например, если предварительно не установить libssl-dev, то оно начнет собираться из исходников, а это пиздец долго и не нужно.

Если у тебя слабое железо, советую собрать бинарник например на своей локальной машине и потом перекинуть уже на сервер. Будет в разы быстрее.

По ощущениям ничего не изменилось, как раньше копались в говне с taskd, так теперь и с taskchampion копаемся. Чё блядь сложно было сразу бинарники скомпилить и выложить на гитхабе? Ну или хотя бы snap пакет.

Ну пиздец!

После того как собралось, запускаем:

sudo cp target/release/taskchampion-sync-server /usr/local/bin/

Проверяем:

sudo mkdir -p /var/lib/taskchampion-sync
sudo chown $USER:$USER /var/lib/taskchampion-sync

taskchampion-sync-server --data-dir /var/lib/taskchampion-sync --listen 0.0.0.0:8080

Если ошибок нет, значит запустилось, а в папке /var/lib/taskchampion-sync появится база данных sqlite.

У себя на машине в файл ~/.taskrc прописываем:

sync.server.url=http://<ip_сервера>:8080

Генерим ключи:

uuidgen
openssl rand -hex 32

И прописываем в ~/.taskrc:

sync.server.client_id=2f5eda9d-97f1...
sync.encryption_secret=9dd4s461268c8...

Производим первичную инициализацию и синкаем таски с сервером:

task sync init && task sync

# Syncing with sync server at http://<ip>:8080

Работает! Смотрим что там в базе не сервере:

sqlite3 taskchampion-sync-server.sqlite3
SELECT * FROM clients

И видим наш client_id, значит всё синканулось заебись!

Теперь готовим юнит для systemd:

[Unit]
Description=Taskchampion Sync Server
After=network.target

[Service]
ExecStart=/usr/local/bin/taskchampion-sync-server \
  --data-dir /var/lib/taskchampion-sync \
  --listen 127.0.0.1:8080
Restart=on-failure
User=<твой юзер>
Group=<твоя группа>

[Install]
WantedBy=multi-user.target

Активируем и запускаем:

sudo systemctl daemon-reload
sudo systemctl enable --now taskchampion-sync.service

Теперь сервер синхронизации не торчит портом наружу. Нужен nginx!

Конфигуряем nginx:

server {
    listen 80;
    server_name tasks.bashdays.ru;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        auth_basic "Restricted";
		auth_basic_user_file /etc/nginx/.htpasswd;
    }
}

Не забываем настроить SSL сертификаты и т.п. чтобы ходило по 443 порту. Чтобы вновь с этим не ебаться, можешь воткнуть angie и прочитать этот короткий пост. Angie автоматически сгенерит сертификаты и сделаем красиво.

Потому что у нас тут basic auth и его могут перехватить через вектор MITM. Если избавиться от basic auth, то любой сможет использовать твой сервис синхронизации под свои таски. НО не зная твоего client_id и секрета, никто не получит твои данные.

В конфиге ~/.taskrc модифицируем uri:

sync.server.url=https://myuser:mypassword@yourdomain.com/

Указываем логин и пароль, потом собака и имя домена. Всё! Теперь при запуске task sync, твой taskwarrior пойдет на сервер синхронизации под логином и паролем.

Это всё прекрасно. Но что делать если не хочется ковыряться в этом говне с компиляцией и настройкой?

Выход есть! Можно всё лихо настроить через S3, благо taskwarrior отлично дружит с этим хранилищем.

Комментарии