---
# System prepended metadata

title: 在社區網路內 Windows 架設 NextCloud (Docker/SSL)
tags: [環路硬碟, ' 社區網路', ' Docker', ' SSL', ' NextCloud', ' Https']

---

---
tags: 環路硬碟, NextCloud, Docker, 社區網路, SSL, Https
wts:
    title: '在社區網路內 Windows 架設 NextCloud'
---
# 在社區網路內 Windows 架設 NextCloud (Docker/SSL)

## 環境: 
* Windows 10 / Docker
* 要與社區網路公司申請網域名 (mapping 會跳轉到你的 AP 分亨器)。
* 要與社區網路公司申請開通 80 / 443 port
* 在 AP 分亨器上設置固定的 ip 給要架設 nextcloud 的電腦
* 在 AP 分亨器上設置 NAT/虛擬伺服器 的對應 (或 DMZ)
    * 80 -> 192.168.1.101/8080 (範例, 192.168.1.101 即是要建立 nextcloud 的電腦)
    * 443 -> 192.168.1.101/443

## 安裝 Docker Desktop [https://docs.docker.com/desktop/install/windows-install/]

## 參考 Github 上的 NextCloud [https://github.com/nextcloud/docker]
* 移到下方的 [HTTPS - SSL encryption] 中有一個 example source code [https://github.com/nextcloud/docker/tree/master/.examples]
* yam file 內容修改如下, 其中修改說明如下:
    * volumes 直接改為 OS 下的路徑避免 docker 重建時資料不見 (ex: ./@data, ./nextcloud ....)，其中與範例不同的是將 proxy 目錄改為 @proxy
    * 承上，下方 vloumes 都可以註解(原方式是可以在 docker run 時給予設定)
    * 如 github 上說明設定 MYSQL_ROOT_PASSWORD, VIRTUAL_HOST, LETSENCRYPT_HOST, LETSENCRYPT_EMAIL, ports 的對應
    ```
    version: '3'

    services:
      db:
        image: mariadb:10.6
        command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
        restart: always
        volumes:
          - ./db:/var/lib/mysql:Z
        environment:
          - MYSQL_ROOT_PASSWORD=password
          - MARIADB_AUTO_UPGRADE=1
          - MARIADB_DISABLE_UPGRADE_BACKUP=1
        env_file:
          - db.env

      redis:
        image: redis:alpine
        restart: always

      app:
        image: nextcloud:apache
        restart: always
        volumes:
          - ./@data:/var/www/html/data:z
          - ./nextcloud:/var/www/html:z
          - ./@apps:/var/www/html/apps
        environment:
          - VIRTUAL_HOST=yourdomain
          - LETSENCRYPT_HOST=yourdomain
          - LETSENCRYPT_EMAIL=youremail
          - MYSQL_HOST=db
          - REDIS_HOST=redis
        env_file:
          - db.env
        depends_on:
          - db
          - redis
        networks:
          - proxy-tier
          - default

      cron:
        image: nextcloud:apache
        restart: always
        volumes:
          - ./nextcloud:/var/www/html:z
        entrypoint: /cron.sh
        depends_on:
          - db
          - redis

      proxy:
        build: ./@proxy
        restart: always
        ports:
          - 8080:80
          - 443:443
        labels:
          com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
        volumes:
          - ./certs:/etc/nginx/certs:z,ro
          - ./vhost.d:/etc/nginx/vhost.d:z
          - ./html:/usr/share/nginx/html:z
          - /var/run/docker.sock:/tmp/docker.sock:z,ro
        networks:
          - proxy-tier
    #    depends_on:
    #      - omgwtfssl

      letsencrypt-companion:
        image: nginxproxy/acme-companion
        restart: always
        volumes:
          - ./certs:/etc/nginx/certs:z
          - ./acme:/etc/acme.sh:z
          - ./vhost.d:/etc/nginx/vhost.d:z
          - ./html:/usr/share/nginx/html:z
          - /var/run/docker.sock:/var/run/docker.sock:z,ro
        networks:
          - proxy-tier
        depends_on:
          - proxy

    # self signed
    #  omgwtfssl:
    #    image: paulczar/omgwtfssl
    #    restart: "no"
    #    volumes:
    #      - ./certs:/certs
    #    environment:
    #      - SSL_SUBJECT=yourdomain
    #      - CA_SUBJECT=my@example.com
    #      - SSL_KEY=./certs/yourdomain.key
    #      - SSL_CSR=./certs/yourdomain.csr
    #      - SSL_CERT=./certs/yourdomain.crt
    #    networks:
    #      - proxy-tier

    #volumes:
    #  db:
    #  nextcloud:
    #  certs:
    #  acme:
    #  vhost.d:
    #  html:

    networks:
      proxy-tier:
  
    ```
* 依 github 上說明建立
    * 不是指令執行完畢馬上可用，可能要等一些時間
    ```
    docker-compose up -d 
    ```
    常用指令
    ```
    docker-compose up -d
    docker ps -a
    docker-compose down
    docker-compose stop
    docker-compose start
    docker-compose rm
    docker system prune -a
    docker logs xxxxx -f
    ```
* 修改 nextcloud config
    * 在 nextcloud\config\config.php
    trusted_domains 中允許 yourdomain
    ```
      'trusted_domains' => 
          array (
            0 => 'yourdomain',
            1 => '192.168.1.101',
          ),
    ```
    改為走 https
    ```
      'overwrite.cli.url' => 'https://yourdomain',
      'overwriteprotocol' => 'https',#修改協定    
    ```
* 內部 wifi 設備 (電腦) 無法連到 yourdomain 解決方法
    * windows : 在 hosts file 中建立 mapping 即可
    ```
    192.168.1.101        yourdomain (sakurazhan254-1.tc.kingnet.net.tw)
* 內部 wifi 設備 (手機, 以 iphone 為例) [參考](https://www.minwt.com/mac/22141.html)
    * 在主機上安裝 Charles
    * 在手機上 wifi 內設定 代理伺服器