Как стать автором
Обновить

Self-hosted URL shortener + Raycast

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров2K

Привет Хабр!

Я обожаю сокращать ссылки через собственный 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.

Теги:
Хабы:
+3
Комментарии11

Публикации

Работа

DevOps инженер
32 вакансии
Rust разработчик
13 вакансий

Ближайшие события