nextcloudに手を出してみよう

家庭内外でのストレージとして、nextcloud環境を構築してみようかと思い立ち、家の外からどうするかは別途考えることとして、環境をざっくり作って行きます。
可能であれば、分散しているNAS(4台)も統合して見えるようにしたい…

0.環境

お試しなので、構成はほぼ最小で、HDDも1000GByteにしていきます。
OSはとりあえずUbuntu 22.04.4のメディアからminimal構成で導入。

1.導入と初期設定

1-1.rootパスワードの設定

導入が終わったら、Ubuntuの場合、rootのパスワードが設定されていないので、これを設定。

user@hostname:~$ sudo passwd root
[sudo] password for user: <実行ユーザーのパスワード>
New password: <rootユーザーのパスワード>
Retype new password: <rootユーザーのパスワード>
passwd: password updated successfully

1-2.パッケージのアップデート

aptコマンドでパッケージのアップグレードまで実施する。
アップグレードの最後にサービスの再起動要求が来るのでこれも実施する。

user@hostname:~$ sudo apt update


70 packages can be upgraded. Run 'apt list --upgradable' to see them.
~$ sudo apt upgrade

69 upgraded, 2 newly installed, 0 to remove and 1 not upgraded.
Need to get 16.1 MB of archives.
After this operation, 715 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y

1-3.前提パッケージのインストール

nextcloudは、dockerでも提供されているので、今回はこれを使います。
なのでそもそもの前提となるdocker、docker-composeのパッケージを導入します。

user@hostname:~$ sudo apt install docker docker-compose


Do you want to continue? [Y/n] Y

1-4.仮想マシンのSnapshot取得

一旦ここまででProxmox VEから仮想マシンのsnapshotを取得しておく。
(この後、docker関係で構成がうまくいかなかったときのために…)

1-5.dockerの環境を作る。

ウチの環境でdockerを使う場合、
 ・dockerhomeユーザーで作業
 ・/dockerディレクトリ以下にファイル類を配置
するようにしているので、ユーザー/ディレクトリを作成していく。

root@hostname:~# adduser dockerhome

New password:
Retype new password:

root@hostname:~# usermod -aG docker dockerhome
root@hostname:~# grep docker /etc/group
docker:x:119:dockerhome
dockerhome:x:1001:
root@hostname:~# mkdir /docker
root@hostname:~# chown dockerhome:dockerhome /docker
root@hostname:~# ls -l / | grep docker
drwxr-xr-x 2 dockerhome dockerhome 4096 Mar 09 04:22 docker

1-6.タイムゾーンの設定

この段階で、Ubuntuだとなりに導入していると、タイムゾーンがUTCになっているのを思い出したので、早めにJSTに変更しておきます。
(本来であればパッケージ導入前後にやっておければ…)

root@hostname:~# timedatectl
Local time: Tue 2025-03-09 04:33:38 UTC
Universal time: Tue 2025-03-09 04:33:38 UTC
RTC time: Tue 2025-03-09 04:33:38
Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
root@hostname:~# timedatectl set-timezone Asia/Tokyo
root@hostname:~# timedatectl
Local time: Tue 2025-03-09 13:34:01 JST
Universal time: Tue 2025-03-09 04:34:01 UTC
RTC time: Tue 2025-03-09 04:34:01
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

2.Docker設定

nextcloudをdockerでpullリクエストしてくるだけだと何なので、docker-composeでまとめて処理できるようにしておこうかと思います。

2-1.docker-compose.yml

dockerの関連ファイルは/docker以下に置くようにしているので、まずはそこにディレクトリとファイルを作成します。
今回は試験的な構築なので、他の開設サイトを参考にほぼコピペ。

root@hostname:~# su - dockerhome
dockerhome@hostname:~$ cd /docker/
dockerhome@hostname:/docker$ mkdir docker-nextcloud
dockerhome@hostname:/docker$ cd docker-nextcloud/
dockerhome@hostname:/docker/docker-nextcloud$ touch docker-compose.yml
dockerhome@hostname:/docker/docker-nextcloud$ ls -l
total 0
-rw-rw-r-- 1 dockerhome dockerhome 0 Mar 09 14:22 docker-compose.yml
dockerhome@hostname:/docker/docker-nextcloud$ vi docker-compose.yml

version: '2'
volumes:
nextcloud:
db:

services:
db:
image: mariadb
restart: always
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_ROOT_PASSWORD=<MySQLのrootユーザーパスワード>
- MYSQL_USER=<nextcloudがMySQLに接続するのに使うユーザー>
- MYSQL_PASSWORD=<nextcloudがMySQLに接続するのに使うユーザーのパスワード>
app:
image: nextcloud
ports:
- 8080:80
links:
- db
volumes:
- nextcloud:/var/www/html
restart: always

んー。MySQL(使っているのはmariadbですが)のパスワードの部分、平文で書くのはなぁ…
調べたところ、暗号化した文字列を書いての対応はできないらしい。

そんなことしていたら外部ファイルに記載して対応という方法があったので、これを採用。
設定ファイルを書き換えます。

dockerhome@hostname:/docker/docker-nextcloud$ vi docker-compose.yml

version: '2'
volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    env_file: ./db_environment   新しく追加
    environment:
      - MYSQL_DATABASE=nextcloud
      - MYSQL_ROOT_PASSWORD=<MySQLのrootユーザーパスワード>
      - MYSQL_USER=<nextcloudがMySQLに接続するのに使うユーザー>
      - MYSQL_PASSWORD=<nextcloudがMySQLに接続するのに使うユーザーのパスワード>
  app:
    image: nextcloud
    ports:
      - 8080:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    restart: always

dockerhome@hostname:/docker/docker-nextcloud$ vi ./db_environment
MYSQL_DATABASE=nextcloud
MYSQL_ROOT_PASSWORD=<MySQLのrootユーザーパスワード>
MYSQL_USER=<nextcloudがMySQLに接続するのに使うユーザー>
MYSQL_PASSWORD=<nextcloudがMySQLに接続するのに使うユーザーのパスワード>

そしたら他ユーザーからは見えないように、権限を設定してやる。
dockerのグループに所属しているユーザーにはもちろん見せる。

dockerhome@hostname:/docker/docker-nextcloud$ ls -l
total 8
-rw-rw-r-- 1 dockerhome dockerhome 101 Mar 09 15:06 db_environment
-rw-rw-r-- 1 dockerhome dockerhome 311 Mar 09 15:05 docker-compose.yml
dockerhome@hostname:/docker/docker-nextcloud$ chmod 660 db_environment
dockerhome@hostname:/docker/docker-nextcloud$ chown dockerhome:docker db_environment
dockerhome@hostname:/docker/docker-nextcloud$ ls -l
total 8
-rw-rw---- 1 dockerhome docker 101 Mar 09 15:06 db_environment
-rw-rw-r-- 1 dockerhome dockerhome 311 Mar 09 15:05 docker-compose.yml

2-2.docker-composeで起動

一応、多分これで起動できると思うので、さっそく起動してみます。

dockerhome@hostname:/docker/docker-nextcloud$ docker-compose up -d
Creating network "docker-nextcloud_default" with the default driver
Creating volume "docker-nextcloud_nextcloud" with default driver
Creating volume "docker-nextcloud_db" with default driver
Pulling db (mariadb:)…
latest: Pulling from library/mariadb
5a7813e071bf: Pull complete
bdecd990c29c: Pull complete
5db80086e4da: Pull complete
901fe9394c00: Pull complete
43eb19e1b102: Pull complete
597f7afe50fe: Pull complete
e1dede558384: Pull complete
5c3a22df929b: Pull complete
Digest: sha256:310d29fbb58169dcddb384b0ff138edb081e2773d6e2eceb976b3668089f2f84
Status: Downloaded newer image for mariadb:latest
Pulling app (nextcloud:)…
latest: Pulling from library/nextcloud
7cf63256a31a: Pull complete
02aa0bfe816b: Pull complete
8929067778be: Pull complete
063974348ccd: Pull complete
f26f1ad6e54d: Pull complete
a97035320663: Pull complete
55a6d997f013: Pull complete
be1b093a2245: Pull complete
3acaaa0d0c5b: Pull complete
0e837c2fac70: Pull complete
aecd72a519c7: Pull complete
7f47c5f800b7: Pull complete
1db31e85631a: Pull complete
4f4fb700ef54: Pull complete
42ffb375519b: Pull complete
56b2542f8972: Pull complete
dc86dbc9eb0c: Pull complete
e8a3ce8caaa9: Pull complete
d1850fc0598b: Pull complete
4869d8644676: Pull complete
ffdb8590adf5: Pull complete
e6866d2be3fe: Pull complete
Digest: sha256:32c9403b1b770141850ed999a3a0f20c8ff416d487278e531ae5d594e23d55d2
Status: Downloaded newer image for nextcloud:latest
Creating docker-nextcloud_db_1 … done
Creating docker-nextcloud_app_1 … done
dockerhome@malphas:/docker/docker-nextcloud$ docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------
docker-nextcloud_app_1 /entrypoint.sh apache2-for ... Up 0.0.0.0:8080->80/tcp,:::8080->80/tcp
docker-nextcloud_db_1 docker-entrypoint.sh mariadbd Up 3306/tcp
dockerhome@malphas:/docker/docker-nextcloud$

お、うまくいったらしい。
ん?これ、よく見るとhttpなのか。docker-compose.ymlの時点で気づいていればよかった…
別途https対応は考えることにします。

3.nextcloudに接続

3-1.初期設定

ブラウザから接続(http://hostname:8080)してみます。
すると左の画面が表示されるので、設定値を記入していきます。

設定項目設定値
新しい管理者アカウント新規に設定
新しい管理者パスワード新規に設定
データフォルダー/var/www/html/data(デフォルト値)
データベースを設定してくださいMySQL/MariaDB
データベースアカウント2-1でdb_environmentファイルに書いたMYSQL_USER
データベースのパスワード2-1でdb_environmentファイルに書いたMYSQL_PASSWORD
データベース名2-1でdb_environmentファイルに書いたMYSQL_DATABASE
データベースのホスト名localhost:3306

ん?

先の入力画面でデータベースの選択で[MySQL/MariaDB]が選択したつもりなのですが…なぜ?
とりあえずインストール進めてみます。

ん?なぜだ?

3-2.調査

問題の切り分けをしていくのに、MariaDB側かnextcloud側か切り分けてみる。

3-2-1.MariaDBの接続確認

そもそもつながるかを確認。
確認には外からつついてもよいのですが、コンテナの中に入って接続してみます。
まずはコンテナIDを確認。

dockerhome@hostname:/docker/docker-nextcloud$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eea1807fbd20 nextcloud "/entrypoint.sh apac…" 52 minutes ago Up 17 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp docker-nextcloud_app_1
10ee13408f19 mariadb "docker-entrypoint.s…" 53 minutes ago Up 17 minutes 3306/tcp docker-nextcloud_db_1

mariadbのコンテナIDが分かったので、docker execで入って確認します。

dockerhome@hostname:/docker/docker-nextcloud$ docker exec -i -t 10ee13408f19 /bin/sh
#

まずは、nextcloudに接続するために設定したユーザーで確認。

# mariadb -u <nextcloudのDB接続ユーザー> -p -h localhost <nextcloudで利用するDB名>
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 11.7.2-MariaDB-ubu2404 mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [nextcloud]> \q
Bye

問題なし。
では、MySQLのrootユーザーで確認。


# mariadb -u root -p -h localhost <nextcloudで利用するDB名>
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 11.7.2-MariaDB-ubu2404 mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [nextcloud]> \q
Bye
# exit

こちらも無事接続できるのが確認できた。
どうにもDB側の問題ではなさそう…。

3-2-2.nextcloud側の確認

httpで接続できている時点で、Webアプリ側の起動自体は問題なさそう。
と思って新しい管理者アカウントを試しに”nextcloud”にして、以下画面の赤丸部分触ったら、なぜか裏で処理が回り始めて、インストールが完了してしまった…。

なぜだ?
疑問が尽きない…仮想マシンのスナップショットはとってあるので、別でちょっと検証しよう…

まずは推奨アプリの導入。
今回はお試しなのでとりあえず全部入れます。

あれ?
これだけ?ちょっと拍子抜けしました。なんかもっとこう、色々初期設定があるのかと身構えていたばかりに。

とりあえず、細かい設定は別途詰めてやってみてみます。

参考

https://blog.future.ad.jp/%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E4%BD%95%E3%81%8B%E5%8B%95%E3%81%8B%E3%81%97%E3%81%9F%E3%81%84%E4%BA%BA%E5%90%91%E3%81%91%E3%82%B5%E3%83%BC%E3%83%90%E5%AD%A6%E7%BF%92%E3%83%96%E3%83%AD%E3%82%B0

https://qiita.com/atom00/items/a12c994ad18ea7afc43c