Shlink is a self-hosted alternative to Bitly that provides unlimited custom short links, click tracking, and complete data privacy on your own domain.
A community coordinator sharing event links across newsletters and posters needs to track engagement without leaking visitor data to commercial ad networks. Proprietary shorteners log visitor metadata on remote servers and cap click counts behind expensive tiers. Shlink runs the entire redirection service on private hosting, keeping audience metrics and custom domains under your direct control.
Bitly routes all click traffic through its own infrastructure, collecting visitor referrers, device types, and geographic locations on third-party servers. For privacy-conscious organizations and teams complying with data regulations like GDPR, sending audience browsing data to an external commercial platform creates persistent governance risks. Shlink runs redirects entirely on your own server. Every link resolves against your database, with built-in controls to anonymize IP addresses or disable tracking entirely.
Shlink matches Bitly on core features: custom slugs, QR codes, campaign tags, multiple domains, and device-specific routing for mobile visitors. Bitly retains an advantage in turnkey operations, offering pre-configured SSL certificates and automated social media connectors. In contrast, Shlink separates its PHP engine from the interface, requiring you to connect the official Shlink Web Client via an API key. Importing existing links from Bitly export files is supported out of the box, but server maintenance and backups remain in your hands.
Is Shlink free for commercial use? Yes. Shlink carries no licensing fees or user seat costs for personal or commercial deployments.
Shlink vs Bitly — which should I choose? Choose Bitly if you want a fully managed service with turnkey social media integrations. Choose Shlink if you want complete data ownership, unlimited links, and custom domains on your own server.
Can I import my existing links from Bitly into Shlink? Yes. Shlink includes import tools that ingest exported CSV files from Bitly, preserving your original slugs and destination URLs.
Shlink is an outstanding self-hosted choice for site owners who demand full control over link routing and visitor privacy rather than paying commercial subscriptions. Active development in 2026 and an unencumbered MIT license make it a dependable asset to host on private infrastructure. If your team cannot manage a containerized server and regular updates, a hosted service like Bitly remains the more practical route.
We started this exact setup from scratch in a clean Linux machine on Nov 3, 2026 and checked it through Shlink's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p shlink && cd shlink
curl -fsSL https://open-source.store/tools/shlink/compose.yml -o compose.ymlcat > .env <<EOF
DEFAULT_DOMAIN=localhost:8080
IS_HTTPS_ENABLED=false
INITIAL_API_KEY=$(openssl rand -hex 16)
POSTGRES_PASSWORD=$(openssl rand -hex 12)
EOFDEFAULT_DOMAIN — Default domain and port used for generating short URLs without protocol (e.g. s.example.com); set to your public domain in production.IS_HTTPS_ENABLED — Whether generated short URLs use the https protocol; set to true in production when serving behind SSL/TLS.INITIAL_API_KEY — Initial administrator API key for managing Shlink via the REST API and web clients. Generated above; keep it secret.POSTGRES_PASSWORD — Password for the bundled PostgreSQL database. Generated above; keep it secret.docker compose up -dservices:
shlink:
image: shlinkio/shlink:5.1.8
ports:
- "8080:8080"
environment:
DEFAULT_DOMAIN: ${DEFAULT_DOMAIN}
IS_HTTPS_ENABLED: ${IS_HTTPS_ENABLED}
INITIAL_API_KEY: ${INITIAL_API_KEY}
SKIP_INITIAL_GEOLITE_DOWNLOAD: "true"
DB_DRIVER: postgres
DB_NAME: shlink
DB_USER: shlink
DB_PASSWORD: ${POSTGRES_PASSWORD}
DB_HOST: db
DB_PORT: 5432
depends_on:
db:
condition: service_healthy
restart: always
healthcheck:
test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1:8080/rest/health || exit 1"]
interval: 5s
timeout: 5s
retries: 10
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: shlink
POSTGRES_USER: shlink
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- shlink-db-data:/var/lib/postgresql/data
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
volumes:
shlink-db-data:
Lint, codegen, breaking-change checks and dependency management in one Git-native CLI. Open source, no registry lock-in.
Show that Shlink is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 25 s: postgres:16-alpine, shlinkio/shlink:5.1.8.
Based on the upstream setup. Official Docker deployment with PostgreSQL. Pinned images to shlink:5.1.8 and postgres:16-alpine with healthchecks; credentials and domain configured via environment variables.
shlink-1 | 2026-11-03T01:45:10.375735466Z time=2026-11-03T01:45:10.375Z level=INFO msg="[2026-11-03T01:45:10.375644+00:00] [0d7ad767-c70f-435e-9172-8a413cc831da] Access.INFO - GET /pages/ajax.render.php?operation=render_dashboard&dashboard_id=1&layout_class=DashboardLayoutOneCol&title=%25%3C%2Fscript%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.376079716Z time=2026-11-03T01:45:10.376Z level=INFO msg="[2026-11-03T01:45:10.375872+00:00] [97c6adb7-669a-4b00-a3c7-93bdb8db6657] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.376237257Z time=2026-11-03T01:45:10.376Z level=INFO msg="[2026-11-03T01:45:10.376129+00:00] [329ab570-6c37-442d-9697-6b98517ea1cd] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.381023174Z time=2026-11-03T01:45:10.380Z level=INFO msg="[2026-11-03T01:45:10.380965+00:00] [97c6adb7-669a-4b00-a3c7-93bdb8db6657] Access.INFO - GET /storage/framework/sessions/ 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.381515924Z time=2026-11-03T01:45:10.381Z level=INFO msg="[2026-11-03T01:45:10.381474+00:00] [be162be2-5fea-433b-96d8-c87d623ad6b6] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.386342757Z time=2026-11-03T01:45:10.385Z level=INFO msg="[2026-11-03T01:45:10.385665+00:00] [329ab570-6c37-442d-9697-6b98517ea1cd] Access.INFO - GET /storage/framework/sessions/ 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.386347091Z time=2026-11-03T01:45:10.386Z level=INFO msg="[2026-11-03T01:45:10.386154+00:00] [0a74a06a-fa04-4a4e-ad02-44c1bdaf9053] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.390988549Z time=2026-11-03T01:45:10.390Z level=INFO msg="[2026-11-03T01:45:10.390846+00:00] [be162be2-5fea-433b-96d8-c87d623ad6b6] Access.INFO - GET /web/set_profiling?profile=0&collectors=%3Cscript%3Ealert(document.domain)%3C/script%3E 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.391663341Z time=2026-11-03T01:45:10.391Z level=INFO msg="[2026-11-03T01:45:10.391625+00:00] [65153e26-bfea-4ce9-a27a-5b2524a3e41c] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.393348757Z time=2026-11-03T01:45:10.392Z level=INFO msg="[2026-11-03T01:45:10.392839+00:00] [0a74a06a-fa04-4a4e-ad02-44c1bdaf9053] Access.INFO - GET /web/set_profiling?profile=0&collectors=%3Cscript%3Ealert(document.domain)%3C/script%3E 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.393351632Z time=2026-11-03T01:45:10.393Z level=INFO msg="[2026-11-03T01:45:10.393184+00:00] [b2e0beb7-c986-4254-907a-4d61298af72a] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.399027466Z time=2026-11-03T01:45:10.399Z level=INFO msg="[2026-11-03T01:45:10.398976+00:00] [65153e26-bfea-4ce9-a27a-5b2524a3e41c] Access.INFO - GET /fed.rpc.solo.io.GlooInstanceApi/ListClusterDetails 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.399390174Z time=2026-11-03T01:45:10.399Z level=INFO msg="[2026-11-03T01:45:10.399350+00:00] [9fcbba00-2128-4ad1-a2d6-d15fba782e34] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.400500799Z time=2026-11-03T01:45:10.400Z level=INFO msg="[2026-11-03T01:45:10.399961+00:00] [b2e0beb7-c986-4254-907a-4d61298af72a] Access.INFO - GET /fed.rpc.solo.io.GlooInstanceApi/ListClusterDetails 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.400503216Z time=2026-11-03T01:45:10.400Z level=INFO msg="[2026-11-03T01:45:10.400326+00:00] [ba18693d-785b-4292-a08b-31504bf4c525] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.405634549Z time=2026-11-03T01:45:10.405Z level=INFO msg="[2026-11-03T01:45:10.405581+00:00] [9fcbba00-2128-4ad1-a2d6-d15fba782e34] Access.INFO - GET /data/pbootcms.db 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.405911882Z time=2026-11-03T01:45:10.405Z level=INFO msg="[2026-11-03T01:45:10.405880+00:00] [6c63dbaa-5f63-4730-aaf5-b349c205c060] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.406569632Z time=2026-11-03T01:45:10.406Z level=INFO msg="[2026-11-03T01:45:10.406537+00:00] [ba18693d-785b-4292-a08b-31504bf4c525] Access.INFO - GET /data/pbootcms.db 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.407076216Z time=2026-11-03T01:45:10.406Z level=INFO msg="[2026-11-03T01:45:10.406930+00:00] [ebcce741-1cba-493c-bee4-3ec730223ced] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.412644757Z time=2026-11-03T01:45:10.412Z level=INFO msg="[2026-11-03T01:45:10.412592+00:00] [6c63dbaa-5f63-4730-aaf5-b349c205c060] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.412768132Z time=2026-11-03T01:45:10.412Z level=INFO msg="[2026-11-03T01:45:10.412731+00:00] [ebcce741-1cba-493c-bee4-3ec730223ced] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.414331382Z time=2026-11-03T01:45:10.414Z level=INFO msg="[2026-11-03T01:45:10.414195+00:00] [6c63dbaa-5f63-4730-aaf5-b349c205c060] Access.INFO - GET /down_data.php?filename=../../../../../../../../../../../../../../etc/passwd 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.414348882Z time=2026-11-03T01:45:10.414Z level=INFO msg="[2026-11-03T01:45:10.414288+00:00] [ebcce741-1cba-493c-bee4-3ec730223ced] Access.INFO - GET /down_data.php?filename=../../../../../../../../../../../../../../etc/passwd 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.414799632Z time=2026-11-03T01:45:10.414Z level=INFO msg="[2026-11-03T01:45:10.414672+00:00] [00d04190-56a3-4848-898b-989211060f6c] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.414993507Z time=2026-11-03T01:45:10.414Z level=INFO msg="[2026-11-03T01:45:10.414895+00:00] [10d88729-d230-4717-811e-6bf73a999223] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.420149466Z time=2026-11-03T01:45:10.420Z level=INFO msg="[2026-11-03T01:45:10.420087+00:00] [00d04190-56a3-4848-898b-989211060f6c] Access.INFO - GET /irj/cache.jsp?cmd=ls 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.421108466Z time=2026-11-03T01:45:10.421Z level=INFO msg="[2026-11-03T01:45:10.420255+00:00] [10d88729-d230-4717-811e-6bf73a999223] Access.INFO - GET /irj/cache.jsp?cmd=ls 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.421271174Z time=2026-11-03T01:45:10.421Z level=INFO msg="[2026-11-03T01:45:10.421246+00:00] [2a50c250-cd89-44c0-9be0-b5ec856a4c0f] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.421288174Z time=2026-11-03T01:45:10.421Z level=INFO msg="[2026-11-03T01:45:10.421254+00:00] [36ee72cb-6ab4-44a5-af83-92df5e8e85a2] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.425237466Z time=2026-11-03T01:45:10.425Z level=INFO msg="[2026-11-03T01:45:10.425163+00:00] [36ee72cb-6ab4-44a5-af83-92df5e8e85a2] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.426158382Z time=2026-11-03T01:45:10.426Z level=INFO msg="[2026-11-03T01:45:10.426105+00:00] [2a50c250-cd89-44c0-9be0-b5ec856a4c0f] Access.INFO - GET /digilib/index.php?destination=%22%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E&p=member 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.426395007Z time=2026-11-03T01:45:10.426Z level=INFO msg="[2026-11-03T01:45:10.426265+00:00] [36ee72cb-6ab4-44a5-af83-92df5e8e85a2] Access.INFO - GET /Solar_History.php?time_begin=xx%22%3E%3Cscript%3Ealert(document.domain)%3C/script%3E%3C%22&time_end&event_level=0&event_pcs=1&search_on=on&search_off=on&word=hj%27&sort_type=0&record=10&command=%95%5C%8E%A6 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.427037007Z {"time":"2026-11-03T01:45:10.426978174Z","level":"DEBUG","msg":"file extension is forbidden","logger":"static","ext":".php"}
shlink-1 | 2026-11-03T01:45:10.427039591Z time=2026-11-03T01:45:10.427Z level=INFO msg="[2026-11-03T01:45:10.426552+00:00] [c5c6dd13-bddf-45e1-b1e6-ee9daa2b14a8] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.427040507Z time=2026-11-03T01:45:10.427Z level=INFO msg="[2026-11-03T01:45:10.426835+00:00] [c60aed54-03a7-4d00-b30b-6f53c590dd26] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.431622924Z time=2026-11-03T01:45:10.431Z level=INFO msg="[2026-11-03T01:45:10.431576+00:00] [c60aed54-03a7-4d00-b30b-6f53c590dd26] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.432223591Z time=2026-11-03T01:45:10.432Z level=INFO msg="[2026-11-03T01:45:10.432182+00:00] [c5c6dd13-bddf-45e1-b1e6-ee9daa2b14a8] Access.INFO - GET /advanced_component_system/index.php?ACS_path=..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd%00 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.432564091Z time=2026-11-03T01:45:10.432Z level=INFO msg="[2026-11-03T01:45:10.432533+00:00] [d357a648-b508-4ed8-8d11-8c1d607fd4be] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.433550299Z time=2026-11-03T01:45:10.433Z level=INFO msg="[2026-11-03T01:45:10.433018+00:00] [c60aed54-03a7-4d00-b30b-6f53c590dd26] Access.INFO - GET /Solar_History.php?time_begin=xx%22%3E%3Cscript%3Ealert(document.domain)%3C/script%3E%3C%22&time_end&event_level=0&event_pcs=1&search_on=on&search_off=on&word=hj%27&sort_type=0&record=10&command=%95%5C%8E%A6 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.433558841Z time=2026-11-03T01:45:10.433Z level=INFO msg="[2026-11-03T01:45:10.433386+00:00] [997d664c-8e15-4928-afca-f0ffa63a1fb1] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.438569507Z time=2026-11-03T01:45:10.438Z level=INFO msg="[2026-11-03T01:45:10.438514+00:00] [d357a648-b508-4ed8-8d11-8c1d607fd4be] Access.INFO - GET /advanced_component_system/index.php?ACS_path=..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd%00 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.438918424Z time=2026-11-03T01:45:10.438Z level=INFO msg="[2026-11-03T01:45:10.438886+00:00] [5c9669a6-52b8-4b59-b600-592eb0fe15fb] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.440346591Z time=2026-11-03T01:45:10.440Z level=INFO msg="[2026-11-03T01:45:10.440096+00:00] [997d664c-8e15-4928-afca-f0ffa63a1fb1] Access.INFO - GET /wp-admin/admin-ajax.php?action=bwg_frontend_data&shortcode_id=1%22%20onmouseover=alert(document.domain)// 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.440574966Z time=2026-11-03T01:45:10.440Z level=INFO msg="[2026-11-03T01:45:10.440503+00:00] [c80859f2-8c7c-4a0a-a379-b6556cc8a472] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.444962841Z time=2026-11-03T01:45:10.444Z level=INFO msg="[2026-11-03T01:45:10.444918+00:00] [c80859f2-8c7c-4a0a-a379-b6556cc8a472] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.446349382Z time=2026-11-03T01:45:10.446Z level=INFO msg="[2026-11-03T01:45:10.446299+00:00] [5c9669a6-52b8-4b59-b600-592eb0fe15fb] Access.INFO - GET /wp-admin/admin-ajax.php?action=bwg_frontend_data&shortcode_id=1%22%20onmouseover=alert(document.domain)// 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.446738716Z time=2026-11-03T01:45:10.446Z level=INFO msg="[2026-11-03T01:45:10.446700+00:00] [04d8dc3a-f893-4448-83eb-deba45295003] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.447497591Z time=2026-11-03T01:45:10.447Z level=INFO msg="[2026-11-03T01:45:10.447257+00:00] [c80859f2-8c7c-4a0a-a379-b6556cc8a472] Access.INFO - GET /KeepAlive.jsp?stamp=16170297%3C%2Fscript%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.447753841Z time=2026-11-03T01:45:10.447Z level=INFO msg="[2026-11-03T01:45:10.447646+00:00] [fc9bed16-a945-4885-adc6-bcdb7628bed5] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.451311216Z time=2026-11-03T01:45:10.451Z level=INFO msg="[2026-11-03T01:45:10.451273+00:00] [04d8dc3a-f893-4448-83eb-deba45295003] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.453060424Z time=2026-11-03T01:45:10.453Z level=INFO msg="[2026-11-03T01:45:10.453022+00:00] [04d8dc3a-f893-4448-83eb-deba45295003] Access.INFO - GET /KeepAlive.jsp?stamp=16170297%3C%2Fscript%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.453500382Z time=2026-11-03T01:45:10.453Z level=INFO msg="[2026-11-03T01:45:10.453430+00:00] [16b8780e-6600-45e6-a71c-ccabbfe27283] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.455546591Z time=2026-11-03T01:45:10.455Z level=INFO msg="[2026-11-03T01:45:10.454314+00:00] [fc9bed16-a945-4885-adc6-bcdb7628bed5] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.455656966Z time=2026-11-03T01:45:10.455Z level=INFO msg="[2026-11-03T01:45:10.455629+00:00] [fc9bed16-a945-4885-adc6-bcdb7628bed5] Access.INFO - GET /docker-compose.prod.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.455937924Z time=2026-11-03T01:45:10.455Z level=INFO msg="[2026-11-03T01:45:10.455878+00:00] [8c14847d-af17-43e2-b57b-ebcd3932b782] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.456019966Z {"time":"2026-11-03T01:45:10.455987132Z","level":"DEBUG","msg":"file open error","logger":"static","error":"open ../../public/docker-compose.production.yml: no such file or directory"}
shlink-1 | 2026-11-03T01:45:10.457856424Z time=2026-11-03T01:45:10.457Z level=INFO msg="[2026-11-03T01:45:10.457814+00:00] [16b8780e-6600-45e6-a71c-ccabbfe27283] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.460974257Z time=2026-11-03T01:45:10.460Z level=INFO msg="[2026-11-03T01:45:10.460923+00:00] [16b8780e-6600-45e6-a71c-ccabbfe27283] Access.INFO - GET /docker-compose.prod.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.461306841Z time=2026-11-03T01:45:10.461Z level=INFO msg="[2026-11-03T01:45:10.461232+00:00] [54fe3f68-0f42-432a-8cc2-8c06c0c93811] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.466015216Z time=2026-11-03T01:45:10.465Z level=INFO msg="[2026-11-03T01:45:10.465972+00:00] [8c14847d-af17-43e2-b57b-ebcd3932b782] Access.INFO - GET /api/moduleInformation 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.466452049Z time=2026-11-03T01:45:10.466Z level=INFO msg="[2026-11-03T01:45:10.466350+00:00] [fe51ed83-98a5-41b7-aaeb-c1899a7d8937] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.471137966Z time=2026-11-03T01:45:10.471Z level=INFO msg="[2026-11-03T01:45:10.471091+00:00] [54fe3f68-0f42-432a-8cc2-8c06c0c93811] Access.INFO - GET /api/moduleInformation 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.473069924Z time=2026-11-03T01:45:10.473Z level=INFO msg="[2026-11-03T01:45:10.471504+00:00] [5fe54890-1ae8-4dd9-9b21-4cde737d1754] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.473083424Z time=2026-11-03T01:45:10.473Z level=INFO msg="[2026-11-03T01:45:10.473056+00:00] [fe51ed83-98a5-41b7-aaeb-c1899a7d8937] Access.INFO - GET / 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.473338757Z time=2026-11-03T01:45:10.473Z level=INFO msg="[2026-11-03T01:45:10.473302+00:00] [7cdc06b2-6b9e-4e58-a556-e34400878654] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.477515382Z time=2026-11-03T01:45:10.476Z level=INFO msg="[2026-11-03T01:45:10.476947+00:00] [5fe54890-1ae8-4dd9-9b21-4cde737d1754] Access.INFO - GET / 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.477519507Z time=2026-11-03T01:45:10.477Z level=INFO msg="[2026-11-03T01:45:10.477307+00:00] [3cf2e1a9-e9f5-49f3-8606-cde5b7f07520] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.477985007Z time=2026-11-03T01:45:10.477Z level=INFO msg="[2026-11-03T01:45:10.477943+00:00] [7cdc06b2-6b9e-4e58-a556-e34400878654] Access.INFO - GET /digilib/index.php?destination=%22%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E&p=member 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.478905132Z {"time":"2026-11-03T01:45:10.478878716Z","level":"DEBUG","msg":"file extension is forbidden","logger":"static","ext":".php"}
shlink-1 | 2026-11-03T01:45:10.479004382Z time=2026-11-03T01:45:10.478Z level=INFO msg="[2026-11-03T01:45:10.478975+00:00] [3372b1cd-fe13-4dd3-913c-3a237e9f0edd] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.482693091Z time=2026-11-03T01:45:10.482Z level=INFO msg="[2026-11-03T01:45:10.482158+00:00] [3cf2e1a9-e9f5-49f3-8606-cde5b7f07520] Access.INFO - GET /core/install.php 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.482696257Z time=2026-11-03T01:45:10.482Z level=INFO msg="[2026-11-03T01:45:10.482529+00:00] [8bbf84b9-2c31-46bb-bd45-9622311aef90] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.484264466Z time=2026-11-03T01:45:10.484Z level=INFO msg="[2026-11-03T01:45:10.484225+00:00] [3372b1cd-fe13-4dd3-913c-3a237e9f0edd] Access.INFO - GET /core/install.php 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.484733507Z time=2026-11-03T01:45:10.484Z level=INFO msg="[2026-11-03T01:45:10.484587+00:00] [bfe775a7-d13a-4e84-8e18-414cb4b07366] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.490562341Z time=2026-11-03T01:45:10.490Z level=INFO msg="[2026-11-03T01:45:10.490503+00:00] [8bbf84b9-2c31-46bb-bd45-9622311aef90] Access.INFO - GET /storage/sessions/ 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.491373674Z time=2026-11-03T01:45:10.491Z level=INFO msg="[2026-11-03T01:45:10.491245+00:00] [bfe775a7-d13a-4e84-8e18-414cb4b07366] Access.INFO - GET /storage/sessions/ 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.491543716Z time=2026-11-03T01:45:10.491Z level=INFO msg="[2026-11-03T01:45:10.491511+00:00] [52bc7a2e-be50-4d32-b29d-b3d290c2c58a] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.491689424Z time=2026-11-03T01:45:10.491Z level=INFO msg="[2026-11-03T01:45:10.491640+00:00] [4ecce34e-787d-4632-9366-4ac1fec7a736] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.497412674Z time=2026-11-03T01:45:10.497Z level=INFO msg="[2026-11-03T01:45:10.497330+00:00] [52bc7a2e-be50-4d32-b29d-b3d290c2c58a] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.500428007Z time=2026-11-03T01:45:10.500Z level=INFO msg="[2026-11-03T01:45:10.500368+00:00] [4ecce34e-787d-4632-9366-4ac1fec7a736] Access.INFO - GET /akasia/index.php?destination=%22%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E&p=member 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.500786632Z {"time":"2026-11-03T01:45:10.500752632Z","level":"DEBUG","msg":"file extension is forbidden","logger":"static","ext":".php"}
shlink-1 | 2026-11-03T01:45:10.500863424Z time=2026-11-03T01:45:10.500Z level=INFO msg="[2026-11-03T01:45:10.500826+00:00] [52bc7a2e-be50-4d32-b29d-b3d290c2c58a] Access.INFO - GET /docker-compose.production.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.501129924Z {"time":"2026-11-03T01:45:10.501106716Z","level":"DEBUG","msg":"file open error","logger":"static","error":"open ../../public/docker-compose.staging.yml: no such file or directory"}
shlink-1 | 2026-11-03T01:45:10.501311841Z time=2026-11-03T01:45:10.501Z level=INFO msg="[2026-11-03T01:45:10.501282+00:00] [3a61605a-3a34-4dea-b997-959638d52993] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.501644591Z time=2026-11-03T01:45:10.501Z level=INFO msg="[2026-11-03T01:45:10.501612+00:00] [2d9ff5fe-4b22-4058-8c08-910e24dc00fd] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.506909049Z time=2026-11-03T01:45:10.506Z level=INFO msg="[2026-11-03T01:45:10.506874+00:00] [2d9ff5fe-4b22-4058-8c08-910e24dc00fd] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.512092841Z time=2026-11-03T01:45:10.508Z level=INFO msg="[2026-11-03T01:45:10.508601+00:00] [2d9ff5fe-4b22-4058-8c08-910e24dc00fd] Access.INFO - GET /docker-compose.production.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.512097466Z time=2026-11-03T01:45:10.509Z level=INFO msg="[2026-11-03T01:45:10.509038+00:00] [df27a05a-b398-407b-b06f-c5a4b7f24640] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.513483549Z time=2026-11-03T01:45:10.513Z level=INFO msg="[2026-11-03T01:45:10.513397+00:00] [3a61605a-3a34-4dea-b997-959638d52993] Access.INFO - GET /akasia/index.php?destination=%22%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E&p=member 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.513745257Z {"time":"2026-11-03T01:45:10.513721799Z","level":"DEBUG","msg":"file extension is forbidden","logger":"static","ext":".php"}
shlink-1 | 2026-11-03T01:45:10.513908007Z time=2026-11-03T01:45:10.513Z level=INFO msg="[2026-11-03T01:45:10.513874+00:00] [5bd5afc9-177b-4a7b-8434-70fa4154b7eb] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.518941841Z time=2026-11-03T01:45:10.518Z level=INFO msg="[2026-11-03T01:45:10.518432+00:00] [df27a05a-b398-407b-b06f-c5a4b7f24640] Access.INFO - GET /library/index.php?destination=%22%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E&p=member 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.518945549Z time=2026-11-03T01:45:10.518Z level=INFO msg="[2026-11-03T01:45:10.518798+00:00] [c3ac7be0-0cfe-4d2c-a784-ed646590dcc3] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.519517049Z time=2026-11-03T01:45:10.519Z level=INFO msg="[2026-11-03T01:45:10.519475+00:00] [5bd5afc9-177b-4a7b-8434-70fa4154b7eb] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.523656507Z time=2026-11-03T01:45:10.523Z level=INFO msg="[2026-11-03T01:45:10.523611+00:00] [c3ac7be0-0cfe-4d2c-a784-ed646590dcc3] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.524204549Z time=2026-11-03T01:45:10.524Z level=INFO msg="[2026-11-03T01:45:10.524167+00:00] [5bd5afc9-177b-4a7b-8434-70fa4154b7eb] Access.INFO - GET /docker-compose.staging.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.524544466Z {"time":"2026-11-03T01:45:10.524517841Z","level":"DEBUG","msg":"file open error","logger":"static","error":"open ../../public/docker-compose.dev.yml: no such file or directory"}
shlink-1 | 2026-11-03T01:45:10.524669882Z time=2026-11-03T01:45:10.524Z level=INFO msg="[2026-11-03T01:45:10.524641+00:00] [a6af13ff-1d46-45b7-8b61-ca5dfe1ba184] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.526254591Z time=2026-11-03T01:45:10.526Z level=INFO msg="[2026-11-03T01:45:10.525994+00:00] [c3ac7be0-0cfe-4d2c-a784-ed646590dcc3] Access.INFO - GET /docker-compose.staging.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.527708632Z time=2026-11-03T01:45:10.527Z level=INFO msg="[2026-11-03T01:45:10.526387+00:00] [15fc2aa3-e2ed-486a-8c7b-b8ea43de7399] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.531566007Z time=2026-11-03T01:45:10.531Z level=INFO msg="[2026-11-03T01:45:10.531509+00:00] [a6af13ff-1d46-45b7-8b61-ca5dfe1ba184] Access.INFO - GET /library/index.php?destination=%22%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E&p=member 404 1428" logger=server
shlink-1 | 2026-11-03T01:45:10.531935924Z time=2026-11-03T01:45:10.531Z level=INFO msg="[2026-11-03T01:45:10.531834+00:00] [b7557a53-550e-422b-83bc-188f8042ae64] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.532312632Z time=2026-11-03T01:45:10.532Z level=INFO msg="[2026-11-03T01:45:10.532272+00:00] [15fc2aa3-e2ed-486a-8c7b-b8ea43de7399] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.535934257Z time=2026-11-03T01:45:10.535Z level=INFO msg="[2026-11-03T01:45:10.535823+00:00] [15fc2aa3-e2ed-486a-8c7b-b8ea43de7399] Access.INFO - GET /docker-compose.dev.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.536208882Z {"time":"2026-11-03T01:45:10.536165591Z","level":"DEBUG","msg":"file open error","logger":"static","error":"open ../../public/docker-compose-dev.yml: no such file or directory"}
shlink-1 | 2026-11-03T01:45:10.536432841Z time=2026-11-03T01:45:10.536Z level=INFO msg="[2026-11-03T01:45:10.536336+00:00] [5e12563b-80e9-4311-b9d5-aab33d0ec587] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.536476424Z time=2026-11-03T01:45:10.536Z level=INFO msg="[2026-11-03T01:45:10.536425+00:00] [b7557a53-550e-422b-83bc-188f8042ae64] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.537601632Z time=2026-11-03T01:45:10.537Z level=INFO msg="[2026-11-03T01:45:10.537569+00:00] [b7557a53-550e-422b-83bc-188f8042ae64] Access.INFO - GET /docker-compose.dev.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.538100757Z time=2026-11-03T01:45:10.538Z level=INFO msg="[2026-11-03T01:45:10.537967+00:00] [afa27903-2e05-4c02-8ab9-ad7ce9327405] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.540212257Z time=2026-11-03T01:45:10.540Z level=INFO msg="[2026-11-03T01:45:10.540177+00:00] [5e12563b-80e9-4311-b9d5-aab33d0ec587] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.541244632Z time=2026-11-03T01:45:10.541Z level=INFO msg="[2026-11-03T01:45:10.541209+00:00] [5e12563b-80e9-4311-b9d5-aab33d0ec587] Access.INFO - GET /docker-compose-dev.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.541552049Z {"time":"2026-11-03T01:45:10.541514674Z","level":"DEBUG","msg":"file open error","logger":"static","error":"open ../../public/docker-compose.override.yml: no such file or directory"}
shlink-1 | 2026-11-03T01:45:10.541821632Z time=2026-11-03T01:45:10.541Z level=INFO msg="[2026-11-03T01:45:10.541689+00:00] [a008527e-ee5c-4f0c-b46c-ef0e3b0a55ef] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.542409924Z time=2026-11-03T01:45:10.542Z level=INFO msg="[2026-11-03T01:45:10.542379+00:00] [afa27903-2e05-4c02-8ab9-ad7ce9327405] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.543466132Z time=2026-11-03T01:45:10.543Z level=INFO msg="[2026-11-03T01:45:10.543436+00:00] [afa27903-2e05-4c02-8ab9-ad7ce9327405] Access.INFO - GET /docker-compose-dev.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.543889466Z time=2026-11-03T01:45:10.543Z level=INFO msg="[2026-11-03T01:45:10.543819+00:00] [3fa8863d-47e9-450a-b551-83499a1ce79b] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.548108674Z time=2026-11-03T01:45:10.548Z level=INFO msg="[2026-11-03T01:45:10.548060+00:00] [a008527e-ee5c-4f0c-b46c-ef0e3b0a55ef] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.549252424Z time=2026-11-03T01:45:10.549Z level=INFO msg="[2026-11-03T01:45:10.549218+00:00] [a008527e-ee5c-4f0c-b46c-ef0e3b0a55ef] Access.INFO - GET /docker-compose.override.yml 404 1488" logger=server
shlink-1 | 2026-11-03T01:45:10.549428924Z time=2026-11-03T01:45:10.549Z level=INFO msg="[2026-11-03T01:45:10.549280+00:00] [3fa8863d-47e9-450a-b551-83499a1ce79b] Shlink.WARNING - Tried to geolocate IP address, but a GeoLite2 db was not found." logger=server
shlink-1 | 2026-11-03T01:45:10.550511382Z time=2026-11-03T01:45:10.550Z level=INFO msg="[2026-11-03T01:45:10.550469+00:00] [3fa8863d-47e9-450a-b551-83499a1ce79b] Access.INFO - GET /docker-compose.override.yml 404 1488" logger=server