2024-04-04 11:40:26 +10:00
|
|
|
<!-- SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com> -->
|
|
|
|
<!-- SPDX-License-Identifier: MIT -->
|
|
|
|
|
2024-04-11 04:46:29 +10:00
|
|
|
[](https://hub.docker.com/r/sintan1729/chhoto-url)
|
|
|
|
[](https://github.com/SinTan1729)
|
|
|
|
[](https://github.com/SinTan1729/chhoto-url/releases/latest)
|
2024-06-22 01:01:19 +10:00
|
|
|

|
2024-04-11 04:46:29 +10:00
|
|
|

|
|
|
|
[](https://spdx.org/licenses/MIT.html)
|
2023-04-10 12:35:51 +10:00
|
|
|
|
2024-03-09 05:33:44 +10:00
|
|
|
#  <span style="font-size:42px">Chhoto URL</span>
|
2022-11-10 09:46:43 +10:00
|
|
|
|
2020-02-15 07:36:50 +10:00
|
|
|
# What is it?
|
2024-03-05 11:05:11 +10:00
|
|
|
A simple selfhosted URL shortener with no unnecessary features. Simplicity
|
|
|
|
and speed are the main foci of this project. The docker image is ~6 MB (compressed),
|
|
|
|
and it uses <5 MB of RAM under regular use.
|
2020-06-19 04:09:43 +10:00
|
|
|
|
2020-06-19 04:13:07 +10:00
|
|
|
Don't worry if you see no activity for a long time. I consider this project
|
|
|
|
to be complete, not dead. I'm unlikely to add any new features, but I will try
|
2024-03-05 11:05:11 +10:00
|
|
|
and fix every bug you report. I will also try to keep it updated in terms of
|
|
|
|
security vulnerabilities.
|
2020-06-19 04:09:43 +10:00
|
|
|
|
2020-06-19 04:13:07 +10:00
|
|
|
If you feel like a feature is missing, please let me know by creating an issue
|
|
|
|
using the "feature request" template.
|
2020-02-15 07:36:50 +10:00
|
|
|
|
|
|
|
## But why another URL shortener?
|
2024-03-27 08:46:26 +10:00
|
|
|
Most URL shorteners are either bloated with unnecessary features, or are a pain to set up.
|
2024-05-31 16:51:11 +10:00
|
|
|
Even fewer are written with simplicity and lightness in mind. When I saw the `simply-shorten`
|
|
|
|
project (linked below), I really liked the idea but thought that it missed some features. Also,
|
2024-03-27 08:46:26 +10:00
|
|
|
I didn't like the fact that a simple app like this had a ~200 MB docker image (mostly due to the
|
|
|
|
included java runtime). So, I decided to rewrite it in Rust and add some features to it that I
|
|
|
|
thought were essential (e.g. hit counting).
|
2020-02-15 07:36:50 +10:00
|
|
|
|
2024-02-11 10:44:15 +10:00
|
|
|
## What does the name mean?
|
2024-03-01 10:29:36 +10:00
|
|
|
Chhoto (ছোট, [IPA](https://en.wikipedia.org/wiki/Help:IPA/Bengali): /tʃʰoʈo/) is the Bangla word
|
|
|
|
for small. URL means, well... URL. So the name simply means Small URL.
|
2024-02-11 10:44:15 +10:00
|
|
|
|
2020-02-15 07:36:50 +10:00
|
|
|
# Features
|
2024-03-05 11:37:36 +10:00
|
|
|
- Shortens URLs of any length to a randomly generated link.
|
2020-02-15 07:36:50 +10:00
|
|
|
- (Optional) Allows you to specify the shortened URL instead of the generated
|
2024-03-05 11:37:36 +10:00
|
|
|
one. (It's surprisingly missing in a surprising number of alternatives.)
|
|
|
|
- Opening the shortened URL in your browser will instantly redirect you
|
|
|
|
to the correct long URL. (So no stupid redirecting pages.)
|
|
|
|
- Super lightweight and snappy. (The docker image is only ~6MB and RAM uasge
|
|
|
|
stays under 5MB under normal use.)
|
2022-11-05 09:53:13 +10:00
|
|
|
- Counts number of hits for each short link in a privacy respecting way
|
2022-12-28 23:31:03 +10:00
|
|
|
i.e. only the hit is recorded, and nothing else.
|
2024-04-04 11:50:27 +10:00
|
|
|
- Has a mobile friendly UI.
|
2024-05-29 09:20:09 +10:00
|
|
|
- Has a public mode, where anyone can add links without authentication. Deleting
|
|
|
|
or listing available links will need admin access using the password.
|
2022-12-28 23:31:03 +10:00
|
|
|
- Allows setting the URL of your website, in case you want to conveniently
|
|
|
|
generate short links locally.
|
|
|
|
- Links are stored in an SQLite database.
|
|
|
|
- Available as a Docker container.
|
2023-04-04 04:52:01 +10:00
|
|
|
- Backend written in Rust using [Actix](https://actix.rs/), frontend
|
2020-02-15 07:36:50 +10:00
|
|
|
written in plain HTML and vanilla JS, using [Pure CSS](https://purecss.io/)
|
2022-12-28 23:31:03 +10:00
|
|
|
for styling.
|
2023-04-09 08:22:59 +10:00
|
|
|
- Uses very basic authentication using a provided password. It's not encrypted in transport.
|
2024-03-07 14:42:06 +10:00
|
|
|
I recommend using something like [caddy](https://caddyserver.com/) to
|
2023-04-09 08:22:59 +10:00
|
|
|
encrypt the connection by SSL.
|
2020-05-24 03:16:27 +10:00
|
|
|
|
|
|
|
# Bloat that will not be implemented
|
2022-11-04 16:41:15 +10:00
|
|
|
- Tracking or spying of any kind. The only logs that still exist are
|
2023-04-11 02:51:20 +10:00
|
|
|
errors printed to stderr and the basic logging (only warnings) provided by the
|
|
|
|
[`env_logger`](https://crates.io/crates/env_logger) crate.
|
2023-04-10 12:35:51 +10:00
|
|
|
- User management. If you need a shortener for your whole organization, either
|
2020-05-24 03:54:27 +10:00
|
|
|
run separate containers for everyone or use something else.
|
2020-05-24 03:16:27 +10:00
|
|
|
- Cookies, newsletters, "we value your privacy" popups or any of the multiple
|
2020-05-24 03:54:27 +10:00
|
|
|
other ways modern web shows how anti-user it is. We all hate those, and they're
|
|
|
|
not needed here.
|
|
|
|
- Paywalls or messages begging for donations. If you want to support me (for
|
2023-04-10 12:35:51 +10:00
|
|
|
whatever reason), you can message me through GitHub issues.
|
2020-02-15 07:36:50 +10:00
|
|
|
|
2024-10-07 11:38:05 +10:00
|
|
|
# Screenshots
|
|
|
|
#### Note: I'm using Dark Reader here to get the dark theme.
|
2024-06-22 00:46:47 +10:00
|
|
|
<p align="middle">
|
2024-06-22 01:01:19 +10:00
|
|
|
<img src="screenshot-desktop.webp" height="250" alt="desktop screenshot" />
|
|
|
|
<img src="screenshot-mobile.webp" height="250" alt="mobile screenshot" />
|
2024-06-22 00:46:47 +10:00
|
|
|
</p>
|
2020-02-16 23:50:49 +10:00
|
|
|
|
2020-02-15 07:36:50 +10:00
|
|
|
# Usage
|
2022-11-06 05:41:00 +10:00
|
|
|
## Using `docker compose` (Recommended method)
|
2022-11-15 15:12:26 +10:00
|
|
|
There is a sample `compose.yaml` file in this repository. It contains
|
2022-11-06 05:41:00 +10:00
|
|
|
everything needed for a basic install. You can use it as a base, modifying
|
|
|
|
it as needed. Run it with
|
|
|
|
```
|
|
|
|
docker compose up -d
|
|
|
|
```
|
2022-11-06 05:44:15 +10:00
|
|
|
If you're using a custom location for the `db_url`, make sure to make that file
|
|
|
|
before running the docker image, as otherwise a directory will be created in its
|
2023-04-10 12:35:51 +10:00
|
|
|
place, resulting in possibly unwanted behavior.
|
2020-02-15 07:36:50 +10:00
|
|
|
|
2024-03-14 10:26:10 +10:00
|
|
|
## Building and running with docker
|
2020-02-15 07:36:50 +10:00
|
|
|
### `docker run` method
|
2024-03-25 16:22:54 +10:00
|
|
|
0. (Only if you really want to) Build the image for the default `x86_64-unknown-linux-musl` target:
|
2020-02-15 07:36:50 +10:00
|
|
|
```
|
2024-03-25 16:22:54 +10:00
|
|
|
docker build . -t chhoto-url
|
2020-02-15 07:36:50 +10:00
|
|
|
```
|
2024-03-25 16:22:54 +10:00
|
|
|
For building on `arm64` or `arm/v7`, use the following:
|
|
|
|
```
|
|
|
|
docker build . -t chhoto-url --build-arg target=<desired-target>
|
|
|
|
```
|
2024-03-25 16:40:10 +10:00
|
|
|
Make sure that the desired target is a `musl` one, since the docker image is built from `scratch`.
|
2024-03-25 16:22:54 +10:00
|
|
|
For cross-compilation, take a look at the `Makefile`. It builds and pushes for `linux/amd64`, `linux/aarch64`
|
|
|
|
and `linux/arm/v7` architectures. For any other architectures, open a discussion, and I'll try to help you out.
|
2020-05-24 03:54:27 +10:00
|
|
|
1. Run the image
|
2020-02-15 07:36:50 +10:00
|
|
|
```
|
2020-03-24 18:07:25 +10:00
|
|
|
docker run -p 4567:4567
|
|
|
|
-e password="password"
|
2024-02-11 10:29:50 +10:00
|
|
|
-d chhoto-url:latest
|
2020-02-15 07:36:50 +10:00
|
|
|
```
|
2020-05-24 03:54:27 +10:00
|
|
|
1.a Make the database file available to host (optional)
|
2020-02-15 07:36:50 +10:00
|
|
|
```
|
2020-04-19 06:53:01 +10:00
|
|
|
touch ./urls.sqlite
|
2020-02-15 07:36:50 +10:00
|
|
|
docker run -p 4567:4567 \
|
2020-03-24 18:07:25 +10:00
|
|
|
-e password="password" \
|
2020-04-19 06:53:01 +10:00
|
|
|
-v ./urls.sqlite:/urls.sqlite \
|
2020-05-24 03:54:27 +10:00
|
|
|
-e db_url=/urls.sqlite \
|
2024-02-11 10:29:50 +10:00
|
|
|
-d chhoto-url:latest
|
2020-02-15 07:36:50 +10:00
|
|
|
```
|
2022-11-11 12:17:39 +10:00
|
|
|
1.b Further, set the URL of your website (optional)
|
|
|
|
```
|
|
|
|
touch ./urls.sqlite
|
|
|
|
docker run -p 4567:4567 \
|
|
|
|
-e password="password" \
|
|
|
|
-v ./urls.sqlite:/urls.sqlite \
|
|
|
|
-e db_url=/urls.sqlite \
|
|
|
|
-e site_url="https://www.example.com" \
|
2024-02-11 10:29:50 +10:00
|
|
|
-d chhoto-url:latest
|
2022-11-11 12:17:39 +10:00
|
|
|
```
|
2020-09-19 18:01:36 +10:00
|
|
|
|
2024-03-31 15:51:10 +10:00
|
|
|
You can set the redirect method to Permanent 308 (default) or Temporary 307 by setting
|
|
|
|
the `redirect_method` variable to `TEMPORARY` or `PERMANENT` (it's matched exactly). By
|
|
|
|
default, the auto-generated links are adjective-name pairs. You can use UIDs by setting
|
|
|
|
the `slug_style` variable to `UID`. You can also set the length of those slug by setting
|
|
|
|
the `slug_length` variable. It defaults to 8, and a minimum of 4 is supported.
|
2023-04-28 15:22:30 +10:00
|
|
|
|
2024-05-29 09:20:09 +10:00
|
|
|
To enable public mode, set `public_mode` to `Enable`. With this, anyone will be able to add
|
|
|
|
links. Listing existing links or deleting links will need admin access using the password.
|
|
|
|
|
2024-06-01 11:30:09 +10:00
|
|
|
By default, the server sends no Cache-Control headers. You can set custom `cache_control_header`
|
|
|
|
to send your desired headers. It must be a comma separated list of valid
|
|
|
|
[RFC 7234 §5.2](https://datatracker.ietf.org/doc/html/rfc7234#section-5.2) headers. For example,
|
|
|
|
you can set it to `no-cache, private` to disable caching. It might help during testing if
|
|
|
|
served through a proxy.
|
2024-05-31 16:42:51 +10:00
|
|
|
|
2024-04-01 15:47:25 +10:00
|
|
|
## Instructions for CLI usage
|
2024-04-01 12:07:31 +10:00
|
|
|
The application can be used from the terminal using something like `curl`. In all the examples
|
|
|
|
below, replace `http://localhost:4567` with where your instance of `chhoto-url` is accessible.
|
|
|
|
|
|
|
|
If you have set up
|
|
|
|
a password, first do the following to get an authentication cookie and store it in a file.
|
|
|
|
```bash
|
|
|
|
curl -X post -d "<your-password>" -c cookie.txt http://localhost:4567/api/login
|
|
|
|
```
|
2024-04-02 04:43:03 +10:00
|
|
|
You should receive "Correct password!" if the provided password was correct. For any subsequent
|
|
|
|
request, please add `-b cookie.txt` to provide authentication.
|
2024-04-01 12:07:31 +10:00
|
|
|
|
|
|
|
To add a link, do
|
|
|
|
```bash
|
2024-04-01 15:47:25 +10:00
|
|
|
curl -X POST -d '{"shortlink":"<shortlink>", "longlink":"<longlink>"}' http://localhost:4567/api/new
|
2024-04-01 12:07:31 +10:00
|
|
|
```
|
|
|
|
Send an empty `<shortlink>` if you want it to be auto-generated. The server will reply with the generated shortlink.
|
|
|
|
|
|
|
|
To get a list of all the currently available links as `json`, do
|
|
|
|
```bash
|
|
|
|
curl http://localhost:4567/api/all
|
|
|
|
```
|
|
|
|
|
|
|
|
To delete a link, do
|
|
|
|
```bash
|
|
|
|
curl -X DELETE http://localhost:4567/api/del/<shortlink>
|
|
|
|
```
|
|
|
|
The server will send a confirmation.
|
|
|
|
|
|
|
|
You can get the version of `chhoto-url` the server is running using `curl http://localhost:4567/api/version` and
|
|
|
|
get the siteurl using `curl http://localhost:4567/api/siteurl`.
|
|
|
|
|
2020-09-19 18:01:36 +10:00
|
|
|
## Disable authentication
|
2023-04-10 08:31:00 +10:00
|
|
|
If you do not define a password environment variable when starting the docker image, authentication
|
|
|
|
will be disabled.
|
2023-04-09 06:56:42 +10:00
|
|
|
|
|
|
|
This if not recommended in actual use however, as it will allow anyone to create new links and delete
|
2020-09-19 18:01:36 +10:00
|
|
|
old ones. This might not seem like a bad idea, until you have hundreds of links
|
|
|
|
pointing to illegal content. Since there are no logs, it's impossible to prove
|
|
|
|
that those links aren't created by you.
|
|
|
|
|
2022-11-12 09:50:12 +10:00
|
|
|
## Notes
|
2024-06-01 11:30:09 +10:00
|
|
|
- It started as a fork of [`simply-shorten`](https://gitlab.com/draganczukp/simply-shorten).
|
2022-11-12 09:50:12 +10:00
|
|
|
- The list of adjectives and names used for random short url generation is a modified
|
2024-03-05 11:05:11 +10:00
|
|
|
version of [this list used by docker](https://github.com/moby/moby/blob/master/pkg/namesgenerator/names-generator.go).
|