NextCloudとOnlyOfficeによる内網オフライン環境構築手順

背景

業務上のニーズにより、麒麟システムの仮想マシン間で頻繁にファイルや動画を転送する必要がありました。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

タグ: Nextcloud onlyoffice Docker HTTPS 内網構築

8月18日 01:31 投稿