In my path towards dockerizing everything in my laptop, I wrote another Dockerfile
to build my taskd-server container service.
And yeah, if you don’t know what this little jewel is, Taskwarrior is just your todo list
manager, flexible, fast, efficient; it captures tasks, shows you the list and removes tasks
from that list, but it also has many great features, for example it could become a sophisticated
data query tool that can help you stay organized, and get through your work.
As I said taskw has several strengths and the one I like very much is the ability to organize tasks in a user-defined hierarchy (by project, by date, by priority); when your list become so long, I think you can appreciate the query system, so the good news is that you can write your own functions (combining the task-cli commands) to display things as you prefer, for instance this little peace of code show how you can combine the ls and the summary commands to display tasks by project name:
if [[ -z "$1" ]]; then task list && task summary else task list project:$1 && task summary project:$1 fi
But now it’s time to talk about the server side level.
First of all, you can find the Dockerfile on my github but you can just skip this check pulling the container from the dockerhub:
$ docker pull fmount/taskd
The default image generates a container that runs the server on localhost:53589.
In order to expose the service, you need to modify the taskd server conf and run it on 0.0.0.0:53589, so the conf definitively looks like:
confirmation=1 extensions=/usr/local/libexec/taskd ip.log=on log=/tmp/taskd.log pid.file=/tmp/taskd.pid queue.size=10 request.limit=1048576 root=/var/taskd server=0.0.0.0:53589 trust=strict verbose=1 client.cert=/var/taskd/client.cert.pem client.key=/var/taskd/client.key.pem server.cert=/var/taskd/server.cert.pem server.key=/var/taskd/server.key.pem server.crl=/var/taskd/server.crl.pem ca.cert=/var/taskd/ca.cert.pem
The image also stores configuration and data in /var/taskd, which you should persist somewhere, so you can run it mounting your own data to the taskd server:
$ docker run --name "the_magical_tomato" -p 53589:53589 \ -v /home/user/taskd-srv:/var/taskd:Z fmount/taskd:1.2.0
or you can start the docker container without any volume:
$ docker run --name "the_magical_tomato" -p 53589:53589 fmount/taskd:1.2.0
and then copy all client conf from the /var/taskd:
$ docker cp the_magical_tomato:/var/taskd/client.cert.pem $ docker cp the_magical_tomato:/var/taskd/client.key.pem $ docker cp the_magical_tomato:/var/taskd/ca.cert.pem
But … before copying the file client* and ca.cert mentioned above, you need first to create a tenant and the related user(s) to sync from the server, so you need to attach to the container:
$ docker exec -it the_magical_tomato /bin/bash
and add a Group/user:
$ taskd add org MyOrganization $ taskd add user 'MyOrganization' 'myuser'
Finally, just generate the correct keys for the user client, so going to:
$ cd /opt/taskd/pki
generate the client.* launching:
$ ./generate.client 'myuser'
This will generate a new key and cert, named myuser.cert.pem and myuser.key.pem. It is not important that ‘myuser’ was used here, just that it is something unique, and valid for use in a file name. It has no bearing on security.
Once the container is running and you see the exposed port (ss command is your friend), you can finally configure your client adding to taskrc the following:
taskd.certificate=/home/user/.task/client.cert.pem taskd.key=/home/user/.task/client.key.pem taskd.ca=/home/user/.task/ca.cert.pem taskd.server=server_address:53589 taskd.credentials=Private/user/uuid
Here some useful doc I found to build the container and configure my clients:
Finally, a last interesting note on this post is related to a tmux layout I made in order to show some infos about the status of task activities; following this GIST you can find the tmux layout provided and, according to my last project Tmux layout plugin, you can load it putting it in the ~/.tmux/plugins/tmux-layout/layouts.