このページでは、CASるで運用しているサーバー構成、VPN、公開サービス、監視基盤、Bot、OpenCloud Office連携の稼働状況をまとめます。
CASるでは、主に以下の2台のサーバーを利用しています。
| サーバー | 役割 | VPN内IP |
|---|---|---|
| ConoHa VPS | 公開入口、VPN Server、監視親サーバー | 10.10.10.10 |
| 石川メッキサーバー | Wiki、Cloud Storage、Office連携、Bot、監視対象サーバー | 10.10.10.20 |
全体として、ConoHa VPSを外部公開の入口および監視親サーバーとし、石川メッキサーバー上でWiki、クラウドストレージ、Office連携、Botを動かしています。両サーバー間はSoftEther VPNで接続します。
各サービスの公開ドメイン、転送先、内部構成については、後続の「公開経路」と「稼働サービス一覧」で説明します。
ConoHa VPSは、外部公開の入口と管理用基盤を担当します。
| システム | リポジトリ | 役割 |
|---|---|---|
| VPN Server | CASru-IT/CasruVPNSettings |
SoftEther VPN Server |
| リバースプロキシ | CASru-IT/CasruPortForward |
Traefikによる443振り分け |
| 監視基盤 | CASru-IT/ServerMonitoringStack |
Prometheus / Grafana / exporter |
VPSでは、外部からの 80 / 443 をTraefikが受けます。
vpn.cas-ru.com への通信はSoftEther VPN Serverへ流します。
wiki.cas-ru.com への通信は、VPN経由で石川メッキサーバー上のWiki.jsへ流します。
drive.cas-ru.com への通信は、VPN経由で石川メッキサーバー上のOpenCloudへ流します。
collabora.cas-ru.com への通信は、VPN経由で石川メッキサーバー上のCollabora Onlineへ流します。
石川メッキサーバーは、サークル内サービスの実行環境です。
| システム | リポジトリ | 役割 |
|---|---|---|
| VPN Client | CASru-IT/CasruVPNSettings |
SoftEther VPN Client |
| Wiki | CASru-IT/CasruWiki |
Wiki.js + PostgreSQL + Elasticsearch |
| Cloud Storage | CASru-IT/CasruCloudStorage |
OpenCloudによるクラウドストレージ |
| Office連携 | CASru-IT/casru-opencloud-office |
Collabora OnlineによるOpenCloud Office連携 |
| 予算管理Bot | CASru-IT/BudgetManagementBotSystem |
Discord予算管理Bot |
| 会員管理Bot | CASru-IT/MemberBotSystem |
Discord会員管理Bot |
| 監視対象 | CASru-IT/ServerMonitoringStack |
node_exporter / cAdvisor |
石川メッキサーバーは、SoftEther VPN ClientとしてVPSへ常時接続します。
VPN内では 10.10.10.20 として扱います。
Wikiは、Wiki.js本体、正本データ保存用のPostgreSQL、検索インデックス用のElasticsearchで構成されています。
PostgreSQLには、Wiki本文、ユーザー、権限、履歴、設定などの正本データを保存します。
Elasticsearchは検索インデックス用であり、Wikiの正本データ保存先ではありません。
OpenCloudは、CASる向けのクラウドストレージとして利用します。
ファイル本体と設定は石川メッキサーバー上の /srv/casru-cloud-storage 配下に永続化します。
外部からは https://drive.cas-ru.com でアクセスします。
Collabora Onlineは、OpenCloud上のOfficeファイル表示・編集に利用します。
外部からは https://collabora.cas-ru.com でアクセスします。
公開URLへの通信とVPN接続は、ConoHa VPS上のTraefikを入口として振り分けます。HTTPSで公開する3サービスはVPSでTLS終端し、VPN接続はTCP/SNI passthroughでSoftEther VPN Serverへ転送します。
図中のWiki.js、OpenCloud、Collabora Onlineへの転送は、いずれもSoftEther VPNを経由します。
| 項目 | 内容 |
|---|---|
| 公開URL | https://wiki.cas-ru.com |
| 公開入口 | ConoHa VPS / Traefik |
| 転送先 | 10.10.10.20:3000 |
| 実体 | 石川メッキサーバー上のWiki.js |
| DB | PostgreSQL / Docker内部のみ |
| 検索基盤 | Elasticsearch / Docker内部のみ |
Wiki.js本体は石川メッキサーバーで動作しています。
PostgreSQLはDocker内部ネットワークのみで利用し、外部には公開しません。
PostgreSQLには、Wiki本文、ユーザー、権限、履歴、設定などの正本データを保存します。
ElasticsearchはWiki.jsの検索インデックス用に利用します。
日本語検索を強化するため、kuromojiを利用した日本語解析を導入しています。
Elasticsearchの 9200 番ポートはホスト公開せず、Wiki.jsからDocker内部ネットワーク経由で接続します。
| 項目 | 内容 |
|---|---|
| 公開URL | https://drive.cas-ru.com |
| 公開入口 | ConoHa VPS / Traefik |
| 転送先 | 10.10.10.20:9200 |
| 実体 | 石川メッキサーバー上のOpenCloud |
| リポジトリ | CASru-IT/CasruCloudStorage |
| 用途 | CASる向けクラウドストレージ、ファイル共有、Officeファイル連携 |
OpenCloud本体は石川メッキサーバーで動作しています。
drive.cas-ru.com は、石川メッキサーバーではなくConoHa VPSを向けます。
VPS上のTraefikがHTTPSを終端し、VPN経由で 10.10.10.20:9200 へ転送します。
OpenCloud側の正式URLは以下です。
OC_URL=https://drive.cas-ru.com
そのため、VPN内から http://10.10.10.20:9200 に直接ブラウザアクセスすると、ログインURLやWeb設定が drive.cas-ru.com 前提になり、表示が崩れる場合があります。
http://10.10.10.20:9200 は、ブラウザ利用ではなく疎通確認用として扱います。
curl -I http://10.10.10.20:9200
curl -i http://10.10.10.20:9200/config.json
通常のブラウザ利用は以下で行います。
https://drive.cas-ru.com
| 項目 | 内容 |
|---|---|
| 公開URL | https://collabora.cas-ru.com |
| 公開入口 | ConoHa VPS / Traefik |
| 転送先 | 10.10.10.20:9980 |
| 実体 | 石川メッキサーバー上のCollabora Online |
| リポジトリ | CASru-IT/casru-opencloud-office |
| 利用元 | OpenCloud / https://drive.cas-ru.com |
| 連携方式 | WOPI |
| 用途 | OpenCloud上のOfficeファイル表示・編集 |
CollaboraはOpenCloudから利用されるOffice表示・編集用サービスです。
ユーザーがOpenCloud上でOfficeファイルを開いたときは、以下の流れでブラウザ、Collabora、OpenCloudのcollaboration serviceが通信します。
Collaboraは、https://drive.cas-ru.com/wopi/files/... にあるOpenCloudのWOPI endpointへアクセスします。専用の wopi.cas-ru.com は使用しません。
9980 番ポートはインターネットへ直接公開しません。
外部公開は必ずVPS上のTraefikの 443 番を経由します。
| 項目 | 内容 |
|---|---|
| 接続先 | vpn.cas-ru.com |
| 公開ポート | 443/tcp |
| VPS側入口 | Traefik |
| 転送先 | SoftEther VPN Server 1443/tcp |
| VPN内ネットワーク | 10.10.10.0/24 |
vpn.cas-ru.com:443 は、TraefikでTLS終端せずにSoftEtherへTCP passthroughします。
| 用途 | IP |
|---|---|
| VPNネットワーク | 10.10.10.0/24 |
| SecureNAT Gateway | 10.10.10.1 |
| ConoHa VPS | 10.10.10.10 |
| 石川メッキサーバー | 10.10.10.20 |
| VPNクライアントPC | 10.10.10.100 - 10.10.10.200 |
管理者PCはVPN接続後、以下のように各サーバーへアクセスできます。
| 対象 | アクセス先 |
|---|---|
| VPS SSH | 10.10.10.10 |
| 石川メッキ SSH | 10.10.10.20 |
| Grafana | http://10.10.10.10:3001 |
| Prometheus | http://10.10.10.10:9090 |
| Wiki.js 直接確認 | http://10.10.10.20:3000 |
| OpenCloud疎通確認 | http://10.10.10.20:9200 |
| OpenCloud正式URL | https://drive.cas-ru.com |
| Collabora疎通確認 | http://10.10.10.20:9980/hosting/discovery |
| Collabora正式URL | https://collabora.cas-ru.com |
| 項目 | 内容 |
|---|---|
| リポジトリ | CASru-IT/CasruWiki |
| 稼働場所 | 石川メッキサーバー |
| アプリ | Wiki.js |
| DB | PostgreSQL |
| 検索基盤 | Elasticsearch 7.17系 + kuromoji |
| 公開URL | https://wiki.cas-ru.com |
| 内部アクセス | 10.10.10.20:3000 |
Wiki.jsは、サークル内の情報共有・運用資料管理に利用します。
Wiki本文、ユーザー、権限、履歴、設定などの正本データはPostgreSQLに保存します。
Elasticsearchは検索インデックス用であり、Wikiのデータ本体ではありません。
日本語検索を強化するため、Elasticsearchにはkuromojiによる日本語解析を導入しています。
Wiki.jsからはDocker内部ネットワークの http://elasticsearch:9200 に接続します。
| 項目 | 内容 |
|---|---|
| リポジトリ | CASru-IT/CasruCloudStorage |
| 稼働場所 | 石川メッキサーバー |
| アプリ | OpenCloud |
| 公開URL | https://drive.cas-ru.com |
| 転送元 | ConoHa VPS / Traefik |
| 転送先 | 10.10.10.20:9200 |
| 主な用途 | クラウドストレージ、ファイル共有、Officeファイル連携 |
| データ保存先 | /srv/casru-cloud-storage/data |
| 設定保存先 | /srv/casru-cloud-storage/config |
CasruCloudStorageは、CASる向けのクラウドストレージ環境です。
現在はOpenCloudを利用し、ファイル共有、ブラウザからのファイル管理、共有リンク作成、Officeファイルの表示・編集などに利用します。
OpenCloudは石川メッキサーバー上で動作し、外部からは https://drive.cas-ru.com でアクセスします。
VPS上のTraefikがHTTPSを終端し、VPN経由で 10.10.10.20:9200 へ転送します。
OpenCloudの正式URLは https://drive.cas-ru.com です。
そのため、http://10.10.10.20:9200 は疎通確認用として扱い、通常のブラウザ利用は https://drive.cas-ru.com から行います。
ファイル本体を扱うサービスのため、WikiやBot以上にバックアップ方針が重要です。
OpenCloud側では、Office連携のために app-registry と collaboration serviceを有効化しています。
主な設定は以下です。
OC_URL=https://drive.cas-ru.com
OC_ADD_RUN_SERVICES=app-registry,collaboration
COLLABORATION_APP_ADDR=https://collabora.cas-ru.com
COLLABORATION_WOPI_SRC=https://drive.cas-ru.com
COLLABORATION_APP_PROOF_DISABLE=true
実際のsecret値はWikiに書かないでください。
| 項目 | 内容 |
|---|---|
| リポジトリ | CASru-IT/casru-opencloud-office |
| 稼働場所 | 石川メッキサーバー |
| アプリ | Collabora Online |
| 公開URL | https://collabora.cas-ru.com |
| 転送元 | ConoHa VPS / Traefik |
| 転送先 | 10.10.10.20:9980 |
| 利用元 | OpenCloud |
| 連携方式 | WOPI |
| 主な用途 | docx / xlsx / pptx のブラウザ表示・編集 |
Collabora Onlineは、OpenCloudのWeb Office機能として利用します。
OpenCloud側では collaboration serviceを有効化し、CollaboraをOfficeアプリとして登録します。
Collabora側では、OpenCloudのWOPI hostとして drive.cas-ru.com を許可します。
主な設定は以下です。
COLLABORA_DOMAIN=collabora.cas-ru.com
COLLABORA_ALLOWED_HOST=drive\\.cas-ru\\.com(:443)?
COLLABORA_ALIASGROUP1=https://drive.cas-ru.com:443,https://drive.cas-ru.com
CollaboraはOpenCloudのWOPI endpointへアクセスします。
https://drive.cas-ru.com/wopi/files/...
9980 番ポートはインターネットへ直接公開せず、必ずVPS上のTraefikからVPN経由で転送します。
| 項目 | 内容 |
|---|---|
| リポジトリ | CASru-IT/BudgetManagementBotSystem |
| 稼働場所 | 石川メッキサーバー |
| 種類 | Discord Bot |
| DB | PostgreSQL |
| データボリューム | CasruBudgetDB |
予算申請、承認、残予算確認、履歴確認などを行うDiscord Botです。
外部Webサービスとして公開するものではなく、Discord APIへ接続して動作します。
| 項目 | 内容 |
|---|---|
| リポジトリ | CASru-IT/MemberBotSystem |
| 稼働場所 | 石川メッキサーバー |
| 種類 | Discord Bot |
| DB | SQLite |
| データボリューム | CasruDB |
| QRコード保存先 | qrcodes/ |
会員登録、会費支払い管理、CSV出力、QRコード管理などを行うDiscord Botです。
外部Webサービスとして公開するものではなく、Discord APIへ接続して動作します。
一部のサービスでは、Docker volumeとは別にホスト側ディレクトリをコンテナへマウントしています。
| システム | ホスト側 | 用途 |
|---|---|---|
| CasruCloudStorage | /srv/casru-cloud-storage/data |
OpenCloudのファイル本体 |
| CasruCloudStorage | /srv/casru-cloud-storage/config |
OpenCloudの設定 |
| BudgetManagementBotSystem | ./src/BudgetManagementBotSystem/data/evidences |
証憑ファイル |
| MemberBotSystem | ./qrcodes |
QRコード |
Docker volumeで管理するDBなどの保存先は、各サービスの説明を参照してください。
監視は ServerMonitoringStack で管理しています。
ConoHa VPSを監視親サーバーとし、PrometheusとGrafanaを動かします。
石川メッキサーバー側では、node_exporterとcAdvisorのみを動かします。
| 役割 | サーバー | サービス |
|---|---|---|
| 監視親 | ConoHa VPS | Prometheus / Grafana / node_exporter / cAdvisor |
| 監視対象 | 石川メッキサーバー | node_exporter / cAdvisor |
| サービス | サーバー | ポート |
|---|---|---|
| Grafana | VPS | 10.10.10.10:3001 |
| Prometheus | VPS | 10.10.10.10:9090 |
| node_exporter | VPS | 10.10.10.10:9100 |
| cAdvisor | VPS | 10.10.10.10:8080 |
| node_exporter | 石川メッキ | 10.10.10.20:9100 |
| cAdvisor | 石川メッキ | 10.10.10.20:8080 |
Grafanaは、Wiki.jsが3000番ポートを利用しているため、VPS側では3001番ポートで運用します。
Prometheusはpush型ではなくpull型です。
VPS側のPrometheusが、VPS自身と石川メッキサーバーのexporterへ定期的にアクセスしてメトリクスを取得します。
| リポジトリ | 内容 |
|---|---|
CASru-IT/CasruVPNSettings |
SoftEther VPN Server / Client 設定 |
CASru-IT/CasruPortForward |
VPS上のTraefikリバースプロキシ |
CASru-IT/CasruWiki |
Wiki.js / PostgreSQL / Elasticsearch構成 |
CASru-IT/CasruCloudStorage |
OpenCloudによるクラウドストレージ構成 |
CASru-IT/casru-opencloud-office |
Collabora OnlineによるOpenCloud Office連携 |
CASru-IT/ServerMonitoringStack |
Prometheus / Grafana / exporter構成 |
CASru-IT/BudgetManagementBotSystem |
予算管理Discord Bot |
CASru-IT/MemberBotSystem |
会員管理Discord Bot |
以下の情報はWikiに直接書かないでください。
.env の実値設定値の実体は、各サーバー上の .env やDockerボリューム内に保持します。
OpenCloud / Collabora連携では、特に以下の値を外部に貼らないでください。
OC_JWT_SECRET
COLLABORATION_JWT_SECRET
COLLABORATION_WOPI_SECRET
OC_MACHINE_AUTH_API_KEY
COLLABORATION_MACHINE_AUTH_API_KEY
COLLABORA_ADMIN_PASSWORD
ログや docker compose config の出力を共有する場合は、secret値を必ず伏せてください。
node_exporterやcAdvisorは、サーバーの詳細なリソース情報を公開します。
そのため、以下のポートはインターネットへ直接公開しないでください。
| サービス | ポート |
|---|---|
| node_exporter | 9100 |
| cAdvisor | 8080 |
| Prometheus | 9090 |
| Grafana | 3001 |
これらはVPN内からのアクセスを基本とします。
ElasticsearchはWiki.jsの検索インデックス用に利用します。
Elasticsearchの 9200 番ポートは、インターネットやVPN内に直接公開しません。
Wiki.jsからDocker内部ネットワーク経由でのみ接続します。
| サービス | ポート | 公開方針 |
|---|---|---|
| Elasticsearch | 9200 |
Docker内部ネットワークのみ |
ElasticsearchにはWiki検索用のインデックスが保存されるため、外部から直接アクセスできる状態にしないでください。
OpenCloudは石川メッキサーバー上で 10.10.10.20:9200 を使って動作します。
ただし、9200 番ポートをインターネットへ直接公開しないでください。
外部公開は必ず以下の経路に限定します。
外部ユーザー
↓
https://drive.cas-ru.com
↓
ConoHa VPS / Traefik
↓ VPN経由
10.10.10.20:9200
| サービス | ポート | 公開方針 |
|---|---|---|
| OpenCloud | 9200 |
VPS上のTraefikからVPN経由で転送 |
| OpenCloud | 9200 |
インターネットへ直接公開しない |
ElasticsearchとOpenCloudはどちらも 9200 番ポートに関係しますが、意味が異なります。
| 対象 | 9200 の意味 |
|---|---|
| Elasticsearch | Wiki.js用検索インデックスのDocker内部ポート |
| OpenCloud | 石川メッキサーバー上でTraefikから転送されるHTTPポート |
Elasticsearchの 9200 はDocker内部ネットワークのみで使います。
OpenCloudの 9200 はVPS上のTraefikからVPN経由で到達する転送先として使います。
Collabora Onlineは石川メッキサーバー上で 10.10.10.20:9980 を使って動作します。
ただし、9980 番ポートをインターネットへ直接公開しないでください。
外部公開は必ず以下の経路に限定します。
外部ユーザー
↓
https://collabora.cas-ru.com
↓
ConoHa VPS / Traefik
↓ VPN経由
10.10.10.20:9980
| サービス | ポート | 公開方針 |
|---|---|---|
| Collabora Online | 9980 |
VPS上のTraefikからVPN経由で転送 |
| Collabora Online | 9980 |
インターネットへ直接公開しない |
OpenCloudの正式URLは以下です。
OC_URL=https://drive.cas-ru.com
この値は、OpenCloudのWeb画面、ログイン、OpenID Connect、共有リンク、WOPI連携などに影響します。
http://10.10.10.20:9200 をブラウザで直接開くと、設定上は drive.cas-ru.com 前提になっているため、表示やログインが崩れる場合があります。
通常利用は以下で行います。
https://drive.cas-ru.com
http://10.10.10.20:9200 は疎通確認用です。
curl -I http://10.10.10.20:9200
curl -i http://10.10.10.20:9200/config.json
OpenCloudとCollaboraは別サブドメインで動作します。
OpenCloud: https://drive.cas-ru.com
Collabora: https://collabora.cas-ru.com
そのため、Traefik側でCSPを調整しています。
drive.cas-ru.com 側では、OpenCloud画面内でCollaboraをiframe表示できるように、frame-src に https://collabora.cas-ru.com を含めます。
frame-src 'self' blob: https://embed.diagrams.net/ https://collabora.cas-ru.com;
collabora.cas-ru.com 側では、Collaboraの cool.html が必要とするinline scriptとWebSocketを許可します。
script-src 'self' 'unsafe-inline' 'unsafe-eval';
connect-src 'self' https://drive.cas-ru.com https://collabora.cas-ru.com wss://collabora.cas-ru.com;
frame-ancestors https://drive.cas-ru.com;
この設定は CASru-IT/CasruPortForward 側のTraefik middlewareで管理します。
OpenCloudとCollaboraはWOPIで連携します。
Officeファイルを開くと、CollaboraはOpenCloudの以下のURLへアクセスします。
https://drive.cas-ru.com/wopi/files/...
今回の構築では、OpenCloud側で以下のエラーが発生しました。
ProofKeys verification failed
Invalid timestamp
WOPI::CheckFileInfo returned 500
原因は、CollaboraからのWOPI requestにProofKeys検証用のtimestamp/proof headerが無く、OpenCloud側が500を返していたことです。
対処として、OpenCloud側で以下を設定しています。
COLLABORATION_APP_PROOF_DISABLE=true
この設定により、CollaboraからのWOPI CheckFileInfo が通り、OpenCloud上のOfficeファイルを開けるようになりました。
Officeファイルが開けない場合は、まず以下を確認します。
OpenCloud側:
cd ~/Github/CasruCloudStorage
docker compose logs --since 10m opencloud | grep -i -E \
'ProofKeys|Invalid timestamp|/wopi/files|CheckFileInfo|status":200|status":500|collaboration'
Collabora側:
cd ~/Github/casru-opencloud-office
docker compose logs --since 10m collabora | grep -i -E \
'wopi|checkfileinfo|unauthorized|failed|error|500|401|403|404|200|cool|ws'
Traefik側:
cd /srv/github/CasruPortForward
docker compose logs --since 10m | grep -i -E \
'drive.cas-ru.com|collabora.cas-ru.com|wopi|cool|ws|error'
Collabora discovery:
curl -fsS https://collabora.cas-ru.com/hosting/discovery | head
VPSまたはVPN内からCollabora upstream:
curl -fsS http://10.10.10.20:9980/hosting/discovery | head
OpenCloud:
curl -I https://drive.cas-ru.com
curl -I http://10.10.10.20:9200
設定変更後は、以下を確認します。
1. https://drive.cas-ru.com にログイン
2. 個人スペース直下に test.docx をアップロード
3. test.docx をクリックしてCollaboraで開く
4. 内容を編集する
5. 保存されることを確認する
6. OpenCloudで再度開き、編集内容が残っていることを確認する
7. 必要に応じて xlsx / pptx も確認する
8. 別ユーザーでも開けるか確認する
OpenCloudはファイル本体を扱うサービスです。
そのため、以下は必ずバックアップ対象に含めてください。
| 対象 | 内容 |
|---|---|
/srv/casru-cloud-storage/data |
ファイル本体 |
/srv/casru-cloud-storage/config |
OpenCloud設定 |
/srv/casru-cloud-storage/.env |
実運用設定 |
.env には秘密情報が含まれる可能性があるため、GitHubやWikiに直接貼り付けないでください。
同一ディスク内のコピーだけでは、ディスク故障時の対策として不十分です。
可能であれば、別ディスク、別サーバー、または外部バックアップ先にも保存してください。
石川メッキサーバーでは、Wiki.jsが 3000 番ポートを使用します。
そのため、GrafanaはVPS側で 3001 番ポートを使用しています。
| サービス | ポート |
|---|---|
| Wiki.js | 10.10.10.20:3000 |
| Grafana | 10.10.10.10:3001 |
サーバー構成を変更した場合は、このページも更新してください。
確認項目:
drive.cas-ru.com の公開設定変更collabora.cas-ru.com の追加・変更collaboration service設定変更COLLABORATION_APP_ADDR の変更COLLABORATION_WOPI_SRC の変更COLLABORATION_APP_PROOF_DISABLE の変更