Awesome
<img src="wwwroot/img/jsi-logo.png" alt="" width="80" />Just Short It (damnit)!
The most KISS single user URL shortener there is.
To simply run Just Short It in a container run:
docker run -e JSI_BaseUrl=<your-url> \
-e JSI_Account__Username=<your-username> \
-e JSI_Account__Password=<your-password> \
-p 80:8080 \
miawinter/just-short-it:latest
In Docker Compose:
services:
just-short-it:
container_name: JustShortIt
image: miawinter/just-short-it:latest
ports:
- "80:8080"
environment:
- "JSI_BaseUrl=<your-url>"
- "JSI_Account__Username=<your-username>"
- "JSI_Account__Password=<your-password>"
- "JSI_CUSTOMIZATION__GENERATEDIDLENGTH=6" # optional, range 2 to 16, default: 6
Redis
By default Just Short It saves all the redirects in a in-memory distributed Cache, which get's lost whenever the container restarts, so if you want to keep your redirects you wanna use redis.
You can configure the connection to redis using the environment variables JSI_Redis__ConnectionString
and optional JSI_Redis__InstanceName
(default is "JustShortIt").
If you want to run both with compose, the most simple setup looks like this:
services:
just-short-it:
container_name: JustShortIt
image: miawinter/just-short-it:latest
ports:
- "80:8080"
environment:
- "JSI_BaseUrl=<your-url>"
- "JSI_Account__Username=<your-username>"
- "JSI_Account__Password=<your-password>"
- "JSI_Redis__ConnectionString=redis,password=<your-redis-password>"
depends_on:
- redis
redis:
container_name: Redis
image: redis:alpine
environment:
- "REDIS_PASSWORD=<your-redis-password>"
volumes:
- redis:/data
volumes:
redis:
There you go, now your urls survive a restart!
Https
Just Short It! is not supporting Https, I reconmend using a reverse Proxy for hosting that handles SSL. I personally have experience with two types of reverse proxies here: caddy and nginx-proxy.
Caddy
The easiest way to get https with a reverse proxy is Caddy.
services:
# Just Short It
just-short-it:
container_name: JustShortIt
image: miawinter/just-short-it:latest
environment:
- "JSI_BaseUrl=<your-url>"
- "JSI_Account__Username=<your-username>"
- "JSI_Account__Password=<your-password>"
- "JSI_Redis__ConnectionString=redis,password=<your-redis-password>"
depends_on:
- redis
redis:
container_name: Redis
image: redis:alpine
environment:
- "REDIS_PASSWORD=<your-redis-password>"
volumes:
- redis:/data
caddy:
container_name: Caddy
image: caddy:latest
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- caddy_sites: /sites
- caddy_data: /data
- caddy_config:/config
- ./Caddyfile:/etc/caddy/Caddyfile
volumes:
redis:
caddy_sites:
caddy_data:
caddy_config:
Then you need a Caddyfile
:
<your_domain> {
tls <your-email>
reverse_proxy JustShortIt:8080
}
The tls property is the email used for let's encrypt, there you would be notified if a
certificate is about to expire (which won't happen as long as caddy is running, because
it automatically requests new ones before they do).
The domain should only be [subdomain?].[domain].[tls], if you prefix it with http or https
caddy will only support that, but without this caddy responds to both and will automatically
redirect from http to https, as well as take care of the https certificates.
nginx-prodxy
jwilders nginx-proxy togehter with acme-companion.
Here is an Example of how to use Just Short It! togehter with nginx-proxy:
services:
# Just Short It
just-short-it:
container_name: JustShortIt
image: miawinter/just-short-it:latest
environment:
- "JSI_BaseUrl=<your-url>"
- "JSI_Account__Username=<your-username>"
- "JSI_Account__Password=<your-password>"
- "JSI_Redis__ConnectionString=redis,password=<your-redis-password>"
environment:
- "VIRTUAL_HOST=<your-url>"
- "VIRTUAL_PORT=8080"
- "LETSENCRYPT_HOST=<your-url>"
depends_on:
- redis
- acme-companion
redis:
container_name: Redis
image: redis:alpine
environment:
- "REDIS_PASSWORD=<your-redis-password>"
volumes:
- redis:/data
# nginx-proxy with acme-companion
nginx-proxy:
container_name: nginx-proxy
restart: unless-stopped
image: jwilder/nginx-proxy:alpine
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- certs:/etc/nginx/certs:ro
- conf:/etc/nginx/conf.d
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
environment:
- "DHPARAM_GENERATION=false" # Not sure you need this actually
- "DISABLE_ACCESS_LOGS" # Always nice to comply with GDPR
acme-companion:
container_name: acme-companion
restart: unless-stopped
image: nginxproxy/acme-companion
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- certs:/etc/nginx/certs:rw
- conf:/etc/nginx/conf.d
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- /etc/acme.sh:/etc/acme.sh
environment:
- "DEFAULT_EMAIL=<your-email>"
- "NGINX_PROXY_CONTAINER=nginx-proxy"
depends_on:
- nginx
volumes:
# Just Short It!
redis:
# Proxy
certs:
conf:
vhost:
html:
License and Attribution
Just Short It by Mia Winter is licensed under the MIT License.
Just Short It uses tailwindcss, licensed under the MIT License
Just Short It uses daisyUI, licensed under the MIT License
Just Short It uses PostCSS, licensed under the MIT License
Just Short It uses PostCSS CLI, licensed under the MIT License
Just Short It uses autoprefixer, licensed under the MIT License
Just Short It uses cssnano, licensed under the MIT License
Just Short It uses heroicons, licensed under the MIT License
Copyright (c) 2024 Mia Winter