NextcloudをDocker Desktopで構築してみた!

Nextcloud作ってみたよ!(Collaboraとの連携に疲弊しました....)

NextcloudをDocker Desktop for Windows11で構築しました。

用意したコンポーネントはReverse Proxy、Nextcloud、Collabora、Minio、PostgreSQL、Redis、Elasticsearchです。
https通信が望ましいのですが今回はhttp通信のみ対応しています。よってTalkのチャット機能は利用できそうですが、ビデオ通話は利用できません。(自己証明書でも通話できるようになるのかな?

Composeファイル

Reverse Proxy
利用していたイメージでは環境変数”VHOST_*”を指定しているサービスを検知し、自動で設定ファイルを構成します。
本当はhttps通信にしたかったが今回は断念しました。何でも参考にした文献ではこの”nginxproxy/nginx-proxy“イメージと”nginxproxy/acme-companion“の組み合わせでhttps通信が実現可能ではあるものの、インターネットで利用できるドメインが必要だそうです。
自己証明書も今回対応していません。https通信がしたいならこのあたりを見ると良いだろう!

Nextcloud
Object StoreとDB、Redisの設定を行っています。
他サービスのdepends_onでNextcloudの初期化完了まで待機してほしくてhealthcheckを指定しています。

Minio
NextcloudのObject Storeとして利用しています。
アクセスキーは”MINIO_ACCESS_KEY”/”MINIO_SECRET_KEY”で指定しています。”MINIO_ROOT_USER”/”MINIO_ROOT_USER”を指定するとNextcloudでエラーとなります。

PostgreSQL
NextcloudのDBとして利用しています。一応”/docker-entrypoint-initdb.d/”をマウントしていますが今回は特に必要ありません。

Redis
正直ちゃんと利用されている川分かりません(笑)
Nextcloudのキャッシュとして利用されているはずです。

Elasticsearch
NextcroudのWeb上で全文検索を行う場合に利用されます。
アプリインストール画面から”Full text search“/”Full text search – Elasticsearch Platform“/”Full text search – Files“をインストールしてください。その後”docker compose –profile after_nc_startup up -d”コマンドで”elastic_liveindex”を起動させてください。
設定画面で以下を入力する必要があります。

  • Address of the Servelet: http://IP_of_elasticsearch:9200
  • Index: nextcloud
  • [Advanced] Analyzer tokenizer(日本語化対応): kuromoji_tokenizer

その他以下のサービスを起動させています。

elastic_liveindex
全文検索機能を利用する際に”Elasticsearch”でインデックスを作成する必要があり、ファイルを追加する度にインデックスを更新しなければなりません。そのインデックスの作成と自動更新を行うためのサービスです。
面倒なのがこいつは”docker compose up -d”で各種サービスの起動後、Elasticsearchサービスで言及したアプリをインストールした後に起動されなければなりません。

cron
これも正直ちゃんと動作しているか分かりません(笑)
Nextcloudのイメージに標準で同梱されているので恐らくNextcloudのサービス内で実行されるべきかもしれません。1コンテナ1アプリの原則を考慮して分けてはみましたがマウントされるべきディレクトリなどが正しいとは限りません…。

docker-compose.yml

version: '3.7'

# Common
x-common-timezone: &COMMON_TZ
  "Asia/Tokyo"
# Nextcloud
x-nextcloud-img: &NEXTCLOUD_IMAGE
  "nextcloud:29.0.4-apache"
# Minio
x-minio-key: &MINIO_KEY
  "VK78bZz1g6f8O6BI"
x-minio-secret: &MINIO_SECRET
  "iB5fo1nj1Ra1m72fumvQ9FCXXo4vLF1H"
# Database.
x-posgre-database: &POSTGRES_DATABASE
  "nextcloud_db"
x-posgre-root-pass: &POSTGRES_ROOT_PASSWORD
  "postgresql-root"
x-postgres-user-name: &POSTGRES_USER_NAME
  "postgresql_user"
x-postgres-user-pass: &POSTGRES_USER_PASSWORD
  "postgresql-pass"
# Redis
x-redis-admin-pass: &REDIS_PASSWORD
  "nextcloud_redis_pass"

services:
  # Reverse Proxy for Nextcloud and Collabora.
  # hostsファイルに"nc.nextcloud.home: 192.168.1.10"と"office.nextcloud.home: 192.168.1.26"を追記すること。
  # Nextcloud: https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/index.html
  # Collabora: https://sdk.collaboraonline.com/docs/installation/Proxy_settings.html#reverse-proxy-with-nginx-webserver
  reverse_proxy:
    image: nginxproxy/nginx-proxy:alpine
    container_name: reverse_proxy
    # We make the reverse-proxy depend on the acme companion
    # as we would prefer serving no service at all than
    # unsecure ones.
    ports:
      - 80:80
      # - 443:443
      - 9980:9980
    environment:
      TRUST_DOWNSTREAM_PROXY: false
      TZ: *COMMON_TZ
    volumes:
      # - ./htpasswd:/etc/nginx/htpasswd:ro
      - proxy_certs:/etc/nginx/certs:ro
      - proxy_vhost:/etc/nginx/vhost.d
      - proxy_html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
      # - ./network_internal.conf:/etc/nginx/network_internal.conf:ro
    networks:
      nextcloud_net:
        ipv4_address: 192.168.1.10
    depends_on:
      nextcloud:
        condition: service_healthy
      collabora:
        condition: service_started

  nextcloud:
    image: *NEXTCLOUD_IMAGE
    container_name: nextcloud
    init: true
    volumes:
      - nc_data:/var/www/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      nextcloud_net:
        ipv4_address: 192.168.1.21
    expose:
      - 80
    extra_hosts:
      - "office.nextcloud.home:192.168.1.26"
    environment:
      NEXTCLOUD_ADMIN_USER: "admin"
      NEXTCLOUD_ADMIN_PASSWORD: "admin"
      NEXTCLOUD_TRUSTED_DOMAINS: "nc.nextcloud.home office.nextcloud.home"
      # Minio
      # NG for Hostname, OK for IP address.
      OBJECTSTORE_S3_HOST: 192.168.1.22
      OBJECTSTORE_S3_PORT: 9000
      OBJECTSTORE_S3_KEY: *MINIO_KEY
      OBJECTSTORE_S3_SECRET: *MINIO_SECRET
      OBJECTSTORE_S3_BUCKET: nextcloud
      # OBJECTSTORE_S3_REGION: us-east-1
      OBJECTSTORE_S3_USEPATH_STYLE: true
      OBJECTSTORE_S3_SSL: false
      OBJECTSTORE_S3_AUTOCREATE: true
      # Reverse Proxy
      VIRTUAL_PROTO: http
      VIRTUAL_HOST: "nc.nextcloud.home"
      VIRTUAL_PORT: "80"
      # PostgreSQL
      POSTGRES_HOST: nextcloud_postgres
      POSTGRES_DB: *POSTGRES_DATABASE
      POSTGRES_USER: *POSTGRES_USER_NAME
      POSTGRES_PASSWORD: *POSTGRES_USER_PASSWORD
      # Redis
      REDIS_HOST: nextcloud_redis
      REDIS_HOST_PORT: 6379
      REDIS_HOST_PASSWORD: *REDIS_PASSWORD
      # Common
      TZ: *COMMON_TZ
    depends_on:
      - postgresql
      - redis
      - minio
      - elasticsearch
    healthcheck:
      test: ["CMD", "curl", "http://localhost/"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 120s
  
  # Background Cron Job for Nextcloud.
  # https://github.com/docker-library/docs/blob/master/nextcloud/README.md#adding-features
  cron:
    image: *NEXTCLOUD_IMAGE
    volumes:
      - nc_data:/var/www/html
    networks:
      nextcloud_net:
        ipv4_address: 192.168.1.23
    entrypoint: /cron.sh
    depends_on:
      nextcloud:
        condition: service_healthy

  # File Storage.
  minio:
    # Minioのクライアントは名前解決をしないのかコンテナ名で指定不可(IP指定必須)
    image: minio/minio:RELEASE.2024-08-03T04-33-23Z
    container_name: nextcloud_minio
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      # "MINIO_ROOT_USER"組か"MINIO_ACCESS_KEY"組のどちらかのみ有効にできる
      # "MINIO_ROOT_USER"はNextcloudでエラーになる`
      MINIO_ACCESS_KEY: *MINIO_KEY
      MINIO_SECRET_KEY: *MINIO_SECRET
      TZ: *COMMON_TZ
    command: server /data --address ":9000" --console-address ":9001" --json
    volumes:
      - minio_data:/data
    networks:
      nextcloud_net:
        ipv4_address: 192.168.1.22

  postgresql:
    image: postgres:16.3
    container_name: nextcloud_postgres
    ports:
      - 5432:5432
    environment:
      POSTGRES_DB: *POSTGRES_DATABASE
      POSTGRES_ROOT_PASSWORD: *POSTGRES_ROOT_PASSWORD
      POSTGRES_USER: *POSTGRES_USER_NAME
      POSTGRES_PASSWORD: *POSTGRES_USER_PASSWORD
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
      TZ: *COMMON_TZ
    volumes:
      - postgre_data:/var/lib/postgresql/data
      - ./postgres/init/:/docker-entrypoint-initdb.d/
    networks:
      nextcloud_net:
        ipv4_address: 192.168.1.24
  
  redis:
    image: redis:7.4.0-alpine
    container_name: nextcloud_redis
    ports:
      - 6379:6379
    environment:
      TZ: *COMMON_TZ
    command: [ '--requirepass',  *REDIS_PASSWORD ]
    volumes:
      - redis_data:/data/
    networks:
      nextcloud_net:
        ipv4_address: 192.168.1.25
  
  # Document Edit Server
  collabora:
    image: collabora/code:24.04.6.1.1
    container_name: nextcloud_collabora
    expose:
      - 80
    extra_hosts:
      - "nc.nextcloud.home:192.168.1.21"
    environment:
      username: cloud_admin
      password: cloud_pass
      domain: "nc\\.nextcloud\\.home"
      server_name: "office.nextcloud.home"
      # dictionaries: "de_DE"
      # for Reverse Proxy
      extra_params: --o:ssl.enable=false --o:ssl.termination=false --port=80
      VIRTUAL_PROTO: http
      VIRTUAL_HOST: "office.nextcloud.home"
      VIRTUAL_PORT: "80"
      # VIRTUAL_HOST_MULTIPORTS: |-
      #   office.nextcloud.home:
      #     "/":
      #       port: 80
      TZ: *COMMON_TZ
    networks:
      nextcloud_net:
        ipv4_address: 192.168.1.26
    privileged: true
    cap_add:
      - MKNOD
      - CHOWN
      - SYS_ADMIN
    devices:
     - "/dev/fuse:/dev/fuse"
  
  # elasticserch index for nextcloud.
  # Full Serch Plugin:
  # + Full text search
  # + Full text search - Elasticsearch Platform
  # + Full text search - Files
  # Address of the Servelet: http://192.168.1.27:9200
  # Index: nextcloud
  # [Advanced] Analyzer tokenizer(日本語化対応): kuromoji_tokenizer
  elasticsearch:
    build: ./elasticsearch
    container_name: elasticsearch
    expose:
      - 9200
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - xpack.security.enabled=false
    volumes:
      - elasticsearch_data:/usr/share/elasticsearch/data
    networks:
      nextcloud_net:
        ipv4_address: 192.168.1.27
  
  # create elasticserch index for nextcloud.
  # "elasticsearch"で示したプラグインがインストールしないとエラーになる。
  # startup command: docker compose --profile after_nc_startup up -d
  # https://github.com/nextcloud/fulltextsearch/wiki/Basic-Installation
  elastic_liveindex:
    image: *NEXTCLOUD_IMAGE
    volumes:
      - nc_data:/var/www/html
    entrypoint: ''
    command: >
      bash -c "php ./occ fulltextsearch:index &&
       php ./occ fulltextsearch:live -q"
    user: www-data
    networks:
      nextcloud_net:
        ipv4_address: 192.168.1.28
    depends_on:
      nextcloud:
        condition: service_healthy
    profiles:
      - after_nc_startup

volumes:
  proxy_certs:
  proxy_vhost:
  proxy_html:
  proxy_acme:
  nc_data:
  minio_data:
  postgre_data:
  redis_data:
  elasticsearch_data:

networks:
  nextcloud_net:
    ipam:
      driver: default
      config:
        - subnet: 192.168.1.0/24

Dockerfile

“elasticsearch”サービスのためのDockerファイルです。詳細は忘れました。コピペしただけです。

FROM docker.elastic.co/elasticsearch/elasticsearch:7.17.0

RUN elasticsearch-plugin install --batch ingest-attachment &&\
    elasticsearch-plugin install --batch analysis-kuromoji &&\
    elasticsearch-plugin install --batch analysis-icu

コメントを残す