2023-10-24 09:50:42 +08:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< title >
verdaccio 搭建 npm私库
< / title >
< meta name = "description" content = "" >
< meta name = "keywords" content = "" >
< meta name = "author" content = "Mozzie" >
2023-11-04 14:36:13 +08:00
< link rel = "canonical" href = "https://mozzie.cn/2023/10/25/front-end/verdaccio/" >
2023-10-24 09:50:42 +08:00
< link rel = "icon" type = "image/svg" href = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M16 7h1a2 2 0 0 1 2 2v.5a.5.5 0 0 0 .5.5a.5.5 0 0 1 .5.5v3a.5.5 0 0 1-.5.5a.5.5 0 0 0-.5.5v.5a2 2 0 0 1-2 2h-2"></path><path d="M8 7H6a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h1"></path><path d="M12 8l-2 4h3l-2 4"></path></g></svg>' >
2023-10-31 13:15:48 +08:00
< link rel = "stylesheet" href = "/css/26c34ce6.css" >
2023-10-24 09:50:42 +08:00
< meta name = "generator" content = "Hexo 6.3.0" > < / head >
< body id = "app" >
<!-- 响应式布局按钮 -->
< a class = "side-navigation btn-hover btn-hover-bg tip left" data-tip = "Expand" >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 24 24" >
< g fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >
< rect x = "4" y = "4" width = "16" height = "16" rx = "2" > < / rect >
< path d = "M9 4v16" > < / path >
< / g >
< / svg >
< / a >
< aside >
< div >
2023-11-03 14:52:16 +08:00
< link rel = "stylesheet" href = "/css/5bfc518f.css" >
2023-10-24 09:50:42 +08:00
< div class = "home-bar" >
< a href = "/" class = "tip" data-tip = "Home" >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 512 512" >
< path
d="M172.2 226.8c-14.6-2.9-28.2 8.9-28.2 23.8V301c0 10.2 7.1 18.4 16.7 22c18.2 6.8 31.3 24.4 31.3 45c0 26.5-21.5 48-48 48s-48-21.5-48-48V120c0-13.3-10.7-24-24-24H24c-13.3 0-24 10.7-24 24v248c0 89.5 82.1 160.2 175 140.7c54.4-11.4 98.3-55.4 109.7-109.7c17.4-82.9-37-157.2-112.5-172.2zM209 0c-9.2-.5-17 6.8-17 16v31.6c0 8.5 6.6 15.5 15 15.9c129.4 7 233.4 112 240.9 241.5c.5 8.4 7.5 15 15.9 15h32.1c9.2 0 16.5-7.8 16-17C503.4 139.8 372.2 8.6 209 0zm.3 96c-9.3-.7-17.3 6.7-17.3 16.1v32.1c0 8.4 6.5 15.3 14.8 15.9c76.8 6.3 138 68.2 144.9 145.2c.8 8.3 7.6 14.7 15.9 14.7h32.2c9.3 0 16.8-8 16.1-17.3c-8.4-110.1-96.5-198.2-206.6-206.7z"
fill="currentColor">< / path >
< / svg >
< span > Mozzie< / span >
< / a >
<!-- 切换主题 -->
< a id = "toggle-theme" class = "tip left" data-tip = "Switch Theme" >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 512 512" >
< path d = "M256 118a22 22 0 0 1-22-22V48a22 22 0 0 1 44 0v48a22 22 0 0 1-22 22z" fill = "currentColor" > < / path >
< path d = "M256 486a22 22 0 0 1-22-22v-48a22 22 0 0 1 44 0v48a22 22 0 0 1-22 22z" fill = "currentColor" > < / path >
< path
d="M369.14 164.86a22 22 0 0 1-15.56-37.55l33.94-33.94a22 22 0 0 1 31.11 31.11l-33.94 33.94a21.93 21.93 0 0 1-15.55 6.44z"
fill="currentColor">< / path >
< path
d="M108.92 425.08a22 22 0 0 1-15.55-37.56l33.94-33.94a22 22 0 1 1 31.11 31.11l-33.94 33.94a21.94 21.94 0 0 1-15.56 6.45z"
fill="currentColor">< / path >
< path d = "M464 278h-48a22 22 0 0 1 0-44h48a22 22 0 0 1 0 44z" fill = "currentColor" > < / path >
< path d = "M96 278H48a22 22 0 0 1 0-44h48a22 22 0 0 1 0 44z" fill = "currentColor" > < / path >
< path
d="M403.08 425.08a21.94 21.94 0 0 1-15.56-6.45l-33.94-33.94a22 22 0 0 1 31.11-31.11l33.94 33.94a22 22 0 0 1-15.55 37.56z"
fill="currentColor">< / path >
< path
d="M142.86 164.86a21.89 21.89 0 0 1-15.55-6.44l-33.94-33.94a22 22 0 0 1 31.11-31.11l33.94 33.94a22 22 0 0 1-15.56 37.55z"
fill="currentColor">< / path >
< path d = "M256 358a102 102 0 1 1 102-102a102.12 102.12 0 0 1-102 102z" fill = "currentColor" > < / path >
< / svg >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 512 512" >
< path
d="M264 480A232 232 0 0 1 32 248c0-94 54-178.28 137.61-214.67a16 16 0 0 1 21.06 21.06C181.07 76.43 176 104.66 176 136c0 110.28 89.72 200 200 200c31.34 0 59.57-5.07 81.61-14.67a16 16 0 0 1 21.06 21.06C442.28 426 358 480 264 480z"
fill="currentColor">< / path >
< / svg >
< / a >
< / div >
2023-11-01 15:10:40 +08:00
< script src = "/js/0c01b885.js" > < / script >
2023-10-24 09:50:42 +08:00
<!-- search -->
2023-11-03 14:52:16 +08:00
< link rel = "stylesheet" href = "/css/3320a187.css" >
2023-10-24 09:50:42 +08:00
< form class = "search-group" >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 20 20" >
< g fill = "currentColor" >
< path d = "M8.5 3a5.5 5.5 0 0 1 4.383 8.823l4.147 4.147a.75.75 0 0 1-.976 1.133l-.084-.073l-4.147-4.147A5.5 5.5 0 1 1 8.5 3zm0 1.5a4 4 0 1 0 0 8a4 4 0 0 0 0-8z" fill = "currentColor" > < / path >
< / g >
< / svg >
< span id = "search-input" > Search...< / span >
< div class = "short-key" >
< kbd class = "key-cap" > < span > Ctrl K< / span > < / kbd >
< / div >
< / form >
< script >
window.algolia = {
appId: "5DTW808BZ8",
SearchOnlyAPIKey: "27845b245efc8a2853cc0bdc7366ea26"
}
2023-11-03 14:52:16 +08:00
window.search = {
enable: "true"
}
2023-10-24 09:50:42 +08:00
< / script >
2023-11-03 14:52:16 +08:00
< script src = "/js/015f750d.js" > < / script >
2023-10-24 09:50:42 +08:00
2023-11-03 14:52:16 +08:00
2023-10-24 09:50:42 +08:00
<!-- navigation -->
2023-10-20 10:28:01 +08:00
< link rel = "stylesheet" href = "/css/3efc6cb5.css" >
2023-10-24 09:50:42 +08:00
< section class = "category-nav scrollbar-obtrusive" >
< ul class = "nav-items" >
< li data-path = "archives" >
< a href = "/archives" >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 24 24" >
< g fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >
< path d = "M12 7v14" > < / path >
< path d = "M9 18l3 3l3-3" > < / path >
< circle cx = "12" cy = "5" r = "2" > < / circle >
< / g >
< / svg >
< div class = "ellipsis" > Timeline< / div >
< / a >
< / li >
< li data-path = "roadmap" >
< a href = "/roadmap" >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 24 24" >
< g fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >
< path d = "M10.5 20.4l-6.9-6.9c-.781-.781-.781-2.219 0-3l6.9-6.9c.781-.781 2.219-.781 3 0l6.9 6.9c.781.781.781 2.219 0 3l-6.9 6.9c-.781.781-2.219.781-3 0z" > < / path >
< path d = "M9 14v-2c0-.59.414-1 1-1h5" > < / path >
< path d = "M13 9l2 2l-2 2" > < / path >
< / g >
< / svg >
< div class = "ellipsis" > Roadmap< / div >
< / a >
< / li >
2023-10-30 10:58:06 +08:00
< li data-path = "resume" >
< a href = "/resume" >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 24 24" >
< g fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >
< path d = "M14 3v4a1 1 0 0 0 1 1h4" > < / path >
< path d = "M5 8V5a2 2 0 0 1 2-2h7l5 5v11a2 2 0 0 1-2 2h-5" > < / path >
< circle cx = "6" cy = "14" r = "3" > < / circle >
< path d = "M4.5 17L3 22l3-1.5L9 22l-1.5-5" > < / path >
< / g >
< / svg >
< div class = "ellipsis" > Resume< / div >
< / a >
< / li >
2023-10-24 09:50:42 +08:00
< / ul >
< p > Category< / p >
< ul >
< li class = "" >
2023-11-03 16:57:27 +08:00
< a href = "/categories/EQ/" >
2023-10-24 09:50:42 +08:00
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 24 24" > < g fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" > < path d = "M5.636 5.636a9 9 0 0 1 13.397.747L13.414 12l5.619 5.617A9 9 0 1 1 5.636 5.636z" > < / path > < circle cx = "11.5" cy = "7.5" r = "1" fill = "currentColor" > < / circle > < / g > < / svg >
< div class = "ellipsis" >
< span >
2023-11-03 16:57:27 +08:00
EQ
2023-10-24 09:50:42 +08:00
< / span >
< / div >
< / a >
< / li >
2023-10-31 14:01:43 +08:00
< li class = "" >
2023-11-03 16:57:27 +08:00
< a href = "/categories/Hexo/" >
2023-10-24 09:50:42 +08:00
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 24 24" > < g fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" > < path d = "M4 17v1a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-1" > < / path > < path d = "M8 16h8" > < / path > < path d = "M8.322 12.582l7.956.836" > < / path > < path d = "M8.787 9.168l7.826 1.664" > < / path > < path d = "M10.096 5.764l7.608 2.472" > < / path > < / g > < / svg >
< div class = "ellipsis" >
< span >
2023-11-03 16:57:27 +08:00
Hexo
2023-10-24 09:50:42 +08:00
< / span >
< / div >
< / a >
< / li >
2023-10-31 14:01:43 +08:00
< li class = "active" >
< a href = "/categories/Front-End/" >
2023-10-24 09:50:42 +08:00
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 24 24" > < g fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" > < path d = "M20 4l-2 14.5l-6 2l-6-2L4 4z" > < / path > < path d = "M7.5 8h3v8l-2-1" > < / path > < path d = "M16.5 8H14a.5.5 0 0 0-.5.5v3a.5.5 0 0 0 .5.5h1.423a.5.5 0 0 1 .495.57L15.5 15.5l-2 .5" > < / path > < / g > < / svg >
< div class = "ellipsis" >
< span >
2023-10-31 14:01:43 +08:00
Front-End
2023-10-24 09:50:42 +08:00
< / span >
< / div >
< / a >
< / li >
< / ul >
< / section >
2023-10-20 10:28:01 +08:00
< script src = "/js/f8b20eb9.js" > < / script >
2023-10-24 09:50:42 +08:00
<!-- icp -->
< div class = "icp" >
< a target = "_blank" rel = "noopener" href = "http://beian.miit.gov.cn/" > 苏ICP备19008833号-4< / a >
< / div >
< / div >
< / aside >
< main >
2023-10-24 09:48:00 +08:00
< link rel = "stylesheet" href = "/css/32ae9342.css" >
2023-10-24 09:50:42 +08:00
< div class = "post-container" >
< div class = "content" >
< header >
2023-10-20 10:28:01 +08:00
< link rel = "stylesheet" href = "/css/de5de8fb.css" >
2023-10-24 09:50:42 +08:00
< nav class = "breadcrumb" >
< a href = "/" class = "home tip btn-hover right" data-tip = "Home" >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 512 512" >
< path d = "M172.2 226.8c-14.6-2.9-28.2 8.9-28.2 23.8V301c0 10.2 7.1 18.4 16.7 22c18.2 6.8 31.3 24.4 31.3 45c0 26.5-21.5 48-48 48s-48-21.5-48-48V120c0-13.3-10.7-24-24-24H24c-13.3 0-24 10.7-24 24v248c0 89.5 82.1 160.2 175 140.7c54.4-11.4 98.3-55.4 109.7-109.7c17.4-82.9-37-157.2-112.5-172.2zM209 0c-9.2-.5-17 6.8-17 16v31.6c0 8.5 6.6 15.5 15 15.9c129.4 7 233.4 112 240.9 241.5c.5 8.4 7.5 15 15.9 15h32.1c9.2 0 16.5-7.8 16-17C503.4 139.8 372.2 8.6 209 0zm.3 96c-9.3-.7-17.3 6.7-17.3 16.1v32.1c0 8.4 6.5 15.3 14.8 15.9c76.8 6.3 138 68.2 144.9 145.2c.8 8.3 7.6 14.7 15.9 14.7h32.2c9.3 0 16.8-8 16.1-17.3c-8.4-110.1-96.5-198.2-206.6-206.7z" fill = "currentColor" > < / path >
< / svg >
< / a >
< em >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 20 20" >
< g fill = "none" >
< path d = "M7.733 4.207a.75.75 0 0 1 1.06.026l5.001 5.25a.75.75 0 0 1 0 1.035l-5 5.25a.75.75 0 1 1-1.087-1.034L12.216 10l-4.51-4.734a.75.75 0 0 1 .027-1.06z" fill = "currentColor" > < / path >
< / g >
< / svg >
< / em >
< a href = "/categories/Front-End/" >
Front-End
< / a >
< em >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 20 20" >
< g fill = "none" >
< path d = "M7.733 4.207a.75.75 0 0 1 1.06.026l5.001 5.25a.75.75 0 0 1 0 1.035l-5 5.25a.75.75 0 1 1-1.087-1.034L12.216 10l-4.51-4.734a.75.75 0 0 1 .027-1.06z" fill = "currentColor" > < / path >
< / g >
< / svg >
< / em >
< span class = "ellipsis" >
verdaccio 搭建 npm私库
< / span >
< / nav >
2023-10-20 10:28:01 +08:00
< script src = "/js/31d6cfe0.js" > < / script >
2023-10-24 09:50:42 +08:00
< / header >
< main class = "scrollbar-obtrusive" >
< div class = "article-container" >
<!-- 文章tags -->
<!-- 渲染文章内容 -->
< article > < h1 id = "使用-docker-搭建-verdaccio" > < a href = "#使用-docker-搭建-verdaccio" class = "headerlink" title = "使用 docker 搭建 verdaccio" > < / a > 使用 docker 搭建 verdaccio< / h1 > < p > 创建 & 配置< code > config.yaml< / code > 文件< / p >
2023-10-20 10:28:01 +08:00
< pre class = "line-numbers language-yaml" data-language = "yaml" > < code class = "language-yaml" > < span class = "token comment" > # Read about the best practices< / span >
< span class = "token comment" > # https://verdaccio.org/docs/best< / span >
< span class = "token comment" > # path to a directory with all packages< / span >
< span class = "token key atrule" > storage< / span > < span class = "token punctuation" > :< / span > /verdaccio/storage/data
< span class = "token comment" > # path to a directory with plugins to include< / span >
< span class = "token key atrule" > plugins< / span > < span class = "token punctuation" > :< / span > /verdaccio/plugins
< span class = "token comment" > # 包体积上限, 默认10mb< / span >
< span class = "token key atrule" > max_body_size< / span > < span class = "token punctuation" > :< / span > 1024mb
< span class = "token key atrule" > web< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > enable< / span > < span class = "token punctuation" > :< / span > < span class = "token boolean important" > true< / span >
< span class = "token key atrule" > title< / span > < span class = "token punctuation" > :< / span > Mozzie< span class = "token punctuation" > -< / span > NPM
< span class = "token comment" > # gravatar: false< / span >
< span class = "token comment" > # login: true< / span >
< span class = "token key atrule" > pkgManagers< / span > < span class = "token punctuation" > :< / span >
< span class = "token punctuation" > -< / span > npm
< span class = "token punctuation" > -< / span > yarn
< span class = "token punctuation" > -< / span > pnpm
< span class = "token key atrule" > html_cache< / span > < span class = "token punctuation" > :< / span > < span class = "token boolean important" > true< / span >
< span class = "token key atrule" > showFooter< / span > < span class = "token punctuation" > :< / span > < span class = "token boolean important" > false< / span >
< span class = "token key atrule" > auth< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > htpasswd< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > file< / span > < span class = "token punctuation" > :< / span > /verdaccio/storage/htpasswd
< span class = "token comment" > # 关闭注册, 手动添加用户, 默认Bcrypt算法, 随便找个网页生成个密码, 使用账号:密码添加到 htpasswd 文件中,例如 test:$2a$10$0xPGVnpcdxcfmFxtWyWDx./TRtm/W/gSzib/jck3w.sF9x.Ur8t8W< / span >
< span class = "token key atrule" > max_users< / span > < span class = "token punctuation" > :< / span > < span class = "token number" > -1< / span >
< span class = "token key atrule" > i18n< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > web< / span > < span class = "token punctuation" > :< / span > zh< span class = "token punctuation" > -< / span > CN
< span class = "token comment" > # notify: # 配置 Webhook 推送到钉钉,记得修改 access_token 和 atMobiles< / span >
< span class = "token comment" > # method: POST< / span >
< span class = "token comment" > # headers: [{ "Content-Type": "application/json" } ]< / span >
< span class = "token comment" > # endpoint: https://oapi.dingtalk.com/robot/send?access_token=xxxx< / span >
< span class = "token comment" > # content: '{ "msgtype":"text", "at": { "atMobiles": ["13000000000"] } , "text":{ "content":"NPM 发布新包:\n > 包名称:{ { name} } \n > 版本号:{ { #each versions} } { { version} } { { /each} } \n > 发布者:{ { publisher.name} } "} } '< / span >
< span class = "token key atrule" > uplinks< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > npmjs< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > url< / span > < span class = "token punctuation" > :< / span > https< span class = "token punctuation" > :< / span > //registry.npmjs.org/
< span class = "token key atrule" > yarn< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > url< / span > < span class = "token punctuation" > :< / span > https< span class = "token punctuation" > :< / span > //registry.yarnpkg.com/
< span class = "token key atrule" > timeout< / span > < span class = "token punctuation" > :< / span > 10s
< span class = "token key atrule" > taobao< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > url< / span > < span class = "token punctuation" > :< / span > https< span class = "token punctuation" > :< / span > //registry.npmmirror.com/
< span class = "token key atrule" > timeout< / span > < span class = "token punctuation" > :< / span > 10s
< span class = "token key atrule" > packages< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > "@*/*"< / span > < span class = "token punctuation" > :< / span >
< span class = "token comment" > # 可访问权限, web界面看不见, 不登陆, 也无法 install 包< / span >
< span class = "token key atrule" > access< / span > < span class = "token punctuation" > :< / span > $authenticated < span class = "token comment" > # $all< / span >
< span class = "token comment" > # 发布权限, $authenticated 表示只有通过验证的人< / span >
< span class = "token key atrule" > publish< / span > < span class = "token punctuation" > :< / span > $authenticated
< span class = "token comment" > # 可取消发布权限< / span >
< span class = "token key atrule" > unpublish< / span > < span class = "token punctuation" > :< / span > $authenticated
< span class = "token comment" > # 包不存在时的代理< / span >
< span class = "token key atrule" > proxy< / span > < span class = "token punctuation" > :< / span > npmjs yarn taobao
< span class = "token key atrule" > "**"< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > access< / span > < span class = "token punctuation" > :< / span > $authenticated < span class = "token comment" > # $all< / span >
< span class = "token key atrule" > publish< / span > < span class = "token punctuation" > :< / span > $authenticated
< span class = "token key atrule" > unpublish< / span > < span class = "token punctuation" > :< / span > $authenticated
< span class = "token key atrule" > proxy< / span > < span class = "token punctuation" > :< / span > npmjs yarn taobao
< span class = "token key atrule" > middlewares< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > audit< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > enabled< / span > < span class = "token punctuation" > :< / span > < span class = "token boolean important" > true< / span >
< span class = "token key atrule" > listen< / span > < span class = "token punctuation" > :< / span > 0.0.0.0< span class = "token punctuation" > :< / span > < span class = "token number" > 4873< / span >
< span class = "token key atrule" > log< / span > < span class = "token punctuation" > :< / span > < span class = "token punctuation" > { < / span > < span class = "token key atrule" > type< / span > < span class = "token punctuation" > :< / span > stdout< span class = "token punctuation" > ,< / span > < span class = "token key atrule" > format< / span > < span class = "token punctuation" > :< / span > pretty< span class = "token punctuation" > ,< / span > < span class = "token key atrule" > level< / span > < span class = "token punctuation" > :< / span > http < span class = "token punctuation" > } < / span > < span aria-hidden = "true" class = "line-numbers-rows" > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre >
< p > 创建容器,环境变量,< code > VERDACCIO_PUBLIC_URL< / code > 是静态资源的前缀地址, 由于nginx挂了< code > ssl< / code > ,如果使用< code > http< / code > 可以不添加< / p >
< pre class = "line-numbers language-bash" data-language = "bash" > < code class = "language-bash" > < span class = "token function" > docker< / span > run < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > -p< / span > < span class = "token number" > 4873< / span > :4873 < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > --restart< / span > < span class = "token operator" > =< / span > always < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > --network< / span > mozzie.cn-net < span class = "token punctuation" > \< / span >
--network-alias verdaccio < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > --env< / span > < span class = "token assign-left variable" > VERDACCIO_PORT< / span > < span class = "token operator" > =< / span > < span class = "token number" > 4873< / span > < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > --env< / span > < span class = "token assign-left variable" > VERDACCIO_PUBLIC_URL< / span > < span class = "token operator" > =< / span > https://npm.mozzie.cn < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > --ip< / span > < span class = "token number" > 172.21< / span > .0.196 < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > --name< / span > verdaccio < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > -v< / span > /www/wwwroot/nginx/html/verdaccio/storage:/verdaccio/storage < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > -v< / span > /www/wwwroot/nginx/html/verdaccio/config:/verdaccio/conf < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > -v< / span > /www/wwwroot/nginx/html/verdaccio/plugins:/verdaccio/plugins < span class = "token punctuation" > \< / span >
< span class = "token parameter variable" > -d< / span > verdaccio/verdaccio< span aria-hidden = "true" class = "line-numbers-rows" > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre >
< p > 配置nginx的反向代理conf, 注意所在的docker网络, 使用< code > container_name< / code > < / p >
< pre class = "line-numbers language-conf" data-language = "conf" > < code class = "language-conf" > server {
# listen 80;
listen 443 ssl;
server_name npm.mozzie.cn;
ssl_certificate / etc/ nginx/ ssl/ npm.mozzie.cn_bundle.pem;
ssl_certificate_key / etc/ nginx/ ssl/ npm.mozzie.cn.key;
gzip on;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http:/ / verdaccio:4873/ ;
proxy_redirect off;
}
} < span aria-hidden = "true" class = "line-numbers-rows" > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre >
< p > 运行添加用户,报错,因为 < code > htpasswd< / code > 默认创建在宿主机,也就是上面挂载的< code > /www/wwwroot/nginx/html/verdaccio/storage< / code > 目录中< / p >
< pre class = "line-numbers language-bash" data-language = "bash" > < code class = "language-bash" > < span class = "token function" > npm< / span > adduser < span class = "token parameter variable" > --registry< / span > https://npm.mozzie.cn/< span aria-hidden = "true" class = "line-numbers-rows" > < span > < / span > < / span > < / code > < / pre >
< p > 配置< code > htpasswd< / code > 、< code > storage< / code > 文件夹权限< / p >
< pre class = "line-numbers language-bash" data-language = "bash" > < code class = "language-bash" > < span class = "token comment" > # 宿主机中执行< / span >
< span class = "token builtin class-name" > cd< / span > /www/wwwroot/nginx/html/verdaccio/storage
< span class = "token function" > touch< / span > htpasswd
< span class = "token function" > sudo< / span > < span class = "token function" > chown< / span > < span class = "token number" > 10001< / span > :65533 htpasswd
< span class = "token function" > sudo< / span > < span class = "token function" > chown< / span > < span class = "token parameter variable" > -R< / span > < span class = "token number" > 10001< / span > :65533 /www/wwwroot/nginx/html/verdaccio/storage< span aria-hidden = "true" class = "line-numbers-rows" > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre >
< h1 id = "verdaccio-用户管理" > < a href = "#verdaccio-用户管理" class = "headerlink" title = "verdaccio 用户管理" > < / a > verdaccio 用户管理< / h1 > < p > 由于在 < code > config.yml< / code > 中关闭了可访问权限< / p >
< pre class = "line-numbers language-yaml" data-language = "yaml" > < code class = "language-yaml" > < span class = "token key atrule" > auth< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > htpasswd< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > file< / span > < span class = "token punctuation" > :< / span > /verdaccio/storage/htpasswd
< span class = "token comment" > # 关闭注册, 手动添加用户, 默认Bcrypt算法, < / span >
< span class = "token key atrule" > max_users< / span > < span class = "token punctuation" > :< / span > < span class = "token number" > -1< / span >
< span class = "token key atrule" > packages< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > "@*/*"< / span > < span class = "token punctuation" > :< / span >
< span class = "token comment" > # 可访问权限, web界面看不见, 不登陆, 也无法 install 包< / span >
< span class = "token key atrule" > access< / span > < span class = "token punctuation" > :< / span > $authenticated < span class = "token comment" > # $all< / span >
< span class = "token comment" > # 发布权限, $authenticated 表示只有通过验证的人< / span >
< span class = "token key atrule" > publish< / span > < span class = "token punctuation" > :< / span > $authenticated
< span class = "token comment" > # 可取消发布权限< / span >
< span class = "token key atrule" > unpublish< / span > < span class = "token punctuation" > :< / span > $authenticated
< span class = "token key atrule" > "**"< / span > < span class = "token punctuation" > :< / span >
< span class = "token key atrule" > access< / span > < span class = "token punctuation" > :< / span > $authenticated
< span class = "token key atrule" > publish< / span > < span class = "token punctuation" > :< / span > $authenticated
< span class = "token key atrule" > unpublish< / span > < span class = "token punctuation" > :< / span > $authenticated< span aria-hidden = "true" class = "line-numbers-rows" > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre >
< p > 默认的 < code > addUser< / code > 策略是 < code > Bcrypt< / code > 生成密码,随便找个网页生成个密码,使用< code > 账号:密码< / code > 添加到 < code > htpasswd< / code > 文件中,例如 < / p >
< pre class = "line-numbers language-bash" data-language = "bash" > < code class = "language-bash" > test:< span class = "token variable" > $2a< / span > < span class = "token variable" > $10< / span > < span class = "token variable" > $0xPGVnpcdxcfmFxtWyWDx< / span > ./TRtm/W/gSzib/jck3w.sF9x.Ur8t8W< span aria-hidden = "true" class = "line-numbers-rows" > < span > < / span > < / span > < / code > < / pre >
< p > 因此在实际开发中,管理员手动给用户创建好账号,然后根据用户的包管理工具,进行登录,例如以 < code > npm< / code > 为例< / p >
< pre class = "line-numbers language-bash" data-language = "bash" > < code class = "language-bash" > < span class = "token function" > npm< / span > adduser < span class = "token parameter variable" > --registry< / span > https://npm.mozzie.cn/
< span class = "token comment" > # 输入 Username: mozzie | Password: xxx | Email: (this IS public) himozzie@foxmail.com< / span >
< span class = "token comment" > # 提示登陆成功 Logged in as mozzie on https://npm.mozzie.cn/.< / span > < span aria-hidden = "true" class = "line-numbers-rows" > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre >
< p > 在系统的 < code > cat ~/.npmrc< / code > 中会增加一行,就可以正常的进行以来的安装了< / p >
< pre class = "line-numbers language-bash" data-language = "bash" > < code class = "language-bash" > //npm.mozzie.cn/:_authToken< span class = "token operator" > =< / span > < span class = "token string" > "Do/wrh5QzsnYaNU4x3ZlVA=="< / span > < span aria-hidden = "true" class = "line-numbers-rows" > < span > < / span > < / span > < / code > < / pre >
< h1 id = "项目-npmrc-Scope区分" > < a href = "#项目-npmrc-Scope区分" class = "headerlink" title = "项目 .npmrc Scope区分" > < / a > 项目 .npmrc Scope区分< / h1 > < p > 需要指定 < code > .npmrc< / code > 来区别 < code > Scope< / code > 的安装地址,例如一个包名为 < code > @mozzie/hook< / code > ,对应的私库为 < code > https://npm.mozzie.cn/< / code > < / p >
< pre class = "line-numbers language-bash" data-language = "bash" > < code class = "language-bash" > < span class = "token assign-left variable" > registry< / span > < span class = "token operator" > =< / span > http://registry.npm.taobao.org/
@mozzie:registry< span class = "token operator" > =< / span > https://npm.mozzie.cn
< span class = "token comment" > # npm拉包的校验< / span >
//https://npm.mozzie.cn/:_authToken< span class = "token operator" > =< / span > xxxxxxxxxxxxx< span aria-hidden = "true" class = "line-numbers-rows" > < span > < / span > < span > < / span > < span > < / span > < span > < / span > < / span > < / code > < / pre > < / article >
2023-10-24 09:50:42 +08:00
2023-10-20 10:28:01 +08:00
< link rel = "stylesheet" href = "/css/ccbcde32.css" >
2023-10-24 09:50:42 +08:00
< div class = "copyright" >
2023-11-04 14:36:13 +08:00
< a target = "_blank" href = "https://mozzie.cn/2023/10/25/front-end/verdaccio/" >
2023-10-24 09:50:42 +08:00
< span > Post Url: < / span >
2023-11-04 14:36:13 +08:00
< span > https://mozzie.cn/2023/10/25/front-end/verdaccio/< / span >
2023-10-24 09:50:42 +08:00
< / a >
< ul >
< li >
< span > Author< / span >
< p > Mozzie< / p >
< / li >
< li >
< span > Published on< / span >
2023-11-04 14:36:13 +08:00
< p > 2023-10-25< / p >
2023-10-24 09:50:42 +08:00
< / li >
< li >
< span > License< / span >
< p > < a target = "_blank" rel = "noopener" href = "https://creativecommons.org/licenses/by-nc-sa/4.0/" > CC BY-NC-SA 4.0< / a > < / p >
< / li >
< / ul >
< / div >
2023-10-20 10:28:01 +08:00
< script src = "/js/31d6cfe0.js" > < / script >
2023-10-24 09:50:42 +08:00
<!-- 评论 -->
< div id = "vcomments" > < / div >
< / div >
< / main >
< / div >
< div class = "meta-container" >
< div class = "toc-wrapper content-dialog" >
< p class = "catalog" >
< svg xmlns = "http://www.w3.org/2000/svg" xmlns:xlink = "http://www.w3.org/1999/xlink" viewBox = "0 0 24 24" >
< g fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" stroke-linejoin = "round" >
< path d = "M4 6h16" > < / path >
< path d = "M4 12h16" > < / path >
< path d = "M4 18h12" > < / path >
< / g >
< / svg >
< span > Catalog< / span >
< / p >
<!-- 文章toc -->
< ol class = "toc" > < li class = "toc-item toc-level-1" > < a class = "toc-link" href = "#%E4%BD%BF%E7%94%A8-docker-%E6%90%AD%E5%BB%BA-verdaccio" > < span class = "toc-number" > 1.< / span > < span class = "toc-text" > 使用 docker 搭建 verdaccio< / span > < / a > < / li > < li class = "toc-item toc-level-1" > < a class = "toc-link" href = "#verdaccio-%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86" > < span class = "toc-number" > 2.< / span > < span class = "toc-text" > verdaccio 用户管理< / span > < / a > < / li > < li class = "toc-item toc-level-1" > < a class = "toc-link" href = "#%E9%A1%B9%E7%9B%AE-npmrc-Scope%E5%8C%BA%E5%88%86" > < span class = "toc-number" > 3.< / span > < span class = "toc-text" > 项目 .npmrc Scope区分< / span > < / a > < / li > < / ol >
< / div >
< / div >
< / div >
< script >
window.katex = {
enable: "true",
jsCdn: "//cdn.jsdelivr.net/npm/katex@0.13.18/dist/katex.min.js",
cssCdn: "//cdn.jsdelivr.net/npm/katex@0.13.18/dist/katex.min.css"
}
window.mermaid = {
enable: "true",
cdn: "//cdn.jsdelivr.net/npm/mermaid@10.4.0/dist/mermaid.min.js",
}
window.valine = {
enable: "true",
appId: 'TisMit6uhflounFqAN3ZGjgq-MdYXbMMI',
appKey: 'CdjirjYdz07U5i62ElsJvXUh',
avatar: 'monsterid',
cdn: '//unpkg.com/valine@latest/dist/Valine.min.js',
serverURLs: '//tismit6u.api.lncldglobal.com'
};
< / script >
2023-10-21 17:55:14 +08:00
< script src = "/js/a02fa72b.js" > < / script >
2023-10-24 09:50:42 +08:00
< / main >
< / body >
< script >
window.i18n = {
"tip-collapse": "Collapse",
"tip-expand": "Expand",
"text-select": "select",
"text-move": "movement",
"text-esc": "close",
"tip-status-done": "Done",
"tip-status-doing": "In Progress",
"tip-status-todo": "Todo",
"tip-status-other": "Duplicate",
"tip-status-default": "Default",
2023-10-25 22:07:27 +08:00
"tip-roadmap-today": "Positioning to the today",
"text-search": "Search...",
2023-10-26 15:09:35 +08:00
"text-today": "Today",
// month
"January": "January",
"February": "February",
"March": "March",
"April": "April",
"May": "May",
"June": "June",
"July": "July",
"August": "August",
"September": "September",
"October": "October",
"November": "November",
"December": "December",
2023-10-24 09:50:42 +08:00
}
< / script >
2023-11-01 15:10:40 +08:00
< script src = "/js/f7dea7e6.js" > < / script >
2023-10-24 09:50:42 +08:00
2023-10-20 10:28:01 +08:00
< / html >