Ubuntu

Ubuntu20.04 短縮URLサービスの提供

今更感はあるけれど、短縮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 docker-compose.yml and the .docker.env-file from the repository and configure the .docker.env (see below)

Github / thedevs-network / kutt

.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が長く使われ、アクセス分析できるようにすることが大切なようで、ユーザー登録ができない設定はおまけのようなものなのだろう。
この設定を適用すると、運用しづらくなるように思った。

さいごに

思っていたよりも重厚な装備になる印象。もう少しライトなものでも良かったのかもしれないけれど、他に選択肢もないような気がしている。

広告

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