今更感はあるけれど、短縮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.yml
and 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が長く使われ、アクセス分析できるようにすることが大切なようで、ユーザー登録ができない設定はおまけのようなものなのだろう。
この設定を適用すると、運用しづらくなるように思った。
さいごに
思っていたよりも重厚な装備になる印象。もう少しライトなものでも良かったのかもしれないけれど、他に選択肢もないような気がしている。
コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他