Add Docker Compose setup for self-hosted Shlink on Coolify

This commit is contained in:
Julien Calixte
2026-03-19 22:34:21 +01:00
parent e34496d1ea
commit ddd73aacbd
4 changed files with 74 additions and 0 deletions

17
.env.example Normal file
View File

@@ -0,0 +1,17 @@
# Your short URL domain (e.g. s.example.com)
DEFAULT_DOMAIN=s.example.com
# Set to false if running without TLS termination
IS_HTTPS_ENABLED=true
# Database
DB_NAME=shlink
DB_USER=shlink
DB_PASSWORD=change_me_strong_password
# Generate a UUID or random string for the initial API key
# e.g.: openssl rand -hex 32
INITIAL_API_KEY=change_me_api_key
# Timezone (https://www.php.net/manual/en/timezones.php)
TIMEZONE=UTC

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.env

View File

@@ -0,0 +1,18 @@
# Shlink — self-hosted URL shortener
Deployed on [Coolify](https://coolify.io) via Docker Compose.
## Coolify setup
1. Create a new resource → **Docker Compose** → point to this repo.
2. In the Coolify environment variables UI, set the values from `.env.example`:
- `DEFAULT_DOMAIN` — your short URL domain (e.g. `s.example.com`)
- `DB_PASSWORD` — strong random password
- `INITIAL_API_KEY` — initial API key (`openssl rand -hex 32`)
- `TIMEZONE` — your timezone
3. Add a domain in Coolify pointing to port `8080`.
4. Deploy.
## Shlink Web UI
Optionally connect [shlink-web-client](https://app.shlink.io) to your instance using your domain and API key.

38
docker-compose.yml Normal file
View File

@@ -0,0 +1,38 @@
services:
shlink:
image: shlinkio/shlink:stable
restart: unless-stopped
environment:
DEFAULT_DOMAIN: ${DEFAULT_DOMAIN}
IS_HTTPS_ENABLED: ${IS_HTTPS_ENABLED:-true}
DB_DRIVER: postgres
DB_HOST: db
DB_PORT: 5432
DB_NAME: ${DB_NAME:-shlink}
DB_USER: ${DB_USER:-shlink}
DB_PASSWORD: ${DB_PASSWORD}
INITIAL_API_KEY: ${INITIAL_API_KEY}
TIMEZONE: ${TIMEZONE:-UTC}
depends_on:
db:
condition: service_healthy
ports:
- "8080:8080"
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: ${DB_NAME:-shlink}
POSTGRES_USER: ${DB_USER:-shlink}
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-shlink} -d ${DB_NAME:-shlink}"]
interval: 5s
timeout: 5s
retries: 10
volumes:
db_data: