惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
The Hacker News
The Hacker News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Security Archives - TechRepublic
Security Archives - TechRepublic
Google Online Security Blog
Google Online Security Blog
D
Docker
H
Hacker News: Front Page
Recent Announcements
Recent Announcements
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
Security Latest
Security Latest
AI
AI
I
InfoQ
Google DeepMind News
Google DeepMind News
阮一峰的网络日志
阮一峰的网络日志
S
Secure Thoughts
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Scott Helme
Scott Helme
N
News | PayPal Newsroom
Y
Y Combinator Blog
V
Visual Studio Blog
Latest news
Latest news
大猫的无限游戏
大猫的无限游戏
Microsoft Security Blog
Microsoft Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
WordPress大学
WordPress大学
V
Vulnerabilities – Threatpost
C
Cyber Attacks, Cyber Crime and Cyber Security
TaoSecurity Blog
TaoSecurity Blog
S
Security @ Cisco Blogs
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
T
Troy Hunt's Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
H
Heimdal Security Blog
美团技术团队
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Security Affairs
T
Threat Research - Cisco Blogs
Webroot Blog
Webroot Blog
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏

WAYJAM

告别 NPM Token:迁移到 Trusted Publishing 全记录 Sing-box:IPv6 优先出站与 Netflix 强制 IPv6 分流 [All In One] HomeLab 虚拟化 iKuai + Mihomo - IPv6 支持 [All In One] HomeLab 虚拟化 iKuai + Mihomo LiteLLM 多模型 API 中转 MacOS Bootstrp with Nix Fluency Support Full Rss [All In One] PVE 中 OpenWrt LXC 重启问题 Tabby 终端配置以及配置全平台同步 Cloudflare Tunnel + Nginx Proxy Manager:服务穿透 PVE 7 升级 8 笔记 PVE 安装 Android x86 & 安装 Magisk Fly.io 部署 Artalk 评论系统 [All In One] HomeLab 2023 搭建总结 [All In One] 轻量的文件 & 媒体服务器配置 [All In One] R71s 主机散热改造 [All In One] PVE LXC 安装 OpenWrt 软路由以及网络规划 [All In One] 安装 Proxmox VE 7.4 从零开始配置Rime - 2023 Self Hosted Bitwarden + Cloudfare HTTPS Debian NFS Server 以及 MacOS Client AdguardHome 和 Clash 透明代理配合使用 使用 Kind 部署 Prow 手记 BackBlaze B2 + Cloudfare Worker 图床 PicGo Amazon S3 插件 自动给模板生成 Inline-Svg Hugo Theme WeUI 发布! Hugo Theme Fluency 发布! Docker Clash 和 透明代理 有限状态机与分布式熔断器 「家庭娱乐」N1刷 EmuELEC 做游戏盒子 「家庭娱乐」N1刷 Armbian 做家庭服务器 分布式限流器之令牌桶实现 Kustomize 管理 Kubernetes 集群 Mixedpaper 主题发布到 Hugo 官方仓库 About 优化 Docker 构建时间 解决 etcd 与 grpc 不兼容问题 Kubernetes 部署 ElasticSearch7 集群 从零开始配置Rime - 2019 转移域名,更换评论系统,更换图床 搭建 NPM Proxy 之预编译包 美区Apple ID终于绑定PayPal成功 无可奈何的页面增强方案 LogStash的调试 GitLab Shell如何通过SSH工作 Python打开类 荒原 [Theme] Bitcron主题Mixedpaper发布! Ngrok端口转发 故事之五 - 柠檬茶 故事之四 - 我是天才 故事之一 Arch滚挂了怎么办? OpenWrt内网IPv6之二 某次更新后Primusrun不能启动Dota2 OpenWrt的DNS智能解析方案 替换Google CDN库 使用Privoxy将socks代理转化为http代理 ArchLinux之软件篇 再次安装ArchLinux手记 博客再次重生 搞了个Minecraft服务器 【LnV工作室荣誉出品】小苹果MV华农大版 雨梦 醉臥石中笑人間 路由器内网IPV6地址分配 OPENWRT安装软件的两个问题 路由器上进行锐捷认证 改了BIOS的LOGO Windows下搭建我的C/C++的开发环境 Linux下用Mentohust认证校园网 Archlinux+Windows 双系统安装手记(UEFI+GPT) Google-code-prettify代码高亮 《末世迷踪》 Hello Net World!
搭建 NPM Proxy
2019-02-25 · via WAYJAM

工欲善其事,必先利其器

背景是公司内部服务器是网络隔离的, 但是要做自动化构建、测试等,通常都需要从外部拉取依赖。所以,我又要搭建内部的镜像源了。(为什么说又呢。。。)

毫无疑问,是要用到一个服务器专门做镜像源的服务器,它有特殊的网络策略,内网的服务器可以和它连通,用作内外网的转发,以下假设使用 Nginx 做反向代理。

那么,当前公司内部之前已经搭建了 Private NPM Registry(使用 cnpm 搭建),私有包自然是从内部服务器下载,而 Public 包,则是通过 301 重定向到 taobao registry

npm install xxxx -dd  # verbose mode 分析npm下载过程

一开始的思路是希望在 Nginx 内部做重定向(serverfault),防止在客户端做重定向,而客户端网络隔离。以下为参考配置,主要方法是将 301/302/307 的 HTTP 请求定义为错误并内部重定向到特定 uri ,然后再通过 proxy_pass 反向代理至公共源。

server {
    ...
    
    location / {
        proxy_pass http://reg.cnpm.internal;  # 内部搭建的CNPM
        proxy_intercept_errors on;
        error_page 301 302 307 = @handle_redirect;
    }

    location @handle_redirect {
        set $saved_redirect_location '$upstream_http_location';
        proxy_pass http://registry.taobao.org;  # 镜像服务器能够访问的NPM
    }
}

配置好之后使用 npm install 测试,发现依然失败,分析 verbose 得知,registry info 已经成功获取到数据,但是 info 里面的 tarball 地址却还是原来注册服务器的地址。通过 npm info xxx 或者直接 curl 可以验证:

{
  _id:"compare",
  _rev:"6-d647d4531309933813e678fc321bb664",
  name:"compare",
  description:"Compare primitives the right way (using `<`, `>` and `==`)",
  dist-tags:{
    latest:"2.0.0"
  },
  versions:{
	#...
    2.0    .0:{
      #...
      dist:{
        integrity:"sha512-FXeLLVm09Uh7Updmmx2NCCRG2nMq+mdY3DR9PqhVeOrie3IFU+occFQoqziFkHlTUDw8mDgmdblIZ+J9tsSAUA==",
        shasum:"8090b34dcb288f629e905972da69ea7a6d5922a0",
        tarball:"https://registry.npmjs.org/compare/-/compare-2.0.0.tgz",
        fileCount:4,
        unpackedSize:2682,
        npm-signature:"... "
      },
      #...
    }
  },
  #...
}

在开发人员的工作电脑上,自然是可以正常使用的,但在内部服务器通向互联网的流量都被阻止了。

所以,“代理”不能够单纯地转发响应,而且要“修改”响应。我选择了 Verdaccio

  • It’s a web app based on Node.js
  • It’s a private npm registry
  • It’s a local network proxy
  • It’s a Pluggable application
  • It’s a fairly easy install and use
  • We offer Docker and Kubernetes support

从官方仓库下载默认配置文件:https://github.com/verdaccio/verdaccio/blob/master/conf/docker.yaml,按照官方配置文档配置多个 uplink (类似 Nginxupstream ),然后在 packages 下配置包匹配规则。

uplinks:
  npmjs:
    url: https://registry.npmjs.org/
    cache: true
  internal_npm:
    url: http://reg.cnpm.internal
    cache: false
packages:
  '@private_scope/*': # 根据情况配置私有scope,可以配置多条
    access: $all
    proxy: internal_npm # 转发到上游
  '**':
  	# 匹配所有包
    access: $all
    #publish: $authenticated
    proxy: npmjs

然后启动:


docker run --name verdaccio \
-v /path-to/verdaccio/config.yaml:/verdaccio/conf/config.yaml:ro \
-v /data/verdaccio/storage:/verdaccio/storage \
-v /data/verdaccio/plugins:/verdaccio/plugins \
-d \
-p 4873:4873 \
--restart always \
verdaccio/verdaccio

至此,这个 NPM 代理即可正常地在内部使用, info 响应里面的 tarball 也会被替换成代理的链接,并且同时支持内部包、外部包。