NextCloud

NextCloudをDockerで構築する手順+自己証明書でssl化をメモ、インストールの時はインターネット環境で、実行はクローズド環境です。
サーバーは Ubuntu Server 24.04 LTS
ホワイトボードサーバーも同一環境に実装
Office Draw.io 全文検索は別途考えよう

sudo apt update
sudo apt upgrade -y

Dockerのインストール

sudo apt install -y ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

一般ユーザー権限で Docker を使用する設定

sudo usermod -aG docker $USER

newgrp docker

mkcertのインストール

sudo apt install mkcert

ルート認証局(CA)のインストール

mkcert -install

サーバー証明書と秘密鍵の作成
your-ip your-domainは適宜変更

mkcert -key-file server.key -cert-file server.crt localhost your-ip your-domain

NextCloudのインストールをここから

ls
server.crt  server.key

mkdir nextcloud
cd nextcloud
mkdir certs

# 上の階層にある自己証明書をコピー
cp ../server.crt certs/
cp ../server.key certs/

docker-compose.yml

vi docker-compose.yml

nextcloud-whiteboard-serverのhttps://your-ip は適宜変更

services:
  app:
    image: nextcloud
    restart: always
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
    environment:
      - MYSQL_PASSWORD=nextcloudpassword
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

  db:
    image: mariadb:10.6
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_PASSWORD=nextcloudpassword
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  proxy:
    image: nginx:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./certs:/etc/nginx/certs:ro
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - app

  nextcloud-whiteboard-server:
    image: ghcr.io/nextcloud-releases/whiteboard:release
    restart: always
    ports:
      - 3002:3002
    environment:
      - NEXTCLOUD_URL=https://your-ip
      - JWT_SECRET_KEY=some-random-key
    depends_on:
      - proxy

volumes:
  nextcloud:
  db:

networks:
  default:
    name: nextcloud-network
    driver: bridge

Nginx

vi nginx.conf

your-ipは適宜変更

server {
    listen 80;
    server_name localhost your-ip;

    # Redirect all HTTP traffic to HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name localhost your-ip;

    # SSL settings
    ssl_certificate /etc/nginx/certs/server.crt;
    ssl_certificate_key /etc/nginx/certs/server.key;

    # Proxy settings to Nextcloud app container
    location / {
        proxy_pass http://app:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 10G; # Adjust as needed for file uploads
        proxy_request_buffering off; # Disable buffering for large uploads
    }

    # WebSocket proxy settings for Whiteboard
    location /whiteboard/ {
        proxy_pass http://your-ip:3002/; # Backend WebSocket server
        proxy_http_version 1.1;           # Use HTTP/1.1 for WebSocket
        proxy_set_header Upgrade $http_upgrade; # WebSocket upgrade header
        proxy_set_header Connection "upgrade";  # Connection header for WebSocket
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # Optional timeout settings (adjust as needed)
        proxy_read_timeout 60s;
        proxy_connect_timeout 60s;
    }

}

docker起動

pwd
/home/user/nextcloud

docker compose up -d

開く
your-ipは適宜変更

http://your-ip
https://your-ip

ログイン画面確認後閉じる

docker container exec -it nextcloud-app-1 /bin/bash

### docker containerの中
# cat /var/www/html/config/config.php

cat の中身をテキストコピー
your-ipは適宜変更
'overwrite.cli.url' の値を httpからhttpsにする
'overwrite.cli.url' のポート8080を付ける
'overwriteprotocol' => 'https',を追加
'config_is_read_only' => true,を追加
'trusted_domains' =>
array (
0 => 'your-ip',
1 => 'your-ip:8080',
2 => 'localhost'
),

pwd
/home/user/nextcloud

vi config.php

<?php
$CONFIG = array (
  'htaccess.RewriteBase' => '/',
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'apps_paths' =>
  array (
    0 =>
    array (
      'path' => '/var/www/html/apps',
      'url' => '/apps',
      'writable' => false,
    ),
    1 =>
    array (
      'path' => '/var/www/html/custom_apps',
      'url' => '/custom_apps',
      'writable' => true,
    ),
  ),
  'upgrade.disable-web' => true,
  'instanceid' => 'oc7249if6xb1',
  'passwordsalt' => 'agedocLilsCYJ8eiGNCfILq6rS2yrw',
  'secret' => '0JUQLU2sH7ViOrSNrWz6a8+9+N2tkxk2/sqM6v6L+26B3LYa',
  'trusted_domains' =>
  array (
          0 => 'your-ip',
          1 => 'your-ip:8080',
          2 => 'localhost'
  ),
  'datadirectory' => '/var/www/html/data',
  'dbtype' => 'mysql',
  'version' => '31.0.4.1',
  'overwrite.cli.url' => 'https://your-ip:8080',
  'overwriteprotocol' => 'https',
  'dbname' => 'nextcloud',
  'dbhost' => 'db',
  'dbport' => '',
  'dbtableprefix' => 'oc_',
  'mysql.utf8mb4' => true,
  'dbuser' => 'nextcloud',
  'dbpassword' => 'nextcloudpassword',
  'installed' => true,
  'config_is_read_only' => true,
);

app のvolumesにconfig.phpを追加

services:
  app:
    image: nextcloud
    restart: always
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
      - ./config.php:/var/www/html/config/config.php:rw # config.phpをマウント
    environment:
      - MYSQL_PASSWORD=nextcloudpassword
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

  db:
    image: mariadb:10.6
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_PASSWORD=nextcloudpassword
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  proxy:
    image: nginx:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./certs:/etc/nginx/certs:ro
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - app

  nextcloud-whiteboard-server:
    image: ghcr.io/nextcloud-releases/whiteboard:release
    restart: always
    ports:
      - 3002:3002
    environment:
      - NEXTCLOUD_URL=https://your-ip
      - JWT_SECRET_KEY=some-random-key
    depends_on:
      - proxy

volumes:
  nextcloud:
  db:

networks:
  default:
    name: nextcloud-network
    driver: bridge

docker再起動

pwd
/home/user/nextcloud

docker compose down

docker compose up -d

開く
your-ipは適宜変更

http://your-ip
https://your-ip

とりあえずインストールする

アプリにホワイトボードを追加した
your-ip は適宜変更

dockerを再起動するとwhiteboardのデータがdocker compose downで消えてしまう

perplexityに聞いたところ redisにしなさいといわれて試したが、docker compose down で同じく消える

whiteboardの/app自体を永続化して対応した
果たしてこれでいいのだろうか・・・ひとまずdocker compose down してもデータは残るようにはなった
一応その時のdocker-compose.yml
your-ip は同じく適宜変更

services:
  app:
    image: nextcloud
    restart: always
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
      - ./config.php:/var/www/html/config/config.php:rw # config.phpをマウント
    environment:
      - MYSQL_PASSWORD=nextcloudpassword
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db

  db:
    image: mariadb:10.6
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_PASSWORD=nextcloudpassword
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  proxy:
    image: nginx:latest
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./certs:/etc/nginx/certs:ro
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - app

  redis: # Redisサービス追加
    image: redis:alpine
    restart: always
    volumes:
      - redis_data:/data
    command: redis-server --save 60 1 --loglevel warning

  nextcloud-whiteboard-server:
    image: ghcr.io/nextcloud-releases/whiteboard:release
    restart: always
    ports:
      - 3002:3002
    environment:
      - NEXTCLOUD_URL=https://your-ip
      - JWT_SECRET_KEY=some-random-key
      - STORAGE_STRATEGY=redis # LRU→Redisに変更
      - REDIS_URL=redis://redis:6379
    depends_on:
      - proxy
      - redis # 依存関係追加

volumes:
  nextcloud:
  db:
  whiteboard_data:
  redis_data: #Redis永続化用

networks:
  default:
    name: nextcloud-network
    driver: bridge

draw.ioとofficeの方も今度試そう


いいなと思ったら応援しよう!