Weird. This is my unit file (it is templated with a per-server configuration file) and it works fine:
Code:
[eschwartz@arch ~]$ cat ~/.config/systemd/user/calibre-server@.service
[Unit]
Description=Main calibre server
After=network.target
[Service]
EnvironmentFile=/%h/.config/calibre/servers/%i.conf
ExecStart=/usr/bin/calibre-server \
--port="${port}" \
--with-library "${path}" \
--restriction "${restriction}" \
--user "${user}" \
--pass "${pass}"
[Install]
WantedBy=default.target
But the problem did appear to be in the initial calibre server if localhost:8080 didn't work, and making it fork caused it to work???
I cannot think why a forked and daemonized /usr/bin/calibre-server would be any more likely to start than one which represents the main process of the service.
EDIT: Maybe you forgot to remove PIDFile= when you switched to Type=simple and systemd nuked the process out of confusion?
...
Really, it doesn't make a difference whether your daemonize and fork it, or not. It works either way, but Type=simple doesn't make systemctl wait while the server forks before returning. Since systemd natively knows how to track it. Or something.