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