开源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 客户端,通过使用 ShlinkREST API,提供了一个漂亮的 web UI 来处理多个 Shlink 实例。

前期准备

获取 API key

Shlink 使用 MaxMindGeoLite2 数据库来定位对您的短 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 使用值 mysqlmariapostgresmssql来防止使用 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/