2023-10-24 09:48:00 +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" > < link rel = "canonical" href = "https://mozzie.cn/2023/10/20/front-end/verdaccio/" > < 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-20 10:28:01 +08:00
< link rel = "stylesheet" href = "/css/2f1ea598.css" >
2023-10-24 09:48:00 +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-10-20 10:28:01 +08:00
< link rel = "stylesheet" href = "/css/e01add4b.css" >
2023-10-24 09:48:00 +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-10-20 10:28:01 +08:00
< script src = "/js/1247bc3e.js" > < / script >
2023-10-24 09:48:00 +08:00
<!-- search -->
2023-10-20 10:28:01 +08:00
< link rel = "stylesheet" href = "/css/4c3d0e88.css" >
2023-10-24 09:48:00 +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" } < / script >
2023-10-20 10:28:01 +08:00
< script src = "/js/07f44e09.js" > < / script >
2023-10-24 09:48:00 +08:00
<!-- navigation -->
2023-10-20 10:28:01 +08:00
< link rel = "stylesheet" href = "/css/3efc6cb5.css" >
2023-10-24 09:48:00 +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 > < / ul > < p > Category< / p > < ul > < li class = "" > < a href = "/categories/EQ/" > < 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 > EQ< / span > < / div > < / a > < / li > < li class = "" > < a href = "/categories/Hexo/" > < 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 > Hexo< / span > < / div > < / a > < / li > < li class = "active" > < a href = "/categories/Front-End/" > < 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 > Front-End< / span > < / div > < / a > < / li > < / ul > < / section >
2023-10-20 10:28:01 +08:00
< script src = "/js/f8b20eb9.js" > < / script >
2023-10-24 09:48:00 +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 >
< link rel = "stylesheet" href = "/css/32ae9342.css" >
< 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:48:00 +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:48:00 +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 >
< link rel = "stylesheet" href = "/css/ccbcde32.css" >
2023-10-24 09:48:00 +08:00
< div class = "copyright" > < a target = "_blank" href = "https://mozzie.cn/2023/10/20/front-end/verdaccio/" > < span > Post Url: < / span > < span > https://mozzie.cn/2023/10/20/front-end/verdaccio/< / span > < / a > < ul > < li > < span > Author< / span > < p > Mozzie< / p > < / li > < li > < span > Published on< / span > < p > 2023-10-20< / p > < / 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:48:00 +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:48:00 +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" , "text-search" : "Search..." } < / script >
2023-10-20 10:28:01 +08:00
< script src = "/js/85d1c72e.js" > < / script >
< / html >