Slack,無償版では直近90日分しか見えなくなっちゃいましたね.
一時的にEnterprise契約をしてギリギリでバックアップを取得することに成功しましたが,Slackアプリで思い出を遡ることはできなくなってしまいました.
悲しい限りです.
さて,今回はSlack APIを利用して定期的に投稿を取得し,静的なWebページを生成・公開することでいつでも過去の投稿を遡れるようにします.
具体的には,Proxmox上にUbuntuのVMを建てて,以下のソフトウェアを動かし,生成されたファイルをNginxで公開します.
ProxmoxによるVM構築
LXCもありますが,今回はISOアップロードによるVM構築で行います.
ISOのアップロード
今回は Ubuntu 22.04 LTS (Server) を使用します.
左カラムでlocalを選択し,ISO Images→Uploadで使用したいディストリビューションのイメージをアップロードします.
VMの作成
今回は以下のパラメータで作成しました.
General
- Name: 任意の表示名を入力
-
Start at boot: true
OS
- ISO image: アップロードしたISOを選択
System
スルー
Disks
- Disk size (GiB): 64
CPU
スルー (1Core/1CPU)
Memory
- Memory (MiB): 4096
- Minimum memory (MiB): 2048
Network
スルー (上流に疎通可能なIFが自動割当)
Confirm
- Start after created: enable
[Finish] で作成後起動します.
Ubuntuのインストール・設定
左カラムから今回作成したVMを選択し,右上の[Console]を押下するとコンソールが見えます.
インストーラーに従い,インストールを完了します.
SSH設定
以下の記事に従って変更してください.
パッケージ更新設定の変更
Ubuntuの場合,/etc/apt/apt.conf.d/20auto-upgrades を開いてみると,すでに自動アップデートが有効化されていることが分かります.
しかし,/etc/apt/apt.conf.d/50unattended-upgrades を開いてみると,セキュリティアップデートのみが対象となっていることが確認できます.
全てのアップデートを自動で実施させます.
/etc/apt/apt.conf.d/50unattended-upgrades を開き,-updates がコメントアウトされていますので行頭の//を外します.
タイムゾーンの変更
タイムゾーンを合わせておきます.
# timedatectl set-timezone Asia/Tokyo
定期的な自動再起動設定
アップデートによっては再起動が求められるものもあります.
定期的にシェルに入って確認するのも億劫なので,週1で再起動がかかるようにします.
# crontab -e
任意のエディタを選び,末尾に以下を挿入します.(毎週月曜日の朝4:00)
0 4 * * 1 /usr/sbin/reboot >/dev/null 2>&1
なお,設定文の生成にはこちらのサイトが大変有用です.
Crontab Generator - Generate crontab syntax
パッケージの更新・再起動
パッケージ情報を更新後,一旦アップデートしておきます.
# apt update && apt upgrade -y
ファイアウォールの設定
# ufw allow 80
# ufw allow 443
# ufw allow [SSH-PORT]
# ufw enable
グローバルに公開
一旦ここらで再起動をかけます.
# reboot
ちゃんと起き上がってきてくれたら,DNSやルーティングを適切に設定して,サーバの80, 443ポートに外からアクセスできるようにします.
NAT配下でポートフォワードが億劫であれば,ngrokなどを利用するとよいかもしれません.(その場合,証明書の取得が不要です.Nginxのconfigもよしなにいじってください.)
Webサーバのインストール
起動後SSHログインし,rootに成り代わります.
% sudo su -
証明書の取得
BASIC認証をかけるので,https化が必須です.
今回はLet's Encryptを用いてWebサーバ証明書を取得します.
snapdをアップデートします.
# snap install core; sudo snap refresh core
Certbotをインストールします.
# snap install --classic certbot
# ln -s /snap/bin/certbot /usr/bin/certbot
証明書を取得します.
# certbot certonly --nginx
Nginxのインストール・設定
Webサーバソフトウェアnginxをインストールし,設定ファイルを作ります.
# apt install nginx
# vi /etc/nginx/sites-available/slack
今回は以下のようにしました.
ログフォーマットを定義します.
# vi /etc/nginx/nginx.conf
# Logging Settingsの下,# Gzip Settingsの上の範囲内に,以下を記載します.
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
Diffie-Hellman鍵共有に用いるパラメータファイルを作成します.
# openssl dhparam 2048 > /etc/nginx/dhparam
BASIC認証用に,認証ファイルを作成します.
# apt install apache2-utils -y
# cd /etc/nginx
# htpasswd -c .htpasswd [BASIC-AUTH-USERNAME]
BASIC認証用ユーザのパスワードを指定してください.
設定を有効化します.
# ln -s /etc/nginx/sites-available/slack /etc/nginx/sites-enabled/slack
# nginx -t
# systemctl reload nginx
以降は非rootユーザで操作します.
exit で抜けるなどして,初めに作成した常用ユーザに戻ってください.
とりあえずここまでで,BASIC認証を有効化した,httpsアクセスのできるWebサーバが完成しました.
Slackアーカイバの導入
公式ドキュメントに従ってセットアップします.
GitHub - felixrieseberg/slack-archive: Generate static HTML archives of Slack workspaces
カスタムAppの作成
https://api.slack.com/apps を開き,[Create New App]→[From scratch]を選択.
適当な名前(例:Archiver)を入力して,適用したいワークスペースを選択します.
左カラム中央付近の[Features]から,[OAuth & Permission]を開きます.
Redirect URLに,存在しないURLを入力しておきます.
トークンの取得に用いるので,他人が管理しているドメイン配下ではないほうがよいでしょう.
https://slack-archive.example.com/ とでもしておきますか.
次に,User Token Scopesから以下を1つずつ追加します.
似ているものが多いので気をつけてください.
- channels:history
- channels:read
- files:read
- remote_files:read
- users:read
もしどうしてもプライベートCh.やDM,グループDMの内容も取得したい場合は以下も選択します.
ただし,不用意にアクセス権限を与えるとうっかり公開してしまうリスクが生じますので十分注意してください.推奨しません.
Basic Informationに戻り,Client IDとClient Secretをメモしておきます.
トークンの取得
ブラウザで,以下のURLにアクセスします.
https://[WORKSPACE-NAME].slack.com/oauth/authorize?client_id=[CLIENT-ID]&scope=client
すると,以下にリダイレクトされます.
https://[あなたが指定したURL]/?code=[CODE]&state=
[CODE]の部分をメモしておきます.
ブラウザで,以下のURLにアクセスします.
https://[WORKSPACE-NAME].slack.com/api/oauth.access?client_id=[CLIENT-ID]&client_secret=[CLIENT-SECRET]&code=[CODE]"
JSONが返ってくるはずです.
xoxp- で始まる文字列をメモしておきます.
これがトークンで,以降投稿を取得する度に入力する必要があります.
アーカイバのインストール・データ取得
シェルに入り,slack-archiveをインストールします.
% sudo apt install nodejs npm -y
% npx slack-archive
以降,npx slack-archive と叩くことで都度データの取得が可能です.
定期的に叩くことでデータが蓄積され,90日以前の投稿も確認できるようになります.
トークンを入力したあとは,
スペースキーで選択
[a]キーで全選択
Enterキーで次の項目に進みます
ので,注意して選択してください.
slack-archiveディレクトリ内に静的ファイルが配置されていることが確認できます.
以下のコマンドで公開ディレクトリにコピーします.
% sudo cp -r slack-archive/* /usr/share/nginx/html/[WORKSPACE-NAME]/
データ取得の自動化・定期実行
(TBA)
動作確認
ブラウザで https://[DOMAIN]/[WORKSPACE-NAME] にアクセスすると,表示されていることと思います.
おつかれさまでした.