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 访问的服务器也不例外。

浙公网安备 33010602011771号