blog-hexo/db.json
2023-10-20 10:28:01 +08:00

1 line
100 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"meta":{"version":1,"warehouse":"4.0.2"},"models":{"Asset":[{"_id":"themes/hexo-theme-linear/source/css/0c63d269.css","path":"css/0c63d269.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/206.a3a4e130.css","path":"css/206.a3a4e130.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/21.88950121.css","path":"css/21.88950121.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/291.a8323266.css","path":"css/291.a8323266.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/271.54fa1675.css","path":"css/271.54fa1675.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/2cd7dba2.css","path":"css/2cd7dba2.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/2f1ea598.css","path":"css/2f1ea598.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/3a4a90d1.css","path":"css/3a4a90d1.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/3efc6cb5.css","path":"css/3efc6cb5.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/429.fb1dabcb.css","path":"css/429.fb1dabcb.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/4c3d0e88.css","path":"css/4c3d0e88.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/618.6513d67e.css","path":"css/618.6513d67e.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/766.64ad3c35.css","path":"css/766.64ad3c35.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/922.9efa0b6b.css","path":"css/922.9efa0b6b.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/7c527814.css","path":"css/7c527814.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/aeb44e7a.css","path":"css/aeb44e7a.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/945.fdf98cb0.css","path":"css/945.fdf98cb0.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/ccbcde32.css","path":"css/ccbcde32.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/de5de8fb.css","path":"css/de5de8fb.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/e01add4b.css","path":"css/e01add4b.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/efca006a.css","path":"css/efca006a.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/css/f3729dde.css","path":"css/f3729dde.css","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/font/linear.woff2","path":"font/linear.woff2","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/font/motto.woff","path":"font/motto.woff","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/favicon.svg","path":"img/favicon.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon-arrow-left.svg","path":"img/icon-arrow-left.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon-book.svg","path":"img/icon-book.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon-date.svg","path":"img/icon-date.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon-click.svg","path":"img/icon-click.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon-layout.svg","path":"img/icon-layout.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon-link.svg","path":"img/icon-link.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon-moon.svg","path":"img/icon-moon.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon-sun.svg","path":"img/icon-sun.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon1.svg","path":"img/icon1.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon3.svg","path":"img/icon3.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/icon2.svg","path":"img/icon2.svg","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/logo.png","path":"img/logo.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/07f44e09.js","path":"js/07f44e09.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/07f44e09.js.LICENSE.txt","path":"js/07f44e09.js.LICENSE.txt","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/1247bc3e.js","path":"js/1247bc3e.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/206.759361ed.js","path":"js/206.759361ed.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/21.282c05e7.js","path":"js/21.282c05e7.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/271.ee88a6de.js","path":"js/271.ee88a6de.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/291.4ac6984b.js","path":"js/291.4ac6984b.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/31d6cfe0.js","path":"js/31d6cfe0.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/3cf4fd98.js","path":"js/3cf4fd98.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/429.bc4769cb.js","path":"js/429.bc4769cb.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/430dbbd6.js","path":"js/430dbbd6.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/618.1a58fba9.js","path":"js/618.1a58fba9.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/766.9503a62c.js","path":"js/766.9503a62c.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/85d1c72e.js","path":"js/85d1c72e.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/922.689e0633.js","path":"js/922.689e0633.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/945.0313a94c.js","path":"js/945.0313a94c.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/96ea39da.js","path":"js/96ea39da.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/ca6b30b5.js","path":"js/ca6b30b5.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/js/f8b20eb9.js","path":"js/f8b20eb9.js","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/100.png","path":"img/qweather-color-icon/100.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/101.png","path":"img/qweather-color-icon/101.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/102.png","path":"img/qweather-color-icon/102.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/103.png","path":"img/qweather-color-icon/103.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/104.png","path":"img/qweather-color-icon/104.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/150.png","path":"img/qweather-color-icon/150.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/151.png","path":"img/qweather-color-icon/151.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/152.png","path":"img/qweather-color-icon/152.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/153.png","path":"img/qweather-color-icon/153.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/300.png","path":"img/qweather-color-icon/300.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/301.png","path":"img/qweather-color-icon/301.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/302.png","path":"img/qweather-color-icon/302.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/303.png","path":"img/qweather-color-icon/303.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/304.png","path":"img/qweather-color-icon/304.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/305.png","path":"img/qweather-color-icon/305.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/306.png","path":"img/qweather-color-icon/306.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/307.png","path":"img/qweather-color-icon/307.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/308.png","path":"img/qweather-color-icon/308.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/309.png","path":"img/qweather-color-icon/309.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/310.png","path":"img/qweather-color-icon/310.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/311.png","path":"img/qweather-color-icon/311.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/312.png","path":"img/qweather-color-icon/312.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/313.png","path":"img/qweather-color-icon/313.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/314.png","path":"img/qweather-color-icon/314.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/315.png","path":"img/qweather-color-icon/315.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/316.png","path":"img/qweather-color-icon/316.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/317.png","path":"img/qweather-color-icon/317.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/318.png","path":"img/qweather-color-icon/318.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/350.png","path":"img/qweather-color-icon/350.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/351.png","path":"img/qweather-color-icon/351.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/400.png","path":"img/qweather-color-icon/400.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/399.png","path":"img/qweather-color-icon/399.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/401.png","path":"img/qweather-color-icon/401.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/402.png","path":"img/qweather-color-icon/402.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/403.png","path":"img/qweather-color-icon/403.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/404.png","path":"img/qweather-color-icon/404.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/406.png","path":"img/qweather-color-icon/406.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/407.png","path":"img/qweather-color-icon/407.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/409.png","path":"img/qweather-color-icon/409.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/408.png","path":"img/qweather-color-icon/408.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/410.png","path":"img/qweather-color-icon/410.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/456.png","path":"img/qweather-color-icon/456.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/457.png","path":"img/qweather-color-icon/457.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/499.png","path":"img/qweather-color-icon/499.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/500.png","path":"img/qweather-color-icon/500.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/502.png","path":"img/qweather-color-icon/502.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/501.png","path":"img/qweather-color-icon/501.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/503.png","path":"img/qweather-color-icon/503.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/504.png","path":"img/qweather-color-icon/504.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/507.png","path":"img/qweather-color-icon/507.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/508.png","path":"img/qweather-color-icon/508.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/510.png","path":"img/qweather-color-icon/510.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/509.png","path":"img/qweather-color-icon/509.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/511.png","path":"img/qweather-color-icon/511.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/512.png","path":"img/qweather-color-icon/512.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/514.png","path":"img/qweather-color-icon/514.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/513.png","path":"img/qweather-color-icon/513.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/515.png","path":"img/qweather-color-icon/515.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/900.png","path":"img/qweather-color-icon/900.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/901.png","path":"img/qweather-color-icon/901.png","modified":1,"renderable":1},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/999.png","path":"img/qweather-color-icon/999.png","modified":1,"renderable":1}],"Cache":[{"_id":"source/_posts/front-end/verdaccio.md","hash":"50453d3e60c7e63e31bc9f3efcebc241d317fae0","modified":1697768855158},{"_id":"source/_posts/Linear 入门.md","hash":"1d34cf44b02d833b768dfe29fbba9dbd9fce63e3","modified":1697765129685},{"_id":"source/_posts/Linear-Starter-Guide.md","hash":"fccd455d2345ebbfb02ba8156a929102da289ad2","modified":1697765213835},{"_id":"themes/hexo-theme-linear/source/js/31d6cfe0.js","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1697766724527},{"_id":"themes/hexo-theme-linear/languages/es.yml","hash":"3e47b0f87a02d7f8ece63becb37fcfbb1ed32b16","modified":1697766724477},{"_id":"themes/hexo-theme-linear/languages/ar.yml","hash":"de613e0512e106e67c39c5534ccfea29eb15f557","modified":1697766724476},{"_id":"themes/hexo-theme-linear/languages/de.yml","hash":"20ccde52ba59700211177dbc6a0658489d3fabda","modified":1697766724476},{"_id":"themes/hexo-theme-linear/languages/fr.yml","hash":"125ed203d8ce117f61ab4e3e4ffca58cd7bb6c61","modified":1697766724477},{"_id":"themes/hexo-theme-linear/languages/ko.yml","hash":"4cd415dee4bcdbdefd1b7df6caea76ccc258c49a","modified":1697766724477},{"_id":"themes/hexo-theme-linear/languages/en.yml","hash":"5d97a1ba5a02e24443b37bc000567fdf17340bd2","modified":1697766724476},{"_id":"themes/hexo-theme-linear/languages/ja.yml","hash":"944eea06cacb1aeb58833eb273f32433d323768e","modified":1697766724477},{"_id":"themes/hexo-theme-linear/languages/zh-TW.yml","hash":"ad746b7bd795e81ed8f34e7fe05faf7e1cd999d7","modified":1697766724478},{"_id":"themes/hexo-theme-linear/_config.yml","hash":"3b03792d72cfda4e250faba8dea790c7f7a63690","modified":1697768622100},{"_id":"themes/hexo-theme-linear/layout/airplane.ejs","hash":"28521fce0f5dbd1fd62c612ae68b78ba254faef3","modified":1697766724483},{"_id":"themes/hexo-theme-linear/languages/ru.yml","hash":"974811181b770e78e4571dfa87aed51fd3863043","modified":1697766724478},{"_id":"themes/hexo-theme-linear/languages/zh-CN.yml","hash":"cf4c13270d7ac15baea1e774064f27bd2d2f8f32","modified":1697766724478},{"_id":"themes/hexo-theme-linear/layout/archive.ejs","hash":"d63bc4ebac416b4f5b80fb673ec0a3f092a4e255","modified":1697766724483},{"_id":"themes/hexo-theme-linear/layout/breadcrumb.ejs","hash":"81c91ad7b618a760b901741ff0d87333acddf60c","modified":1697766724483},{"_id":"themes/hexo-theme-linear/layout/homebar.ejs","hash":"fdc00e93db6bfd508e3cd44aef084124a00b3424","modified":1697766724483},{"_id":"themes/hexo-theme-linear/layout/index.ejs","hash":"f9981d732327e420c7a727ee8cced34327d7fd31","modified":1697766724483},{"_id":"themes/hexo-theme-linear/layout/navigation.ejs","hash":"b92b8cf5698a1b7631a2d463da6891b8ddc078ed","modified":1697766724484},{"_id":"themes/hexo-theme-linear/layout/category.ejs","hash":"679f6aa009bc1f681fe9c2305c79f96e87e119ea","modified":1697766724483},{"_id":"themes/hexo-theme-linear/layout/layout.ejs","hash":"0733d5f564941dd109bd2eb72acfad95cf3c4f89","modified":1697766724484},{"_id":"themes/hexo-theme-linear/scripts/mermaid_tag.js","hash":"bc74c79cf41709da1993597acaebae96d6b3761d","modified":1697766724491},{"_id":"themes/hexo-theme-linear/layout/post.ejs","hash":"891458ae52a93e8070513b2a35a49d0afdb4a962","modified":1697766724484},{"_id":"themes/hexo-theme-linear/scripts/generate_excerpt.js","hash":"a7cfe46e7e389b1654c81f3e9a8a934dd80d735a","modified":1697766724491},{"_id":"themes/hexo-theme-linear/layout/postCopyright.ejs","hash":"83a579d0e8d7cf341ac8acc9a733d5046e224e32","modified":1697766724484},{"_id":"themes/hexo-theme-linear/scripts/postIcon.js","hash":"73362a6570b00613681425b59a30903be671cd91","modified":1697766724491},{"_id":"themes/hexo-theme-linear/layout/weather.ejs","hash":"04052e95f80ac11765b90019b149d7fb1bb68bab","modified":1697766724485},{"_id":"themes/hexo-theme-linear/scripts/post_counter.js","hash":"62aaa594dafcffe5aa457628eaf183075cabe159","modified":1697766724491},{"_id":"themes/hexo-theme-linear/layout/welcome.ejs","hash":"ce7419f61089411de4cea72165a4ce89c4d55fbd","modified":1697766724485},{"_id":"themes/hexo-theme-linear/scripts/sort_posts.js","hash":"5cedcd663fd7eb1b255360ea9eb6089fd55e959c","modified":1697766724491},{"_id":"themes/hexo-theme-linear/layout/search.ejs","hash":"da088b901ea192cbd8c6fc451094bc93890ecc4d","modified":1697766724484},{"_id":"themes/hexo-theme-linear/source/css/206.a3a4e130.css","hash":"f8c04ec30e94eb972ff315b8c1eef655b9e8a03e","modified":1697766724500},{"_id":"themes/hexo-theme-linear/source/css/0c63d269.css","hash":"6b9b9796cf8ff9349b724f4b789f1347eaa0d476","modified":1697766724500},{"_id":"themes/hexo-theme-linear/source/css/291.a8323266.css","hash":"e18068692b42ef4b76adc55d5ddc9f2bb10203f4","modified":1697766724500},{"_id":"themes/hexo-theme-linear/source/css/2cd7dba2.css","hash":"dbc4f3071866019f0faae76620928ddf2f6700e6","modified":1697766724501},{"_id":"themes/hexo-theme-linear/source/css/271.54fa1675.css","hash":"845cb754fd4ea780279a16e01a345d55889866e2","modified":1697766724500},{"_id":"themes/hexo-theme-linear/source/css/21.88950121.css","hash":"44c9b83ffe9151e2e233c2f55b6e89b30ea7c7bb","modified":1697766724500},{"_id":"themes/hexo-theme-linear/source/css/2f1ea598.css","hash":"ac520cdae0399c2b818dcac34c5ff58fd204d10f","modified":1697766724501},{"_id":"themes/hexo-theme-linear/source/css/3efc6cb5.css","hash":"1f1958bfd921ac3eea83a1e14ed97e8e83b31fb6","modified":1697766724501},{"_id":"themes/hexo-theme-linear/source/css/4c3d0e88.css","hash":"c4a5bf3a1f7adf21c04d9950b02a67f516bbac9f","modified":1697766724502},{"_id":"themes/hexo-theme-linear/source/css/618.6513d67e.css","hash":"660188677fab2c0946ac4b8ed81611ad5472feb8","modified":1697766724502},{"_id":"themes/hexo-theme-linear/source/css/3a4a90d1.css","hash":"4ffc2c5e9f1afd4fa74d7d9b785e0697cd7fb770","modified":1697766724501},{"_id":"themes/hexo-theme-linear/source/css/766.64ad3c35.css","hash":"8434994030b9b9d0fa3a82df079c860f49543b82","modified":1697766724502},{"_id":"themes/hexo-theme-linear/source/css/922.9efa0b6b.css","hash":"721bc1b89ae059267d9b4aa3cc37f5c1ff8f32c3","modified":1697766724503},{"_id":"themes/hexo-theme-linear/source/css/aeb44e7a.css","hash":"95b181f50e6adb98be13bb60983edb155a83f6d7","modified":1697766724503},{"_id":"themes/hexo-theme-linear/source/css/7c527814.css","hash":"7061b6b9c6fe1da1956a664b3ee7862ef257c716","modified":1697766724502},{"_id":"themes/hexo-theme-linear/source/css/429.fb1dabcb.css","hash":"1f2b77bab319123d193042b9990056abe9f2fd73","modified":1697766724501},{"_id":"themes/hexo-theme-linear/source/css/945.fdf98cb0.css","hash":"f227a8697bf14eb75ba63d14a0608db53c9a50a1","modified":1697766724503},{"_id":"themes/hexo-theme-linear/source/css/ccbcde32.css","hash":"3475deea0241c67fadc3de5149886e90af24f2e6","modified":1697766724503},{"_id":"themes/hexo-theme-linear/source/css/de5de8fb.css","hash":"a05682caa4e0b8a106578468f795dad472ee75da","modified":1697766724504},{"_id":"themes/hexo-theme-linear/source/css/efca006a.css","hash":"97972d1b7ca177983b39a67e772736f661637468","modified":1697766724504},{"_id":"themes/hexo-theme-linear/source/css/e01add4b.css","hash":"5fc672a8fb8b65d60c087cc908d5170eaac56e0c","modified":1697766724504},{"_id":"themes/hexo-theme-linear/source/css/f3729dde.css","hash":"2a7faa0c3816e3b653fb4540fa63504a26b2051f","modified":1697766724504},{"_id":"themes/hexo-theme-linear/source/img/favicon.svg","hash":"6e88f8a231bb0a7ae4cc4598f85b6d346a286095","modified":1697766724505},{"_id":"themes/hexo-theme-linear/source/font/motto.woff","hash":"755620f3bad3ebdf683c074043104d4c11f8d23e","modified":1697766724505},{"_id":"themes/hexo-theme-linear/source/img/icon-book.svg","hash":"d5e4064468dde477bf9a630c3fababec41316708","modified":1697766724505},{"_id":"themes/hexo-theme-linear/source/img/icon-date.svg","hash":"b391e34adafed83ef52d836fd6f81618494c4c6b","modified":1697766724506},{"_id":"themes/hexo-theme-linear/source/img/icon-click.svg","hash":"b10df8b886a8b2d44293b26f42b440c9aedb66a7","modified":1697766724506},{"_id":"themes/hexo-theme-linear/source/font/linear.woff2","hash":"57cac19ad34a50d5a4da5e471e08174c950ce5fb","modified":1697766724504},{"_id":"themes/hexo-theme-linear/source/img/icon-arrow-left.svg","hash":"a36362d2555e8b836fcec1f7eeeae4588a871bdd","modified":1697766724505},{"_id":"themes/hexo-theme-linear/source/img/icon-link.svg","hash":"436b5ee7ef2d28766e86ac1e65a567d1e786c1b3","modified":1697766724506},{"_id":"themes/hexo-theme-linear/source/img/icon-moon.svg","hash":"032be7ed3d2320f22069e2efb2fb7f60592d6212","modified":1697766724507},{"_id":"themes/hexo-theme-linear/source/img/icon1.svg","hash":"f15fbcecbaa00db99aeaca9807922514f6452d02","modified":1697766724507},{"_id":"themes/hexo-theme-linear/source/img/icon-layout.svg","hash":"108ef43073a5b92552dc00744a9f11db8e5ac0a2","modified":1697766724506},{"_id":"themes/hexo-theme-linear/source/img/icon-sun.svg","hash":"57a0ce52ecce7188eaac5e06eab54609a8e572c8","modified":1697766724507},{"_id":"themes/hexo-theme-linear/source/img/icon2.svg","hash":"cc598540651110d977afd26dc0a1f01bbc95bf21","modified":1697766724507},{"_id":"themes/hexo-theme-linear/source/js/07f44e09.js.LICENSE.txt","hash":"35ad54c8f1627db94ca60022d50f416d495b72c6","modified":1697766724526},{"_id":"themes/hexo-theme-linear/source/js/1247bc3e.js","hash":"1d0335fdedecd72daa5eb2288a8891ab2e83e55d","modified":1697766724526},{"_id":"themes/hexo-theme-linear/source/js/07f44e09.js","hash":"e8a21a4252ad34adc1a54066eab32a26a7313940","modified":1697766724526},{"_id":"themes/hexo-theme-linear/source/js/206.759361ed.js","hash":"129b5fd004afbbe4ab06cf6e944097b42c98655b","modified":1697766724526},{"_id":"themes/hexo-theme-linear/source/img/icon3.svg","hash":"a1a9dcee7703ec48f2d92b0d533b62fef16097fc","modified":1697766724508},{"_id":"themes/hexo-theme-linear/source/js/271.ee88a6de.js","hash":"2d93e1c6f51c16e6cc0c41740dc1de5a0c362926","modified":1697766724527},{"_id":"themes/hexo-theme-linear/source/js/21.282c05e7.js","hash":"78359415e9f39c9c2119551ac2a97ba9f15af294","modified":1697766724527},{"_id":"themes/hexo-theme-linear/source/js/3cf4fd98.js","hash":"0d51155f6dc08d1d8c693d210c1407b2e26b5685","modified":1697766724527},{"_id":"themes/hexo-theme-linear/source/js/291.4ac6984b.js","hash":"b5bb3c24cbcb7d09604c8c66c9d4470e6a2fd449","modified":1697766724527},{"_id":"themes/hexo-theme-linear/source/js/429.bc4769cb.js","hash":"926f0c003b8cfc0f4eb78ab6367aab9228d31abf","modified":1697766724528},{"_id":"themes/hexo-theme-linear/source/js/430dbbd6.js","hash":"ff77ecc0d3b8bee105dabbaccefdb83b07a09e47","modified":1697766724528},{"_id":"themes/hexo-theme-linear/source/js/618.1a58fba9.js","hash":"afbe73ca7b78196e48dd9147a12db960d17589ff","modified":1697766724528},{"_id":"themes/hexo-theme-linear/source/js/85d1c72e.js","hash":"8ec5c0c8f9dff40d1fc2d16de3baa51442e12be2","modified":1697766724528},{"_id":"themes/hexo-theme-linear/source/js/922.689e0633.js","hash":"1757f732da655e7dc36fe4a23d29b72a549e9423","modified":1697766724529},{"_id":"themes/hexo-theme-linear/source/js/945.0313a94c.js","hash":"ccc3bda115641d497837d4cf8e93f776f0e64c6d","modified":1697766724529},{"_id":"themes/hexo-theme-linear/source/js/f8b20eb9.js","hash":"86cff2cb169c614dedd464b373d94322328cb185","modified":1697766724530},{"_id":"themes/hexo-theme-linear/source/js/766.9503a62c.js","hash":"9f2114b6ac69ab0a67b1c88c5f6c48ff244185f7","modified":1697766724528},{"_id":"themes/hexo-theme-linear/source/js/ca6b30b5.js","hash":"481a8f20c3d4e565c1ea5dafe4218597d051a9fc","modified":1697766724529},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/100.png","hash":"ad42001979a0dbb8807c128b871dc28161b8c191","modified":1697766724510},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/102.png","hash":"74d7cfa4f23850a456c16d0e0956264e920f7a85","modified":1697766724511},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/101.png","hash":"890888efd8db7a3f29427e476ce3433f4a564321","modified":1697766724510},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/104.png","hash":"36add97ed90d57e691e6e15d3456898a42dccb16","modified":1697766724511},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/150.png","hash":"572b4a6e56271b89208daa538f02416d50249347","modified":1697766724511},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/151.png","hash":"8041e428fc369be40f9e993f4f718ae99c7662fa","modified":1697766724511},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/103.png","hash":"656d81bd50728c7ba62572e838db7c355d522e51","modified":1697766724511},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/152.png","hash":"3ec0a1ac063ae068cc9d728eef88a9a6d7859153","modified":1697766724512},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/153.png","hash":"3eb50d325ec84e1248585d347471b1093a83909c","modified":1697766724512},{"_id":"themes/hexo-theme-linear/source/js/96ea39da.js","hash":"a6c6a3f3afb38e8326846eb8eac1bbadd48ac6d3","modified":1697766724529},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/300.png","hash":"bd67445ff764f3f1d4eeb81625372585bb537b07","modified":1697766724512},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/302.png","hash":"371fa4d79b6a93573fde068f179829ed97c8f4f8","modified":1697766724513},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/303.png","hash":"453442f93e62ac98884aae173530f26272d97ad6","modified":1697766724513},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/304.png","hash":"3669eb04ee87dca604f70f7404c0ecb303d17af4","modified":1697766724513},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/305.png","hash":"618e18bf06b5d12d64269b30d6f044fc356d24b0","modified":1697766724513},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/306.png","hash":"69b55e71e8da4e0fe223ff76b9a68f98e4134b3d","modified":1697766724514},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/307.png","hash":"02a08e002d21a10e0854b1036556fb81b0308be3","modified":1697766724514},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/308.png","hash":"ace460a40174aa90dde6c2ef71663f30cec24193","modified":1697766724514},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/310.png","hash":"9315203066fa97a7d10f2a6fb0fd3ce5b7805126","modified":1697766724514},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/311.png","hash":"ab5c5059f354da2f9525b30ee81312fbfa4749bf","modified":1697766724515},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/309.png","hash":"c5140be49b8936e5d30380f14f7dce49a7be7cb5","modified":1697766724514},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/313.png","hash":"afa70386816623e847c09f51032212d2520d1740","modified":1697766724515},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/314.png","hash":"110f9fe81f80b8f372b7472fbcfd9c0071b33151","modified":1697766724516},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/312.png","hash":"c672d7373fce89803b5e8d06420e158f11ea346f","modified":1697766724515},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/301.png","hash":"cc616d4c7ae6abbe0338f418fe35acce93c46164","modified":1697766724512},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/315.png","hash":"2100a23ee6d584227715164263c43875e8d8946c","modified":1697766724516},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/316.png","hash":"4de1ac0254507c5509fc4d04e208fd81d2af7b34","modified":1697766724516},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/317.png","hash":"7e60725abd3b91b9ba388ad9b9f642690c39ff9e","modified":1697766724516},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/351.png","hash":"3ab30470a65acb8fe879aa7adc9064284abd8407","modified":1697766724517},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/350.png","hash":"f29c1aa55c4afd3df17aef7885a35b0bd177d771","modified":1697766724517},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/318.png","hash":"7a042920165671cdbfef6c58596a80f9a1f6f016","modified":1697766724516},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/400.png","hash":"79444a48a0e416e4cac1eb319496f495091f4c86","modified":1697766724517},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/401.png","hash":"279c8bc00b4e57db9b1095df64044ec80b37edb0","modified":1697766724518},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/402.png","hash":"033fc236885a2bf7007d97eb054b0c5885035be5","modified":1697766724518},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/403.png","hash":"dfad1a525c4467c3e95e281befdf813e145620df","modified":1697766724518},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/404.png","hash":"112e73e641d1a30712993b5dca681a5e033831ee","modified":1697766724518},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/407.png","hash":"82223792a5e3e556148b4663f195ef22044c143a","modified":1697766724519},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/409.png","hash":"aed269911d0249a700b4f3890c424f00f4a27e1e","modified":1697766724521},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/406.png","hash":"b9cd0421518e0a76041285e5bf0c1666a93428a5","modified":1697766724518},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/399.png","hash":"993ddcd386480d211ec9b2e56656d659bb6c453b","modified":1697766724517},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/408.png","hash":"02b34a66020c9f3e5173702d30e5a7b69139bade","modified":1697766724519},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/410.png","hash":"9170b32d6b7f644ce49116f3e35d35558bae6536","modified":1697766724521},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/456.png","hash":"dd16b957cc544730afab8d2712821dd6c77f5167","modified":1697766724522},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/499.png","hash":"2b51631144a7c0f813b6425d4daa30c4d4e8bd38","modified":1697766724522},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/502.png","hash":"4146081a2635ff88fa14e38ed8d360d3b4fa74dd","modified":1697766724523},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/500.png","hash":"ddb4712d8f19bb8c197e600000dd2d51049f970d","modified":1697766724522},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/457.png","hash":"5dffe7e9139bfb697b046c427b9ef0ed6ffa95c7","modified":1697766724522},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/501.png","hash":"ddb4712d8f19bb8c197e600000dd2d51049f970d","modified":1697766724522},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/503.png","hash":"9415147c4bcebadd7f3089339064b8120c8d4089","modified":1697766724523},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/504.png","hash":"defba93520719f72b217583062ccc79abd5b445e","modified":1697766724523},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/509.png","hash":"3bc779bfbcab94a79c91b26288e2e7b67412d15e","modified":1697766724524},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/510.png","hash":"524131e401d0b150dab2733af336f4649b8ade74","modified":1697766724524},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/508.png","hash":"ae98a3217df26021ec2f667f099d27575c912bf4","modified":1697766724523},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/512.png","hash":"64e11f225c35caa6ef2612d613026c52cfd3557e","modified":1697766724524},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/511.png","hash":"e2efe07a29446ebecd313ccd8a2c7d57a670f203","modified":1697766724524},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/507.png","hash":"426d5a73a482ac5721e7da2141e4fe704f50b608","modified":1697766724523},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/514.png","hash":"fdf992021ff20e1ffe1b19f0b918aa35204f22e7","modified":1697766724525},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/513.png","hash":"ceff3dfd109a990c9595276ad6b56061bb662e5e","modified":1697766724524},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/900.png","hash":"6eacf8df641c6096feb746c7544a825d3c65bf47","modified":1697766724525},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/901.png","hash":"f6b3f1cd64e9c325e9dc3ab42469baa5c5119c2d","modified":1697766724525},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/999.png","hash":"74e4fa5bdd815d988b55525d4e7f6d40bf1080d4","modified":1697766724525},{"_id":"themes/hexo-theme-linear/source/img/qweather-color-icon/515.png","hash":"fdf992021ff20e1ffe1b19f0b918aa35204f22e7","modified":1697766724525},{"_id":"themes/hexo-theme-linear/source/img/logo.png","hash":"05730ab0dadd5036509f942834278eef683994dd","modified":1697766724508},{"_id":"public/2023/10/20/Linear 入门/index.html","hash":"2fbb3e60d350d3ae1926c3087ee916f644135a38","modified":1697768866266},{"_id":"public/2023/10/20/Linear-Starter-Guide/index.html","hash":"d502036d28fbd976030a445f8dc139facdee5171","modified":1697768866266},{"_id":"public/archives/index.html","hash":"4c45612048995ea192afc5589dfef7e69fff4429","modified":1697768866266},{"_id":"public/archives/2023/10/index.html","hash":"4c45612048995ea192afc5589dfef7e69fff4429","modified":1697768866266},{"_id":"public/archives/2023/index.html","hash":"4c45612048995ea192afc5589dfef7e69fff4429","modified":1697768866266},{"_id":"public/categories/Hexo/index.html","hash":"369fe1a1abfaef2a81a506c3f83c2013d4b858f6","modified":1697768866266},{"_id":"public/categories/Front-End/index.html","hash":"72d2501a9a7562d138e3c6d584a236b2eedc5b72","modified":1697768866266},{"_id":"public/index.html","hash":"c05a820d4e8cc95bda18746bc3568129307b6709","modified":1697768866266},{"_id":"public/2023/10/20/front-end/verdaccio/index.html","hash":"0a0e2acdd361e35038c96166d3f331c90ac0437e","modified":1697768866266},{"_id":"public/font/motto.woff","hash":"755620f3bad3ebdf683c074043104d4c11f8d23e","modified":1697768866266},{"_id":"public/img/favicon.svg","hash":"6e88f8a231bb0a7ae4cc4598f85b6d346a286095","modified":1697768866266},{"_id":"public/img/icon-arrow-left.svg","hash":"a36362d2555e8b836fcec1f7eeeae4588a871bdd","modified":1697768866266},{"_id":"public/font/linear.woff2","hash":"57cac19ad34a50d5a4da5e471e08174c950ce5fb","modified":1697768866266},{"_id":"public/img/icon-book.svg","hash":"d5e4064468dde477bf9a630c3fababec41316708","modified":1697768866266},{"_id":"public/img/icon-click.svg","hash":"b10df8b886a8b2d44293b26f42b440c9aedb66a7","modified":1697768866266},{"_id":"public/img/icon-date.svg","hash":"b391e34adafed83ef52d836fd6f81618494c4c6b","modified":1697768866266},{"_id":"public/img/icon-moon.svg","hash":"032be7ed3d2320f22069e2efb2fb7f60592d6212","modified":1697768866266},{"_id":"public/img/icon-layout.svg","hash":"108ef43073a5b92552dc00744a9f11db8e5ac0a2","modified":1697768866266},{"_id":"public/img/icon-link.svg","hash":"436b5ee7ef2d28766e86ac1e65a567d1e786c1b3","modified":1697768866266},{"_id":"public/img/icon-sun.svg","hash":"57a0ce52ecce7188eaac5e06eab54609a8e572c8","modified":1697768866266},{"_id":"public/img/icon1.svg","hash":"f15fbcecbaa00db99aeaca9807922514f6452d02","modified":1697768866266},{"_id":"public/img/icon3.svg","hash":"a1a9dcee7703ec48f2d92b0d533b62fef16097fc","modified":1697768866266},{"_id":"public/img/icon2.svg","hash":"cc598540651110d977afd26dc0a1f01bbc95bf21","modified":1697768866266},{"_id":"public/img/qweather-color-icon/101.png","hash":"890888efd8db7a3f29427e476ce3433f4a564321","modified":1697768866266},{"_id":"public/img/qweather-color-icon/100.png","hash":"ad42001979a0dbb8807c128b871dc28161b8c191","modified":1697768866266},{"_id":"public/img/qweather-color-icon/102.png","hash":"74d7cfa4f23850a456c16d0e0956264e920f7a85","modified":1697768866266},{"_id":"public/img/qweather-color-icon/104.png","hash":"36add97ed90d57e691e6e15d3456898a42dccb16","modified":1697768866266},{"_id":"public/img/qweather-color-icon/103.png","hash":"656d81bd50728c7ba62572e838db7c355d522e51","modified":1697768866266},{"_id":"public/img/qweather-color-icon/150.png","hash":"572b4a6e56271b89208daa538f02416d50249347","modified":1697768866266},{"_id":"public/img/qweather-color-icon/151.png","hash":"8041e428fc369be40f9e993f4f718ae99c7662fa","modified":1697768866266},{"_id":"public/img/qweather-color-icon/152.png","hash":"3ec0a1ac063ae068cc9d728eef88a9a6d7859153","modified":1697768866266},{"_id":"public/img/qweather-color-icon/153.png","hash":"3eb50d325ec84e1248585d347471b1093a83909c","modified":1697768866266},{"_id":"public/js/07f44e09.js.LICENSE.txt","hash":"35ad54c8f1627db94ca60022d50f416d495b72c6","modified":1697768866266},{"_id":"public/img/qweather-color-icon/300.png","hash":"bd67445ff764f3f1d4eeb81625372585bb537b07","modified":1697768866266},{"_id":"public/img/qweather-color-icon/304.png","hash":"3669eb04ee87dca604f70f7404c0ecb303d17af4","modified":1697768866266},{"_id":"public/img/qweather-color-icon/301.png","hash":"cc616d4c7ae6abbe0338f418fe35acce93c46164","modified":1697768866266},{"_id":"public/img/qweather-color-icon/302.png","hash":"371fa4d79b6a93573fde068f179829ed97c8f4f8","modified":1697768866266},{"_id":"public/img/qweather-color-icon/305.png","hash":"618e18bf06b5d12d64269b30d6f044fc356d24b0","modified":1697768866266},{"_id":"public/img/qweather-color-icon/303.png","hash":"453442f93e62ac98884aae173530f26272d97ad6","modified":1697768866266},{"_id":"public/img/qweather-color-icon/306.png","hash":"69b55e71e8da4e0fe223ff76b9a68f98e4134b3d","modified":1697768866266},{"_id":"public/img/qweather-color-icon/307.png","hash":"02a08e002d21a10e0854b1036556fb81b0308be3","modified":1697768866266},{"_id":"public/img/qweather-color-icon/308.png","hash":"ace460a40174aa90dde6c2ef71663f30cec24193","modified":1697768866266},{"_id":"public/img/qweather-color-icon/309.png","hash":"c5140be49b8936e5d30380f14f7dce49a7be7cb5","modified":1697768866266},{"_id":"public/img/qweather-color-icon/312.png","hash":"c672d7373fce89803b5e8d06420e158f11ea346f","modified":1697768866266},{"_id":"public/img/qweather-color-icon/311.png","hash":"ab5c5059f354da2f9525b30ee81312fbfa4749bf","modified":1697768866266},{"_id":"public/img/qweather-color-icon/310.png","hash":"9315203066fa97a7d10f2a6fb0fd3ce5b7805126","modified":1697768866266},{"_id":"public/img/qweather-color-icon/313.png","hash":"afa70386816623e847c09f51032212d2520d1740","modified":1697768866266},{"_id":"public/img/qweather-color-icon/314.png","hash":"110f9fe81f80b8f372b7472fbcfd9c0071b33151","modified":1697768866266},{"_id":"public/img/qweather-color-icon/315.png","hash":"2100a23ee6d584227715164263c43875e8d8946c","modified":1697768866266},{"_id":"public/img/qweather-color-icon/317.png","hash":"7e60725abd3b91b9ba388ad9b9f642690c39ff9e","modified":1697768866266},{"_id":"public/img/qweather-color-icon/318.png","hash":"7a042920165671cdbfef6c58596a80f9a1f6f016","modified":1697768866266},{"_id":"public/img/qweather-color-icon/350.png","hash":"f29c1aa55c4afd3df17aef7885a35b0bd177d771","modified":1697768866266},{"_id":"public/img/qweather-color-icon/316.png","hash":"4de1ac0254507c5509fc4d04e208fd81d2af7b34","modified":1697768866266},{"_id":"public/img/qweather-color-icon/351.png","hash":"3ab30470a65acb8fe879aa7adc9064284abd8407","modified":1697768866266},{"_id":"public/img/qweather-color-icon/400.png","hash":"79444a48a0e416e4cac1eb319496f495091f4c86","modified":1697768866266},{"_id":"public/img/qweather-color-icon/399.png","hash":"993ddcd386480d211ec9b2e56656d659bb6c453b","modified":1697768866266},{"_id":"public/img/qweather-color-icon/402.png","hash":"033fc236885a2bf7007d97eb054b0c5885035be5","modified":1697768866266},{"_id":"public/img/qweather-color-icon/403.png","hash":"dfad1a525c4467c3e95e281befdf813e145620df","modified":1697768866266},{"_id":"public/img/qweather-color-icon/404.png","hash":"112e73e641d1a30712993b5dca681a5e033831ee","modified":1697768866266},{"_id":"public/img/qweather-color-icon/401.png","hash":"279c8bc00b4e57db9b1095df64044ec80b37edb0","modified":1697768866266},{"_id":"public/img/qweather-color-icon/406.png","hash":"b9cd0421518e0a76041285e5bf0c1666a93428a5","modified":1697768866266},{"_id":"public/img/qweather-color-icon/407.png","hash":"82223792a5e3e556148b4663f195ef22044c143a","modified":1697768866266},{"_id":"public/img/qweather-color-icon/409.png","hash":"aed269911d0249a700b4f3890c424f00f4a27e1e","modified":1697768866266},{"_id":"public/img/qweather-color-icon/408.png","hash":"02b34a66020c9f3e5173702d30e5a7b69139bade","modified":1697768866266},{"_id":"public/img/qweather-color-icon/457.png","hash":"5dffe7e9139bfb697b046c427b9ef0ed6ffa95c7","modified":1697768866266},{"_id":"public/img/qweather-color-icon/456.png","hash":"dd16b957cc544730afab8d2712821dd6c77f5167","modified":1697768866266},{"_id":"public/img/qweather-color-icon/499.png","hash":"2b51631144a7c0f813b6425d4daa30c4d4e8bd38","modified":1697768866266},{"_id":"public/img/qweather-color-icon/410.png","hash":"9170b32d6b7f644ce49116f3e35d35558bae6536","modified":1697768866266},{"_id":"public/img/qweather-color-icon/500.png","hash":"ddb4712d8f19bb8c197e600000dd2d51049f970d","modified":1697768866266},{"_id":"public/img/qweather-color-icon/502.png","hash":"4146081a2635ff88fa14e38ed8d360d3b4fa74dd","modified":1697768866266},{"_id":"public/img/qweather-color-icon/503.png","hash":"9415147c4bcebadd7f3089339064b8120c8d4089","modified":1697768866266},{"_id":"public/img/qweather-color-icon/501.png","hash":"ddb4712d8f19bb8c197e600000dd2d51049f970d","modified":1697768866266},{"_id":"public/img/qweather-color-icon/504.png","hash":"defba93520719f72b217583062ccc79abd5b445e","modified":1697768866266},{"_id":"public/img/qweather-color-icon/508.png","hash":"ae98a3217df26021ec2f667f099d27575c912bf4","modified":1697768866266},{"_id":"public/img/qweather-color-icon/507.png","hash":"426d5a73a482ac5721e7da2141e4fe704f50b608","modified":1697768866266},{"_id":"public/img/qweather-color-icon/510.png","hash":"524131e401d0b150dab2733af336f4649b8ade74","modified":1697768866266},{"_id":"public/img/qweather-color-icon/512.png","hash":"64e11f225c35caa6ef2612d613026c52cfd3557e","modified":1697768866266},{"_id":"public/img/qweather-color-icon/511.png","hash":"e2efe07a29446ebecd313ccd8a2c7d57a670f203","modified":1697768866266},{"_id":"public/img/qweather-color-icon/509.png","hash":"3bc779bfbcab94a79c91b26288e2e7b67412d15e","modified":1697768866266},{"_id":"public/img/qweather-color-icon/515.png","hash":"fdf992021ff20e1ffe1b19f0b918aa35204f22e7","modified":1697768866266},{"_id":"public/img/qweather-color-icon/513.png","hash":"ceff3dfd109a990c9595276ad6b56061bb662e5e","modified":1697768866266},{"_id":"public/img/qweather-color-icon/514.png","hash":"fdf992021ff20e1ffe1b19f0b918aa35204f22e7","modified":1697768866266},{"_id":"public/img/qweather-color-icon/900.png","hash":"6eacf8df641c6096feb746c7544a825d3c65bf47","modified":1697768866266},{"_id":"public/img/qweather-color-icon/999.png","hash":"74e4fa5bdd815d988b55525d4e7f6d40bf1080d4","modified":1697768866266},{"_id":"public/img/qweather-color-icon/901.png","hash":"f6b3f1cd64e9c325e9dc3ab42469baa5c5119c2d","modified":1697768866266},{"_id":"public/css/0c63d269.css","hash":"6b9b9796cf8ff9349b724f4b789f1347eaa0d476","modified":1697768866266},{"_id":"public/css/21.88950121.css","hash":"44c9b83ffe9151e2e233c2f55b6e89b30ea7c7bb","modified":1697768866266},{"_id":"public/css/206.a3a4e130.css","hash":"f8c04ec30e94eb972ff315b8c1eef655b9e8a03e","modified":1697768866266},{"_id":"public/css/291.a8323266.css","hash":"e18068692b42ef4b76adc55d5ddc9f2bb10203f4","modified":1697768866266},{"_id":"public/css/271.54fa1675.css","hash":"845cb754fd4ea780279a16e01a345d55889866e2","modified":1697768866266},{"_id":"public/css/2cd7dba2.css","hash":"dbc4f3071866019f0faae76620928ddf2f6700e6","modified":1697768866266},{"_id":"public/css/429.fb1dabcb.css","hash":"1f2b77bab319123d193042b9990056abe9f2fd73","modified":1697768866266},{"_id":"public/css/3efc6cb5.css","hash":"1f1958bfd921ac3eea83a1e14ed97e8e83b31fb6","modified":1697768866266},{"_id":"public/css/4c3d0e88.css","hash":"c4a5bf3a1f7adf21c04d9950b02a67f516bbac9f","modified":1697768866266},{"_id":"public/css/3a4a90d1.css","hash":"4ffc2c5e9f1afd4fa74d7d9b785e0697cd7fb770","modified":1697768866266},{"_id":"public/css/2f1ea598.css","hash":"ac520cdae0399c2b818dcac34c5ff58fd204d10f","modified":1697768866266},{"_id":"public/css/618.6513d67e.css","hash":"660188677fab2c0946ac4b8ed81611ad5472feb8","modified":1697768866266},{"_id":"public/css/766.64ad3c35.css","hash":"8434994030b9b9d0fa3a82df079c860f49543b82","modified":1697768866266},{"_id":"public/css/7c527814.css","hash":"7061b6b9c6fe1da1956a664b3ee7862ef257c716","modified":1697768866266},{"_id":"public/css/aeb44e7a.css","hash":"95b181f50e6adb98be13bb60983edb155a83f6d7","modified":1697768866266},{"_id":"public/css/945.fdf98cb0.css","hash":"f227a8697bf14eb75ba63d14a0608db53c9a50a1","modified":1697768866266},{"_id":"public/css/de5de8fb.css","hash":"a05682caa4e0b8a106578468f795dad472ee75da","modified":1697768866266},{"_id":"public/css/ccbcde32.css","hash":"3475deea0241c67fadc3de5149886e90af24f2e6","modified":1697768866266},{"_id":"public/css/e01add4b.css","hash":"5fc672a8fb8b65d60c087cc908d5170eaac56e0c","modified":1697768866266},{"_id":"public/css/f3729dde.css","hash":"2a7faa0c3816e3b653fb4540fa63504a26b2051f","modified":1697768866266},{"_id":"public/css/efca006a.css","hash":"97972d1b7ca177983b39a67e772736f661637468","modified":1697768866266},{"_id":"public/css/922.9efa0b6b.css","hash":"721bc1b89ae059267d9b4aa3cc37f5c1ff8f32c3","modified":1697768866266},{"_id":"public/js/1247bc3e.js","hash":"1d0335fdedecd72daa5eb2288a8891ab2e83e55d","modified":1697768866266},{"_id":"public/js/206.759361ed.js","hash":"129b5fd004afbbe4ab06cf6e944097b42c98655b","modified":1697768866266},{"_id":"public/js/21.282c05e7.js","hash":"78359415e9f39c9c2119551ac2a97ba9f15af294","modified":1697768866266},{"_id":"public/js/291.4ac6984b.js","hash":"b5bb3c24cbcb7d09604c8c66c9d4470e6a2fd449","modified":1697768866266},{"_id":"public/js/271.ee88a6de.js","hash":"2d93e1c6f51c16e6cc0c41740dc1de5a0c362926","modified":1697768866266},{"_id":"public/js/429.bc4769cb.js","hash":"926f0c003b8cfc0f4eb78ab6367aab9228d31abf","modified":1697768866266},{"_id":"public/js/31d6cfe0.js","hash":"da39a3ee5e6b4b0d3255bfef95601890afd80709","modified":1697768866266},{"_id":"public/js/430dbbd6.js","hash":"ff77ecc0d3b8bee105dabbaccefdb83b07a09e47","modified":1697768866266},{"_id":"public/js/3cf4fd98.js","hash":"0d51155f6dc08d1d8c693d210c1407b2e26b5685","modified":1697768866266},{"_id":"public/js/766.9503a62c.js","hash":"9f2114b6ac69ab0a67b1c88c5f6c48ff244185f7","modified":1697768866266},{"_id":"public/js/618.1a58fba9.js","hash":"afbe73ca7b78196e48dd9147a12db960d17589ff","modified":1697768866266},{"_id":"public/js/85d1c72e.js","hash":"8ec5c0c8f9dff40d1fc2d16de3baa51442e12be2","modified":1697768866266},{"_id":"public/js/945.0313a94c.js","hash":"ccc3bda115641d497837d4cf8e93f776f0e64c6d","modified":1697768866266},{"_id":"public/js/ca6b30b5.js","hash":"481a8f20c3d4e565c1ea5dafe4218597d051a9fc","modified":1697768866266},{"_id":"public/js/f8b20eb9.js","hash":"86cff2cb169c614dedd464b373d94322328cb185","modified":1697768866266},{"_id":"public/js/922.689e0633.js","hash":"1757f732da655e7dc36fe4a23d29b72a549e9423","modified":1697768866266},{"_id":"public/js/96ea39da.js","hash":"a6c6a3f3afb38e8326846eb8eac1bbadd48ac6d3","modified":1697768866266},{"_id":"public/js/07f44e09.js","hash":"e8a21a4252ad34adc1a54066eab32a26a7313940","modified":1697768866266},{"_id":"public/img/logo.png","hash":"05730ab0dadd5036509f942834278eef683994dd","modified":1697768866266}],"Category":[{"name":"Hexo","_id":"clnxzqxcz0002icz38evkcka4"},{"name":"Front-End","_id":"clnxzqxd20005icz3byqj3j9e"}],"Data":[],"Page":[],"Post":[{"title":"Linear 入门","top":0,"status":"doing","_content":"\n# 配置项\n\n","source":"_posts/Linear 入门.md","raw":"---\ntitle: Linear 入门\ntop: 0\ncategories:\n - Hexo\nstatus: doing\n---\n\n# 配置项\n\n","slug":"Linear 入门","published":1,"date":"2023-10-20T01:08:12.352Z","updated":"2023-10-20T01:25:29.685Z","comments":1,"layout":"post","photos":[],"link":"","_id":"clnxzqxcw0000icz36pi62i4o","content":"<h1 id=\"配置项\"><a href=\"#配置项\" class=\"headerlink\" title=\"配置项\"></a>配置项</h1>","site":{"data":{}},"excerpt":"","more":"<h1 id=\"配置项\"><a href=\"#配置项\" class=\"headerlink\" title=\"配置项\"></a>配置项</h1>"},{"title":"Linear-Starter-Guide","top":0,"status":"doing","_content":"\n[中文文档](/Linear主题文档)\n\n# Configuration\n\ncontinued...😁\n","source":"_posts/Linear-Starter-Guide.md","raw":"---\ntitle: Linear-Starter-Guide\ntop: 0\ncategories:\n - Hexo\nstatus: doing\n---\n\n[中文文档](/Linear主题文档)\n\n# Configuration\n\ncontinued...😁\n","slug":"Linear-Starter-Guide","published":1,"date":"2023-10-20T01:05:56.355Z","updated":"2023-10-20T01:26:53.835Z","comments":1,"layout":"post","photos":[],"link":"","_id":"clnxzqxcy0001icz3a7cadi3r","content":"<p><a href=\"/Linear%E4%B8%BB%E9%A2%98%E6%96%87%E6%A1%A3\">中文文档</a></p>\n<h1 id=\"Configuration\"><a href=\"#Configuration\" class=\"headerlink\" title=\"Configuration\"></a>Configuration</h1><p>continued…😁</p>\n","site":{"data":{}},"excerpt":"","more":"<p><a href=\"/Linear%E4%B8%BB%E9%A2%98%E6%96%87%E6%A1%A3\">中文文档</a></p>\n<h1 id=\"Configuration\"><a href=\"#Configuration\" class=\"headerlink\" title=\"Configuration\"></a>Configuration</h1><p>continued…😁</p>\n"},{"title":"verdaccio 搭建 npm私库","status":"done","_content":"\n# 使用 docker 搭建 verdaccio\n\n创建 & 配置`config.yaml`文件\n\n```yaml\n# Read about the best practices\n# https://verdaccio.org/docs/best\n\n# path to a directory with all packages\nstorage: /verdaccio/storage/data\n# path to a directory with plugins to include\nplugins: /verdaccio/plugins\n\n# 包体积上限默认10mb\nmax_body_size: 1024mb\n\n\nweb:\n enable: true\n title: Mozzie-NPM\n # gravatar: false\n # login: true\n pkgManagers:\n - npm\n - yarn\n - pnpm\n html_cache: true\n showFooter: false\n\nauth:\n htpasswd:\n file: /verdaccio/storage/htpasswd\n # 关闭注册手动添加用户默认Bcrypt算法随便找个网页生成个密码使用账号:密码添加到 htpasswd 文件中,例如 test:$2a$10$0xPGVnpcdxcfmFxtWyWDx./TRtm/W/gSzib/jck3w.sF9x.Ur8t8W\n max_users: -1\n\n\ni18n:\n web: zh-CN\n\n# notify: # 配置 Webhook 推送到钉钉,记得修改 access_token 和 atMobiles\n# method: POST\n# headers: [{ \"Content-Type\": \"application/json\" }]\n# endpoint: https://oapi.dingtalk.com/robot/send?access_token=xxxx\n# content: '{\"msgtype\":\"text\", \"at\": {\"atMobiles\": [\"13000000000\"] }, \"text\":{\"content\":\"NPM 发布新包:\\n > 包名称:{{name}} \\n > 版本号:{{#each versions}}{{version}}{{/each}} \\n > 发布者:{{publisher.name}} \"}}'\n\nuplinks:\n npmjs:\n url: https://registry.npmjs.org/\n yarn:\n url: https://registry.yarnpkg.com/\n timeout: 10s\n taobao:\n url: https://registry.npmmirror.com/\n timeout: 10s\n\npackages:\n \"@*/*\":\n # 可访问权限web界面看不见不登陆也无法 install 包\n access: $authenticated # $all\n # 发布权限, $authenticated 表示只有通过验证的人\n publish: $authenticated\n # 可取消发布权限\n unpublish: $authenticated\n # 包不存在时的代理\n proxy: npmjs yarn taobao\n \"**\":\n access: $authenticated # $all\n publish: $authenticated\n unpublish: $authenticated\n proxy: npmjs yarn taobao\n\nmiddlewares:\n audit:\n enabled: true\nlisten: 0.0.0.0:4873\nlog: { type: stdout, format: pretty, level: http }\n```\n\n创建容器环境变量`VERDACCIO_PUBLIC_URL`是静态资源的前缀地址由于nginx挂了`ssl`,如果使用`http`可以不添加\n\n```bash\ndocker run \\\n-p 4873:4873 \\\n--restart=always \\\n--network mozzie.cn-net \\\n--network-alias verdaccio \\\n--env VERDACCIO_PORT=4873 \\\n--env VERDACCIO_PUBLIC_URL=https://npm.mozzie.cn \\\n--ip 172.21.0.196 \\\n--name verdaccio \\\n-v /www/wwwroot/nginx/html/verdaccio/storage:/verdaccio/storage \\\n-v /www/wwwroot/nginx/html/verdaccio/config:/verdaccio/conf \\\n-v /www/wwwroot/nginx/html/verdaccio/plugins:/verdaccio/plugins \\\n-d verdaccio/verdaccio\n```\n\n\n\n配置nginx的反向代理conf注意所在的docker网络使用`container_name`\n\n\n\n```conf\nserver {\n # listen 80;\n listen 443 ssl;\n server_name npm.mozzie.cn;\n ssl_certificate /etc/nginx/ssl/npm.mozzie.cn_bundle.pem;\n ssl_certificate_key /etc/nginx/ssl/npm.mozzie.cn.key;\n gzip on;\n\n location / {\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $host;\n proxy_set_header X-NginX-Proxy true;\n proxy_pass http://verdaccio:4873/;\n proxy_redirect off;\n }\n}\n```\n\n运行添加用户报错因为 `htpasswd`默认创建在宿主机,也就是上面挂载的`/www/wwwroot/nginx/html/verdaccio/storage`目录中\n\n```bash\nnpm adduser --registry https://npm.mozzie.cn/\n```\n\n配置`htpasswd`、`storage` 文件夹权限\n\n```bash\n# 宿主机中执行\ncd /www/wwwroot/nginx/html/verdaccio/storage\ntouch htpasswd\nsudo chown 10001:65533 htpasswd\nsudo chown -R 10001:65533 /www/wwwroot/nginx/html/verdaccio/storage\n```\n\n# verdaccio 用户管理\n\n由于在 `config.yml` 中关闭了可访问权限\n\n```yaml\nauth:\n htpasswd:\n file: /verdaccio/storage/htpasswd\n # 关闭注册手动添加用户默认Bcrypt算法\n max_users: -1\n\npackages:\n \"@*/*\":\n # 可访问权限web界面看不见不登陆也无法 install 包\n access: $authenticated # $all\n # 发布权限, $authenticated 表示只有通过验证的人\n publish: $authenticated\n # 可取消发布权限\n unpublish: $authenticated\n \"**\":\n access: $authenticated\n publish: $authenticated\n unpublish: $authenticated\n```\n\n默认的 `addUser` 策略是 `Bcrypt` 生成密码,随便找个网页生成个密码,使用`账号:密码`添加到 `htpasswd` 文件中,例如 \n\n```bash\ntest:$2a$10$0xPGVnpcdxcfmFxtWyWDx./TRtm/W/gSzib/jck3w.sF9x.Ur8t8W\n```\n\n因此在实际开发中管理员手动给用户创建好账号然后根据用户的包管理工具进行登录例如以 `npm` 为例\n\n```bash\nnpm adduser --registry https://npm.mozzie.cn/\n# 输入 Username: mozzie | Password: xxx | Email: (this IS public) himozzie@foxmail.com\n# 提示登陆成功 Logged in as mozzie on https://npm.mozzie.cn/.\n```\n\n在系统的 `cat ~/.npmrc` 中会增加一行,就可以正常的进行以来的安装了\n\n```bash\n//npm.mozzie.cn/:_authToken=\"Do/wrh5QzsnYaNU4x3ZlVA==\"\n```\n\n# 项目 .npmrc Scope区分\n\n需要指定 `.npmrc` 来区别 `Scope` 的安装地址,例如一个包名为 `@mozzie/hook`,对应的私库为 `https://npm.mozzie.cn/`\n\n```bash\nregistry=http://registry.npm.taobao.org/\n@mozzie:registry=https://npm.mozzie.cn\n# npm拉包的校验\n//https://npm.mozzie.cn/:_authToken=xxxxxxxxxxxxx\n```","source":"_posts/front-end/verdaccio.md","raw":"---\ntitle: verdaccio 搭建 npm私库\ncategories:\n - Front-End\nstatus: done\n---\n\n# 使用 docker 搭建 verdaccio\n\n创建 & 配置`config.yaml`文件\n\n```yaml\n# Read about the best practices\n# https://verdaccio.org/docs/best\n\n# path to a directory with all packages\nstorage: /verdaccio/storage/data\n# path to a directory with plugins to include\nplugins: /verdaccio/plugins\n\n# 包体积上限默认10mb\nmax_body_size: 1024mb\n\n\nweb:\n enable: true\n title: Mozzie-NPM\n # gravatar: false\n # login: true\n pkgManagers:\n - npm\n - yarn\n - pnpm\n html_cache: true\n showFooter: false\n\nauth:\n htpasswd:\n file: /verdaccio/storage/htpasswd\n # 关闭注册手动添加用户默认Bcrypt算法随便找个网页生成个密码使用账号:密码添加到 htpasswd 文件中,例如 test:$2a$10$0xPGVnpcdxcfmFxtWyWDx./TRtm/W/gSzib/jck3w.sF9x.Ur8t8W\n max_users: -1\n\n\ni18n:\n web: zh-CN\n\n# notify: # 配置 Webhook 推送到钉钉,记得修改 access_token 和 atMobiles\n# method: POST\n# headers: [{ \"Content-Type\": \"application/json\" }]\n# endpoint: https://oapi.dingtalk.com/robot/send?access_token=xxxx\n# content: '{\"msgtype\":\"text\", \"at\": {\"atMobiles\": [\"13000000000\"] }, \"text\":{\"content\":\"NPM 发布新包:\\n > 包名称:{{name}} \\n > 版本号:{{#each versions}}{{version}}{{/each}} \\n > 发布者:{{publisher.name}} \"}}'\n\nuplinks:\n npmjs:\n url: https://registry.npmjs.org/\n yarn:\n url: https://registry.yarnpkg.com/\n timeout: 10s\n taobao:\n url: https://registry.npmmirror.com/\n timeout: 10s\n\npackages:\n \"@*/*\":\n # 可访问权限web界面看不见不登陆也无法 install 包\n access: $authenticated # $all\n # 发布权限, $authenticated 表示只有通过验证的人\n publish: $authenticated\n # 可取消发布权限\n unpublish: $authenticated\n # 包不存在时的代理\n proxy: npmjs yarn taobao\n \"**\":\n access: $authenticated # $all\n publish: $authenticated\n unpublish: $authenticated\n proxy: npmjs yarn taobao\n\nmiddlewares:\n audit:\n enabled: true\nlisten: 0.0.0.0:4873\nlog: { type: stdout, format: pretty, level: http }\n```\n\n创建容器环境变量`VERDACCIO_PUBLIC_URL`是静态资源的前缀地址由于nginx挂了`ssl`,如果使用`http`可以不添加\n\n```bash\ndocker run \\\n-p 4873:4873 \\\n--restart=always \\\n--network mozzie.cn-net \\\n--network-alias verdaccio \\\n--env VERDACCIO_PORT=4873 \\\n--env VERDACCIO_PUBLIC_URL=https://npm.mozzie.cn \\\n--ip 172.21.0.196 \\\n--name verdaccio \\\n-v /www/wwwroot/nginx/html/verdaccio/storage:/verdaccio/storage \\\n-v /www/wwwroot/nginx/html/verdaccio/config:/verdaccio/conf \\\n-v /www/wwwroot/nginx/html/verdaccio/plugins:/verdaccio/plugins \\\n-d verdaccio/verdaccio\n```\n\n\n\n配置nginx的反向代理conf注意所在的docker网络使用`container_name`\n\n\n\n```conf\nserver {\n # listen 80;\n listen 443 ssl;\n server_name npm.mozzie.cn;\n ssl_certificate /etc/nginx/ssl/npm.mozzie.cn_bundle.pem;\n ssl_certificate_key /etc/nginx/ssl/npm.mozzie.cn.key;\n gzip on;\n\n location / {\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $host;\n proxy_set_header X-NginX-Proxy true;\n proxy_pass http://verdaccio:4873/;\n proxy_redirect off;\n }\n}\n```\n\n运行添加用户报错因为 `htpasswd`默认创建在宿主机,也就是上面挂载的`/www/wwwroot/nginx/html/verdaccio/storage`目录中\n\n```bash\nnpm adduser --registry https://npm.mozzie.cn/\n```\n\n配置`htpasswd`、`storage` 文件夹权限\n\n```bash\n# 宿主机中执行\ncd /www/wwwroot/nginx/html/verdaccio/storage\ntouch htpasswd\nsudo chown 10001:65533 htpasswd\nsudo chown -R 10001:65533 /www/wwwroot/nginx/html/verdaccio/storage\n```\n\n# verdaccio 用户管理\n\n由于在 `config.yml` 中关闭了可访问权限\n\n```yaml\nauth:\n htpasswd:\n file: /verdaccio/storage/htpasswd\n # 关闭注册手动添加用户默认Bcrypt算法\n max_users: -1\n\npackages:\n \"@*/*\":\n # 可访问权限web界面看不见不登陆也无法 install 包\n access: $authenticated # $all\n # 发布权限, $authenticated 表示只有通过验证的人\n publish: $authenticated\n # 可取消发布权限\n unpublish: $authenticated\n \"**\":\n access: $authenticated\n publish: $authenticated\n unpublish: $authenticated\n```\n\n默认的 `addUser` 策略是 `Bcrypt` 生成密码,随便找个网页生成个密码,使用`账号:密码`添加到 `htpasswd` 文件中,例如 \n\n```bash\ntest:$2a$10$0xPGVnpcdxcfmFxtWyWDx./TRtm/W/gSzib/jck3w.sF9x.Ur8t8W\n```\n\n因此在实际开发中管理员手动给用户创建好账号然后根据用户的包管理工具进行登录例如以 `npm` 为例\n\n```bash\nnpm adduser --registry https://npm.mozzie.cn/\n# 输入 Username: mozzie | Password: xxx | Email: (this IS public) himozzie@foxmail.com\n# 提示登陆成功 Logged in as mozzie on https://npm.mozzie.cn/.\n```\n\n在系统的 `cat ~/.npmrc` 中会增加一行,就可以正常的进行以来的安装了\n\n```bash\n//npm.mozzie.cn/:_authToken=\"Do/wrh5QzsnYaNU4x3ZlVA==\"\n```\n\n# 项目 .npmrc Scope区分\n\n需要指定 `.npmrc` 来区别 `Scope` 的安装地址,例如一个包名为 `@mozzie/hook`,对应的私库为 `https://npm.mozzie.cn/`\n\n```bash\nregistry=http://registry.npm.taobao.org/\n@mozzie:registry=https://npm.mozzie.cn\n# npm拉包的校验\n//https://npm.mozzie.cn/:_authToken=xxxxxxxxxxxxx\n```","slug":"front-end/verdaccio","published":1,"date":"2023-10-20T02:25:55.131Z","updated":"2023-10-20T02:27:35.158Z","comments":1,"layout":"post","photos":[],"link":"","_id":"clnxzqxd00003icz3dv7zf2xa","content":"<h1 id=\"使用-docker-搭建-verdaccio\"><a href=\"#使用-docker-搭建-verdaccio\" class=\"headerlink\" title=\"使用 docker 搭建 verdaccio\"></a>使用 docker 搭建 verdaccio</h1><p>创建 &amp; 配置<code>config.yaml</code>文件</p>\n<pre class=\"line-numbers language-yaml\" data-language=\"yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># Read about the best practices</span>\n<span class=\"token comment\"># https://verdaccio.org/docs/best</span>\n\n<span class=\"token comment\"># path to a directory with all packages</span>\n<span class=\"token key atrule\">storage</span><span class=\"token punctuation\">:</span> /verdaccio/storage/data\n<span class=\"token comment\"># path to a directory with plugins to include</span>\n<span class=\"token key atrule\">plugins</span><span class=\"token punctuation\">:</span> /verdaccio/plugins\n\n<span class=\"token comment\"># 包体积上限默认10mb</span>\n<span class=\"token key atrule\">max_body_size</span><span class=\"token punctuation\">:</span> 1024mb\n\n\n<span class=\"token key atrule\">web</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">enable</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span>\n <span class=\"token key atrule\">title</span><span class=\"token punctuation\">:</span> Mozzie<span class=\"token punctuation\">-</span>NPM\n <span class=\"token comment\"># gravatar: false</span>\n <span class=\"token comment\"># login: true</span>\n <span class=\"token key atrule\">pkgManagers</span><span class=\"token punctuation\">:</span>\n <span class=\"token punctuation\">-</span> npm\n <span class=\"token punctuation\">-</span> yarn\n <span class=\"token punctuation\">-</span> pnpm\n <span class=\"token key atrule\">html_cache</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span>\n <span class=\"token key atrule\">showFooter</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">false</span>\n\n<span class=\"token key atrule\">auth</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">htpasswd</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">file</span><span class=\"token punctuation\">:</span> /verdaccio/storage/htpasswd\n <span class=\"token comment\"># 关闭注册手动添加用户默认Bcrypt算法随便找个网页生成个密码使用账号:密码添加到 htpasswd 文件中,例如 test:$2a$10$0xPGVnpcdxcfmFxtWyWDx./TRtm/W/gSzib/jck3w.sF9x.Ur8t8W</span>\n <span class=\"token key atrule\">max_users</span><span class=\"token punctuation\">:</span> <span class=\"token number\">-1</span>\n\n\n<span class=\"token key atrule\">i18n</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">web</span><span class=\"token punctuation\">:</span> zh<span class=\"token punctuation\">-</span>CN\n\n<span class=\"token comment\"># notify: # 配置 Webhook 推送到钉钉,记得修改 access_token 和 atMobiles</span>\n<span class=\"token comment\"># method: POST</span>\n<span class=\"token comment\"># headers: [&#123; \"Content-Type\": \"application/json\" &#125;]</span>\n<span class=\"token comment\"># endpoint: https://oapi.dingtalk.com/robot/send?access_token=xxxx</span>\n<span class=\"token comment\"># content: '&#123;\"msgtype\":\"text\", \"at\": &#123;\"atMobiles\": [\"13000000000\"] &#125;, \"text\":&#123;\"content\":\"NPM 发布新包:\\n > 包名称:&#123;&#123;name&#125;&#125; \\n > 版本号:&#123;&#123;#each versions&#125;&#125;&#123;&#123;version&#125;&#125;&#123;&#123;/each&#125;&#125; \\n > 发布者:&#123;&#123;publisher.name&#125;&#125; \"&#125;&#125;'</span>\n\n<span class=\"token key atrule\">uplinks</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">npmjs</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//registry.npmjs.org/\n <span class=\"token key atrule\">yarn</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//registry.yarnpkg.com/\n <span class=\"token key atrule\">timeout</span><span class=\"token punctuation\">:</span> 10s\n <span class=\"token key atrule\">taobao</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//registry.npmmirror.com/\n <span class=\"token key atrule\">timeout</span><span class=\"token punctuation\">:</span> 10s\n\n<span class=\"token key atrule\">packages</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">\"@*/*\"</span><span class=\"token punctuation\">:</span>\n <span class=\"token comment\"># 可访问权限web界面看不见不登陆也无法 install 包</span>\n <span class=\"token key atrule\">access</span><span class=\"token punctuation\">:</span> $authenticated <span class=\"token comment\"># $all</span>\n <span class=\"token comment\"># 发布权限, $authenticated 表示只有通过验证的人</span>\n <span class=\"token key atrule\">publish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token comment\"># 可取消发布权限</span>\n <span class=\"token key atrule\">unpublish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token comment\"># 包不存在时的代理</span>\n <span class=\"token key atrule\">proxy</span><span class=\"token punctuation\">:</span> npmjs yarn taobao\n <span class=\"token key atrule\">\"**\"</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">access</span><span class=\"token punctuation\">:</span> $authenticated <span class=\"token comment\"># $all</span>\n <span class=\"token key atrule\">publish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token key atrule\">unpublish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token key atrule\">proxy</span><span class=\"token punctuation\">:</span> npmjs yarn taobao\n\n<span class=\"token key atrule\">middlewares</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">audit</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">enabled</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span>\n<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>\n<span class=\"token key atrule\">log</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">&#123;</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\">&#125;</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>\n\n<p>创建容器,环境变量,<code>VERDACCIO_PUBLIC_URL</code>是静态资源的前缀地址由于nginx挂了<code>ssl</code>,如果使用<code>http</code>可以不添加</p>\n<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>\n<span class=\"token parameter variable\">-p</span> <span class=\"token number\">4873</span>:4873 <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">--restart</span><span class=\"token operator\">=</span>always <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">--network</span> mozzie.cn-net <span class=\"token punctuation\">\\</span>\n--network-alias verdaccio <span class=\"token punctuation\">\\</span>\n<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>\n<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>\n<span class=\"token parameter variable\">--ip</span> <span class=\"token number\">172.21</span>.0.196 <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">--name</span> verdaccio <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">-v</span> /www/wwwroot/nginx/html/verdaccio/storage:/verdaccio/storage <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">-v</span> /www/wwwroot/nginx/html/verdaccio/config:/verdaccio/conf <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">-v</span> /www/wwwroot/nginx/html/verdaccio/plugins:/verdaccio/plugins <span class=\"token punctuation\">\\</span>\n<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>\n\n\n\n<p>配置nginx的反向代理conf注意所在的docker网络使用<code>container_name</code></p>\n<pre class=\"line-numbers language-conf\" data-language=\"conf\"><code class=\"language-conf\">server &#123;\n # listen 80;\n listen 443 ssl;\n server_name npm.mozzie.cn;\n ssl_certificate &#x2F;etc&#x2F;nginx&#x2F;ssl&#x2F;npm.mozzie.cn_bundle.pem;\n ssl_certificate_key &#x2F;etc&#x2F;nginx&#x2F;ssl&#x2F;npm.mozzie.cn.key;\n gzip on;\n\n location &#x2F; &#123;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $host;\n proxy_set_header X-NginX-Proxy true;\n proxy_pass http:&#x2F;&#x2F;verdaccio:4873&#x2F;;\n proxy_redirect off;\n &#125;\n&#125;<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>\n\n<p>运行添加用户,报错,因为 <code>htpasswd</code>默认创建在宿主机,也就是上面挂载的<code>/www/wwwroot/nginx/html/verdaccio/storage</code>目录中</p>\n<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>\n\n<p>配置<code>htpasswd</code>、<code>storage</code> 文件夹权限</p>\n<pre class=\"line-numbers language-bash\" data-language=\"bash\"><code class=\"language-bash\"><span class=\"token comment\"># 宿主机中执行</span>\n<span class=\"token builtin class-name\">cd</span> /www/wwwroot/nginx/html/verdaccio/storage\n<span class=\"token function\">touch</span> htpasswd\n<span class=\"token function\">sudo</span> <span class=\"token function\">chown</span> <span class=\"token number\">10001</span>:65533 htpasswd\n<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>\n\n<h1 id=\"verdaccio-用户管理\"><a href=\"#verdaccio-用户管理\" class=\"headerlink\" title=\"verdaccio 用户管理\"></a>verdaccio 用户管理</h1><p>由于在 <code>config.yml</code> 中关闭了可访问权限</p>\n<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>\n <span class=\"token key atrule\">htpasswd</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">file</span><span class=\"token punctuation\">:</span> /verdaccio/storage/htpasswd\n <span class=\"token comment\"># 关闭注册手动添加用户默认Bcrypt算法</span>\n <span class=\"token key atrule\">max_users</span><span class=\"token punctuation\">:</span> <span class=\"token number\">-1</span>\n\n<span class=\"token key atrule\">packages</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">\"@*/*\"</span><span class=\"token punctuation\">:</span>\n <span class=\"token comment\"># 可访问权限web界面看不见不登陆也无法 install 包</span>\n <span class=\"token key atrule\">access</span><span class=\"token punctuation\">:</span> $authenticated <span class=\"token comment\"># $all</span>\n <span class=\"token comment\"># 发布权限, $authenticated 表示只有通过验证的人</span>\n <span class=\"token key atrule\">publish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token comment\"># 可取消发布权限</span>\n <span class=\"token key atrule\">unpublish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token key atrule\">\"**\"</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">access</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token key atrule\">publish</span><span class=\"token punctuation\">:</span> $authenticated\n <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>\n\n<p>默认的 <code>addUser</code> 策略是 <code>Bcrypt</code> 生成密码,随便找个网页生成个密码,使用<code>账号:密码</code>添加到 <code>htpasswd</code> 文件中,例如 </p>\n<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>\n\n<p>因此在实际开发中,管理员手动给用户创建好账号,然后根据用户的包管理工具,进行登录,例如以 <code>npm</code> 为例</p>\n<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/\n<span class=\"token comment\"># 输入 Username: mozzie | Password: xxx | Email: (this IS public) himozzie@foxmail.com</span>\n<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>\n\n<p>在系统的 <code>cat ~/.npmrc</code> 中会增加一行,就可以正常的进行以来的安装了</p>\n<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>\n\n<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>\n<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/\n@mozzie:registry<span class=\"token operator\">=</span>https://npm.mozzie.cn\n<span class=\"token comment\"># npm拉包的校验</span>\n//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>","site":{"data":{}},"excerpt":"","more":"<h1 id=\"使用-docker-搭建-verdaccio\"><a href=\"#使用-docker-搭建-verdaccio\" class=\"headerlink\" title=\"使用 docker 搭建 verdaccio\"></a>使用 docker 搭建 verdaccio</h1><p>创建 &amp; 配置<code>config.yaml</code>文件</p>\n<pre class=\"line-numbers language-yaml\" data-language=\"yaml\"><code class=\"language-yaml\"><span class=\"token comment\"># Read about the best practices</span>\n<span class=\"token comment\"># https://verdaccio.org/docs/best</span>\n\n<span class=\"token comment\"># path to a directory with all packages</span>\n<span class=\"token key atrule\">storage</span><span class=\"token punctuation\">:</span> /verdaccio/storage/data\n<span class=\"token comment\"># path to a directory with plugins to include</span>\n<span class=\"token key atrule\">plugins</span><span class=\"token punctuation\">:</span> /verdaccio/plugins\n\n<span class=\"token comment\"># 包体积上限默认10mb</span>\n<span class=\"token key atrule\">max_body_size</span><span class=\"token punctuation\">:</span> 1024mb\n\n\n<span class=\"token key atrule\">web</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">enable</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span>\n <span class=\"token key atrule\">title</span><span class=\"token punctuation\">:</span> Mozzie<span class=\"token punctuation\">-</span>NPM\n <span class=\"token comment\"># gravatar: false</span>\n <span class=\"token comment\"># login: true</span>\n <span class=\"token key atrule\">pkgManagers</span><span class=\"token punctuation\">:</span>\n <span class=\"token punctuation\">-</span> npm\n <span class=\"token punctuation\">-</span> yarn\n <span class=\"token punctuation\">-</span> pnpm\n <span class=\"token key atrule\">html_cache</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span>\n <span class=\"token key atrule\">showFooter</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">false</span>\n\n<span class=\"token key atrule\">auth</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">htpasswd</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">file</span><span class=\"token punctuation\">:</span> /verdaccio/storage/htpasswd\n <span class=\"token comment\"># 关闭注册手动添加用户默认Bcrypt算法随便找个网页生成个密码使用账号:密码添加到 htpasswd 文件中,例如 test:$2a$10$0xPGVnpcdxcfmFxtWyWDx./TRtm/W/gSzib/jck3w.sF9x.Ur8t8W</span>\n <span class=\"token key atrule\">max_users</span><span class=\"token punctuation\">:</span> <span class=\"token number\">-1</span>\n\n\n<span class=\"token key atrule\">i18n</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">web</span><span class=\"token punctuation\">:</span> zh<span class=\"token punctuation\">-</span>CN\n\n<span class=\"token comment\"># notify: # 配置 Webhook 推送到钉钉,记得修改 access_token 和 atMobiles</span>\n<span class=\"token comment\"># method: POST</span>\n<span class=\"token comment\"># headers: [&#123; \"Content-Type\": \"application/json\" &#125;]</span>\n<span class=\"token comment\"># endpoint: https://oapi.dingtalk.com/robot/send?access_token=xxxx</span>\n<span class=\"token comment\"># content: '&#123;\"msgtype\":\"text\", \"at\": &#123;\"atMobiles\": [\"13000000000\"] &#125;, \"text\":&#123;\"content\":\"NPM 发布新包:\\n > 包名称:&#123;&#123;name&#125;&#125; \\n > 版本号:&#123;&#123;#each versions&#125;&#125;&#123;&#123;version&#125;&#125;&#123;&#123;/each&#125;&#125; \\n > 发布者:&#123;&#123;publisher.name&#125;&#125; \"&#125;&#125;'</span>\n\n<span class=\"token key atrule\">uplinks</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">npmjs</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//registry.npmjs.org/\n <span class=\"token key atrule\">yarn</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//registry.yarnpkg.com/\n <span class=\"token key atrule\">timeout</span><span class=\"token punctuation\">:</span> 10s\n <span class=\"token key atrule\">taobao</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//registry.npmmirror.com/\n <span class=\"token key atrule\">timeout</span><span class=\"token punctuation\">:</span> 10s\n\n<span class=\"token key atrule\">packages</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">\"@*/*\"</span><span class=\"token punctuation\">:</span>\n <span class=\"token comment\"># 可访问权限web界面看不见不登陆也无法 install 包</span>\n <span class=\"token key atrule\">access</span><span class=\"token punctuation\">:</span> $authenticated <span class=\"token comment\"># $all</span>\n <span class=\"token comment\"># 发布权限, $authenticated 表示只有通过验证的人</span>\n <span class=\"token key atrule\">publish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token comment\"># 可取消发布权限</span>\n <span class=\"token key atrule\">unpublish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token comment\"># 包不存在时的代理</span>\n <span class=\"token key atrule\">proxy</span><span class=\"token punctuation\">:</span> npmjs yarn taobao\n <span class=\"token key atrule\">\"**\"</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">access</span><span class=\"token punctuation\">:</span> $authenticated <span class=\"token comment\"># $all</span>\n <span class=\"token key atrule\">publish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token key atrule\">unpublish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token key atrule\">proxy</span><span class=\"token punctuation\">:</span> npmjs yarn taobao\n\n<span class=\"token key atrule\">middlewares</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">audit</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">enabled</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span>\n<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>\n<span class=\"token key atrule\">log</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">&#123;</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\">&#125;</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>\n\n<p>创建容器,环境变量,<code>VERDACCIO_PUBLIC_URL</code>是静态资源的前缀地址由于nginx挂了<code>ssl</code>,如果使用<code>http</code>可以不添加</p>\n<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>\n<span class=\"token parameter variable\">-p</span> <span class=\"token number\">4873</span>:4873 <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">--restart</span><span class=\"token operator\">=</span>always <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">--network</span> mozzie.cn-net <span class=\"token punctuation\">\\</span>\n--network-alias verdaccio <span class=\"token punctuation\">\\</span>\n<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>\n<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>\n<span class=\"token parameter variable\">--ip</span> <span class=\"token number\">172.21</span>.0.196 <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">--name</span> verdaccio <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">-v</span> /www/wwwroot/nginx/html/verdaccio/storage:/verdaccio/storage <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">-v</span> /www/wwwroot/nginx/html/verdaccio/config:/verdaccio/conf <span class=\"token punctuation\">\\</span>\n<span class=\"token parameter variable\">-v</span> /www/wwwroot/nginx/html/verdaccio/plugins:/verdaccio/plugins <span class=\"token punctuation\">\\</span>\n<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>\n\n\n\n<p>配置nginx的反向代理conf注意所在的docker网络使用<code>container_name</code></p>\n<pre class=\"line-numbers language-conf\" data-language=\"conf\"><code class=\"language-conf\">server &#123;\n # listen 80;\n listen 443 ssl;\n server_name npm.mozzie.cn;\n ssl_certificate &#x2F;etc&#x2F;nginx&#x2F;ssl&#x2F;npm.mozzie.cn_bundle.pem;\n ssl_certificate_key &#x2F;etc&#x2F;nginx&#x2F;ssl&#x2F;npm.mozzie.cn.key;\n gzip on;\n\n location &#x2F; &#123;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $host;\n proxy_set_header X-NginX-Proxy true;\n proxy_pass http:&#x2F;&#x2F;verdaccio:4873&#x2F;;\n proxy_redirect off;\n &#125;\n&#125;<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>\n\n<p>运行添加用户,报错,因为 <code>htpasswd</code>默认创建在宿主机,也就是上面挂载的<code>/www/wwwroot/nginx/html/verdaccio/storage</code>目录中</p>\n<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>\n\n<p>配置<code>htpasswd</code>、<code>storage</code> 文件夹权限</p>\n<pre class=\"line-numbers language-bash\" data-language=\"bash\"><code class=\"language-bash\"><span class=\"token comment\"># 宿主机中执行</span>\n<span class=\"token builtin class-name\">cd</span> /www/wwwroot/nginx/html/verdaccio/storage\n<span class=\"token function\">touch</span> htpasswd\n<span class=\"token function\">sudo</span> <span class=\"token function\">chown</span> <span class=\"token number\">10001</span>:65533 htpasswd\n<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>\n\n<h1 id=\"verdaccio-用户管理\"><a href=\"#verdaccio-用户管理\" class=\"headerlink\" title=\"verdaccio 用户管理\"></a>verdaccio 用户管理</h1><p>由于在 <code>config.yml</code> 中关闭了可访问权限</p>\n<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>\n <span class=\"token key atrule\">htpasswd</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">file</span><span class=\"token punctuation\">:</span> /verdaccio/storage/htpasswd\n <span class=\"token comment\"># 关闭注册手动添加用户默认Bcrypt算法</span>\n <span class=\"token key atrule\">max_users</span><span class=\"token punctuation\">:</span> <span class=\"token number\">-1</span>\n\n<span class=\"token key atrule\">packages</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">\"@*/*\"</span><span class=\"token punctuation\">:</span>\n <span class=\"token comment\"># 可访问权限web界面看不见不登陆也无法 install 包</span>\n <span class=\"token key atrule\">access</span><span class=\"token punctuation\">:</span> $authenticated <span class=\"token comment\"># $all</span>\n <span class=\"token comment\"># 发布权限, $authenticated 表示只有通过验证的人</span>\n <span class=\"token key atrule\">publish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token comment\"># 可取消发布权限</span>\n <span class=\"token key atrule\">unpublish</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token key atrule\">\"**\"</span><span class=\"token punctuation\">:</span>\n <span class=\"token key atrule\">access</span><span class=\"token punctuation\">:</span> $authenticated\n <span class=\"token key atrule\">publish</span><span class=\"token punctuation\">:</span> $authenticated\n <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>\n\n<p>默认的 <code>addUser</code> 策略是 <code>Bcrypt</code> 生成密码,随便找个网页生成个密码,使用<code>账号:密码</code>添加到 <code>htpasswd</code> 文件中,例如 </p>\n<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>\n\n<p>因此在实际开发中,管理员手动给用户创建好账号,然后根据用户的包管理工具,进行登录,例如以 <code>npm</code> 为例</p>\n<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/\n<span class=\"token comment\"># 输入 Username: mozzie | Password: xxx | Email: (this IS public) himozzie@foxmail.com</span>\n<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>\n\n<p>在系统的 <code>cat ~/.npmrc</code> 中会增加一行,就可以正常的进行以来的安装了</p>\n<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>\n\n<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>\n<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/\n@mozzie:registry<span class=\"token operator\">=</span>https://npm.mozzie.cn\n<span class=\"token comment\"># npm拉包的校验</span>\n//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>"}],"PostAsset":[],"PostCategory":[{"post_id":"clnxzqxcw0000icz36pi62i4o","category_id":"clnxzqxcz0002icz38evkcka4","_id":"clnxzqxd30006icz30v0fgb8p"},{"post_id":"clnxzqxcy0001icz3a7cadi3r","category_id":"clnxzqxcz0002icz38evkcka4","_id":"clnxzqxd30007icz38a3k9tor"},{"post_id":"clnxzqxd00003icz3dv7zf2xa","category_id":"clnxzqxd20005icz3byqj3j9e","_id":"clnxzqxd30008icz311vg8ons"}],"PostTag":[],"Tag":[]}}