开源URL短链接服务Shlink

最近一直有人在问,docker 查询注册表失败的问题,目前老苏验证可用的方法有 2 个:

  • 方法一(可用):
  1. 看过老苏以前文章的读者都知道,在遇到发布到 ghcr.io 的镜像时,老苏都会推荐用 dockerproxy,其实发布到 hub.docker.com 的镜像也是一样可用的

  1. 打开 https://dockerproxy.com,在第一步中输入镜像的 用户名/镜像名称:tag,点 获取命令

  1. 用 ssh 客户端登录到群晖,在命令行依次执行第二步~第四步的命令,权限不够的话,加 sudo 再执行

此方法虽然麻烦,但适合没有条件科学上网的人,如果你觉得好用的话,记得去给网站捐助一下,不过这个方法并不能解决注册表搜索的问题

更多的玩法请看官方文档:https://dockerproxy.com/docs

  • 方法二(不可用)

从文档看,似乎有更简单的方式,但老苏没成功,大家可以试试看

注册表 –> 设置,选中 https://rigistry.hub.docker.com,点 编辑

勾选 启用注册表镜像,在 注册表镜像 URL 中填入 https://dockerproxy.com

但老苏试了还是不行,当然你也可以找找其他的镜像 URL 试试,其中阿里和华为需要注册自己的账号

  • 方法三(可用):

就用科学上网了,把 docker.com 加入到域名黑名单,一劳永逸


本文完成于 2 月上旬;

什么是 Shlink ?

Shlink 是一个自托管的开源 URL 缩短器,它提供了一个 REST 和一个 CLI 接口来与之交互。此外,还有一个官方的 Shlink web 客户端,通过使用 Shlink 的 REST API,提供了一个漂亮的 web UI 来处理多个 Shlink 实例。

前期准备

获取 API key

Shlink 使用 MaxMind 的 GeoLite2 数据库来定位对您的短 URL 的访问。

Shlink 需要一个 GeoLite2 许可证密钥,用来定期下载新版本的数据库,确保数据始终是最新的。

这些许可证是免费的,只需要在 https://www.maxmind.com/en/geolite2/signup 注册用户,然后生成一个 license key 就可以

保存这个 License Key 值很重要,因为也是只显示一次的

建数据库

老苏用了群晖自带的 MariaDB 10 数据库。

在 phpMyAdmin 中创建名为 shlink 的空数据库。

为便于说明,假设数据库密码为 123456

反向代理

短链接应该是放在公网用的,用局域网 IP 方式显然是不合理的

域名 局域网地址 说明
st.laosu.ml 192.168.0.197:8019 服务端
stc.laosu.ml 192.168.0.197:8020 客户端

老苏的域名没有备案,在实际访问时是要带端口的,例如服务端是 https://st.laosu.ml:444

虽然老苏已经尽量缩短 url,但是实际上还是有点长,毕竟是二级域名,有条件的话,最好用短的一级域名 😂

SSL 还是没问题就全选

客户端也是一样的

环境变量

老苏用到了下面👇这些环境变量

可变 值
DEFAULT_DOMAIN 用于此 Shlink 实例的自定义域名
IS_HTTPS_ENABLED 是否启用 https 协议
GEOLITE_LICENSE_KEY 您的 GeoLite2 许可证密钥
DB_DRIVER 使用值 mysql 、 maria 、 postgres 或 mssql来防止使用 SQLite 数据库
DB_USER 数据库服务器的用户名
DB_PASSWORD 数据库服务器的口令
DB_HOST 运行数据库引擎的服务器的主机名
DB_PORT 运行数据库服务的端口
DB_NAME 要使用的数据库名称

更多的环境变量请看官方文档:https://shlink.io/documentation/environment-variables/

命令行安装

如果你熟悉命令行,可能用 docker cli 更快捷

老苏安装的 stable版对应的版本是 3.5.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 新建文件夹 shlink 和 子目录
mkdir -p /volume2/docker/shlink/data

# 进入 shlink 目录
cd /volume2/docker/shlink

# 运行服务端容器
docker run -d \
--restart unless-stopped \
--name shlink-server \
-p 8019:8080 \
-e DEFAULT_DOMAIN=st.laosu.ml:444 \
-e IS_HTTPS_ENABLED=true \
-e GEOLITE_LICENSE_KEY=<你的 GeoLite2 许可证密钥> \
-e DB_DRIVER=mysql \
-e DB_HOST=192.168.0.197 \
-e DB_PORT=3307 \
-e DB_USER=shlink \
-e DB_PASSWORD=123456 \
-e DB_NAME=shlink \
shlinkio/shlink:stable

# 运行客户端容器
docker run -d \
--restart unless-stopped \
--name shlink-web-client \
-p 8020:80 \
shlinkio/shlink-web-client

也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '3'

services:
server:
image: shlinkio/shlink:stable
container_name: shlink-server
restart: unless-stopped
ports:
- 8019:8080
volumes:
- ./data:/data
environment:
- DEFAULT_DOMAIN=st.laosu.ml:444
- IS_HTTPS_ENABLED=true
- GEOLITE_LICENSE_KEY=<你的 GeoLite2 许可证密钥>
- DB_DRIVER=mysql
- DB_HOST=192.168.0.197
- DB_PORT=3307
- DB_USER=shlink
- DB_PASSWORD=123456
- DB_NAME=shlink

client:
image: shlinkio/shlink-web-client
container_name: shlink-web-client
restart: unless-stopped
ports:
- 8020:80

然后执行下面的命令

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 shlink 和 子目录
mkdir -p /volume2/docker/shlink/data

# 进入 shlink 目录
cd /volume2/docker/shlink

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

一开始会下载 GeoLite2 数据库

在浏览器中输入 http://群晖IP:8019 访问服务端,但实际上只能看到 404 错误

接下来要使用以下命令生成新的 API 密钥

1
docker exec -it shlink-server shlink api-key:generate

也可以从 终端机 进入

输入 shlink api-key:generate

每次执行都会生成不同的 API key,所以截图中的 API key 都是不一样的

在浏览器中输入 http://群晖IP:8020 就能看到客户端的主界面

点 + Add a server,因为前、后端在同一个局域网,所以写 IP 就可以了

添加成功后的主界面

创建一个短链接

生成的短链接类似于 –> https://st.laosu.ml:444/ivyCe

参考文档

shlinkio/shlink: The definitive self-hosted URL shortener
地址:https://github.com/shlinkio/shlink

Shlink — The URL shortener — Documentation
地址:https://shlink.io/documentation/