A self-hostable pastebin for your tailnet. It can store an infinite* number of pastes.
- Install Nix
- Enable flakes
nix develop
You can then test your changes to tclip by running go run ./cmd/tclipd or go run ./cmd/tclip as appropriate.
Note that for the first run of ./cmd/tclipd, you must set
either the TS_AUTHKEY environment variable, or run it with
--tsnet-verbose to get the login URL for Tailscale.
The web server:
nix build .#tclipd
The docker image:
nix develop --command -- mkctr --gopaths="./cmd/tclipd:/bin/tclipd" --tags="latest" --base="gcr.io/distroless/static" --repos=tclip --ldflags="-w -s" --target=local --push -- /bin/tclipd
docker run tclip
The portable service image:
nix build .#portable-service
These configuration options are available as command-line flags and environment variables. All of them are optional.
| Command-line flag | Environment variable | Default value | Description |
|---|---|---|---|
-hostname |
TSNET_HOSTNAME |
paste |
The hostname to use on your tailnet. |
-data-location |
DATA_DIR |
~/.config/tailscale/paste |
Where program data is stored. |
-tsnet-verbose |
TSNET_VERBOSE |
false |
If set, tsnet will log verbosely to stderr. |
-use-funnel |
USE_FUNNEL |
false |
If set, expose individual pastes to the public internet with Funnel. |
-hide-funnel-users |
HIDE_FUNNEL_USERS |
false |
If set, don't display the username and profile picture of the user who created the paste in funneled pastes. |
-http-port |
HTTP_PORT |
unset | If set, expose individual pastes on a HTTP server running on the given port. |
-control-url |
TSNET_CONTROL_URL |
unset | If set, a custom control server to use, e.g. for Headscale users. |
-disable-https |
DISABLE_HTTPS |
false |
If set, disable serving on HTTPS with Serve. Useful for Headscale deployments. |
-enable-line-numbers |
ENABLE_LINE_NUMBERS |
false |
If set, enable line numbers being shown when viewing a paste. |
-enable-word-wrap |
ENABLE_WORD_WRAP |
false |
If set, allows lines to break and wrap to the following line. |
There are several options you can take to deploy tclip. The most basic deployment method is to use fly.io, but we offer a few options so that you can make the decision that is right for you.
In order to deploy this service, you will need to get an authkey from
the admin panel. It
is a good idea to associate this with the tag tag:service or its own
tag:tclip. Please also do not set the ephemeral tag as that
will destroy the node when the service shuts down.
Your authkey should start with tskey-auth.
You will need to have Magic DNS enabled.
In one of your infrastructure management GitHub repositories, create a
folder for tclip and then copy the following
fly.toml template
into that folder.
app = "FLY_APP_NAME"
[build]
image = "ghcr.io/tailscale-dev/tclip:latest"
[deploy]
strategy = "immediate"
[env]
DATA_DIR = "/data"
[mounts]
source = "tclip_data"
destination = "/data"Replace FLY_APP_NAME with a name such as yourorg-tclip and
then run these commands with the flyctl command:
$ flyctl apps create FLY_APP_NAME
$ flyctl volumes create tclip_data
$ flyctl secrets set TS_AUTHKEY=<key>
$ flyctl deployYou should be able to open the app at http://paste and paste to your heart's content.
Run flyctl deploy to update the service.
To run this service in Docker, run the following command:
docker run \
-d \
-v /var/lib/tclip:/data \
-e DATA_DIR=/data \
-e TS_AUTHKEY=<key> \
-n tclip \
--restart always \
ghcr.io/tailscale-dev/tclip:latest
Every so often you should pull a new version of tclip and recreate the container:
docker pull ghcr.io/tailscale-dev/tclip:latest
docker rm -f tclip
Then run the above command to recreate the container.
Add the path /var/lib/tclip to your backup program of choice.
systemd has a mechanism for portable
service which are like Docker
images mixed with systemd unit configurations. This allows you to
install tclip on any Linux distribution with systemd (and the
portablectl command, install systemd-container to get this package
on Ubuntu). This lets you view tclip logs with journalctl and
manage it like any other systemd service.
You can download the portable service image from CI by looking at the
recently finished
builds,
clicking on the most recent one, and downloading the
portable-service artifact. This will get you a zipfile that contains
a single .raw file. Copy this .raw file to /var/lib/portable on
your target server. Then run portablectl list to get a list of
available portable services:
$ portablectl list
NAME TYPE RO CRTIME MTIME USAGE STATE
tclip_0.1.0-20230116 raw yes Mon 2023-01-16 16:49:58 UTC Mon 2023-01-16 16:53:59 UTC 14.8M detachedCopy the name of the tclip service including the
auto-generated version number to your clipboard (for example:
tclip_0.1.0-20230116) and pass that to portablectl attach:
$ sudo portablectl attach tclip_0.1.0-20230116Next, create the folder /etc/systemd/system/tclip.service.d
and create the file 10-ts-auth-key.conf in it with the following
contents (be sure to replace <key> with your tailnet authkey):
# /etc/systemd/system/tclip.service.d/10-ts-authkey.conf
[Service]
Environment=TS_AUTHKEY=<key>
Finally, enable tclip.service and start it with systemctl enable --now:
$ sudo systemctl enable --now tclip.serviceWait a moment for it to connect to Tailscale and then check on it with
tailscale status. Your new node named paste should show up in your
tailnet.
To update tclip, first detach the portable service using portablectl detach after finding the list with portablectl list. Then delete
the correlating .raw file in /var/lib/portables. Download a new
one in its place and re-attach and re-enable the service.
Add the path /var/lib/private/tclip to your backup program of
choice.