Code Monkey home page Code Monkey logo

golink's Introduction

golink

status: experimental

golink is a private shortlink service for your tailnet. It lets you create short, memorable links for the websites you and your team use most. If you're new to golink, learn more in our announcement blog post. If you were looking for a SaaS go link service that doesn't use Tailscale, you might be thinking of golinks.io or trot.to

Screenshot of golink home screen

Building and running

To build from source and run in dev mode:

go run ./cmd/golink -dev-listen :8080

golink will be available at http://localhost:8080/, storing links in a temporary database, and will not attempt to join a tailnet.

The equivalent using the pre-built docker image:

docker run -it --rm -p 8080:8080 ghcr.io/tailscale/golink:main -dev-listen :8080

If you receive the docker error unable to open database file: out of memory (14), use a persistent volume as documented in Running in production.

Updating Dependencies

After updating dependencies and making changes to go.mod and go.sum, flake.nix needs to be updated to reflect the new SHA256 of the go dependencies. This can be done by running:

./update-flake.sh

Joining a tailnet

Create an auth key for your tailnet at https://login.tailscale.com/admin/settings/keys. Configure the auth key to your preferences, but at a minimum we generally recommend:

  • add a tag (maybe something like tag:golink) to make it easier to set ACLs for controlling access and to ensure the node doesn't expires.
  • don't set "ephemeral" so the node isn't removed if it goes offline

Once you have a key, set it as the TS_AUTHKEY environment variable when starting golink. You will also need to specify your sqlite database file:

TS_AUTHKEY="tskey-auth-<key>" go run ./cmd/golink -sqlitedb golink.db

golink stores its tailscale data files in a tsnet-golink directory inside os.UserConfigDir. As long as this is on a persistent volume, the auth key only needs to be provided on first run.

MagicDNS

When golink joins your tailnet, it will attempt to use "go" as its node name, and will be available at http://go.tailnet0000.ts.net/ (or whatever your tailnet name is). To make it accessible simply as http://go/, enable MagicDNS for your tailnet. With MagicDNS enabled, no special configuration or browser extensions are needed on client devices. Users just need to have Tailscale installed and connected to the tailnet.

Running in production

golink compiles as a single static binary (including the frontend) and can be deployed and run like any other binary. Two pieces of data should be on persistent volumes:

  • tailscale data files in the tsnet-golink directory inside os.UserConfigDir
  • the sqlite database file where links are stored

In the docker image, both are stored in /home/nonroot, so you can mount a persistent volume:

docker run -v /persistent/data:/home/nonroot ghcr.io/tailscale/golink:main

The mounted directory will need to be writable by the nonroot user (uid: 65532, gid: 65532), for example by calling sudo chown 65532 /persistent/data. Alternatively, you can run golink as root using docker run -u root.

No ports need to be exposed, whether running as a binary or in docker. golink will listen on port 80 on the tailscale interface, so can be accessed at http://go/.

Deploy on Fly

See https://fly.io/docs/ for full instructions for deploying apps on Fly, but this should give you a good start. Replace FLY_APP_NAME and FLY_VOLUME_NAME with your app and volume names.

Create a fly.toml file:

app = "FLY_APP_NAME"

[build]
image = "ghcr.io/tailscale/golink:main"

[deploy]
strategy = "immediate"

[mounts]
source="FLY_VOLUME_NAME"
destination="/home/nonroot"

Then run the commands with the flyctl CLI.

$ flyctl apps create FLY_APP_NAME
$ flyctl volumes create FLY_VOLUME_NAME
$ flyctl secrets set TS_AUTHKEY=tskey-auth-<key>
$ flyctl deploy

Permissions

By default, users own the links they create and only they can update or delete those links. Ownership can be transferred to another user from the link edit page. Links whose owner is no longer part of the tailnet can be edited by any user, at which point that user will become the new owner.

Users can be granted admin access to edit all links using ACL grants in your tailnet policy file. For example, if you have your golink instance tagged with tag:golink and a user group named group:golink-admins, you can grant them admin access using:

{
  "grants": [{
      "src": ["group:golink-admins"],
      "dst": ["tag:golink"],
      "app": {
        "tailscale.com/cap/golink": [{
            "admin": true
        }]
      }
  }]
}

Or if you want to effectively disable the ownership model and allow everyone in your tailnet to edit all links, you could assign the grant to autogroup:member:

{
  "grants": [{
      "src": ["autogroup:member"],
      "dst": ["tag:golink"],
      "app": {
        "tailscale.com/cap/golink": [{
            "admin": true
        }]
      }
  }]
}

Backups

Once you have golink running, you can backup all of your links in JSON lines format from http://go/.export. At Tailscale, we snapshot our links weekly and store them in git.

To restore links, specify the snapshot file on startup. Only links that don't already exist in the database will be added.

golink -snapshot links.json

You can also resolve links locally using a snapshot file:

golink -resolve-from-backup links.json go/link

Firefox configuration

If you're using Firefox, you might want to configure two options to make it easy to load links:

  • to prevent go/ page loads from the address bar being treated as searches, navigate to about:config and add a boolean setting browser.fixup.domainwhitelist.go with a value of true

  • if you use HTTPS-Only Mode, add an exception

HTTPS

When golink joins your tailnet it will check to see if HTTPS is enabled and begin serving HTTPS traffic it detects that it is. When HTTPS is enabled golink will redirect all requests received by the HTTP endpoint first to their internal HTTPS equivalent before redirecting to the external link destination.

NB: If you use curl to interact with the API of a golink instance with HTTPS enabled over its HTTP interface you must specify the -L flag to follow these redirects or else your request will terminate early with an empty response. We recommend the use of the -L flag in all deployments regardless of current HTTPS status to avoid accidental outages should it be enabled in the future.

golink's People

Contributors

amouat avatar armandocerna avatar bradfitz avatar crawshaw avatar creachadair avatar danderson avatar e-nikolov avatar filosottile avatar gabrielwong159 avatar heilerich avatar icio avatar jwhited avatar kradalby avatar maisem avatar manuelcoppotelli avatar mhofstetter avatar mihaip avatar mullender avatar patka-123 avatar patrickod avatar simonhayward avatar sxlijin avatar vielmetti avatar wasauce avatar willnorris avatar zellyn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

golink's Issues

Add CLI resolver

If Tailscale's unavailable (e.g. you're on the wrong tailnet), it'd be nice as a backup to be easily expand go links from the backup JSON file, using the same templating.

Like:

$ go run github.com/tailscale/golink --resolve-from-backup=/path/to/backup.json go/meet/bar
http://meet.google.com/lookup/bar

cc @willnorris

How to update tailscale version

I wanted to build a Docker image with the most up to date Tailscale.
From what I could see it seems that go.mod is where I can define the Tailscale version.

It uses a pseudo-version, currently v1.1.1-0.20221106050213-036334e91350, which somehow maps to Tailscale v1.33.0-dev20221229.
But I didn't have any luck figuring out what pseudo-version I would have to set to update it to e.g. Tailscale v1.34.1

Could anyone give me a pointer as to how the specific Tailscale version is selected?

Canonical Stats

I'm not actually sure if this is an issue, but it surprised me so I thought I'd query it.

I've defined go/cu-devops to take me to our DevOps work board (think Trello), and that works fine. Shows up in the stats as go/cu-devops.

I then remembered the logic strips - so I could visit go/cudevops and did so. This shows up as a separate entry in the stats now, although clicking the (i) on either go/cu-devops or go/cudevops shows the go/cu-devops Link to be edited.

Should we coalesce the stats entries to the Link value, so missing out hypens doesn't duplicate entries for the same Link?

Add a search feature

The /.all endpoint exists, and you can Control + f in that page, but it might be nice to have a search input on the main page, too.

Connection failure running under Docker

I'm running golink through docker, and while it used to work, it started producing a 404 error, and now appears to be stuck in a connection loop. I tried removing the docker instance and the machine from tailscale, but this is still occurring with a clean install.

I provided a key using TS_AUTHKEY when creating the instance, but while the machine now exists in the tailscale machines page, it shows no connection, and the docker log seems to suggest the key is invalid. Generating a new authkey and replacing the existing one did not resolve the issue, and did not change the logs as far as I can see.

Docker log:

2023/11/14 16:55:56 control: [v1] authRoutine: state:authenticating; wantLoggedIn=true
2023/11/14 16:55:56 control: [v1] direct.TryLogin(token=false, flags=10)
2023/11/14 16:55:56 control: LoginInteractive -> regen=true
2023/11/14 16:55:56 control: doLogin(regen=true, hasUrl=false)
2023/11/14 16:55:56 control: Generating a new nodekey.
2023/11/14 16:55:56 control: RegisterReq: onode= node=[ZhdCM] fup=false nks=false
2023/11/14 16:55:56 control: RegisterReq: got response; nodeKeyExpired=false, machineAuthorized=false; authURL=false
2023/11/14 16:55:56 control: [v1] TryLogin: invalid key: unable to validate API key
2023/11/14 16:55:56 control: [v1] sendStatus: authRoutine-report: state:authenticating
2023/11/14 16:55:56 control: authRoutine: [v1] backoff: 22694 msec
2023/11/14 16:55:56 Received error: invalid key: unable to validate API key
2023/11/14 16:56:19 control: [v1] authRoutine: state:authenticating; wantLoggedIn=true
2023/11/14 16:56:19 control: [v1] direct.TryLogin(token=false, flags=10)
2023/11/14 16:56:19 control: LoginInteractive -> regen=true
2023/11/14 16:56:19 control: doLogin(regen=true, hasUrl=false)
2023/11/14 16:56:19 control: Generating a new nodekey.
2023/11/14 16:56:19 control: RegisterReq: onode= node=[Hq+DJ] fup=false nks=false
2023/11/14 16:56:19 control: RegisterReq: got response; nodeKeyExpired=false, machineAuthorized=false; authURL=false
2023/11/14 16:56:19 control: [v1] TryLogin: invalid key: unable to validate API key
2023/11/14 16:56:19 control: [v1] sendStatus: authRoutine-report: state:authenticating
2023/11/14 16:56:19 control: authRoutine: [v1] backoff: 24477 msec
2023/11/14 16:56:19 Received error: invalid key: unable to validate API key

Add support for conditional paths

This suggestion is born from an internal slack thread. It would be excellent have a text matching feature for go links (using some form of regex) to allow for conditional paths.

"duplicate node key" when running two golink services on the same machine with different hostnames

My goal: use one machine to run two different instances of "golink", so that I can have two independent sets of bookmarks.

This didn't work out of the box - I created a new key, started up the second instance with the -hostname flag, and then got the error message on the console Duplicate node key.

My suspicion is that I'm running into this:

tailscale data files in the tsnet-golink directory inside [os.UserConfigDir](https://pkg.go.dev/os#UserConfigDir)

and that I have to set two separate os.UserConfigDir paths to keep the two things distinct.

handle query parameters

We don't handle query parameters at all right now. There are a few things we should pretty obviously support, but there are also some things that are not so clear.

For example, today http://go/who?q is treated as a link with the short name who?q rather than a link with the short name who and a query string of ?q. That's definitely something we should fix (and simple enough, using r.URL.Path rather than r.RequestURI). And should the query string be included in the final destination link? I think probably so.

What's less clear is when a link's destination URL also contains a query. What happens with any path components from the request? What about query parameters from the request? Do they get combined with the parameters in the destination URL? Do we expose the original query as a template var or func?

Restore all links from one export

It would be great if the golinks server could restore all links from an export if given a JSONL file. That way I could declare all my links in git and use a configmap in k8s to supply them to golink

golink collapses double slashes in URL path

Start with the go link go/ladder => http://ladder/. When appending a full URL to the extra path, the // gets collapsed down to a single /:

% curl -i http://go/ladder/http://bbc.com/
Location: /ladder/http:/bbc.com/

This isn't technically wrong, but for a project like ladder this is undesirable.

For imageproxy, I dealt with a similar issue by switching to gorilla's Mux, and disabling path cleaning. I'd rather not do that here if we can keep from it. But if I remember correctly, the default http.ServeMux always cleans paths and doesn't provide the ability to disable that. There's work happening on http.ServeMux in go1.22, so I can look and see if any of that would be helpful here.

Can the Docker container have a HEALTHCHECK?

The golink binary uses tsnet internally to connect to the tailnet. Is there a way to hook up a HEALTHCHECK to return the status of the golink binary’s internal tsnet connection? That sounds tricky now that I write it, but it would be pretty cool if the Docker health status could reflect the tailnet connection status.

Deploying on Render

We use Render as our host. I tried deploying the Docker image for golink as a private service on Render, however it's not quite working.

I think it's because Docker services on Render do not have full networking capabilities. Render's team provides a sample script for running the Tailscale daemon here. The script uses the --tun=userspace-networking and --socks5-server=localhost:1055 flags and sets the ALL_PROXY environment variable to socks5://localhost:1055/.

I don't know enough about Tailscale or networking to say what exactly would be needed to make Golink work on Render, but AFAICT there is currently no way to pass custom arguments supported by the standalone Tailscale daemon like --tun to the Tailscale client embedded in the Golink service anyway (I think this is what #79 is requesting).

Happy to provide more details about the exact behavior I'm observing when trying to deploy on Render.

"sqlite is busy" error

I saw a sqlite busy error when attempting to follow a link earlier. I suspect there may be some concurrency issues on writes that could use a retry.

I've not looked, but when I've had to do this kind of thing before, I had to bring my own lock and/or async writes (e.g., for updating counts where a failure doesn't lead to a real correctness problem).

I think you have to be kind of lucky to see the error in general, but it'd likely show up in a load test.

Please Tag Versions

While it's nice to be able to just use the "main" tag for the latest update, I would like to specifically know when I'm using a newer version of golink.

The primary problem is right now golink will fall behind in versioning from the tailscale.com go module, hence the "upgrade available" notification in the UI. Right now, I just do a re-deploy from time to time in hopes that maybe the tailscale.com version has been upgraded. Sometimes it has been updated and sometimes it hasn't. Instead of just blindly deploying just to see if the dependency has been updated, I'd rather pin to a specific tagged semantic version so I know if there isn't a new semantic version available, then there is no need to re-deploy.

Feature request: support for aliases

Some of the go-link systems that I've used in the past have supported aliases for a given link. I know it would be possible to just create multiple items using the same link, but ideally if a link gets updated, all the alternate names get updated at once.

ACTION REQUIRED: Changes to pulling Chainguard Images

Hey there Chainguard here.

We noticed that you are using Chainguard Images, thank you! We wanted to make you aware of an upcoming change that will impact your project.

Starting August 16, 2023 public users will no longer be able to pull images from our registry (cgr.dev/chainguard) by tags other than latest or latest-dev. Please see the announcement for more information.

You are currently using the following.

In https://github.com/tailscale/golink/blob/843e615dbfdfaa927d1794b9e4ef2f6fa6156b2e/Dockerfile:

  • cgr.dev/chainguard/go:1.20

Our goal is to prevent your project from experiencing any disruptions. Please see the migration guide for options.

If there's more we can do to help please reply to this issue or email us at [email protected].

Thank you!

loading data from an old instance into a new golink db running on fly.io

Situation: I have an existing golink installation, running on a Pi
locally. There are about 200 links there. I also have a brand new
fly.io installation of golink, following the instructions in the README.

I'd like to migrate the data from my old install to the new one.

One approach is simply to recreate the links, taking as input
the go/.export file and looping around a curl command that
does a PUT as described in go/.help . I think I can do that
with jq, awk, and sh.

A second would be to log into the fly.io console, upload some
files, then modify the Dockerfile to use the -snapshot approach
to get things started. I'm less clear on all of the details there.

Any other options I'm missing? I am pretty sure I'll lose use count
information in any circumstance. I have only a single user in this
tailnet so I won't lose who created the link.

users getting xsrf errors

A number of users are seeing somewhat random XSRF errors when updating or deleting links. We think it is due to how XSRF tokens are generated. The /.detail/ page allows you to provide a non-canonical form of the link's short name and it will still resolve properly. For example, the link might be go/foo, but http://go/.detail/F-o-O will still load the correct detail page. In some cases, XSRF token generation and validation is based on the short name provided in the URL (F-o-O in the above example) and sometimes it's based on the canonical form stored in the database (foo in the above example).

FR: Add port to template

It would be cool if golink templates have the field Port, so it would be possible to have a link like:

go/lh -> http://localhost{{if .Port}}:{{.Port}}{{end}}
go/lh:8080 -> http://localhost:8080
go/lh:9090 -> http://localhost:9090

Another error deploying on Fly.io

Trying to deploy on Fly.io and hitting a new error:

#11 0.677 # cd /work; git status --porcelain
#11 0.677 fatal: detected dubious ownership in repository at '/work'
#11 0.677 To add an exception for this directory, call:
#11 0.677
#11 0.677       git config --global --add safe.directory /work
#11 0.678 error obtaining VCS status: exit status 128
#11 0.678       Use -buildvcs=false to disable VCS stamping

golink owner is getting mangled

I was trying to edit a link I made from my phone and it told me I wasn't the owner and [my address] was. This was surprising. I came back and looked from my computer and saw the same thing.

So I looked at another link that I'd made more recently and I saw that the owner was tagged-devices.

A possible workaround might be #18, but I'm very strongly advocating for this at work, so it might be good to have a better understanding of what's going on here.

Cannot create a link from a subnet-routed host

I have both hosts directly on my tailnet and those connected to it via subnet routes. When I use one of the former to create a link or access link details, it works great, but if I try and use one of the latter, it fails with the error:

404 Not Found: no match for IP:port

although using the links works fine. I suspect this is because it can't find the Tailscale user from the address of indirectly connected hosts.

Is there a way around this? Perhaps by also checking the subnet route list if the host IP isn't in the tailnet range?

Feature request: option to disable HTTPS

It was really awesome to see that HTTPS was getting added in #99, to resolve #29, which helps workflows for some people. However, I'd rather have HTTPS turned off. I've configured my browser to ignore the missing HTTPS, and don't use the opensearch xml feature. One of the downsides of having this turned on, is that golink needs to acquire a new cert on initial deployment, which takes time to get the service live (not a big problem, but also a bit annoying).

I know you can turn off HTTPS from the Admin console, which I did, as I don't use the HTTPS feature of Tailscale atm. However, I'd like to be able to turn this on in the future, and don't get golink breaking on this, which I'll have completely forgotten about in a couple of months.

Yeah, I know, I guess XKCD 1172 is applicable ;) Though, I am willing to contribute a PR, which I'd gladly do. Would you be willing to accept a PR to add support for a configuration flag to override this behavior?

Golink from Docker not accessible from tailscale

I am executing this command

docker run -it -v --rm -e TS_AUTHKEY='tskey-auth-kc<>Jn' -v /tmp/golink:/root ghcr.io/tailscale/golink:main  -sqlitedb /root/test.db -verbose

The output looks good: Serving http://go/ ...

I can resolve the hostname:

dscacheutil -q host -a name go
name: go.tig<>.ts.net
ip_address: 100.<>.217.100

But when I attempt to visit http://go the connection times out:

curl go
curl: (28) Failed to connect to go port 80 after 75007 ms: Operation timed out

I must be holding it wrong :)

support redundant deployment

currently, golink is singly-homed. That can make your coworkers sad when that one instance goes down for whatever reason. We should allow for running multiple redundant copies of golink. At a minimum, we should make it easier to run read-only replicas. Much fancier would be to allow secondary replicas to proxy writes to a single primary replica.

Related: https://github.com/tailscale/corp/issues/18849

Container fails to start: `unable to open database file: out of memory (14)`

Running a minimal container with no volume mounts results in

docker run --rm ghcr.io/tailscale/golink:main
2022/11/14 14:34:02 NewSQLiteDB("/root/golink.db"): unable to open database file: out of memory (14)

or

version: "3"
services:
  golink:
    image: ghcr.io/tailscale/golink:main
    container_name: golink
    restart: unless-stopped
    command: "-verbose -sqlitedb /root/golink.db"
2022/11/14 14:30:55 NewSQLiteDB("/root/golink.db"): unable to open database file: out of memory (14)

However, running and building the binary directly works without an issue:

go run github.com/tailscale/golink/cmd/golink@latest -verbose -sqlitedb /persist/golink/golink.db

Golinks giving build constraints error after update

Not sure if this is specific to my setup or a wider issue with some more common update. Running Ubuntu 22.04.3, and after a series of system/application updates I'm now getting the below error when trying to start the golinks service using the following Terminal command:

TS_AUTHKEY="tskey-auth-{keygoeshere}" go run ./cmd/golink -sqlitedb golink.db


imports github.com/tailscale/golink
imports tailscale.com/tsnet
imports tailscale.com/ipn/ipnlocal
imports tailscale.com/wgengine
imports tailscale.com/net/tstun
imports gvisor.dev/gvisor/pkg/tcpip
imports gvisor.dev/gvisor/pkg/atomicbitops
imports gvisor.dev/gvisor/pkg/state
imports gvisor.dev/gvisor/pkg/state/wire
imports gvisor.dev/gvisor/pkg/gohacks: build constraints exclude all Go files in /home/administrator/go/pkg/mod/gvisor.dev/[email protected]/pkg/gohacks


Also a Linux complete noob, but I tried running "./update-flake.sh" and "go clean -modcache" which both completed -though the error remains.

systemd unit files for golink

If you are not running golink out of a container, it would be helpful to have
a systemd unit file to start the service.

(In my particular case, I'm running two separate golink instance on the same
machine, so that probably means two separate systemd configurations.)

Possible trademark infringement?

IANAL.

The founder of https://golinks.io holds a number of U.S. trademarks related to the name "GO LINKS". If nobody has done so, it may be advisable to seek guidance from legal to avoid any sort of tiff with a product that offers exactly this functionality that is covered under existing U.S. trademarks.

Safari turns my go/link URL into a web search

System configuration: Safari Version 16.0 (17614.1.25.9.10, 17614), macOS Monterey 12.6 (21G115).

I have set up a "go" endpoint, and when I type "go" into the search / URL entry box, it properly sends me to the "go" endpoint on my talent.

I have a link defined, go/gmail . It's listed as a "popular link", and when I click on it it does the expected thing and redirects.

However.

If I type go/gmail into the URL entry box at the top, the system misinterprets go/gmail as a search string, and puts me on a Google search results page.

The issue appears to be "Safari ignores local domain" - https://discussions.apple.com/thread/5504425 - and the suggested workaround (ick) is to either use a fully qualified domain name, or use the http:// prefix. (Or, probably, use Chrome.)

FR: API access to click counts

Since #3 was merged neither the export nor the detail API endpoint provide click counts anymore. It might not be required or desirable for snapshots / backups, but it would be great for other integrations e.g. to better sort search results (I made myself a little Alfred integration).

Could we bring back the (optional) export of click counts? Or is there some important reason this functionality was removed?

FR: Ability to bypass owner checks

Hi folks,

Thanks for putting this together, it's incredible!

We're using this in a smaller company, and would like the ability to opt-out of ownership checks when editing links. At our scale (<10 engs) it's somewhat more useful to let anyone change these.

Ideally this would be a checkbox during the golink creation, thinking we can iterate towards there. Useful crawl solution can be a global flag to opt-out of the checks (a la -skip-ownership-checks).

Happy to take this on if you think it's directionally right.

MagicDNS now seems to be required for go-links to work

With MagicDNS disabled:

$ dig go +short
100.99.0.1

$ curl go/ -I
curl: (28) Failed to connect to go port 80 after 75437 ms: Couldn't connect to server

With MagicDNS enabled (and a restart):

$ curl go/ -I
НТТР/1.1 302 Found
Content-Type: text/html; charset=utf-8
Location: https:/go.bunny-major.ts.net/
Date: Tue, 19 Dec 2023 18:06:27 GMT

НТТР/1.1 200 0K
Date: Tue, 19 Dec 2023 18:06:27 GMT

The docker logs say:

2023/12/19 18:01:11 tsnet: you must enable HTTPS in the admin panel to proceed. 

Entire log after a restart with MagicDNS disabled: https://pastebin.com/921CSuZZ (can't include it here -- too long)

ARM support

Status: Downloaded newer image for ghcr.io/tailscale/golink:main
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm/v7) and no specific platform was requested

Hi, any resource to pass this? Attempting to run via docker on my Turris Omnia (Marvell Armada 385 (dual core armv7) running Turris OS(OpenWRT Fork))

FR: Ability to delete golinks

Unless I'm missing something, I'd be great to have a way to delete golinks that are no longer needed. I've tried everything I can reasonably think of:

  • Sending DELETE requests to go/<name>+ (results in the server just responding with the details for the shortname);
  • Sending DELETE requests to go/<name> (results in the server redirecting me to the destination);
  • Appending ?action=delete onto go/<name>+ (results in 404)
  • Even clearing one or both of the shortname and destination fields in the golink web editor (results in "please fill out this field")

Add favicon

When pinning the go/ tab, I noticed it doesn't have a favicon so it's just showing as a blank box in Safari (haven't tested on other browsers):

image

It would be great to have some sort of icon included.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.