This is a simple lightweight URL shortning service using express and s3db.js.
Fork-it and use it as you like.
docker run --rm -itd \
-p 8000:8000 \
-e PORT=8000 \
-e FS_CONNECTION_STRING="your-secret" \
--name fshortner \
ghcr.io/forattini-dev/fshortner:latest| variable | description | default |
|---|---|---|
| PORT | Port to run the service. | 8000 |
| FS_ID_SIZE | Size of the ID to generate. | 16 |
| FS_SESSION_SECRET | Secret to sign the session. | secret |
| FS_DOMAIN | Domain to use in the shareable link. | inferred |
| FS_BEHIND_PROXY | Enable it if the service is behind a proxy. | false |
| FS_REDIRECT_TEMPLATE | Interface's template. See ./src/views dir for more. |
corporate |
| FS_REDIRECT_TIMEOUT | Timeout to redirect to the original URL. | 0.6 |
| FS_CONNECTION_STRING | Secret to connect to the s3db.js database. | null |
| FS_COSTS_ENABLED | Enable the costs plugin. | true |
| FS_CRON_ENABLED | Enable the cron jobs. | true |
| FS_CRON_CLICKS_COUNTER | Cron expression to update the clicks counter. | */30 * * * * * |
| FS_CRON_VIEWS_COUNTER | Cron expression to update the views counter. | */30 * * * * * |
| FS_AUTH_ENABLED | Enable the basic authentication middleware. | false |
| FS_AUTH_USERNAME | Username to authenticate. | fshortner |
| FS_AUTH_PASSWORD | Password to authenticate. | secret |
The service uses a basic authentication middleware to protect the endpoints.
First, enable the FS_AUTH_ENABLED variable.
To authenticate, use the FS_AUTH_USERNAME and FS_AUTH_PASSWORD variables.
curl -u fshortner:secret http://localhost:8000/v1/urlsimport axios from 'axios'
const response = await axios.get('https://example.com/endpoint', {
auth: {
username: 'fshortner',
password: 'secret'
}
});import axios from 'ky'
const client = await ky.create({
prefixUrl: 'https://example.com',
headers: {
Authorization: `Basic ${Buffer.from(`fshortner:secret`).toString('base64')}`
}
});POST /v1/urls
// request:
{
"link": "https://my-super-loooooooooooong-url.com?p=with+parameters"
}
// response:
{
"id": "AdCcOPzRR4UXCMs4",
"link": "https://my-super-loooooooooooong-url.com?p=with+parameters",
"shareableLink": "http://localhost:8000/AdCcOPzRR4UXCMs4"
}Body parameters:
| parameter | description | required | type | default |
|---|---|---|---|---|
| link | URL to shorten. | true | url string | null |
| webhook | URL to send updates. | false | url string | null |
| getFingerprints | Enable to get the fingerprints. | true | boolean | true |
// request
{
"link": "https://my-super-loooooooooooong-url.com?p=with+parameters",
"webhook": "https://my-webhook.io/?id=my-token"
}
// response:
{
"id": "AdCcOPzRR4UXCMs4",
"link": "https://my-super-loooooooooooong-url.com?p=with+parameters",
"shareableLink": "http://localhost:8000/AdCcOPzRR4UXCMs4",
"webhook": "https://my-webhook.io/?id=my-token"
}GET /v1/urls/:id
// response:
{
"id": "AdCcOPzRR4UXCMs4",
"clicks": 121,
"link": "https://my-super-loooooooooooong-url.com?p=with+parameters",
"shareableLink": "http://localhost:8000/AdCcOPzRR4UXCMs4",
"webhook": true,
"createdAt": "2024-10-07T02:25:35.000Z"
}GET /v1/urls/:id/qrcode
Response is a image/png.
- Fork it! :)
- Run it with
docker-compose up - At your minio container, create credentials and use the example at
./src/concerns/minio-policy.jsonto create a policy. - Make your requests to
http://localhost:8000