Synology Docker 上安装 Nextcloud 的步骤
我在 Synology DSM 7.1 上使用 Docker 包来托管 Nextcloud 的方法。因为我觉得关于这个的日语文档不多,所以我决定记录下来。
另外,我会努力达到安全和设置警告中显示“已通过所有检查”的目标。为了做到这一点,我会做一些较为冒险的尝试。
前提 tí)
假设以下环境已准备就绪。
-
- Synology 社製 DiskStation NAS があること。DSMのバージョンは7.x
-
- Let’s Encrypt で Synology DSM (大雑把に言えば Synology NASの管理画面のことです) に対してSSLサーバー証明書が設定されていること
-
- ヘアピンNATに対応したルーターであること(宅内からDSMのSSLサーバー証明書が設定されたドメインへアクセスできるのであれば、必ずしもその必要はありません)
- 可能であれば、ほかの環境で Nextcloud をセットアップした経験があること
理解者的精华
如果能理解并注意到这一点进行设置,那就不需要阅读以下的文章了。
-
- 外部への露出のために Synology DSM のリバースプロキシ機能を使っています。これによって、Let’s Encrypt サーバー証明書の更新を Synology DSM が勝手にやってくれるようになります。
-
- 共有フォルダーにDockerコンテナ外に置かれる(永続化される)ファイルを置くフォルダーをいくつか作成しています。MariaDB コンテナに見せるフォルダーと、Nextcloudコンテナに見せる data と config と custom_apps のフォルダーについて、Synology DSM の Everyone ユーザーに読み書きの許可を与えています。
- Nextcloud の config.php に以下を書いています。
'overwriteprotocol' => 'https',
'default_phone_region' => 'JP',
-
- Nextcloud に設置される .htaccess を永続化してカスタマイズしています。
- 以下の記述について、
RewriteRule ^.well-known/carddav /remote.php/dav/ [R=301,L]
RewriteRule ^.well-known/caldav /remote.php/dav/ [R=301,L]
我以以下方式进行了改写。
RewriteRule ^.well-known/carddav https://%{SERVER_NAME}:%{SERVER_PORT}/remote.php/dav/ [R=301,L]
RewriteRule ^.well-known/caldav https://%{SERVER_NAME}:%{SERVER_PORT}/remote.php/dav/ [R=301,L]
- Nextcloud コンテナ内に ImageMagick をインストールします。
apt update
apt install -y imagemagick
事前准备工作
那么,我们开始吧。首先要做好准备工作。
請取得Let’s Encrypt的證書。
在这个步骤中,我们将在使用Synology DSM获取的Let’s Encrypt证书的基础上,在即将构建的Nextcloud容器中也使用它。
如果您能够使用HTTPS登录到Synology DSM,那就没有问题。但如果您尚未设置,请阅读以下内容以进行设置。
如何使用Synology NAS从Let’s Encrypt获取证书的方法是什么?
将在 Synology DSM 中获取的证书配置在 Nextcloud 中使用
在 Synology DSM 的控制台中,点击登录门户,然后进入详细设置,找到反向代理,按以下方式创建。
プロトコルHTTPSホスト名何も書かないポートxxxxx(Nextcloudクライアントで指定するポート。ルーターで開いてあればなんでもよい)HSTSを有効にするチェックオン(たしかこれをオンにしないとNextcloudのセキュリティチェックで怒られた気がする)送り先
プロトコルHTTPホスト名localhostポート8088(なんでもよい)
不需要更改自定义标题或详细设置选项卡。
请确保在控制面板>安全>证书>设置中,已选择用于先前添加的目标端口号设置的预计使用的域名证书。
如果在https://证书的域名/上无法打开Synology DSM,则可能是路由器不支持Hairpin NAT。在这种情况下,您需要在Hosts中做一些设置。
如果您使用的是v6 Plus网络,请…
话题稍微偏离了,但是如果使用v6 Plus线路,可用的IPv4端口号将受到限制。
当需要从仅有IPv4环境的外部访问Nextcloud时,必须在可用的端口号范围内设置目标端口号,
否则将无法访问该服务。
由于事后更改URL太麻烦,所以我们应当先好好调查一下。
http://ipv4.web.fc2.com/map-e.html
创建共享文件夹
将Nextcloud的数据以及MariaDB容器的数据库等通过Docker永久保存在这个共享文件夹中。
在控制面板中,选择共享文件夹,点击创建按钮来创建一个共享文件夹。
可以将其命名为 Nextcloud 或其他名称。
垃圾桶功能尚未启用。由于Nextcloud上已存在此功能并且在使用时更为方便,因此在Synology上不进行启用。
此外,对于此共享文件夹的访问权仅限于通过电脑登录Synology NAS的用户。
创建用于存储在Docker中实现持久性的文件的文件夹。
使用文件站,为新创建的Nextcloud文件夹创建以下文件夹。
-
- data
-
- mysql
-
- htaccess
-
- config
- custom_apps
设置对文件夹的访问权限
只有在不进行此设置的情况下,才能启动之后创建的 MariaDB 的 Docker 容器,并且可能会导致容器陷入重启循环,而 Nextcloud 会发生内部服务器错误,无法开始设置。
在 File Station 中,右键点击 Nextcloud 文件夹中创建的 “mysql” 文件夹,然后选择 “属性”。
在所有者选项卡中,选择您用于登录到 Synology DSM 的用户,然后点击 “权限” 选项卡,接着点击 “创建” 按钮。
点击用户,弹出用户列表,选择“Everyone”进行勾选。
然后,在“权限”列表中勾选“读取”和“写入”。
所有子项目都保持勾选状态,点击“完成”即可。
接下来,需要在data、config和custom_apps文件夹中进行相同的配置 (重要)。
在软件包中心安装Docker软件包
Synology 純正の Docker パッケージをインストールするだけで Docker の実行環境が手に入るようになっているので、長い物には巻かれるようにインストールを行う。
Synology DSMのデスクトップから「パッケージセンター」を起動し、「Docker」を検索して「インストール」ボタンをクリックしてインストールする。
今回はこの手順は筆者はずいぶん前に実施済みのため、何か設定項目があったかどうかもわすれてしまったが、たぶん大したことは聞かれていないはず。
安装后,可以点击“打开”按钮。
从“注册表”中下载所需的图像。
这个画面的翻译有点微妙,Docker镜像被全部表达成了“画像”,不过我不在意。
在Docker中打开“注册表”,并从中搜索以下项目进行“下载”。本次下载全部使用“最新”的标签。
Nextcloud
青いチェックマークのついた「nextcloud」を選択して「ダウンロード」ボタンを押して「latest」タグのイメージをダウンロードする。
MariaDB
青いチェックマークのついた「mariadb」を選択して「ダウンロード」ボタンを押して「latest」タグのイメージをダウンロードする。
Redis
青いチェックマークのついた「redis」を選択して「ダウンロード」ボタンを押して「latest」タグのイメージをダウンロードする。
在「容器」选项卡中创建容器
创建之前下载的 Nextcloud、MariaDB 和 Redis 的容器。
尽管有指定容器名称,但实际上可以使用任何名称。
创建MariaDB容器
从“创建容器”中选择图像名称“mariadb:latest”,然后继续。接下来,在“选择网络”中选择“桥接”,然后继续。
在这里,将容器名称设置为“Nextcloud_mariadb”并启用自动重启功能。
这次在这里点击“详细设置”,并在“环境”选项卡中添加以下参数。
本地端口仍然保持自动设置,容器的端口和类型不变,然后继续。
在卷设置中,添加以下文件夹。
在摘要屏幕上,勾选“在向导结束后运行此容器”的选项,然后点击“完成”按钮。
若一切顺利,您在这里创建的容器将会处于运行状态,但如果容器陷入了意外重启循环,请确保在File Station中为mysql文件夹授予了Everyone的权限。
创建一个 Redis 容器
选择从“创建容器”开始的镜像名称为“redis:latest”,然后继续。
接下来,在“选择的网络使用”中选择“桥接”,然后继续前进。
ここではコンテナ名を「Nextcloud_redis」に設定し、やはり自動再起動を有効にします。
ポートの設定や、ボリュームの設定は何も触らなくても大丈夫です。
要約の画面で「ウィザード終了後、このコンテナを実行」のチェックはいれたまま「完了」をクリックします。
只要不进行任何更改,包括持续设置,在没有问题的情况下应该可以启动。
如果不能启动,那就完蛋了。我不知道是什么出了问题。
创建Nextcloud容器
从创建容器菜单中选择图像名称为”nextcloud:latest”,然后继续操作。接下来,在”选择网络”中选择”bridge”,然后点击下一步。
コンテナ名に「Nextcloud_app」と入力、自動再起動を有効にして
ここでも MariaDBのコンテナと同様に「詳細設定」をクリックし、続いて「リンク」のタブで「追加」を2回クリックし、出現した2行の設定を以下のように設定して「保存」をクリックして、続いて「次へ」をクリックしてください。
在本地端口上输入在Synology DSM反向代理设置的“目标”端口号,该端口号是在开始的步骤中设置的。
进行音量设置,选择指定的持续化文件夹并点击“下一步”。点击“添加文件夹”,从已创建的Nextcloud共享文件夹中选择以下文件夹,并按以下方式配置后继续。
请注意,data文件夹是位于www文件夹的根目录下,而不是html文件夹下。
在摘要画面上,保持“在向导结束后运行此容器”选项被勾选的状态,然后点击“完成”。
进行Nextcloud的初始设置
ブラウザ(Google Chromeなど)で
https:// 証明書に記載のドメイン名:リバースプロキシのTargetポート/ でアクセスします。
ここでNASのIPアドレスでアクセスしてセットアップすると、セットアップ中に 400 Bad Request が発生します。
如果一切顺利,您将会看到一个提示窗口,要求您创建一个管理员帐户。但如果出现”内部服务器错误”,请确保您在文件管理器(File Station)中为 Nextcloud 创建的共享文件夹内的”data”文件夹、”config”文件夹以及”custom_apps”文件夹设置了Everyone的访问权限。
如果操作顺利完成,设置如下:
请注意,如果不小心,数据文件夹可能无法持久化,并且数据库可能会设置为SQLite,请小心。
点击”存储和数据库▼”,展开设置项,进行以下配置。
请将数据文件夹的输入从/var/www/html/data更改为必须的/var/www/data。
请在“设置数据库”中选择“MySQL/MariaDB”。
在数据库的主机名上配置的db是指通过Nextcloud_app容器链接设置的“别名”名称。
これで「インストール」ボタンをクリックし、続いて「推奨アプリをインストール」にするか、表示されているアプリがいらなければ「キャンセル」をクリックします。
进入 Nextcloud 容器的方法
以下、セットアップ警告が出ないようにする手順のなかで、コンテナの中に入ってコマンドを入力する場面が何回か出てきますが
Synology の Docker では以下の2通りの方法があります。
使用 Synology DSM 中的“Docker” 来执行的方法.
点击启动Docker,双击包含Nextcloud的容器(如果按照这个步骤进行,容器名为[Nextcloud_app])。
点击“终端”选项卡。
在这里,有时候容器会意外终止。
我不知道原因。
在这里稍等一下,当容器再次启动后,大约在这个时候点击”创建”,就会出现”bash”,然后点击bash。这样,就可以进入输入命令的状态了。
当一切都结束之后,您可以删除bash。
第二种方法… 通过SSH连接Synology NAS并执行操作的方式
在Synology DSM的控制面板中,选择“终端和SNMP”,勾选启用SSH服务。然后使用TeraTerm等工具,通过显示的端口号进行SSH连接,并使用登录DSM时的ID和密码进行登录。
输入sudo docker exec -it Nextcloud_app bash可以进入容器内部(请提供容器名称)。在这里,输入是在容器内执行命令。完成后,输入exit退出容器。
如果您想以Apache用户身份执行occ命令,请使用以下命令:
sudo docker exec -u www-data -it Nextcloud_app bash
确保Nextcloud设置警告不会弹出。
在Nextcloud的仪表盘上,点击右上角用户名的头像图标,然后点击“设置”,就可以打开Nextcloud的设置页面。
点击“管理”中的“概览”,将会显示安全性和设置警告。
对于使用当前最新版本24.0.1通过上述设置方法进行设置时出现的警告,可以通过以下方法解决。
「我們正在透過安全的連線存取實例,但該實例正在產生不安全的URL。」
我会修改存放在Synology NAS上为Nextcloud创建的共享文件夹中的“config”文件夹下的“config.php”文件。
可以在设置文件的任意位置写入以下内容:
‘overwriteprotocol’ => ‘https’
这个会话,虽然写下并保存了,但是更新不会立即显示。
如果多次刷新页面,它就会消失不见了。
让我们一起设置以下电话地区的设置。
“您的系统尚未设置默认的电话地区…” (Your system has not yet set a default phone region…)
在 Synology NAS 上创建的 Nextcloud 用共享文件夹中,修改 “config” 文件夹内的 “config.php”。
在设定文件的某处写入以下内容:
‘default_phone_region’ => ‘JP’。
通常情况下,即使您将此设置写入并保存,它也不会立即生效。
只要上述设置正确无误,它将会逐渐消失。
「Web服务器未正确配置以解决“./well-known/〇〇〇dav”问题」的解决方法。
.htaccess を永続化して、それを使うようにします。
あんまりスマートではありませんが、現状この方法でしか解決できていません。
Synology NASにSSHログインして、以下のようにして.htaccessファイルをコピーします。
sudo docker cp Nextcloud_app:/var/www/html/.htaccess /volume1/Nextcloud/htaccess/
上は、Nextcloudのコンテナ名が Nectcloud_app で Synology NAS に作成した共有フォルダー名が Nextcloud の場合の例です。
只需要一个选项在中文中进行本地化的转述:
在这个文件中,
RewriteRule ^\.well-known/carddav /remote.php/dav/ [R=301,L]
RewriteRule ^\.well-known/caldav /remote.php/dav/ [R=301,L]
と書かれている箇所を以下のように変更します。
RewriteRule ^\.well-known/carddav https://%{SERVER_NAME}:%{SERVER_PORT}/remote.php/dav/ [R=301,L]
RewriteRule ^\.well-known/caldav https://%{SERVER_NAME}:%{SERVER_PORT}/remote.php/dav/ [R=301,L]
随后,在Nextcloud_app的Docker容器的卷设置中,添加文件。
我們將添加這個設定。可能也可以考慮將其設為唯讀模式。
暫時這樣就能解決問題,但當您嘗試升級Nextcloud時,如果不先刪除這個設定,容器將陷入意外的終止循環。
另外,在未来的版本升级中,原始的 .htaccess 文件的内容可能会发生变化。如果发生这种情况,就需要复制该原始文件,并再次对上述部分进行修改,否则可能会发生不好的事情。因此,我不希望采用这种方法,但目前还没有找到好的解决办法。
「邮件服务器的设置未进行或未确认…」
在使用Nextcloud时,您可以在“个人”模块中进行配置,设置您的电子邮件地址。然后,在“管理”模块的“基本设置”中配置电子邮件服务器,并进行测试邮件的发送。一旦成功执行这些步骤,警告将会消失。
你最好设置一下Gmail的相关配置。
参考:https://support.google.com/mail/answer/7126229?hl=ja 的步骤2
如果你在Google账号上启用了两步验证,那么你需要生成一个应用密码。
这个实例的php-imagick模块不支持SVG。
由于容器内没有安装ImageMagick,出现了这个问题。
既然使用了Nextcloud的官方镜像,希望软件相关事项都能保持完美,我真的想抱怨一下。
只需要在容器内执行安装ImageMagick的命令,问题就能解决了。
进入容器并输入以下命令。
apt update
apt install -y imagemagick
删除容器并升级Nextcloud后,需要再次执行此命令。
嗯?Redis怎么了?
是的,虽然我们特意创建了MariaDB容器和Redis容器,但是却没有使用Redis。
在旧版本的Nextcloud(大约是15版本?),如果不配置Redis,就无法完全清除设置警告,但现在即使不配置也能完全正常工作。
嗯,反正既然有这个机会,就试着使用一下吧。
我会修改在Synology NAS上创建的Nextcloud分享文件夹中的”config”文件夹里的”config.php”文件。
我会添加这个设置。
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => 'redis',
'port' => 6379,
),
host で設定している redis とは、Nextcloud_app コンテナのリンクで設定した「エイリアス」の名前です。
要升级使用此方法创建的Nextcloud容器。
しばらくすると、Nextcloud へログインしたときに「Nextcloud バージョンxx.xx への更新があります」などの通知がでてくるようになります。
せっかく Docker を使っているので、Dockerイメージの更新で対応したいですね。
-
- Nextcloud_app コンテナを停止
-
- Nextcloud_mariadb コンテナ、Nextcloud_redis コンテナを停止
-
- Synology NAS の「Nextcloud」共有フォルダーの中身全体をどこかにバックアップ(面倒ならせめてdataフォルダ以外だけでも)
-
- そもそも data フォルダの中が空でないことを確認する(空である場合は、最初のセットアップ時にデータフォルダの永続化に失敗している)
-
- Nextcloud_app コンテナを右クリック→設定→設定をコピーでコピーのインスタンスを作っておく(環境変数などの設定がなんだったかわからなくなったときのためのバックアップコピー)
-
- Synology DSMの画面→Docker→レジストリの画面で「Nextcloud」を検索、ダブルクリックしてタグ「latest」をダウンロード
-
- 通知画面に Docker イメージ %NAME% が正常にダウンロードされました。が表示されるまで待つ
-
- 「コンテナ」画面で Nextcloud_app コンテナを削除
-
- 「Nextcloud のコンテナを作成する」の手順で再びコンテナを作成する。ボリュームの永続化設定や、コンテナのリンク設定も忘れずに行う。このとき、.htaccessの永続化は行わないこと。
-
- Nextcloud へウェブブラウザでアクセスしてアップグレードを実行
-
- 正常終了したら、Nextcloud_app コンテナを一度停止して .htaccess の永続化を行う。
- 再び開始する
如果升级失败
如果数据库的容量超过一定的大小,可能需要通过命令行进行升级。
通过 “Nextcloud容器的进入方法” 中的方法启动容器的bash,在然后手动执行 ./occ upgrade 命令。
如果升级后,维护模式没有自动解除,则执行 ./occ maintenance:mode –off 命令以解除维护模式。
www-data@nextcloud_app:~/html$ ./occ upgrade
Nextcloud or one of the apps require upgrade - only a limited number of commands are available
You may use your browser or the occ upgrade command to do the upgrade
Setting log level to debug
Updating database schema
Updated database
Checking for update of app accessibility in appstore
Checked for update of app "accessibility" in App Store
Checking for update of app activity in appstore
:
:
:
Checking for update of app workflowengine in appstore
Checked for update of app "workflowengine" in App Store
Starting code integrity check...
Finished code integrity check
Update successful
Maintenance mode is kept active
Resetting log level
www-data@nextcloud_app:~/html$ ./occ maintenance:mode --off
Maintenance mode disabled
こういったことが過去一度でもあった場合、あるいは心配な場合は、アップグレード後のバージョンのコンテナを立ち上げて
ウェブブラウザーでアップグレード開始ボタンが表示されることを確認してから、上のようにコマンドラインで実行するとよいと思う。
アップグレード後にセットアップ警告で「データベースにいくつかのインデックスがありません」と表示される場合
なんやかんやメジャーバージョンアップの後は毎回出ているような気がする。
これらはコマンドラインで実行する必要があるので「Nextcloud コンテナの中への入り方」の方法で Nextcloud コンテナの bash を起動してから「〇〇を実行することによって」に書かれているコマンドを実行する。
例)occ db:add-missing-indices を実行することによって と書かれている
./occ db:add-missing-indices
完成后请使用“exit”退出。