背景
業務上のニーズにより、麒麟システムの仮想マシン間で頻繁にファイルや動画を転送する必要がありました。scpなどのツールは手間がかかり、NextCloudを再利用して社内共有ストレージとオンラインドキュメント機能を構築することにしました。OnlyOfficeとの連携には若干の課題があり、その記録を残して今後の参考にします。
デプロイ選択
単一構成
ユーザー数が少なく重要データの保存期間も短い場合、高可用性を考慮せずDockerによる単純配置を選択しました。NextCloud公式の2種類のDocker構成を比較し、外網アクセスが必要なAIOモードは内網環境では不適切であることが判明しました。したがって、事前にイメージをダウンロードして使用する通常のdocker-compose方式を採用しました。
クラスタ構成
重要なデータを長期間保存する場合、K8sによるマルチノード構成とデータベースクラスタリング、オブジェクトストレージの導入が推奨されます。
Docker設定
Dockerとdocker-composeの基本的なインストールは省略します。ネットワーク制限によりイメージ取得が困難な場合、以下の対処法を提案します:
1. イメージミラーの設定
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn",
"https://mirror.baidubce.com",
"https://docker.1panel.live",
"https://2epe3hl0.mirror.aliyuncs.com"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2. 代理サーバーの利用 HTTP/HTTPSプロキシを設定し、VPN接続することでイメージ取得が可能になります。
3. オフラインイメージ配布 x86マシン向けに事前準備されたイメージを提供します:
リンク:https://pan.baidu.com/s/1m_F5XRvNJYwPrpMxXGrtSw?pwd=6a6T
パスワード:6a6T
構築手順
以下のコンポーザファイルを準備します:
version: '3'
volumes:
storage_data:
db_data:
redis_data:
office_data:
services:
database:
image: mariadb:10.11
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
networks:
- internal_network
volumes:
- db_data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=cloud@1234
- MYSQL_PASSWORD=cloud@1234
- MYSQL_DATABASE=cloud
- MYSQL_USER=cloud
cache:
image: redis:alpine
command: redis-server /etc/redis/redis.conf
restart: always
volumes:
- redis_data:/data
- ./redis.conf:/etc/redis/redis.conf
environment:
- REDIS_PASSWORD=cloud@1234
networks:
- internal_network
app_server:
image: nextcloud:latest
depends_on:
- database
- cache
restart: always
ports:
- 9090:80
networks:
- internal_network
links:
- database
- cache
- office
volumes:
- storage_data:/var/www/html
environment:
- DB_HOST=databse
- DB_NAME=cloud
- DB_USER=cloud
- DB_PASSWORD=cloud@1234
- REDIS_HOST=cache
- REDIS_PASSWORD=cloud@1234
- TRUSTED_PROXIES=10.44.61.172
- OVERWRITEHOST=10.44.61.172:9091
- OVERWRITEPROTOCOL=https
- OVERWRITECLIURL=https://10.44.61.172:9091
office_server:
image: onlyoffice/documentserver:latest
restart: always
depends_on:
- database
- cache
volumes:
- office_data:/var/www/onlyoffice/Data
ports:
- 9080:80
- 9443:443
environment:
- JWT_ENABLED=true
- JWT_SECRET=office@1234
networks:
- internal_network
networks:
internal_network:
driver: bridge
redis.confの設定:
port 6379
bind 0.0.0.0
maxmemory 8192mb
maxmemory-policy allkeys-lru
requirepass cloud@1234
timeout 0
databases 16
構築実行:
docker-compose up -d
HTTPS設定
NextCloudのSSL設定
証明書の取得手順:
mkdir -p /data/nextcloud/ssl/ && cd /data/nextcloud/ssl/
openssl genrsa -out cloud.key 2048
openssl req -new -key cloud.key -out csr.csr
openssl x509 -req -days 3650 -in csr.csr -signkey cloud.key -out cloud.crt
Nginx逆プロキシ設定:
# nextcloud
server {
listen 9091 ssl http2;
listen [::]:9091 ssl http2;
ssl_certificate /data/nextcloud/ssl/cloud.crt;
ssl_certificate_key /data/nextcloud/ssl/cloud.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!DHE:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
client_max_body_size 0;
client_body_timeout 3600s;
fastcgi_buffers 64 4K;
client_body_buffer_size 512k;
location / {
proxy_pass http://10.44.61.172:9090/;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 1800;
proxy_send_timeout 1800;
proxy_read_timeout 1800;
proxy_buffering off;
send_timeout 1800;
}
location ^~ /.well-known {
location = /.well-known/carddav { return 301 /remote.php/dav/; }
location = /.well-known/caldav { return 301 /remote.php/dav/; }
location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
location /.well-known/pki-validation { try_files $uri $uri/ =404; }
return 301 /index.php$request_uri;
}
}
設定確認:
nginx -t
systemctl reload nginx
OnlyOfficeのSSL設定
オフィスボリュームに証明書ディレクトリを作成し、以下手順で設定:
cd /data/docker-home/volumes/nextcloud_office_volume/_data
mkdir certs && cd certs
openssl genrsa -out office.key 2048
openssl req -new -key office.key -out csr.csr
openssl x509 -req -days 3650 -in csr.csr -signkey office.key -out office.crt
NextCloudとOnlyOfficeの連携
OnlyOfficeプラグインの導入
プラグインをダウンロードし、DBボリュームのappsディレクトリに配置:
tar xf onlyoffice.tar.gz -C /data/docker-home/volumes/nextcloud_db_volume/_data/apps/
OnlyOfficeの設定
NextCloudの管理画面から「設定」→「ONLYOFFICE」にアクセスし、HTTPSアドレスとパスワードを入力します。
FAQ
オンラインドキュメントが読み込めない場合
自己署名証明書のため、OnlyOfficeコンテナ内で設定を変更します:
docker exec -it nextcloud_office_1 bash
nano /etc/onlyoffice/documentserver/default.json
"rejectUnauthorized": false
共有リンクがコピーできない場合
HTTPSが正しく設定されていない可能性があります。httpではなくhttpsでアクセスしてください。
大容量ファイルアップロードエラー
PHP設定ファイルに以下を追加:
php_value upload_max_filesize 16G
php_value post_max_size 16G
php_value max_input_time 3600
php_value max_execution_time 3600