はじめに
Docker で NextCloud & OnlyOffice 環境を構築した時の備忘録。
基本的には以下のサイトの手順に従う。
How to Easily Integrate OnlyOffice and NextCloud Using Docker
が、OSが違ったり、手順通りでうまくいかなかったところがあるので。
【環境、使用ソフトなど】
・さくらVPS
・CentOS7
・Docker
・NextCloud
・OnlyOffice
・Let's Encrypt
ドメインの取得、DNS設定
httpsでのアクセスが基本となるようなので、あらかじめドメインを取得してさくらVPSへのDNS設定をしておく。
今回はとりあえずお試しということで無料の
freenom
を使用。
まずはユーザ登録、ドメイン取得。
このあたりは参考になるページがいくつもあるので、割愛。
こんな感じでドメインとさくらVPSのIPアドレスを紐付けるAレコードを登録する。
さくらVPSの設定
さくらVPSで、CentOS7をインストールし、基本設定を行う。
このあたりも参考サイトがあるので、実際に実行したコマンドだけ雑に列挙。
・CentOS7を選択してOSインストール
スタートアップスクリプトは選択しない。
・インストール済みのパッケージをアップデート
# yum update
・日本語化、結果確認
# localectl set-locale LANG=ja_JP.UTF-8
# localectl status
System Locale: LANG=ja_JP.UTF-8
VC Keymap: jp106
X11 Layout: jp
・ユーザ追加
# useradd ユーザ名
・パスワード設定
# passwd ユーザ名
→パスワードを設定
・権限の設定
# usermod -G wheel ユーザ名
・追加したユーザでsudoできるように設定
# visudo
## Allows people in group wheel to run all commands
#%wheel ALL=(ALL) ALL ←この行がコメントアウトされていたら、コメントアウトを解除。
# vim /etc/pam.d/su
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid ←この行がコメントアウトされていたら、コメントアウトを解除。
auth substack system-auth
参考:基本設定 | 初心者でもわかる!さくらVPS | Sakura VPS 設定マニュアル
必要があれば、rootのパスワードの変更やログイン禁止なども適当に。
で、作業ユーザでログインし直す。
ポート開放
http,httpsのポートを開放する。
$ sudo firewall-cmd --zone=public --add-service=http --permanent
$ sudo firewall-cmd --zone=public --add-service=https --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh http https ←http,httpsが追加されている。
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Dockerのインストール
すでにインストールされていたら削除
$ sudo yum remove docker docker-common docker-selinux docker-engine
最新バージョンをインストール
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum makecache fast
$ sudo yum install docker-ce
起動
$ sudo systemctl start docker
sudoグループに追加(sudoを付けなくてもdockerコマンドが使用できるように)
$ sudo groupadd docker
$ sudo usermod -aG docker ユーザ名
※ 「sudo groupadd docker」はすでに存在するため不要のはずだが、念のため。
自動起動の設定
$ sudo systemctl enable docker
OS再起動(念のため)
$ reboot
Docker Composeのインストール
インストール
$ sudo curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`
> uname -m` -o /usr/local/bin/docker-compose
→パスワード入力
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 617 0 617 0 0 752 0 --:--:-- --:--:-- --:--:-- 752
100 11.2M 100 11.2M 0 0 1765k 0 0:00:06 0:00:06 --:--:-- 2677k
※ バージョンは、
https://github.com/docker/compose/releases
で確認できる。
実行権限付与
$ sudo chmod +x /usr/local/bin/docker-compose
確認
$ docker -v
Docker version 18.09.2, build 6247962
$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
参考:How to Easily Integrate OnlyOffice and NextCloud Using Docker
docker-onlyoffice-owncloudの設定
gitからファイル取得
git clone --recursive https://github.com/ONLYOFFICE/docker-onlyoffice-owncloud
cd docker-onlyoffice-owncloud
git submodule update --remote
docker-compose.ymlの設定
vi docker-compose.yml
5行目を「image: nextcloud:fpm」に変更する。
ersion: '3'
services:
app:
container_name: app-server
image: nextcloud:fpm ←変更
stdin_open: true
tty: true
nginxブロックに「- /etc/letsencrypt:/etc/letsencrypt」を追記する。
nginx:
container_name: nginx-server
image: nginx
stdin_open: true
tty: true
restart: always
ports:
- 80:80
- 443:443
networks:
- onlyoffice
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- app_data:/var/www/html
- /etc/letsencrypt:/etc/letsencrypt ←追記
networks:
onlyoffice:
driver: 'bridge'
nginx.confの設定
vi nginx.conf
サーバブロックにサーバのドメインを追加する。
server {
listen 80;
↓↓↓↓↓↓↓↓↓追記
server_name ドメイン名;
↑↑↑↑↑↑↑↑↑追記
# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
dockerコンテナ起動
$ docker-compose up -d
確認
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
6ea1f4ff6067 bridge bridge local
33d05649cf53 dockeronlyofficeowncloud_onlyoffice bridge local
56fe104ece72 host host local
d10e8d381e95 none null local
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b645decc529b onlyoffice/documentserver:latest "/bin/sh -c /app/onl…" About a minute ago Up About a minute 80/tcp, 443/tcp onlyoffice-document-server
5d0ed88e01c1 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx-server
48192a961cbc nextcloud:fpm "/entrypoint.sh php-…" About a minute ago Up About a minute 80/tcp, 9000/tcp app-server
http://ドメイン名.com
でサイトにアクセスできることを確認する。
とりあえずここまででNextCloudの構築は成功。
※ Chromeで一度httpsで接続してしまうと、再構築後もhttpsにリダイレクトされてしまって接続できない現象が発生。その場合、以下を参考にHSTSを削除する。
Chromeでhttpからhttpsへ強制リダイレクトされる場合の対処法
Let's Encryptの設定
まずはインストール
$ sudo yum install epel-release
$ sudo yum install certbot
nginx.confにLet's Encryptアクセス用の定義を追加
vi nginx.conf
末尾にlocationを追加する。
# Optional: Don't log access to other assets
location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|swf)$ {
access_log off;
}
↓↓↓↓↓↓↓↓↓追記
location ~ /.well-known/acme-challenge {
root /var/www/html/;
allow all;
}
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/html/;
}
↑↑↑↑↑↑↑↑↑追記
}
}
NGINX再起動
$ docker restart nginx-server
※ 参考サイトではlocation ~ /.well-known/acme-challenge {
の記載だったが、証明書の発行でエラーになった。
参考サイトのコメントに従って、location ^~ /.well-known/acme-challenge/ {
も追加する。
証明書発行
$ sudo certbot certonly --webroot --agree-tos --email メールアドレス -d ドメイン名 -w /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data
こんなメッセージが出て、
/etc/letsencrypt/live/ドメイン名/fullchain.pem
/etc/letsencrypt/live/ドメイン名/privkey.pem
が生成されたら成功。
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/ドメイン名/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/ドメイン名/privkey.pem
Your cert will expire on 2019-05-25. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
nginx.confのサーバブロックにSSL証明書の設定を追加する。
vi nginx.conf
server {
listen 80;
server_name ドメイン名;
↓↓↓↓↓↓↓↓↓追記
listen 443 ssl http2;
# if ($scheme != "https") {
# return 301 https://$host$request_uri;
# }
ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
↑↑↑↑↑↑↑↑↑追記
# Add headers to serve security related headers
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
※ 構築後にスプレッドシートを開こうとすると、「文書を保存できませんでした。」のエラーになったので、参考サイトのコメントに従って、
if ($scheme != "https") { ・・・
からの3行はコメントアウトする。
NGINX再起動
$ docker restart nginx-server
今度は「https://ドメイン名」でアクセスできること、証明書が有効になっていることを確認する。
【2019/05/20 追記】
証明書の自動更新の設定。
以下のコマンドで更新&NGINX再起動し、有効期限が伸びていることを確認する。
sudo certbot certonly --webroot -w /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data -d ドメイン名
docker restart nginx-server
OKなら、コマンドをcronに登録し、cronを再起動。
sudo crontab -e
00 0 * * 0 certbot renew --post-hook "docker restart nginx-server"
sudo systemctl restart crond
※ ↑毎週日曜日の00:00に「certbot renew」を実行し、nginxを再起動。
これでOKなはず。(未確認。。。)
MariaDBの設定
インストール
$ docker run --restart=always --net docker-onlyoffice-owncloud_onlyoffice --name mariadb-server -e MYSQL_ROOT_PASSWORD=パスワード -d mariadb --log-bin --binlog-format=MIXED
※ 微妙にオプションが違ってた。Dockerのバージョンのせい?
--net dockeronlyofficeowncloud_onlyoffice
→--net docker-onlyoffice-owncloud_onlyoffice
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8669abf86cb mariadb "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 3306/tcp mariadb-server
bb915afe1f28 onlyoffice/documentserver:latest "/bin/sh -c /app/onl…" 26 hours ago Up 26 hours 80/tcp, 443/tcp onlyoffice-document-server
9446de803483 nextcloud:fpm "/entrypoint.sh php-…" 26 hours ago Up 26 hours 80/tcp, 9000/tcp app-server
f311556e7c31 nginx "nginx -g 'daemon of…" 26 hours ago Up 20 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx-server
MariaDBのdockerにログイン
$ docker exec -it mariadb-server bash
MariaDBでデータベース作成など
mysql -u root -p
→rootのパスワードを入力。
create database nextcloud;
create user nextclouduser@172.18.0.3 identified by 'パスワード';
grant all privileges on nextcloud.* to nextclouduser@172.18.0.3 identified by 'パスワード';
flush privileges;
exit;
exit
※ IPアドレスは「172.18.0.3」のはずだが、念のため確認する。
docker inspect app-server | grep IPAddress
NextCloudにログイン
以下の設定を入力し、「セットアップを完了します」を選択する。
(管理者アカウント、パスワードは適当に設定。)
設定値 | |
---|---|
データフォルダー | /var/www/html/data ※変更なし |
データベース | MySQL/MariaDB |
データベースのユーザー名 | nextclouduser |
データベースのパスワード | 上で設定したパスワード |
データベース名 | nextcloud |
localhost | mariadb-server |
NextCloudにログインできることを確認する。
あなたの全データの安全な家・・・。
OnlyOfficeとの連携
以下のコマンドを発行
$ sudo bash set_configuration.sh
以下のエラーになった。
App "ONLYOFFICE" cannot be installed because it is not compatible with this
version of the server.
onlyofficeを再取得して置き換える。
$ cd ..
$ sudo git clone --depth=1 https://github.com/ONLYOFFICE/onlyoffice-nextcloud.git onlyoffice
$ sudo mv onlyoffice/ /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data/apps/
「ファイルが存在します」のエラーとなった。
cpならどうか。
$ sudo cp -rf onlyoffice/ /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data/apps/
cp: ディレクトリではない `/var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data/apps/onlyoffice/.git' をディレクトリ `onlyoffice/.git' で上書きすることはできません
どうやら「.git」のファイルが邪魔しているらしい。
削除して再度cp。
$ sudo rm /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data/apps/onlyoffice/.git
$ sudo cp -rf onlyoffice/ /var/lib/docker/volumes/docker-onlyoffice-owncloud_app_data/_data/apps/
今度は成功したらしい。
で、再度コマンド発行。
$ cd docker-onlyoffice-owncloud
$ sudo bash set_configuration.sh
今度は成功。
NextCloudのページをリロードすると、SpreedSheetなどが作成可能になっている。