NextCloudをVPSからVPN経由でアクセスするように設定し自宅鯖で運用する

###最初に：
VPSと自宅鯖をVPNでつなぐっていうのは以前の記事を参照してください
https://qiita.com/atsu1125/items/16198a5b813ba5e0be80
おそらくこの方法でなくてもVPS側から自宅鯖へローカルIPでアクセスできればOKです
環境としてはVPSがCentOS Stream 8でNginxをリバースプロキシとして運用、Softether VPNサーバーが動いていてそこと自宅サーバーを常時VPN接続しています、自宅鯖は現状docker環境ですので、VPNさえつながればOSなんでもいい


###VPSから自宅鯖へトラフィックを転送：
VPS側のNginxの設定
httpディレクティブにリバースプロキシの設定書いてやる
sites-availableとかのフォルダに設定ファイル書く
examle.comを各自の公開したいURLに変更してね
client_max_body_sizeはWebサーバーに一度にアップロードできる最大容量ということになるのですが
これはあくまでVPSのNginxへのアップロードサイズの指定なので基本かなり多めに確保しておいてよい
自宅鯖のNextCloudの方でアップロードサイズの制限はできると思うしおすし

```php:nextcloud.conf
    server {
    server_name examle.com; # managed by Certbot

        location / {
            proxy_pass http://192.168.40.101:8080;
            proxy_set_header X-Real-IP $remote_addr;
            index index.html index.htm;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_redirect off;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_cache_bypass $http_upgrade;
        }

    listen [::]:443 ssl; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/examle.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/examle.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    client_max_body_size 16G;
}

    server {
    if ($host = examle.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen       80 ;
        listen       [::]:80 ;
    server_name example.com;
    return 404; # managed by Certbot


}

```
VPS側のNginxの設定はこれだけです、簡単でしょ
あとは各自でSSL証明書をインストールしてあげてね
Let's encryptで自動更新組むとかCloudflareの自己証明書いれるとかある
うちはLet's encryptを入れてるけどCloudflareも使ってる
Cloudflareの方でSSL暗号化をフルにしておけば特に問題なし

```
sudo nginx -t
sudo systemctl reload nginx
```
でNginxに設定ファイルを読み込ませてやってね

###自宅鯖：NextCloudのインストール：
dockerとdocker-composeが使えるようにしておいてください
そしたらnextcloudのデータを入れるフォルダを作ってやって
docker-compose.ymlを書きます
userとpasswordとexample.comは各自で値を変更されるとよろし
んでこのOVERWRITEPROTOCOLを書かないとNextCloudのUIでページ推移するとアクセスができなくなる
なんでかというとあくまで私たちがアクセスしてるのはVPS上のNginxなので、先程の設定で常時https化している
しかしこのNextCloudが動いてるApacheにはproxy_passで設定した通りhttpでアクセスしているよね
だからApacheさんはページ推移でhttp://のURLを与えてくる
でも私たちは本来はhttps://でアクセスしてるはず、だからエラーになる
のでしっかりと設定してね
あとはDBがPostgreSQL使ってるけど他のものでも設定できれば大丈夫よ

```docker-compose.yml
version: '3.2'

services:
  db:
    image: postgres:13.1
    restart: always
    volumes:
      - ./db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password

  app:
    image: nextcloud:23
    restart: always
    ports:
      - 8080:80
    depends_on:
      - db
    volumes:
      - ./nextcloud:/var/www/html
    environment:
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=user
      - POSTGRES_HOST=db
      - NEXTCLOUD_ADMIN_PASSWORD=password
      - NEXTCLOUD_ADMIN_USER=root
      - NEXTCLOUD_TRUSTED_DOMAINS=examle.com
      - OVERWRITEPROTOCOL=https
```

そしたらそのフォルダで

```
docker-compose up -d
```
でnextcloudを起動してやる、まだ不十分なとこあるけど、これでとりあえず動くはず
VPN接続がVPSと自宅鯖でつながっていて、nginxでリバースプロキシの設定ができていれば
ブラウザでURL入れれば、あとは上で入力したadmin user, admin passを入れればログインできると思う

そしてもう一つ設定したいこと
それが最大アップロードサイズの指定で
隠しファイルになってるからちょっと大変かもだけど
今dockerでインストールしたNextcloudのディレクトリでnextcloudフォルダに入って
.htaccessっていうファイルを探してほしい、そしたらこれを開いて
最後の行にこれを追記して欲しい

```php:.htaccess
php_value upload_max_filesize 16G
php_value post_max_size 16G
```

ここの16Gってのがアップロードできる最大サイズになるので
ここをお好みの値にしてもらえればいいと思う
設定できたら

```
docker-compose down && docker-compose up -d
```

で再起動してあげると
設定が反映されたはず、NextCloudのWebUIの管理画面からアップロード可能サイズを確認できると思う
これで完成だとおもうわよ

###cron jobの設定

dockerでインストールした場合でもcronはホストマシンで設定しないといけない
でも今の時代はcronじゃのうてsystemd timerで管理します


```php:/etc/systemd/system/nextcloudcron.service
[Unit]
Description = Nextcloud cronjob runner

[Service]
Type = simple
User = “dockerの実行ユーザー”
WorkingDirectory = “nextcloudのdockerのインストールディレクトリ”
ExecStart = /usr/local/bin/docker-compose -f ”nextcloudのdockerのインストールディレクトリ”/docker-compose.yml exec -T -u www-data app php -f cron.php
```

```php:/etc/systemd/system/nextcloudcron.timer
[Unit]
Description = Nextcloud Timer

[Timer]
OnBootSec=5min
OnUnitActiveSec=5m
Persistent=false

[Install]
WantedBy=timers.target
```

これらを書いたら

```
systemctl daemon-reload
systemctl enable —-now nextcloudcron.timer

```

これでタイマーを開始したので

```
systemctl status nextcloudcron.service
systemctl list-timers
```

で確認してやる

###留意点：
これ自宅でローカルIPとポート番号指定してアクセスしようとするとOVERWRITEPROTOCOL=httpsのせいでSSLの警告が出ちゃうんよね
自己証明書だからっていうことなんだけど、httpでアクセスしてもその設定のせいでページ推移の度にhttpsになってしまう
基本は自宅でも正式なURL指定してhttpsでアクセスするのがよさそうだねえ
どっちみちアプリからだと正式なURL指定しないとアクセスできないし