You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Docker中部署的NextCloud无法配置Let's Encrypt证书求助

本地Docker部署OwnCloud配置Let's Encrypt证书解决方案需求

已完成前置操作

  • 在自有硬件的Linux Mint 21系统上安装Docker及Docker Desktop
  • 创建并运行可用的OwnCloud镜像与容器
  • 创建并运行可用的MariaDB镜像与容器
  • 成功配置OwnCloud与MariaDB协同工作
  • 可通过互联网端口80访问OwnCloud实例
  • 因Docker容器占用端口80,已停止主机上的Apache服务

问题描述

需要为本地硬件上Docker部署的OwnCloud配置Let's Encrypt证书,但尝试大量教程(包括YouTube视频、博客、问答内容)均无效。

无效操作示例

参考某视频中的命令sudo nextcloud.enable-https lets-encrypt,但该命令针对自带Let's Encrypt的NextCloud镜像,不适用于官方OwnCloud镜像,在主机和容器中执行均报错:

  • 主机执行报错:sudp: nextcloud.enable-https: command not found
  • OwnCloud容器终端带sudo执行报错:/bin/sh: 9: sudo: not found
  • OwnCloud容器终端不带sudo执行报错:/bin/sh: 11: nextcloud.enable-https: not found

已耗时三周(仅周末操作)仍无进展,寻求有效解决方案。


有效解决方案:Docker Compose整合Nginx反向代理+Let's Encrypt

前提条件

  • 拥有指向公网IP的域名(如cloud.yourdomain.com)
  • 域名解析已正确指向公网IP
  • 路由器完成端口映射:外部80、443端口映射到主机的80、443端口

步骤1:创建docker-compose配置

在主机新建目录(如~/owncloud-ssl),创建docker-compose.yml文件:

version: '3.8'

services:
  mariadb:
    image: mariadb:10.6
    restart: always
    volumes:
      - mariadb_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 你的数据库root密码
      MYSQL_DATABASE: owncloud
      MYSQL_USER: owncloud
      MYSQL_PASSWORD: 你的owncloud数据库用户密码

  owncloud:
    image: owncloud/server:latest
    restart: always
    volumes:
      - owncloud_data:/mnt/data
    environment:
      OWNCLOUD_DB_TYPE: mysql
      OWNCLOUD_DB_NAME: owncloud
      OWNCLOUD_DB_USERNAME: owncloud
      OWNCLOUD_DB_PASSWORD: 你的owncloud数据库用户密码
      OWNCLOUD_DB_HOST: mariadb
      OWNCLOUD_ADMIN_USER: admin
      OWNCLOUD_ADMIN_PASSWORD: 你的owncloud管理员密码
      OWNCLOUD_TRUSTED_DOMAINS: cloud.yourdomain.com  # 替换为你的域名
      OWNCLOUD_OVERWRITEPROTOCOL: https  # 强制HTTPS访问
    depends_on:
      - mariadb

  nginx:
    image: nginx:alpine
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"

  certbot:
    image: certbot/certbot
    restart: always
    volumes:
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

volumes:
  mariadb_data:
  owncloud_data:

步骤2:创建Nginx配置文件

在同一目录下创建nginx.conf文件:

events {}

http {
    server {
        listen 80;
        server_name cloud.yourdomain.com;  # 替换为你的域名

        location /.well-known/acme-challenge/ {
            root /var/www/certbot;
        }

        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name cloud.yourdomain.com;  # 替换为你的域名

        ssl_certificate /etc/letsencrypt/live/cloud.yourdomain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/cloud.yourdomain.com/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

        location / {
            proxy_pass http://owncloud:8080;
            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;
        }
    }
}

步骤3:获取初始Let's Encrypt证书

在目录下执行命令:

sudo docker-compose run --rm certbot certonly --webroot -w /var/www/certbot -d cloud.yourdomain.com

按提示输入邮箱、同意条款,完成证书获取。

步骤4:启动所有服务

sudo docker-compose up -d

步骤5:验证配置

访问https://cloud.yourdomain.com,确认OwnCloud可通过HTTPS正常访问,且证书有效。

注意事项

  • 证书会每12小时自动尝试续期,Nginx每6小时重载配置,无需手动操作
  • 若之前已运行单独的OwnCloud和MariaDB容器,需先停止并移除(注意备份数据),再使用此配置启动
  • 确保主机防火墙开放80、443端口

内容的提问来源于stack exchange,提问作者user4462327

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:31:11