LoginSignup
3
3

More than 1 year has passed since last update.

Nextcloud with Apache2 + PostgreSQL on Docker

Last updated at Posted at 2023-04-08

当研究室のシステム

【変更履歴】
2023/04/10:php.iniのmemory_limit, post_max_size, upload_max_filesize変更.

概要

Docker起動したらNextcloud動くようにしたもの.
Apache2のDockerの中にNextcloudを設定.Apache2で動かしているメインのページは/var/www/htmlなどに別にあり,Nextcloudはサブディレクトリで動かす(Nextcloud専用にしない).
PostgreSQLのDockerは他のPC上にあるものとするが,同じPC上に構築する場合も同様.

準備

細かな設定はそれぞれのページに沿うものとする.

Apache2にインストールするモジュール等

公式のInstallation on Linux -Prerequisites for manual installation眺めて,入っていないものをインストール.
自分は,LDAP, PostgreSQLを使用しているので,php-ldapphp-pgsqlをインストールし,a2enmod authnz_ldapしている.

パラメータについて

phpのパラメータはApache2のDockerfileで,Nextcloudのパラメータはマウントしている/srv/nfs4/apache2/www/nextcloud/config/config.phpを直接編集し,設定している.
基本的には公式の値を使用しているが,自分の環境に合わせて変更した部分も少しある.

設定

データベース関係

nextcloudで使用するデータベース用のユーザ・テーブル作成.
PostgreSQL on Dockerの場合,データベースの動いているPC上で作業.
例だとコンテナ名はpgsql_db,ユーザ名はnextcloud,パスワードはpass,データベース名はnextcloud_db.適宜変えましょう(特にパスワード).

$ docker container exec --user postgres -it <データベースのコンテナ名> bash
$ psql
postgres=# CREATE USER <ユーザ名> WITH PASSWORD '<パスワード>';
postgres=# CREATE DATABASE <データベース名> WITH OWNER <ユーザ名>;
$ docker container exec --user postgres -it pgsql_db bash
$ psql
postgres=# CREATE USER nextcloud WITH PASSWORD 'pass';
postgres=# CREATE DATABASE nextcloud_db WITH OWNER nextcloud;

以後はこの例を使用する.

Apache2関係

Apache2で使用するNextcloud用のconf作成.
Apache2 on Dockerの場合,~/Docker/www/sites-available/に作成.

~/Docker/www/sites-available/nextcloud.conf
Alias /nextcloud "/var/www/nextcloud/"

<Directory /var/www/nextcloud/>
  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews

  <IfModule mod_dav.c>
    Dav off
  </IfModule>
</Directory>

Docker関係

Apache2 on DockerDockerfileを以下のように編集・更新.
Apache2 on Dockerdocker-compose.ymlはそのまま使用.

~/Docker/www/Dockerfile
FROM ubuntu:22.04

RUN set -x && \
    apt update && apt upgrade -y && \
    DEBIAN_FRONTEND=noninteractive apt install -y \
       apache2 \
       ffmpeg \
       libmagickcore-6.q16-6-extra \
       locales \
       php \
       php-apcu \
       php-bcmath \
       php-bz2 \
       php-curl \
       php-gd \
       php-gmp \
       php-imagick \
       php-imap \
       php-intl \
       php-ldap \
       php-mbstring \
       php-pgsql \
       php-smbclient \
       php-xml \
       php-zip && \
    locale-gen ja_JP.UTF-8

ENV TZ=Asia/Tokyo LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja

ARG HOSTNAME=www

COPY ./conf /etc/apache2/conf
COPY ./sites-available /etc/apache2/sites-available

RUN echo ServerName $HOSTNAME > /etc/apache2/conf-available/fqdn.conf && \
    /usr/sbin/a2enconf fqdn && \
    /usr/sbin/a2dissite 000-default && \
    /usr/sbin/a2ensite default && \
    /usr/sbin/a2ensite default-ssl && \
    /usr/sbin/a2enmod ssl && \
    /usr/sbin/a2enmod authnz_ldap && \
    /usr/sbin/a2enmod rewrite && \
    /usr/sbin/a2ensite nextcloud && \
    /usr/sbin/a2enmod headers && \
    sed -i 's/memory_limit = 128M/memory_limit = -1/' /etc/php/8.1/apache2/php.ini && \
    sed -i 's/memory_limit = 128M/memory_limit = -1/' /etc/php/8.1/cli/php.ini && \
    sed -i 's/post_max_size = 8M/post_max_size = 128M/' /etc/php/8.1/apache2/php.ini && \
    sed -i 's/post_max_size = 8M/post_max_size = 128M/' /etc/php/8.1/cli/php.ini && \
    sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 128M/' /etc/php/8.1/apache2/php.ini && \
    sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 128M/' /etc/php/8.1/cli/php.ini && \
    sed -i 's/max_execution_time = 30/max_execution_time = 3600/' /etc/php/8.1/apache2/php.ini && \
    sed -i 's/max_execution_time = 30/max_execution_time = 3600/' /etc/php/8.1/cli/php.ini && \
    sed -i 's/;max_input_vars = 1000/max_input_vars = 5000/' /etc/php/8.1/apache2/php.ini && \
    sed -i 's/;max_input_vars = 1000/max_input_vars = 5000/' /etc/php/8.1/cli/php.ini && \
    echo "opcache.enable = 1" >> /etc/php/8.1/mods-available/opcache.ini && \
    echo "opcache.enable_cli = 1" >> /etc/php/8.1/mods-available/opcache.ini && \
    echo "opcache.interned_strings_buffer = 16" >> /etc/php/8.1/mods-available/opcache.ini && \
    echo "opcache.max_accelerated_files = 10000" >> /etc/php/8.1/mods-available/opcache.ini && \
    echo "opcache.memory_consumption = 256" >> /etc/php/8.1/mods-available/opcache.ini && \
    echo "opcache.save_comments = 1" >> /etc/php/8.1/mods-available/opcache.ini && \
    echo "opcache.revalidate_freq = 1" >> /etc/php/8.1/mods-available/opcache.ini && \
    echo "opcache.jit = 1255" >> /etc/php/8.1/mods-available/opcache.ini && \
    echo "opcache.jit_buffer_size = 256M" >> /etc/php/8.1/mods-available/opcache.ini && \
    echo "apc.enable_cli=1" >> /etc/php/8.1/apache2/php.ini && \
    echo "apc.enable_cli=1" >> /etc/php/8.1/cli/php.ini

EXPOSE 80
EXPOSE 443

CMD ["apachectl","-D","FOREGROUND"]

memory_limit >= post_max_size >= upload_max_filesizeである.
で,Nextcloudの場合,大きなファイルは分割してアップロード,その後に内部で結合,らしい.のである程度で良さそう.
ただし下記参考にあるようにパラメータの調整は必要そう.
参考:【techblog】Nextcloud での大容量ファイルの取り扱い

ちなみにmax_execution_time = 3600はNextcloudのfilelocking.ttlのデフォルト値に合わせただけ.

Nextcloud

本体のDL・展開

  1. 公式のcommunity projectsのGet Zip fileからlatest.zipを取得.
  2. /var/www/nextcloudに展開
    1. Apache2 on Dockerではnfs4で提供されている/apache/wwwを利用しているので,もととなる/apache/www/nextcloudに展開.
    2. 所有権をwww-dataに設定
      cd '/apache/www/の場所'
      chown -R www-data:www-data nextcloud
      

Dockerイメージの作成・起動

~/Docker/wwwで作業.
イメージ名・タグ名はご自由に.

docker image build -t nek/www:latest . && docker compose up -d

エラーがなければブラウザ経由(https://<自分のサイト名>/nextcloud/https://<IPアドレス>/nextcloud/など)でアクセスできる.

Nextcloudのインストール

ブラウザ経由でアクセスすると,設定を行うためのページが出てくる.
管理者用のユーザ名・パスワードはここで設定する.
その他のものは設定した値(データ置き場:/var/www/nextcloud/data,データベースアクセスのためのユーザ名:nextcloud,そのパスワード:pass,データベース名:nextcloud_dbやデータベースの名前・IPアドレスなど)を入力する.
ちょっと時間がかかるが,正しく終わると次に進む.
入力間違えちゃって訳が分からなくなったら,nextcloud/config/config.phpを消してもう一回すればよい.

自分の環境では,https://nextcloud/index.php/core/apps/recommendedにジャンプして「読み込めないよ」と出た.しかし,https://nextcloud/index.php/...の間に自分のサイト名を入れたら無事に次の画面に進んだ.

運用

基本的にネットに沢山の情報があるので適当に調べつつ設定.
以下は,特に自分用の忘備録.

cronについて

定期的に回したいものなどぼちぼちある.
特に管理者でログインし設定するバックグラウンドジョブではCron(推奨)に設定した上でシステムのcronによりnextcloud/cron.phpを5分ごとに実行する必要がある.
一方でdockerでcronまわすのはちょっと面倒っぽい.
よってホストPCのcronでdocker内の処理を定期的に実行する.nextcloud/cron.phpの例だと以下のようになる.

ホストの/etc/cron.d/nextcloud
*/5 * * * * root docker container exec --user www-data www /usr/bin/php -f /var/www/nextcloud/cron.php
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3