Привет Хабр!
Я обожаю сокращать ссылки через собственный URL shortener. Это как clck.ru, только всё работает на собственной архитектуре и данные об использовании никуда не утекают. При этом домен я тоже могу поставить какой-нибудь красивый (к примеру - hdla.cloud).
В данном гайде пробегусь по настройке chhoto-url - минималистичного self-hosted решения написанном на Rust. Также для любителей Raycast покажу расширение, которое сам написал, чтобы сокращать ссылки было blazingly fast ⚡.
Статья предполагает, что вы знакомы с основами SSH, Docker и Linux.
Для начала подключаемся к своей VPS по SSH (у кого нет, взять можно за пару минут буквально загуглив "аренда VPS"):
ssh root@<ip вашей vps>
Устанавливаем Docker если еще не сделали этого:
bash <(curl -sSL https://get.docker.com)
Создаём директорию для chhoto-url и переходим в неё:
mkdir chhoto-url && cd chhoto-url
Далее через vim
или nano
создаём compose.yml
(для новичков лучше nano
):
vim compose.yml
services:
chhoto-url:
image: sintan1729/chhoto-url:latest
restart: unless-stopped
container_name: chhoto-url
environment:
- db_url=/db/urls.sqlite
- password=${CHHOTO_URL_PASSWORD}
volumes:
- ./data/:/db
Теперь по аналогии создаём .env
для переменных окружения:
vim .env
CHHOTO_URL_PASSWORD="<сюда пишем длинный и безопасный пароль>"
Далее нужно контейнер поставить за reverse-proxy
которых миллион на любой вкус и цвет. Знатокам с этого момента можно поставить свою по предпочтениям, в то время как для новичков покажу как это сделать с traefik.
Добавляем в compose.yml
необходимую конфигурацию:
services:
traefik:
image: traefik:v3.4
restart: always
container_name: traefik
user: "0:0" # Run as root to access the acme.json file
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.toml:/etc/traefik/traefik.toml
- ./acme/acme.json:/acme/acme.json
chhoto-url:
image: sintan1729/chhoto-url:latest
restart: unless-stopped
container_name: chhoto-url
labels:
- traefik.enable=true
- traefik.http.routers.chhoto-url.rule=Host(`EXAMPLE.COM`)
- traefik.http.routers.chhoto-url.entrypoints=websecure
- traefik.http.routers.chhoto-url.tls.certresolver=letsencrypt
- traefik.http.services.chhoto-url.loadbalancer.server.port=4567
# HTTP to HTTPS redirect
- traefik.http.routers.chhoto-url-http.rule=Host(`EXAMPLE.COM`)
- traefik.http.routers.chhoto-url-http.entrypoints=web
- traefik.http.routers.chhoto-url-http.middlewares=redirect-to-https
- traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
environment:
- db_url=/db/urls.sqlite
- password=${CHHOTO_URL_PASSWORD}
volumes:
- ./data/:/db
Важно заменить EXAMPLE.COM
на свой домен как в compose.yml
, так и в traefik.toml
(настройка собственного домена выходит за рамки этого гайда).
Создаём traefik.toml
:
# Entry Points
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.websecure]
address = ":443"
# Provider for Docker
[providers.docker]
endpoint = "unix:///var/run/docker.sock"
exposedByDefault = false
# Certificate Resolvers
[certificatesResolvers.letsencrypt.acme]
email = "admin@EXAMPLE.COM"
storage = "/acme/acme.json"
caServer = "https://acme-v02.api.letsencrypt.org/directory"
keyType = "EC256"
[certificatesResolvers.letsencrypt.acme.httpChallenge]
entryPoint = "web"
# API and Dashboard (optional - remove if not needed)
[api]
dashboard = false
insecure = false
Создаём специальный файл для certbot
(он нужен для автоматического TLS):
touch acme/acme.json && chmod 600 acme/acme.json
И наконец запускаем сервис:
docker compose up -d
Теперь по указанному домену можно пользоваться сервисом (пароль тот что указывали в .env
) .
Для использования с Raycast просто устанавливаем расширение из официального магазина.
При конфигурации указываем наш домен и пароль:

Исходники моей конфигурации доступны на GitHub.