2021-04-30 05:28:21 +03:00
|
|
|
<!DOCTYPE html>
|
|
|
|
<html lang=en>
|
2021-08-09 02:52:45 +03:00
|
|
|
<head>
|
|
|
|
<title>A Minimal, SQLite-Backed URL Shortener</title>
|
|
|
|
<meta charset='utf-8'>
|
|
|
|
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
|
|
|
|
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
|
|
|
|
<meta name='viewport' content='width=device-width, initial-scale=1'>
|
|
|
|
<meta content='A minimal, SQLite backed URL shortener. Made with Go, Vim, and FreeBSD.' name='description'>
|
|
|
|
</head>
|
|
|
|
<body style='font-family: monospace; max-width: 80ch;'>
|
2021-04-30 05:28:21 +03:00
|
|
|
|
|
|
|
<header>
|
|
|
|
A Minimal, SQLite-Backed URL Shortener
|
|
|
|
</header>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
@media (max-width: 1000px) {
|
2021-08-09 02:52:45 +03:00
|
|
|
pre code {
|
|
|
|
display: block;
|
|
|
|
max-width: 100%%;
|
|
|
|
overflow-x: auto;
|
|
|
|
-webkit-overflow-scrolling: touch;
|
|
|
|
padding: 0 5px 5px 0;
|
|
|
|
}
|
2021-04-30 05:28:21 +03:00
|
|
|
}
|
|
|
|
</style>
|
|
|
|
|
|
|
|
<pre><code>| Examples:
|
2021-08-09 02:52:45 +03:00
|
|
|
|
|
2021-04-30 05:28:21 +03:00
|
|
|
| 1. Create a short link to https://duckduckgo.com
|
2021-08-09 02:52:45 +03:00
|
|
|
| $ curl -d https://duckduckgo.com {{.URL}}
|
|
|
|
| {{.URL}}/502fb5543c36014f
|
|
|
|
|
|
2021-06-06 02:03:35 +03:00
|
|
|
| 2. Create a short link with a custom path
|
2021-08-09 02:52:45 +03:00
|
|
|
| $ curl -d https://duckduckgo.com {{.URL}}/ddg
|
|
|
|
| {{.URL}}/ddg
|
|
|
|
|
|
2021-08-12 21:10:17 +03:00
|
|
|
| 3. Create a short link to https://duckduckgo.com using a query string
|
2021-08-09 02:52:45 +03:00
|
|
|
| $ curl {{.URL}}?https://duckduckgo.com
|
|
|
|
| {{.URL}}/1acd382417199d7e
|
|
|
|
|
|
|
|
|
| 4. Create a short link with a custom path using a query string
|
|
|
|
| $ curl {{.URL}}/ddg?https://duckduckgo.com
|
|
|
|
| {{.URL}}/ddg
|
|
|
|
|
|
2021-08-09 04:33:52 +03:00
|
|
|
| 5. You can also pass an encoded URL:
|
|
|
|
| $ curl {{.URL}}?https%3A%2F%2Fduckduckgo.com
|
|
|
|
| {{.URL}}/1dc4cb37e81de396
|
|
|
|
|
|
|
|
|
| 6. Deleting a short link
|
2021-08-09 02:52:45 +03:00
|
|
|
| $ TMP=$(mktemp)
|
|
|
|
| $ # temp file will store header
|
|
|
|
| $ LINK=$(curl -sS {{.URL}} -d https://duckduckgo.com -D $TMP)
|
|
|
|
| $ # the link has been successfully created
|
|
|
|
| $ DEL=$(cat $TMP | grep -i delete-with | awk '{print$2}'| tr -d '\r')
|
|
|
|
| $ # deletion key is stored in 'X-Delete-With' header.
|
|
|
|
| $ curl $LINK
|
|
|
|
| <a href="https://duckduckgo.com">Permanent Redirect</a>.
|
|
|
|
| $ # the link is working as expected
|
|
|
|
| $ curl $LINK -X DELETE -d $DEL
|
|
|
|
| $ curl $LINK
|
|
|
|
| record not found
|
|
|
|
| $ # the link has been successfully deleted.</code></pre>
|
|
|
|
|
2021-06-06 02:03:35 +03:00
|
|
|
{{if .Demo}}
|
2021-04-30 05:28:21 +03:00
|
|
|
<p>
|
2021-08-09 02:52:45 +03:00
|
|
|
Please note: this is an example deployment. If you attempt to create a short
|
2021-04-30 05:28:21 +03:00
|
|
|
link here you will receive a 401 Unauthorized. If you like the examples above
|
|
|
|
and want to use this URL shortener you should self-host an instance. It's easy
|
|
|
|
to do (one of the design goals). Below are instructions detailing how.
|
|
|
|
<p>
|
2021-08-09 02:52:45 +03:00
|
|
|
{{end}}
|
|
|
|
|
2021-04-30 05:28:21 +03:00
|
|
|
<pre><code>| How to self-host:
|
2021-08-09 02:52:45 +03:00
|
|
|
|
|
2021-06-06 02:03:35 +03:00
|
|
|
| 1. Install dependencies
|
2021-08-09 02:52:45 +03:00
|
|
|
| a. The Go programming language
|
|
|
|
| <a href='https://golang.org/doc/install'>https://golang.org/doc/install</a>
|
|
|
|
| b. Git version control
|
|
|
|
| <a href='https://git-scm.com/book/en/v2/Getting-Started-Installing-Git'>https://git-scm.com/book/en/v2/Getting-Started-Installing-Git</a>
|
|
|
|
|
|
|
|
|
| * Most distributions should have Go and Git in their repositories,
|
|
|
|
| simply as go and git.
|
|
|
|
| Install these through your package manager, e.g.:
|
|
|
|
| # pacman -S go git
|
|
|
|
| # emerge --ask dev-lang/go dev-vcs/git
|
|
|
|
| # apt install go git
|
|
|
|
|
|
|
|
|
| 2. Fetch and compile the source code
|
|
|
|
| # env GO111MODULE=off go get git.swurl.xyz/swirl/link
|
|
|
|
|
|
|
|
|
| 3. Copy the binary to your binary directory
|
|
|
|
| # cp $GOPATH/bin/link /usr/local/bin/linkserv
|
|
|
|
| # # Named linkserv to prevent conflicts with GNU link
|
|
|
|
|
|
2021-08-12 21:19:18 +03:00
|
|
|
| 4. Create a directory to store your database
|
2021-08-09 02:52:45 +03:00
|
|
|
| # mkdir -p /srv/link
|
|
|
|
|
|
2021-08-12 21:19:18 +03:00
|
|
|
| 5. (optional) Copy the example systemd service
|
|
|
|
| # cp doc/link.service /etc/systemd/system/
|
2021-08-09 02:52:45 +03:00
|
|
|
| * You can also create an equivalent for openrc, runit, etc.
|
|
|
|
|
|
2021-08-12 21:19:18 +03:00
|
|
|
| 6. Change the domain to reflect your setup
|
|
|
|
| # sed -i 's/your.doma.in/[DOMAIN HERE]/g' /etc/systemd/system/link.service
|
|
|
|
|
|
|
|
|
| 7. Change the seed to something secure
|
|
|
|
| # sed -i 's/secret/SecretPasswordHere/g' /etc/systemd/system/link.service
|
|
|
|
|
|
|
|
|
| 8. Enable and start the service
|
|
|
|
| # systemctl enable --now link
|
2021-08-09 02:52:45 +03:00
|
|
|
|
|
2021-08-12 21:19:18 +03:00
|
|
|
| 9. Or, run it manually
|
2021-08-09 02:52:45 +03:00
|
|
|
| # linkserv -url http://your.doma.in -db /srv/link/link.db -seed "secret"
|
|
|
|
|
|
2021-04-30 05:28:21 +03:00
|
|
|
| * The server is now running on localhost at port 8080.
|
2021-08-09 02:52:45 +03:00
|
|
|
| * If the SQLite database does not exist, it will be created.
|
|
|
|
| * All logging will be printed to standard error and standard output.
|
|
|
|
|
|
|
|
| Set up an NGINX reverse proxy:
|
|
|
|
|
|
|
|
|
| 1. Install dependencies
|
|
|
|
| * nginx
|
|
|
|
| * certbot
|
|
|
|
| * certbot nginx plugin
|
|
|
|
|
|
|
|
|
| * Most distributions should have these in their repositories:
|
|
|
|
| # pacman -S nginx certbot-nginx
|
|
|
|
| # emerge --ask www-servers/nginx app-crypt/certbot-nginx
|
|
|
|
| # apt install nginx python-certbot-nginx
|
|
|
|
|
|
2021-08-12 21:19:18 +03:00
|
|
|
| 2. Copy the example site file
|
|
|
|
| # cp doc/link.nginx.conf /etc/nginx/sites-available/link
|
|
|
|
|
|
|
|
|
| 3. Change the domain to reflect your setup
|
|
|
|
| # sed -i 's/your.doma.in/[DOMAIN HERE]/g' /etc/nginx/sites-available/link
|
2021-08-09 02:52:45 +03:00
|
|
|
|
|
2021-08-12 21:19:18 +03:00
|
|
|
| 4. Enable the site
|
2021-08-09 02:52:45 +03:00
|
|
|
| # ln -s /etc/nginx/sites-{available,enabled}/link
|
|
|
|
|
|
2021-08-12 21:19:18 +03:00
|
|
|
| 5. Enable https for the site
|
2021-08-09 02:52:45 +03:00
|
|
|
| # certbot --nginx -d your.doma.in
|
|
|
|
|
|
2021-08-12 21:19:18 +03:00
|
|
|
| 6. Enable and start nginx
|
2021-08-09 02:52:45 +03:00
|
|
|
| # systemctl enable --now nginx
|
|
|
|
| # # Or, if you already have nginx running, reload it:
|
|
|
|
| # systemctl reload nginx
|
|
|
|
|
|
|
|
|
| * Your site should now be running on https://your.doma.in.
|
|
|
|
| * To run in a subdirectory, simply put the proxy_pass in the subdirectory, e.g.:
|
|
|
|
location /shortener {
|
|
|
|
proxy_pass http://localhost:8080;
|
|
|
|
}
|
|
|
|
| * If you want to use another HTTP server, then create the equivalent for that HTTP server.
|
|
|
|
</code></pre>
|
|
|
|
|
|
|
|
<footer style='white-space: pre;'>Source code: <a href='https://short.swurl.xyz/src'>short.swurl.xyz/src</a></a>
|
|
|
|
License: AGPL v3{{if .Copy}}
|
|
|
|
Copy: {{.Copy}}{{end}}
|
|
|
|
Made with: Go, Neovim, and Gentoo/Arch Linux
|
2021-04-30 05:28:21 +03:00
|
|
|
</footer>
|
2021-08-09 02:52:45 +03:00
|
|
|
</html>
|