Сервер синхронизации для Taskwarrior
Недавно мы с тобой тыкали 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 отлично дружит с этим хранилищем.