antulik
(Anton Katunin)
2018 年 12 月 11 日午後 10:07
1
背景
オーストラリアの Ruby コミュニティ向けに、クラウド上でホストされた Discourse インスタンス(以下「マスター」と呼びます)を運用しています。年に 2 回、RailsCamp イベントを開催しており、その際は遠隔地(イベントあたり 50〜150 名)で週末全体を共に過ごします。多くの場合、携帯電話の電波がほとんど、あるいは全く届かないため、調整が困難になります。
そのため、イベント会場のローカルネットワーク上で Discourse インスタンスをホストすれば理想的だと考えています(以下「スレーブ」と呼びます)。これを使って、お知らせやスケジュールの共有、写真のアップロードなどが可能になります。
すでに「マスター」上で成長しているコミュニティがあるため、それを活用できれば素晴らしいです。例えば、イベントに到着した時点でプロフィールが既に設定されており、すべてのコンテンツのコピーも利用可能になります。
課題
スレーブが 3 日間オフラインの状態でも、マスターと並行してスレーブの Discourse インスタンスを稼働させる方法。
提案する解決策
Discourse はそのような用途を想定して設計されていないことは理解していますが、私たちのニーズに合わせて調整できる方法があると思います。皆さんのアイデアをお聞かせください。
計画
イベント会場のローカルネットワーク上にスレーブの Discourse インスタンスをセットアップ
イベント直前にマスターをバックアップし、スレーブにリストア
スレーブ側では:
すべてのカテゴリを「読み取り専用」とする
イベント用の新しい「読み書き可能」カテゴリを作成
イベント終了後、Ruby スクリプトを使用してスレーブからマスターへ情報を転送
新規作成されたユーザー
イベント用カテゴリに作成されたすべてのトピックと投稿
完了
質問
提案された解決策に問題があると思われますか?
より良いアプローチは考えられますか?
スレーブ側で全カテゴリへの書き込みアクセスを許可できれば理想的ですが、同期プロセスが非常に複雑になる可能性を感じています。また、電波が届く場所では一部の人がまだマスターにアクセスできるため、混乱を招く恐れもあります。
「いいね!」 4
sam
(Sam Saffron)
2018 年 12 月 11 日午後 11:59
2
Hello from a fellow Australian Rubyist…
This all sounds fine to me. To sync stuff up after the event I would recommend writing a small script that zooms through your read write categories and then makes API requests using our JSON API to create the topics / posts on the master.
I definitely recommend strongly against having any kind of merge topic scenario, it will be full of dragons and not worth the effort.
「いいね!」 8
@antulik
同じようなことに取り組んでみましたか?
私も同様のケースで、Discourse をオフライン環境で動作させ、同期を行う必要があります。
マスターサーバーがあり、100〜200 以上のスレーブインスタンスを運用する予定です。スレーブインスタンスはオンライン/オフラインの両方の状態になり得ますが、ユーザーが利用します。オフラインだったインスタンスがオンラインになった際、競合を起こさずにマスターサーバーと同期し、最新のデータに更新される必要があります。Discourse は頻繁に更新されるため、コードの変更を加えるとインスタンスが壊れるリスクがあるため、コードの変更は避けたいと考えています。
PostgreSQL をある程度カスタマイズすることを考えています。他のデータファイルは Syncthing で同期できますが、PostgreSQL のデータ更新は懸念材料です。マスターのデータを直接同期すると、オフラインユーザーが行った作業が上書きされてしまう可能性があるからです。この問題に対するスクリプト作成のご経験はいかがでしょうか?
「いいね!」 1
antulik
(Anton Katunin)
2019 年 12 月 26 日午後 9:18
4
すべてのイベント会場でインターネットにアクセスできなかったため、まだ行っていません。