今更感はあるけれど、短縮URLサービスの需要がでてきたので、構築してみる。
探してみると、Kuttというオープンソースのシステムがすぐに見つかった。
Github / kutt
Read.meを読むと、Dockerでシステムが簡単に構築できそうだった。
インストール
Dockerのインストール
Dockerのインストール。
$ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg $ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null $ sudo apt update $ sudo apt install docker-ce docker-ce-cli containerd.io $ docker -v Docker version 20.10.14, build a224086
Docker Composeのインストール。バージョンは2に上がっているようだけれど、今回は1.29.2を利用する。
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose $ docker-compose --version docker-compose version 1.29.2, build 5becea4c
※本日の最新は1.29.2。公式の手順書は最新バージョンに追従するようになっているようなので、そこからコピーしてくるのが良いだろう。
Kuttのインストール
Dockerのイメージを実行するだけで良さそうだ。
最初にこの2つのファイルをダウンロードしてくる。というか、表示されたソースをコピーして、決められた名前で貼り付ける。
Download the
Github / thedevs-network / kuttdocker-compose.ymland the.docker.env-file from the repository and configure the.docker.env(see below)
.docker.envは.envというファイル名にして、にいくつか設定値を書き込む。
.env
… #DEFAULT_DOMAIN=localhost:3000 DEFAULT_DOMAIN=work.hogeserver.hogeddns.jp … ADMIN_EMAILS=administrator@hogeserver.hogeddns.jp … MAIL_HOST=mail.hogeserver.hogeddns.jp MAIL_PORT=465 MAIL_SECURE=false MAIL_USER=rohhie MAIL_FROM=kutt <rohhie@hogeserver.hogeddns.jp> MAIL_PASSWORD=secret # The email address that will receive submitted reports. REPORT_EMAIL=abuse@hogeserver.hogeddns.jp # Support email to show on the app CONTACT_EMAIL=webmaster@hogeserver.hogeddns.jp
ADMIN_EMAILSに定義したメールアドレスでログインすると、他のユーザーが作った短縮URLを表示することができる。
レポートは、ユーザーが「この短縮URLはマルウェアや詐欺」と思ったら報告してくれる宛先。
ドメイン名は work.hogeserver.hogeddns.jp とちっとも短くなくて、短縮URLの意味はないけれども、テスト環境なので良しとする。
宅内のDNSには設定済みで、名前解決ができるようになっている。
SSL保護
ApacheでProxyして、通信をSSLで保護する。
$ sudo apt install apache2
デフォルトで有効になっているサイトを止める。
$ sudo a2dissite 000-default.conf
新規にサイトを作る。
/etc/apache2/sites-available/kutt.conf
<VirtualHost *:80>
ServerName work.hogeserver.hogeddns.jp
ServerAdmin webmaster@hogeserver.hogeddns.jp
Redirect permanent / https://work.hogeserver.hogeddns.jp/
</VirtualHost>
<VirtualHost *:443>
ServerName work.hogeserver.hogeddns.jp
ServerAdmin webmaster@hogeserver.hogeddns.jp
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLProxyEngine on
ProxyPreserveHost on
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
SSLEngine on
SSLCertificateFile /etc/ssl/private/work.hogeserver.hogeddns.jp.crt
SSLCertificateKeyFile /etc/ssl/private/work.hogeserver.hogeddns.jp.key
</VirtualHost>
※ここでは、宅内だけで通用する証明書と鍵を設定した。
作成したサイトを有効にする。
また、必要なライブラリを有効にする。
$ sudo a2ensite kutt.conf $ sudo a2enmod ssl proxy_http2
AH00558よけの設定を入れる。
$ echo "ServerName localhost" | sudo tee /etc/apache2/conf-available/fqdn.conf $ sudo a2enconf fqdn
サイトが正しく動くであろう状態になっていることを確認する。
$ sudo apachectl configtest
問題ないようなら、Apacheを再起動する。
$ sudo systemctl restart apache2
動作確認
設定を終えたら、起動。
$ sudo docker-compose up -d
アクセスしてみる。
https://work.hogeserver.hogeddns.jp/
適当なURLを短縮させてみたところ、動作はしているようだ。
ただし、コピーされるURLは http ではなく、https になっていた。
そのため、Apache等でProxyしてSSLによる保護を掛ける必要があるようだ。
サーバーを再起動してみたが、自動的にサービスが起動してきた。問題なくサービスが提供できそうだ。
カスタマイズ
フロントページのデザインを変えたり、ボタンの動作を変えたい、と思ったけれどもそうした設定はなかった。
それがやりたい場合には、ソースをダウンロードしてきて改造するようにとのやりとりがあった。
API
KuttにはAPIが用意されていて、curlコマンドで色々な操作ができるようだった。
Github gist / hashworks / kutt.sh
これを参考にスクリプトを書いてみる。
データーはJSON形式で返ってくるようで、整形するツールをインストールしておく。
$ sudo apt install jq
Web画面からログインして、APIキーを取得する。これはユーザーごとに払い出される。
そして、APIについては、こちらに説明があった。
docs.kutt.it
#!/bin/bash
KUTT_HOST="https://work.hogeserver.hogeddns.jp"
KUTT_API_KEY="Mi4l4EI7Wo2cNhWbKjeb8APuQ7pBBct5ruzVCDOu"
curl -s -H "X-API-KEY: $KUTT_API_KEY" \
"$KUTT_HOST/api/v2/links?all=true" | \
jq
このスクリプトを実行すると、こんな結果が得られた。
$ ./script.sh
{
"total": 2,
"limit": 10,
"skip": 0,
"data": [
{
"id": "dc7c98e0-fc73-4252-9c6c-f61bad9b7d18",
"address": "9ZweYA",
"banned": false,
"created_at": "2022-03-26T03:36:56.023Z",
"updated_at": "2022-03-26T03:36:56.023Z",
"password": false,
"description": null,
"expire_in": null,
"target": "https://rohhie.net/windows-10-mail-has-become-english/",
"visit_count": 0,
"domain": null,
"link": "https://work.hogeserver.hogeddns.jp/9ZweYA"
},
{
"id": "21f14fd4-ec8f-4e02-a1f2-b082665f9741",
"address": "ipCvLj",
"banned": false,
"created_at": "2022-03-26T00:49:05.912Z",
"updated_at": "2022-03-26T00:49:05.912Z",
"password": false,
"description": null,
"expire_in": null,
"target": "https://rohhie.net/ubuntu20-04-building-a-multi-domain-mailing-list-with-mailman3-second-half/",
"visit_count": 0,
"domain": null,
"link": "https://work.hogeserver.hogeddns.jp/ipCvLj"
}
]
}
ここからidとcreated_atだけを取り出してみる。
わくわくBank. / jqコマンド(jsonデータの加工, 整形)の使い方
#!/bin/bash
KUTT_HOST="https://work.hogeserver.hogeddns.jp"
KUTT_API_KEY="Mi4l4EI7Wo2cNhWbKjeb8APuQ7pBBct5ruzVCDOu"
curl -s -H "X-API-KEY: $KUTT_API_KEY" \
"$KUTT_HOST/api/v2/links?all=true" | \
jq -r '.data[] | .id + " " + .created_at'
試しに、作られてから5分経った短縮URLを削除するスクリプトを作ってみた。
#!/bin/bash
KUTT_HOST="https://work.hogeserver.hogeddns.jp"
KUTT_API_KEY="Mi4l4EI7Wo2cNhWbKjeb8APuQ7pBBct5ruzVCDOu"
WORK_DIR="/tmp"
WORKFILE=clearold.$$
NOWTIME=`date +%s`
EXPIRE=300
# 終了時・異常終了時に作業用ファイルを消す
trap "rm -f $WORKFILE" 0 1 2 3 15
cd $WORK_DIR
# 短縮URL IDとCREATED_ATだけを取り出す
curl -s -H "X-API-KEY: $KUTT_API_KEY" \
"$KUTT_HOST/api/v2/links?limit=100&all=true" | \
jq -r '.data[] | .id + " " + .created_at' > $WORKFILE
while read LINE
do
# 1行ずつ要素を分割(ID,CREATED_AT)
ELEMENT=(${LINE// / })
# 経過時間を計算
CREATETIME=`date +%s -d "${ELEMENT[1]}"`
EXPIRETIME=`expr $NOWTIME - $CREATETIME`
# 5分を越えていたら削除
if [ $EXPIRETIME -ge $EXPIRE ];then
curl -s -H "X-API-KEY: $KUTT_API_KEY" \
-X DELETE \
"$KUTT_HOST/api/v2/links/${ELEMENT[0]}" | jq
fi
done < $WORKFILE
起きたこと
localhost:3000にリダイレクトされる
一度、何故か設定が漏れていた。
.env
… DEFAULT_DOMAIN=localhost:3000 …
これでコンテナを起動してアクセスしたら、localhost:3000にリダイレクトされる。
設定を修正して起動し直してもリダイレクトされる…
同じようなことが起きていたのか、Firefoxでは上手くいくという書き込みを見つけ、IEでアクセスしてみたところ上手くいった。
Chromeでシークレットモードを使ってアクセスしたら、上手くいく。
これはキャッシュだ。
ということで、閲覧履歴データの削除で24時間分(設定してから1時間は過ぎていたが24時間は経っていないので)のすべてを削除してみたところ、上手くアクセスができるようになった。
短縮動作
最初、ApacheによるProxy設定をせずに起動して動作を確認していた。
http://work.hogeserver.hogeddns.jp:3000/
適当なURLを短縮させてみたところ、動作はしているようだ。
ただし、コピーされるURLは http ではなく、https になっていた。
このことから、SSLによる通信の保護は必須と考えて、本編の作業手順とした。
サインアップできない
とりあえず、サインアップでもしてみるか…と思ったができない。
このコマンドでログを出してみたけれども、何も表示されない。
$ sudo docker logs -f --tail 10 work_kutt_1
結論としては、メールの設定が誤っていたことが原因だった。
メールの設定を正しくした(今回は、Postfixの設定を変更)ところ、問題は発生しなくなった。
APIが動かない
オレオレ証明書で動作させているため、curlコマンドが答えを返してくれていなかった。
オレオレ認証局の証明書を/usr/local/share/ca-certificates/~~~.crtとして保存し、以下のコマンドで登録。
$ sudo update-ca-certificates
これで動作するようになった。
APIキーが変わらない
管理者でAPIキーを作成した後、登録した一般ユーザーでもAPIキーを作成してみた。
ところが、表示されるAPIキーが一緒だった。
シークレットモードでログインし、APIキーを表示させてみたら、全く別のキーが表示された。
なるほど…ということで、普通のモードで [CTRL]+[F5] を押したところ、新しいキーが表示された。
全体にキャッシュがよく効いているようなので、テスト時には注意しておこうと思った。
ユーザー登録をできなくする
ユーザー登録ができないように、設定を変更してみた。
.env
DISALLOW_REGISTRATION=true
これにより起きたことは、
- Log in / Sign upのボタンは消えない。
- Log in / Sign upの画面は表示できる。
- Log in / Sign upの画面にある Log in、および、Sing upボタンを押しても反応がない。
- APIが動作しなくなる。
ということだった。
このシステムは、作られた短縮URLが長く使われ、アクセス分析できるようにすることが大切なようで、ユーザー登録ができない設定はおまけのようなものなのだろう。
この設定を適用すると、運用しづらくなるように思った。
さいごに
思っていたよりも重厚な装備になる印象。もう少しライトなものでも良かったのかもしれないけれど、他に選択肢もないような気がしている。


コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他