🏠 home 📓 lab notes 🛠 stack 📖 runbooks ~$ whoami

Shlink (TinyURL)

It’s still a workin progress

  1. Create a folder
    mkdir shlink
    cd shlink
    
  2. Create docker-compose.yml

Use this basic setup with Shlink + MariaDB:

services:
  shlink:
    image: shlinkio/shlink:stable
    container_name: shlink
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      DEFAULT_DOMAIN: yourdomain.com
      IS_HTTPS_ENABLED: true
      GEOLITE_LICENSE_KEY: ""
      DB_DRIVER: maria
      DB_HOST: mariadb
      DB_PORT: 3306
      DB_NAME: shlink
      DB_USER: shlink
      DB_PASSWORD: strongpassword
    depends_on:
      - mariadb

  mariadb:
    image: mariadb:11
    container_name: shlink-db
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: shlink
      MYSQL_USER: shlink
      MYSQL_PASSWORD: strongpassword
    volumes:
      - ./db_data:/var/lib/mysql

Replace:

yourdomain.com → your actual domain strongpassword / rootpassword → strong passwords

  1. Start containers
    docker compose up -d
    

    Check if everything started:

    docker ps
    
  2. Initialize Shlink

Usually first boot handles DB migrations automatically, but you can check logs:

docker logs -f shlink

You should see something like:

Database connected successfully

  1. Generate API key

Run:

docker exec -it shlink shlink api-key:generate

Copy that API key.

  1. Access web/API

By default:

API: http://your-server-ip:8080

Shlink itself is mostly API-driven, so for a GUI install a web client like Shlink Web Client.

Example compose addition:

  shlink-web-client:
    image: shlinkio/shlink-web-client
    container_name: shlink-web
    restart: unless-stopped
    ports:
      - "8081:8080"
    environment:
      SHLINK_SERVER_URL: https://yourdomain.com
      SHLINK_SERVER_API_KEY: your_api_key

Then access:

http://server-ip:8081

  1. Reverse proxy (recommended)

If you use Nginx Proxy Manager, Traefik, or Caddy:

proxy domain → shlink:8080 enable SSL


Questions / idea? Open an issue on GitHub.