IP 服务器安装 Let's Encrypt 的证书,用于 1panel 安装的 nextcloud 服务

本文介绍如何使用 acme.sh 签发证书并自动续期,将证书应用于一个 nginx-proxy 容器,并利用其中的 Nginx 服务将 HTTPS 访问转发至 Nextcloud 容器。证书来自 Let's Encrypt,现在已经可以签发免费的 IP 地址证书,详见官方博客


使用 1Panel 安装完 Nextcloud 后,默认的端口映射为 0.0.0.0:40069 -> 443/tcp。将公网 IP 添加到信任域名后,虽然可以通过 https://公网IP:40069 访问 Nextcloud 服务,但浏览器会因证书不可靠而发出安全警告,部分应用也无法通过不安全的连接访问 Nextcloud。因此,需要安装由 CA 签发的 TLS/SSL 证书,以提供安全可信的 HTTPS 访问。

为方便演示,假设「公网 IP」为 1.2.3.4;

1. 使用 acme.sh 签发证书并自动续期

获取安装脚本:

curl https://get.acme.sh | sh -s email=<用于接收到期提醒的邮箱地址>

重新加载 .bashrc 文件:

source ~/.bashrc

签发证书:

acme.sh --issue --standalone -d 1.2.3.4 --cert-profile shortlived --days 3

证书和私钥将会保存到 ~/.acme.sh/1.2.3.4_ecc/

2. 配置 Nginx 代理服务

新建目录,创建并编辑 Nginx 配置文件:

mkdir -p ~/nginx-proxy && cd ~/nginx-proxy
nano nginx.conf # 内容见后

将证书和私钥复制到该目录下,以便 Nginx 容器挂载:

mkdir -p ssl && cd ssl
cp ~/.acme.sh/1.2.3.4_ecc/fullchain.cer ./
cp ~/.acme.sh/1.2.3.4_ecc/1.2.3.4.key ./

查看 Nextcloud 容器所在的网络和 IP:

docker ps # 列出所有在运行的容器
docker networks ls # 列出所有网络
docker inspect <Nextcloud容器名> | grep -i "network"

nginx.conf 配置如下:

# nginx.conf
events {
    worker_connections 1024;
}

http {
    upstream nextcloud {
        # 这里填 Nextcloud 容器名或 IP
        server <Nextcloud容器名或IP>:80;
    }

    server {
        listen 443 ssl;
        # 公网 IP 或域名
        server_name 1.2.3.4;

        # SSL 证书配置(替换成你的证书路径)
        ssl_certificate     /etc/nginx/ssl/fullchain.cer;
        ssl_certificate_key /etc/nginx/ssl/1.2.3.4.key;

        # SSL 安全配置
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        # 文件上传大小限制
        client_max_body_size 10G;

        location / {
            proxy_pass http://nextcloud;
            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 https;
            proxy_redirect http:// https://;
        }
    }
}

3. 启动 nginx-proxy 容器

创建 docker-compose.yml:

nano docker-compose.yml

内容如下:

# docker-compose.yml
version: '3'

services:
    nginx-proxy:
        image: nginx:alpine
        container_name: nginx-proxy
        restart: unless-stopped
        ports:
            - "443:443"
        volumes:
            - ./nginx.conf:/etc/nginx/nginx.conf:ro
            - ./ssl:/etc/nginx/ssl:ro
        networks:
            - <容器网络名>
networks:
    <容器网络名>:
        external: true

⚠️ 注意: Nginx 容器需要与 Nextcloud 容器处于同一网络中。

启动 nginx-proxy 容器:

docker compose up -d

4. 配置 Nextcloud 信任代理

编辑 Nextcloud 配置文件;1panel 中的 Nextcloud 应用默认安装位置为/opt/1panel/apps/nextcloud/nextcloud,这里的配置文件会被 docker 挂载到容器中供 Nextcloud 使用:

nano /opt/1panel/apps/nextcloud/nextcloud/data/config/www/nextcloud/config/config.php

将 nginx-proxy IP 添加到信任代理:

'trusted_proxies' =>
  array (
    0 => 'nginx-proxy', # Nginx 容器名
    1 => '172.18.0.0/16', # Nginx 容器所在子网
  ),
'overwriteprotocol' => 'https',

同时确保公网 IP 加入到了可行域名列表中:

'trusted_domains' =>
  array (
    0 => '1.2.3.4', # 公网 IP
    1 => '<如果有域名的话>,
  ),

重启 Nextcloud 容器使配置生效:

docker restart <Nextcloud容器名>

5. 自动续期

用 curl https://get.acme.sh | sh 这种方式安装的 acme.sh,自动续期是默认开启的,不需要手动配置;检查:

crontab -l

应该能看到7 16 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null这样的提示,注意如果是用 root 权限安装的 acme.sh,也需要用sudo crontab -l才能看到

关联容器部署与自动续期动作:

acme.sh --install-cert -d 1.2.3.4 --key-file ~/nginx-proxy/ssl/1.2.3.4.key --fullchain-file ~/nginx-proxy/ssl/fullchain.cer --reloadcmd "docker restart <Nextcloud容器名>"

其中的 --key-file 和 --fullchain-file 分别指向被 nginx-proxy 服务使用的私钥和证书文件,最后再将续期动作与容器重启关联来更新所使用的证书

可以手动模拟一次续期,检查证书文件时间戳是否更新:

acme.sh --renew -d 1.2.3.4 --force

📌 根据相关法律法规,提供互联网服务均需完成备案,仅通过 IP 访问的服务器也不例外。

posted @ 2026-05-19 17:08  Grsx  阅读(60)  评论(0)    收藏  举报