Skip to content

Verdaccio 私有源部署文档

约 778 字大约 3 分钟

2025-07-30

本文档将指导你如何将 Verdaccio 服务通过 Nginx 代理绑定到 https://npm.xxxx.cyou 子域名,并配置 HTTPS 证书与自动续期。


📦 前提条件

  • 一台已开放 80/443 端口的服务器(CentOS)
  • 已部署并运行 Verdaccio(默认监听端口 4873)
  • 已安装 Nginx
  • 已将子域名 npm.xxxx.cyou 解析到服务器公网 IP
  • 系统时间准确(推荐使用 NTP)

🔐 第一步:申请 SSL 证书(使用 certbot standalone 模式)

注意:此方式会暂时占用 80 端口,请确保 Nginx 暂时关闭

1. 停止 Nginx 占用

sudo systemctl stop nginx

2. 使用 Certbot 申请证书

sudo certbot certonly --standalone -d npm.xxxx.cyou

证书申请成功后,会生成在以下路径:

/etc/letsencrypt/live/npm.xxxx.cyou/fullchain.pem
/etc/letsencrypt/live/npm.xxxx.cyou/privkey.pem

3. 重启 Nginx

sudo systemctl start nginx

🛠️ 第二步:Nginx 配置文件示例

路径建议使用 /etc/nginx/conf.d/npm.xxxx.cyou.conf

# HTTP -> HTTPS 重定向
server {
    listen 80;
    server_name npm.xxxx.cyou;
    return 301 https://$host$request_uri;
}

# Verdaccio HTTPS 服务
server {
    listen 443 ssl;
    server_name npm.xxxx.cyou;

    ssl_certificate /etc/letsencrypt/live/npm.xxxx.cyou/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/npm.xxxx.cyou/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
                 ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
                 DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    location / {
        proxy_pass http://127.0.0.1:4873/;
        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;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

检查并重载配置:

sudo nginx -t && sudo systemctl reload nginx

🔁 第三步:配置自动续期

Let's Encrypt 签发的证书有效期为 90 天,建议每 60 天自动续签一次。

手动测试续期:

sudo certbot renew --dry-run

设置定时任务(每日凌晨 3 点尝试续签):

编辑定时任务:

sudo crontab -e

添加:

0 3 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx

🧪 附加:检查 HTTPS 状态与证书链

使用 OpenSSL 命令查看证书是否正确部署:

openssl s_client -connect npm.xxxx.cyou:443 -servername npm.xxxx.cyou

确认返回中包含:

  • Certificate chain 完整
  • Verify return code: 0 (ok)

🧼 浏览器出现“不安全”提示的排查建议

  • 清除浏览器缓存或使用无痕模式访问
  • 使用 https://www.ssllabs.com/ssltest/ 测试证书链完整性
  • 检查 Nginx 是否加载了旧证书
  • 查看证书是否确实包含 npm.xxxx.cyou 域名

✅ 完整部署后效果

打开浏览器访问:

https://npm.xxxx.cyou/

应该可以看到 Verdaccio 首页,地址栏左侧有 🔒 小锁图标,表示证书安全有效。


📌 其他子域名配置

若你有其他子域名(如 blog.xxxx.cyouadmin.xxxx.cyou),可重复以上流程,只需换成对应域名即可。

✅【推荐方案】用 nginx 模式申请+续期证书

你既然已经用 Nginx,在续期的时候用 --nginx 模式就不需要释放 80 端口了,Certbot 会自动和 nginx 配合。

🔁 操作步骤:

1.先备份原有证书(可选)

sudo cp -r /etc/letsencrypt /etc/letsencrypt-bak

2.重新申请一遍证书,用 nginx 模式(替代 --standalone)

sudo certbot --nginx -d npm.xxxx.cyou

3.验证 nginx 配置是否加了自动更新 hook Certbot 会自动在 /etc/letsencrypt/renewal/npm.xxxx.cyou.conf 里写好使用 nginx 模式。

4.测试自动续期是否能跑通

sudo certbot renew --dry-run