とりあえずの記録

はじめは同学科の人向けのナレッジまとめでした

Slackアーカイブサーバの構築 (on Proxmox VE)

Slack,無償版では直近90日分しか見えなくなっちゃいましたね.
一時的にEnterprise契約をしてギリギリでバックアップを取得することに成功しましたが,Slackアプリで思い出を遡ることはできなくなってしまいました.
悲しい限りです.

さて,今回はSlack APIを利用して定期的に投稿を取得し,静的なWebページを生成・公開することでいつでも過去の投稿を遡れるようにします.

具体的には,Proxmox上にUbuntuVMを建てて,以下のソフトウェアを動かし,生成されたファイルをNginxで公開します.

github.com

ProxmoxによるVM構築

LXCもありますが,今回はISOアップロードによるVM構築で行います.

ISOのアップロード

今回は Ubuntu 22.04 LTS (Server) を使用します.

左カラムでlocalを選択し,ISO Images→Uploadで使用したいディストリビューションのイメージをアップロードします.

VMの作成

右上のCreate VMを押下し,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設定

以下の記事に従って変更してください.

tamasan238.hatenablog.com

パッケージ更新設定の変更

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でWeb用の80・443とSSHポートのみ開けます.

# 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

今回は以下のようにしました.

gist.github.com

ログフォーマットを定義します.
# 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] にアクセスすると,表示されていることと思います.

おつかれさまでした.