* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations what-is-verdaccio.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations what-is-verdaccio.md (Chinese Simplified)
docs(website): new translations
* New translations windows.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Spanish)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Portuguese, Brazilian)
docs(website): new translations
* New translations config.md (Spanish)
docs(website): new translations
* New translations web.md (Portuguese, Brazilian)
docs(website): new translations
* New translations web.md (Spanish)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Portuguese, Brazilian)
docs(website): new translations
* New translations web.md (Chinese Simplified)
docs(website): new translations
* New translations install.md (Chinese Simplified)
docs(website): new translations
* New translations node-api.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations web.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations plugins.md (Portuguese, Brazilian)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations ansible.md (Polish)
docs(website): new translations
* New translations repositories.md (Polish)
docs(website): new translations
* New translations chef.md (Polish)
docs(website): new translations
* New translations puppet.md (Polish)
docs(website): new translations
* New translations ci.md (Polish)
docs(website): new translations
* New translations what-is-verdaccio.md (Polish)
docs(website): new translations
* New translations node-api.md (Polish)
docs(website): new translations
* New translations windows.md (Polish)
docs(website): new translations
* New translations web.md (Polish)
docs(website): new translations
* New translations use-cases.md (Polish)
docs(website): new translations
* New translations uplinks.md (Polish)
docs(website): new translations
* New translations test.md (Polish)
docs(website): new translations
* New translations ssl.md (Polish)
docs(website): new translations
* New translations server.md (Polish)
docs(website): new translations
* New translations reverse-proxy.md (Polish)
docs(website): new translations
* New translations protect-your-dependencies.md (Polish)
docs(website): new translations
* New translations auth.md (Polish)
docs(website): new translations
* New translations plugins.md (Polish)
docs(website): new translations
* New translations packages.md (Polish)
docs(website): new translations
* New translations notifications.md (Polish)
docs(website): new translations
* New translations logger.md (Polish)
docs(website): new translations
* New translations kubernetes.md (Polish)
docs(website): new translations
* New translations install.md (Polish)
docs(website): new translations
* New translations iis-server.md (Polish)
docs(website): new translations
* New translations docker.md (Polish)
docs(website): new translations
* New translations dev-plugins.md (Polish)
docs(website): new translations
* New translations contributing.md (Polish)
docs(website): new translations
* New translations config.md (Polish)
docs(website): new translations
* New translations cli.md (Polish)
docs(website): new translations
* New translations build.md (Polish)
docs(website): new translations
* New translations en.json (Polish)
docs(website): new translations
If you're using this registry for a specific module scope, specify that scope to set it in the webui instructions header e.g. npm set @coolsp:registry http://localhost:4873.
Added as webui.scope option in .yaml.
> Note: in .yaml, escape @ with \\@.
See also feature request #593.
Corrected typo myscopy --> myscope
If you're using this registry for a specific module scope, specify that scope to set it in the webui instructions header e.g. npm set @coolsp:registry http://localhost:4873.
Added as webui.scope option in .yaml.
> Note: in .yaml, escape @ with \\@.
See also feature request #593.
Removed changes to website/translated_docs and website/versioned_docs
And update docs/web.md and config.md
* New translations use-cases.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations what-is-verdaccio.md (Chinese Simplified)
docs(website): new translations
* New translations what-is-verdaccio.md (Chinese Simplified)
docs(website): new translations
* New translations what-is-verdaccio.md (Chinese Simplified)
docs(website): new translations
* New translations windows.md (Chinese Simplified)
docs(website): new translations
* New translations what-is-verdaccio.md (Chinese Simplified)
docs(website): new translations
* New translations windows.md (Chinese Simplified)
docs(website): new translations
* New translations windows.md (Chinese Simplified)
docs(website): new translations
* New translations windows.md (Chinese Simplified)
docs(website): new translations
* New translations windows.md (Chinese Simplified)
docs(website): new translations
* New translations en.json (Chinese Simplified)
docs(website): new translations
* New translations en.json (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations en.json (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations what-is-verdaccio.md (Chinese Simplified)
docs(website): new translations
* New translations what-is-verdaccio.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
If you're using this registry for a specific module scope, specify that scope to set it in the webui instructions header e.g. npm set @coolsp:registry http://localhost:4873.
Added as webui.scope option in .yaml.
> Note: in .yaml, escape @ with \\@.
See also feature request #593.
Update unit test for added scope
If you're using this registry for a specific module scope, specify that scope to set it in the webui instructions header e.g. npm set @coolsp:registry http://localhost:4873.
Added as webui.scope option in .yaml.
> Note: in .yaml, escape @ with \\@.
See also feature request #593.
Unpublishing a specific module version does not remove that version from the local-storage (package.json) "time" object.
This results in the version still being shown in the webui right-pane "Last Sync".
Added delete of the time[ver] object when module version is removed.
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations uplinks.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations test.md (Chinese Simplified)
docs(website): new translations
* New translations use-cases.md (Chinese Simplified)
docs(website): new translations
* New translations use-cases.md (Chinese Simplified)
docs(website): new translations
* New translations use-cases.md (Chinese Simplified)
docs(website): new translations
* New translations use-cases.md (Chinese Simplified)
docs(website): new translations
* New translations use-cases.md (Chinese Simplified)
docs(website): new translations
* New translations use-cases.md (Chinese Simplified)
docs(website): new translations
* New translations use-cases.md (Chinese Simplified)
docs(website): new translations
* New translations web.md (Chinese Simplified)
docs(website): new translations
* New translations web.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations en.json (Portuguese, Brazilian)
docs(website): new translations
* New translations web.md (Portuguese, Brazilian)
docs(website): new translations
* New translations install.md (Spanish)
docs(website): new translations
* New translations en.json (Spanish)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations web.md (Spanish)
docs(website): new translations
* New translations plugins.md (Portuguese, Brazilian)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations install.md (Chinese Simplified)
docs(website): new translations
* New translations install.md (Portuguese, Brazilian)
docs(website): new translations
* New translations dev-plugins.md (Portuguese, Brazilian)
docs(website): new translations
* New translations en.json (Chinese Simplified)
docs(website): new translations
* New translations web.md (Chinese Simplified)
docs(website): new translations
* New translations protect-your-dependencies.md (Chinese Simplified)
docs(website): new translations
* New translations protect-your-dependencies.md (Chinese Simplified)
docs(website): new translations
* New translations protect-your-dependencies.md (Chinese Simplified)
docs(website): new translations
* New translations repositories.md (Chinese Simplified)
docs(website): new translations
* New translations reverse-proxy.md (Chinese Simplified)
docs(website): new translations
* New translations reverse-proxy.md (Chinese Simplified)
docs(website): new translations
* New translations reverse-proxy.md (Chinese Simplified)
docs(website): new translations
* New translations server.md (Chinese Simplified)
docs(website): new translations
* New translations server.md (Chinese Simplified)
docs(website): new translations
* New translations server.md (Chinese Simplified)
docs(website): new translations
* New translations server.md (Chinese Simplified)
docs(website): new translations
* New translations ssl.md (Chinese Simplified)
docs(website): new translations
* New translations ssl.md (Chinese Simplified)
docs(website): new translations
* New translations protect-your-dependencies.md (Chinese Simplified)
docs(website): new translations
* New translations ssl.md (Chinese Simplified)
docs(website): new translations
* New translations protect-your-dependencies.md (Chinese Simplified)
docs(website): new translations
* New translations repositories.md (Chinese Simplified)
docs(website): new translations
* New translations reverse-proxy.md (Chinese Simplified)
docs(website): new translations
* New translations reverse-proxy.md (Chinese Simplified)
docs(website): new translations
* New translations server.md (Chinese Simplified)
docs(website): new translations
* New translations ssl.md (Chinese Simplified)
docs(website): new translations
* New translations protect-your-dependencies.md (Chinese Simplified)
docs(website): new translations
* New translations reverse-proxy.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Spanish)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Portuguese, Brazilian)
docs(website): new translations
* New translations logger.md (Chinese Simplified)
docs(website): new translations
* New translations notifications.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Spanish)
docs(website): new translations
* New translations config.md (Spanish)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Portuguese, Brazilian)
docs(website): new translations
* New translations config.md (Portuguese, Brazilian)
docs(website): new translations
* New translations web.md (Portuguese, Brazilian)
docs(website): new translations
* New translations web.md (Spanish)
docs(website): new translations
* New translations web.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations plugins.md (Portuguese, Brazilian)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations install.md (Chinese Simplified)
docs(website): new translations
* New translations install.md (Chinese Simplified)
docs(website): new translations
* New translations install.md (Chinese Simplified)
docs(website): new translations
* New translations kubernetes.md (Chinese Simplified)
docs(website): new translations
* New translations kubernetes.md (Chinese Simplified)
docs(website): new translations
* New translations kubernetes.md (Chinese Simplified)
docs(website): new translations
* New translations kubernetes.md (Chinese Simplified)
docs(website): new translations
* New translations logger.md (Chinese Simplified)
docs(website): new translations
* New translations logger.md (Chinese Simplified)
docs(website): new translations
* New translations node-api.md (Chinese Simplified)
docs(website): new translations
* New translations notifications.md (Chinese Simplified)
docs(website): new translations
* New translations node-api.md (Chinese Simplified)
docs(website): new translations
* New translations notifications.md (Chinese Simplified)
docs(website): new translations
* New translations notifications.md (Chinese Simplified)
docs(website): new translations
* New translations notifications.md (Chinese Simplified)
docs(website): new translations
* New translations notifications.md (Chinese Simplified)
docs(website): new translations
* New translations node-api.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations install.md (Chinese Simplified)
docs(website): new translations
* New translations kubernetes.md (Chinese Simplified)
docs(website): new translations
* New translations kubernetes.md (Chinese Simplified)
docs(website): new translations
* New translations kubernetes.md (Chinese Simplified)
docs(website): new translations
* New translations logger.md (Chinese Simplified)
docs(website): new translations
* New translations notifications.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations puppet.md (Chinese Simplified)
docs(website): new translations
* New translations puppet.md (Chinese Simplified)
docs(website): new translations
* New translations puppet.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations plugins.md (Portuguese, Brazilian)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations server.md (Spanish)
docs(website): new translations
* New translations server.md (Spanish)
docs(website): new translations
* New translations puppet.md (Spanish)
docs(website): new translations
* New translations ansible.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations build.md (Chinese Simplified)
docs(website): new translations
* New translations build.md (Chinese Simplified)
docs(website): new translations
* New translations chef.md (Chinese Simplified)
docs(website): new translations
* New translations chef.md (Chinese Simplified)
docs(website): new translations
* New translations ci.md (Chinese Simplified)
docs(website): new translations
* New translations chef.md (Chinese Simplified)
docs(website): new translations
* New translations cli.md (Chinese Simplified)
docs(website): new translations
* New translations ci.md (Chinese Simplified)
docs(website): new translations
* New translations cli.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations ansible.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations cli.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations cli.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations ansible.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations build.md (Chinese Simplified)
docs(website): new translations
* New translations ci.md (Chinese Simplified)
docs(website): new translations
* New translations chef.md (Chinese Simplified)
docs(website): new translations
* New translations cli.md (Chinese Simplified)
docs(website): new translations
* New translations ci.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations cli.md (Chinese Simplified)
docs(website): new translations
* New translations ci.md (Chinese Simplified)
docs(website): new translations
* New translations chef.md (Chinese Simplified)
docs(website): new translations
* New translations cli.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations chef.md (Chinese Simplified)
docs(website): new translations
* New translations config.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations iis-server.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations dev-plugins.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations docker.md (Chinese Simplified)
docs(website): new translations
refactor: updates let to const in generateBanner module
refactor: adds getPackageJson module to get vlues from package.json
refactor: adds jsdoc comments in getPackageJson module
* New translations ansible.md (Chinese Simplified)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations build.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations ci.md (Chinese Simplified)
docs(website): new translations
* New translations chef.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations ansible.md (Chinese Simplified)
docs(website): new translations
* New translations ci.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations notifications.md (Spanish)
docs(website): new translations
* New translations auth.md (Chinese Simplified)
docs(website): new translations
* New translations contributing.md (Chinese Simplified)
docs(website): new translations
* New translations build.md (Chinese Simplified)
docs(website): new translations
* New translations chef.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations packages.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations plugins.md (Chinese Simplified)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations use-cases.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations puppet.md (Spanish)
docs(website): new translations
* New translations puppet.md (Spanish)
docs(website): new translations
* New translations packages.md (Spanish)
docs(website): new translations
* New translations test.md (Spanish)
docs(website): new translations
* New translations use-cases.md (Spanish)
docs(website): new translations
* New translations server.md (Spanish)
docs(website): new translations
* New translations use-cases.md (Spanish)
docs(website): new translations
* New translations server.md (Spanish)
docs(website): new translations
* New translations server.md (Spanish)
docs(website): new translations
* New translations server.md (Spanish)
docs(website): new translations
* New translations puppet.md (Spanish)
docs(website): new translations
* New translations server.md (Spanish)
docs(website): new translations
* New translations puppet.md (Spanish)
docs(website): new translations
* New translations server.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations uplinks.md (Spanish)
docs(website): new translations
* New translations uplinks.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations docker.md (Spanish)
docs(website): new translations
* New translations reverse-proxy.md (Spanish)
docs(website): new translations
* New translations uplinks.md (Spanish)
docs(website): new translations
* New translations chef.md (Spanish)
docs(website): new translations
* New translations chef.md (Spanish)
docs(website): new translations
* New translations notifications.md (Spanish)
docs(website): new translations
* New translations notifications.md (Spanish)
docs(website): new translations
* New translations notifications.md (Spanish)
docs(website): new translations
* New translations notifications.md (Spanish)
docs(website): new translations
* New translations notifications.md (Spanish)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations chef.md (Spanish)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations ssl.md (Spanish)
docs(website): new translations
* New translations test.md (Spanish)
docs(website): new translations
* New translations test.md (Spanish)
docs(website): new translations
* New translations test.md (Spanish)
docs(website): new translations
* New translations test.md (Spanish)
docs(website): new translations
* New translations test.md (Spanish)
docs(website): new translations
* New translations test.md (Spanish)
docs(website): new translations
* New translations test.md (Spanish)
docs(website): new translations
* New translations test.md (Spanish)
docs(website): new translations
* New translations packages.md (Spanish)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations packages.md (Spanish)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations packages.md (Spanish)
docs(website): new translations
* New translations packages.md (Spanish)
docs(website): new translations
* New translations packages.md (Spanish)
docs(website): new translations
* New translations packages.md (Spanish)
docs(website): new translations
* New translations protect-your-dependencies.md (Spanish)
docs(website): new translations
* New translations uplinks.md (Spanish)
docs(website): new translations
* New translations docker.md (Spanish)
docs(website): new translations
* New translations node-api.md (Spanish)
docs(website): new translations
* New translations protect-your-dependencies.md (Spanish)
docs(website): new translations
* New translations docker.md (Spanish)
docs(website): new translations
* New translations install.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations use-cases.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations use-cases.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations use-cases.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations use-cases.md (Spanish)
docs(website): new translations
* New translations use-cases.md (Spanish)
docs(website): new translations
* New translations use-cases.md (Spanish)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations plugins.md (Spanish)
docs(website): new translations
* New translations repositories.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations install.md (Spanish)
docs(website): new translations
* New translations en.json (Spanish)
docs(website): new translations
* New translations config.md (Spanish)
docs(website): new translations
* New translations config.md (Spanish)
docs(website): new translations
* New translations auth.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations auth.md (Spanish)
docs(website): new translations
* New translations auth.md (Spanish)
docs(website): new translations
* New translations ansible.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations logger.md (Spanish)
docs(website): new translations
* New translations logger.md (Spanish)
docs(website): new translations
* New translations logger.md (Spanish)
docs(website): new translations
* New translations ci.md (Spanish)
docs(website): new translations
* New translations ci.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations config.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations protect-your-dependencies.md (Spanish)
docs(website): new translations
* New translations uplinks.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations protect-your-dependencies.md (Spanish)
docs(website): new translations
* New translations docker.md (Spanish)
docs(website): new translations
* New translations node-api.md (Spanish)
docs(website): new translations
* New translations protect-your-dependencies.md (Spanish)
docs(website): new translations
* New translations docker.md (Spanish)
docs(website): new translations
* New translations docker.md (Spanish)
docs(website): new translations
* New translations install.md (Spanish)
docs(website): new translations
* New translations reverse-proxy.md (Spanish)
docs(website): new translations
* New translations reverse-proxy.md (Spanish)
docs(website): new translations
* New translations ssl.md (Spanish)
docs(website): new translations
* New translations ssl.md (Spanish)
docs(website): new translations
* New translations ssl.md (Spanish)
docs(website): new translations
* New translations ssl.md (Spanish)
docs(website): new translations
* New translations auth.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations config.md (Spanish)
docs(website): new translations
* New translations ci.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations logger.md (Spanish)
docs(website): new translations
* New translations ci.md (Spanish)
docs(website): new translations
* New translations dev-plugins.md (Spanish)
docs(website): new translations
* New translations logger.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations windows.md (Spanish)
docs(website): new translations
* New translations ansible.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations en.json (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations iis-server.md (Spanish)
docs(website): new translations
* New translations en.json (Portuguese, Brazilian)
docs(website): new translations
* New translations en.json (Spanish)
docs(website): new translations
* New translations cli.md (Chinese Simplified)
docs(website): new translations
* New translations cli.md (Spanish)
docs(website): new translations
* New translations en.json (Chinese Simplified)
docs(website): new translations
- Fix test name in spec file
- Use lodash isString and isNill
- Move normalisation of git url into it's own function
- Create a renderSection() function to render links in a more "dry" way
Previously, when XMLHttpRequest was used, cookies ware sent
when getting /-/verdaccio/logo & /-/verdaccio/packages
After switching to fetch in sha fef7ee75e8
cookies are no longer sent.
This commit configures fetch in the webui to send cookies to the same
domain.
> The "same-origin" value makes fetch behave similarly to
> XMLHttpRequest with regards to cookies.
> https://github.com/github/fetch#sending-cookies
It had still file system remaining logic on search, this will force plugin to implement search. Whether plugin do not has such implementation a warning is displayed in the console and search will return remote search results for each endpoint anyway.
I believe the path here is wrong. When I install verdaccio with NPM, that `src` folder does not exist. However, there is a `build` folder with a `cli.js`. When I changed `src` to `build` on my machine, the instructions here worked.
Just saw this while reading your docs:
1. It would be nice to have the default value for optional parameters (but I don't know what the values are and will leave it up to the maintainers to update them in this file).
2. Also fixes a small typo.
- find NPM_TOKEN by default;
- remove parameter true to token_env;
- remove duplicate code to assigns header authorization;
- method created to validate rules of auth;
- define auth type basic or bearer;
- assigns the header get process.env var NPM_TOKEN;
- assigns the header get process.env by set name;
- assigns the header raw token;
Hi,
I had some troubles setting up SSL for my Verdaccio registry because document was not perfectly clear.
I made little improvements on the SSL wiki page by adding a section about Docker (`listen` config entry is ignored because it's already set on Dockerfile), and I also added a link to the Node documentation pointing at more documentation for the `ca`, `cert` and `key` options for the `https` entry on the configuration.
Hi.
I had issues regarding to resources when accessing Verdaccio through Apache proxy.
I found out that removing ending slashes at `ProxyPass` and `ProxyPassReverse` settings solved it.
I also set Verdaccio's config `url_prefix` to match the proxy location.
Hope it helps.
If packages are being published to verdaccio as well as upstream to
npmjs.org, then when the cache is updated from npmjs.org it uses the
dist-tags from the upstream even if the locally published version is
actually newer. This makes it very difficult to use verdaccio as a
staging registry for testing out potential releases.
This change partially reverts a change in behaviour that was introduced
in #8 which caused a regression for the staging style workflow that was
supported by sinopia.
* Define utils function `get_base_url`.
* If url_prefix start with `/` construct base URL using protocol and host form request.
* Update SERVER.md with description of new `url_prefix` option.
Improves the Docker experience by leveraging Data volumes, dropping root permissions, using a more lightweight and secure base image (node:alpine), and moving unwieldy run arguments into a docker-compose file. The net result is you can now issue a single command `docker-compose up --build` to have a fully-functional verdaccio instance running.
The https module allows for an intermediate certificate in the options.
It was somehow missed. Adding it back since I had a certificate that
included an intermediate certificate.
There is a problem with the docker.yaml file.
auth:
htpasswd:
file:/verdaccio/config/htpasswd
The file property should point to /verdaccio/conf/htpasswd because folder /verdaccio/config dosen't exist and therefore dosen't let to create users.
Thank you for working on this great tool.
Regards
It appears that user lonelyclick has already published this to npm.
I have contacted him about getting added as a collaborator
This reverts commit 564b91fba9.
Node 6 introduced two breaking changes to verdaccio/sinopia
Path functions now throw on null/undefined arguments
Buffer defaults to binary now A lot of test code explicitly converted data to utf8 which broke on checksum
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
* unpublish version does not remove it from timeline ([61e62bd](https://github.com/verdaccio/verdaccio/commit/61e62bd))
### Features
* adds gravatar support for maintainers ([4df6b3b](https://github.com/verdaccio/verdaccio/commit/4df6b3b))
* adds option to set scope in webui instructions header ([f9e9383](https://github.com/verdaccio/verdaccio/commit/f9e9383)), closes [#593](https://github.com/verdaccio/verdaccio/issues/593)
* solves dependency bug for one dependency ([#857](https://github.com/verdaccio/verdaccio/issues/857)) ([f9c9c44](https://github.com/verdaccio/verdaccio/commit/f9c9c44))
* Authentication Plugins / plugin[method] is not a function ([0a3870e](https://github.com/verdaccio/verdaccio/commit/0a3870e))
### Features
* adds base64 support in webui token ([#840](https://github.com/verdaccio/verdaccio/issues/840)) ([4a7a94a](https://github.com/verdaccio/verdaccio/commit/4a7a94a))
* add RemoteUser type for auth ([2f4dbe8](https://github.com/verdaccio/verdaccio/commit/2f4dbe8))
* adds webpack banner plugin to tag bundles with version ([#784](https://github.com/verdaccio/verdaccio/issues/784)) ([dac28d3](https://github.com/verdaccio/verdaccio/commit/dac28d3))
* dynamic date generation for <Package /> component test ([e5ea0c2](https://github.com/verdaccio/verdaccio/commit/e5ea0c2))
* ignores http_proxy and https_proxy ([d04dc8d](https://github.com/verdaccio/verdaccio/commit/d04dc8d))
* improves regex for ascii and test ([#461](https://github.com/verdaccio/verdaccio/issues/461)) ([be3968f](https://github.com/verdaccio/verdaccio/commit/be3968f))
* license field alignment on web ui ([#761](https://github.com/verdaccio/verdaccio/issues/761)) ([9fa523a](https://github.com/verdaccio/verdaccio/commit/9fa523a))
* open external tabs in new tabs ([25e8e60](https://github.com/verdaccio/verdaccio/commit/25e8e60))
* package.json to reduce vulnerabilities ([389e306](https://github.com/verdaccio/verdaccio/commit/389e306))
* solve seo issue [#760](https://github.com/verdaccio/verdaccio/issues/760) ([62d3033](https://github.com/verdaccio/verdaccio/commit/62d3033))
* adds support for ascii-doc preview in readme ([#464](https://github.com/verdaccio/verdaccio/issues/464)) ([29bb57a](https://github.com/verdaccio/verdaccio/commit/29bb57a))
* adds support for external plugin directory ([#532](https://github.com/verdaccio/verdaccio/issues/532)) ([11dcf79](https://github.com/verdaccio/verdaccio/commit/11dcf79))
* capitalises logged in username ([#752](https://github.com/verdaccio/verdaccio/issues/752)) ([0e21e35](https://github.com/verdaccio/verdaccio/commit/0e21e35))
* migration issue with old storage [#740](https://github.com/verdaccio/verdaccio/issues/740) ([e977d50](https://github.com/verdaccio/verdaccio/commit/e977d50))
* favicon refers to .png while only .ico exists [#681](https://github.com/verdaccio/verdaccio/issues/681) ([11e6f9f](https://github.com/verdaccio/verdaccio/commit/11e6f9f))
* web-ui css were not being minimized ([3168a76](https://github.com/verdaccio/verdaccio/commit/3168a76))
### Features
* new verdaccio skin to webui ([b8b2612](https://github.com/verdaccio/verdaccio/commit/b8b2612))
* add node 10 support for test and docker ([cee2564](https://github.com/verdaccio/verdaccio/commit/cee2564))
* support for npm audit fix [#689](https://github.com/verdaccio/verdaccio/issues/689) ([f9f180d](https://github.com/verdaccio/verdaccio/commit/f9f180d))
* :bug: check error code to prevent data loss ([5d73dca](https://github.com/verdaccio/verdaccio/commit/5d73dca)) fix [#329](https://github.com/verdaccio/verdaccio/issues/329)
* Fix [#334](https://github.com/verdaccio/verdaccio/issues/334) UI failure on IE 11, add suppor for old browsers. ([f1f15be](https://github.com/verdaccio/verdaccio/commit/f1f15be))
* :bug: check error code to prevent data loss ([5d73dca](https://github.com/verdaccio/verdaccio/commit/5d73dca))
* :bug: check error code to prevent data loss ([93aae05](https://github.com/verdaccio/verdaccio/commit/93aae05))
* :bug: Package metadata cache not work ([4d6a447](https://github.com/verdaccio/verdaccio/commit/4d6a447))
* Fixed bug with Maximum call stack size exceeded on packages web API ([#326](https://github.com/verdaccio/verdaccio/pull/326))
* fix: :bug: Package metadata cache does not work ([#317](https://github.com/verdaccio/verdaccio/pull/317))
* Debug log color in terminal is too dark ([#311](https://github.com/verdaccio/verdaccio/pull/311))
* docs: Add new sections to documentation ([#308](https://github.com/verdaccio/verdaccio/pull/308))
* Remove from web section not longer valid properties ([#307](https://github.com/verdaccio/verdaccio/pull/307)) ([#309](https://github.com/verdaccio/verdaccio/pull/309))
* Fix possible data loss upstream ([#306](https://github.com/verdaccio/verdaccio/pull/306)) ([#300](https://github.com/verdaccio/verdaccio/pull/300))
### Features
* Update node alpine version to 8.4.0 ([3f96ce3](https://github.com/verdaccio/verdaccio/commit/3f96ce3))
* configuration files inconsistencies, add unit test ([644c098](https://github.com/verdaccio/verdaccio/commit/644c098))
* Remove accept header that seems cause issues [#285](https://github.com/verdaccio/verdaccio/issues/285) [#289](https://github.com/verdaccio/verdaccio/issues/289) and npm search fails ([fab8391](https://github.com/verdaccio/verdaccio/commit/fab8391))
* refactor [#268](https://github.com/verdaccio/verdaccio/issues/268) in a better way, amended to elegant way ([94fb6ad](https://github.com/verdaccio/verdaccio/commit/94fb6ad))
* [#268](https://github.com/verdaccio/verdaccio/issues/268) remove the accept header that avoids request with some regiestries ([e7dcf3c](https://github.com/verdaccio/verdaccio/commit/e7dcf3c))
* [#78](https://github.com/verdaccio/verdaccio/issues/78) add new setting to allow publish when uplinks are offline ([430425c](https://github.com/verdaccio/verdaccio/commit/430425c))
* broken link ([9fb0e14](https://github.com/verdaccio/verdaccio/commit/9fb0e14))
* Param web.title from config.yaml does not work on docker image [#265](https://github.com/verdaccio/verdaccio/issues/265) ([b1a396d](https://github.com/verdaccio/verdaccio/commit/b1a396d))
- config section moved up, some keywords added - [#211](https://github.com/verdaccio/verdaccio/pull/211)
- docs: update docs with behind reverse proxy - [#214](https://github.com/verdaccio/verdaccio/pull/214)
- Add remote ip to request log - [#216](https://github.com/verdaccio/verdaccio/pull/216)
## 2.2.0 (June 8, 2017)
- Allow url_prefix to be only the path - ([@BartDubois ]((https://github.com/BartDubois))) in [#197](https://github.com/verdaccio/verdaccio/pull/197)
- Apache reverse proxy configuration - ([@mysiar ]((https://github.com/mysiar))) in [#198](https://github.com/verdaccio/verdaccio/pull/198)
- don't blindly clobber local dist-tags - ([@rmg ]((https://github.com/rmg))) in [#206](https://github.com/verdaccio/verdaccio/pull/206)
- Adds cache option to uplinks - ([@silkentrance ]((https://github.com/silkentrance))) in [#132](https://github.com/verdaccio/verdaccio/pull/132)
## 2.1.7 (May 14, 2017)
- Fixed publish fail in YARN - ([@W1U02]((https://github.com/W1U02)) in [#183](https://github.com/verdaccio/verdaccio/pull/183)
## 2.1.6 (May 12, 2017)
- Fix https certificates safety check - ([@juanpicado]((https://github.com/juanpicado))) in [#189](https://github.com/verdaccio/verdaccio/pull/189)
- Fix upstream search not work with gzip - ([@Meeeeow](https://github.com/Meeeeow) in [#170](https://github.com/verdaccio/verdaccio/pull/170))
- Add additional requirement to output message - ([@marnel ](https://github.com/marnel) in [#184](https://github.com/verdaccio/verdaccio/pull/184))
- Implement npm ping endpoint - ([@juanpicado]((https://github.com/juanpicado))) in [#179](https://github.com/verdaccio/verdaccio/pull/179)
- Add support for multiple notification endpoints to existing webhook - ([@ryan-codingintrigue]((https://github.com/ryan-codingintrigue)))
in [#108](https://github.com/verdaccio/verdaccio/pull/108)
## 2.1.5 (April 22, 2017)
- fix upstream search - ([@Meeeeow](https://github.com/Meeeeow) in [#166](https://github.com/verdaccio/verdaccio/pull/166))
- Fix search feature - ([@Meeeeow](https://github.com/Meeeeow) in [#163](https://github.com/verdaccio/verdaccio/pull/163))
- add docs about run behind proxy - ([@Meeeeow](https://github.com/Meeeeow) in [#160](https://github.com/verdaccio/verdaccio/pull/160))
## 2.1.4 (April 13, 2017)
- Added Nexus Repository OSS as similar existing software - ([@nedelenbos030](https://github.com/nedelenbos) in [#147](https://github.com/verdaccio/verdaccio/pull/147))
- Increase verbose on notify request - ([@juanpicado](https://github.com/juanpicado) in [#153](https://github.com/verdaccio/verdaccio/pull/153))
- Add fallback support to previous config files - ([@juanpicado](https://github.com/juanpicado) in [#155](https://github.com/verdaccio/verdaccio/pull/155))
- Allows retrieval of all local package contents via http://server/-/search/* - ([@Verikon](https://github.com/Verikon) in [#152](https://github.com/verdaccio/verdaccio/pull/155))
## 2.1.3 (March 29, 2017)
- [GH-83] create systemd service - ([@030](https://github.com/030) in [#89](https://github.com/verdaccio/verdaccio/pull/89))
- optional scope in the readme package name. - ([@psychocode](https://github.com/psychocode) in [#136](https://github.com/verdaccio/verdaccio/pull/136))
- Added docker image for rpi - ([@danielo515](https://github.com/danielo515) in [#137](https://github.com/verdaccio/verdaccio/pull/137))
- Allow configuring a tagline that is displayed on the webpage between. ([@jachstet-sea](https://github.com/jachstet-sea) in [#143](https://github.com/verdaccio/verdaccio/pull/143))
## 2.1.2 (March 9, 2017)
- Contribute guidelines - ([@juanpicado](https://github.com/juanpicado) in [#133](https://github.com/verdaccio/verdaccio/pull/133))
- fix(plugin-loader): plugins verdaccio-* overwrite by sinopia- ([@Alexandre-io](https://github.com/Alexandre-io) in [#129](https://github.com/verdaccio/verdaccio/pull/129))
## 2.1.1 (February 7, 2017)
- [GH-86] updated readme to point to new chef cookbook ([@kgrubb](https://github.com/kgrubb) in [#117](https://github.com/verdaccio/verdaccio/pull/117))
- [GH-88] rename to Verdaccio instead of Sinopia ([@kgrubb](https://github.com/kgrubb) in [#93](https://github.com/verdaccio/verdaccio/pull/93))
- Unit testing coverage ([@juanpicado](https://github.com/juanpicado) in [#116](https://github.com/verdaccio/verdaccio/issues/116))
- Allow htpasswd-created users to log in [@imsnif](https://github.com/imsnif) in [#112](https://github.com/verdaccio/verdaccio/issues/112))
- remove travis io.js support ([@juanpicado](https://github.com/juanpicado) in [#115](https://github.com/verdaccio/verdaccio/issues/115))
- rename clean up ([@juanpicado](https://github.com/juanpicado) in [#114](https://github.com/verdaccio/verdaccio/issues/114))
- _npmUser / author not showing up ([@juanpicado](https://github.com/juanpicado) in [#65](https://github.com/verdaccio/verdaccio/issues/65))
- Docs: correct config attribute `proxy_access` ([@robertgroh](https://github.com/robertgroh) in [#96](https://github.com/verdaccio/verdaccio/pull/96))
- Problem with docker.yaml ([@josedepaz](https://github.com/josedepaz) in [#72](https://github.com/verdaccio/verdaccio/pull/72))
- Prevent logging of user and password ([@tlvince](https://github.com/tlvince) in [#94](https://github.com/verdaccio/verdaccio/pull/94))
- Updated README.md to reflect the availability of the docker image ([@jmwilkinson](https://github.com/jmwilkinson)) in [#71](https://github.com/verdaccio/verdaccio/pull/71))
## 2.1.0 (October 11, 2016)
- Use __dirname to resolve local plugins ([@aledbf](https://github.com/aledbf) in [#25](https://github.com/verdaccio/verdaccio/pull/25))
- Fix npm cli logout ([@plitex](https://github.com/plitex) in [#47](https://github.com/verdaccio/verdaccio/pull/47))
- Add log format: pretty-timestamped ([@jachstet-sea](https://github.com/jachstet-sea) in [#68](https://github.com/verdaccio/verdaccio/pull/68))
- Allow adding/overriding HTTP headers of uplinks via config ([@jachstet-sea](https://github.com/jachstet-sea) in [#67](https://github.com/verdaccio/verdaccio/pull/67))
- Update Dockerfile to fix failed start ([@denisbabineau](https://github.com/denisbabineau) in [#62](https://github.com/verdaccio/verdaccio/pull/62))
- Update the configs to fully support proxying scoped packages ([@ChadKillingsworth](https://github.com/ChadKillingsworth) in [#60](https://github.com/verdaccio/verdaccio/pull/60))
- Prevent the server from crashing if a repo is accessed that the user does not have access to ([@crowebird](https://github.com/crowebird) in [#58](https://github.com/verdaccio/verdaccio/pull/58))
- Hook system, for integration into things like slack
- Register entry partial even if custom template is provided ([@plitex](https://github.com/plitex) in [#46](https://github.com/verdaccio/verdaccio/pull/46))
- Rename process to verdaccio ([@juanpicado](https://github.com/juanpicado) in [#57](https://github.com/verdaccio/verdaccio/pull/57))
## 7 Jun 2015, version 1.4.0
- avoid sending X-Forwarded-For through proxies (issues [#19](https://github.com/rlidwka/sinopia/issues/19), [#254](https://github.com/rlidwka/sinopia/issues/254))
- fix multiple issues in search (issues [#239](https://github.com/rlidwka/sinopia/issues/239), [#253](https://github.com/rlidwka/sinopia/pull/253))
- fix access control regression in `1.2.1` (issue [#238](https://github.com/rlidwka/sinopia/issues/238))
- add a possibility to bind on unix sockets (issue [#237](https://github.com/rlidwka/sinopia/issues/237))
## 11 Apr 2015, version 1.2.1
- added more precise authorization control to auth plugins (issue [#207](https://github.com/rlidwka/sinopia/pull/207))
## 29 Mar 2015, version 1.1.0
- add a possibility to listen on multiple ports (issue [#172](https://github.com/rlidwka/sinopia/issues/172))
- added https support (issues [#71](https://github.com/rlidwka/sinopia/issues/71), [#166](https://github.com/rlidwka/sinopia/issues/166))
- added an option to use a custom template for web UI (issue [#208](https://github.com/rlidwka/sinopia/pull/208))
- remove "from" and "resolved" fields from shrinkwrap (issue [#204](https://github.com/rlidwka/sinopia/issues/204))
- fix hanging when rendering readme (issue [#206](https://github.com/rlidwka/sinopia/issues/206))
- fix logger-related crash when using sinopia as a library
- all requests to uplinks should now have proper headers
## 12 Feb 2015, version 1.0.1
- fixed issue with `max_users` option (issue [#184](https://github.com/rlidwka/sinopia/issues/184))
- fixed issue with not being able to disable the web interface (issue [#195](https://github.com/rlidwka/sinopia/pull/195))
- fixed 500 error while logging in with npm (issue [#200](https://github.com/rlidwka/sinopia/pull/200))
## 26 Jan 2015, version 1.0.0
- switch markdown parser from `remarkable` to `markdown-it`
- update `npm-shrinkwrap.json`
- now downloading tarballs from upstream using the same protocol as for metadata (issue [#166](https://github.com/rlidwka/sinopia/issues/166))
## 22 Dec 2014, version 1.0.0-beta.2
- fix windows behavior when `$HOME` isn't set (issue [#177](https://github.com/rlidwka/sinopia/issues/177))
- fix sanitization for highlighted code blocks in readme (issue [render-readme/#1](https://github.com/rlidwka/render-readme/issues/1))
## 15 Dec 2014, version 1.0.0-beta
- Markdown rendering is now a lot safer (switched to remarkable+sanitizer).
- Header in web interface is now static instead of fixed.
-`GET /-/all?local` now returns list of all local packages (issue [#179](https://github.com/rlidwka/sinopia/pull/179))
## 5 Dec 2014, version 1.0.0-alpha.3
- Fixed an issue with scoped packages in tarballs
## 25 Nov 2014, version 1.0.0-alpha
- Config file is now created in `$XDG_CONFIG_HOME` instead of current directory.
It is printed to stdout each time sinopia starts, so you hopefully won't have any trouble locating it.
The change is made so sinopia will pick up the same config no matter which directory it is started from.
- Default config file is now a lot shorter, and it is very permissive by default. You could use sinopia without modifying it on your own computer, but definitely should change it on production.
- Added auth tokens. For now, auth token is just a username+password encrypted for security reasons, so it isn't much different from basic auth, but allows to avoid "always-auth" npm setting.
- Added scoped packages.
Please note that default `*` mask won't apply to them. You have to use masks like `@scope/*` to match scoped packages, or `**` to match everything.
- Enabled web interface by default. Wow, it looks almost ready now!
- All dependencies are bundled now, so uncompatible changes in 3rd party stuff in the future won't ruin the day.
## 1 Nov 2014, version 0.13.2
- fix `EPERM`-related crashes on windows (issue [#67](https://github.com/rlidwka/sinopia/issues/67))
## 22 Oct 2014, version 0.13.0
- web interface:
- web page layout improved (issue [#141](https://github.com/rlidwka/sinopia/pull/141))
- latest version is now displayed correctly (issues [#120](https://github.com/rlidwka/sinopia/issues/120), [#123](https://github.com/rlidwka/sinopia/issues/123), [#143](https://github.com/rlidwka/sinopia/pull/143))
- fixed web interface working behind reverse proxy (issues [#145](https://github.com/rlidwka/sinopia/issues/145), [#147](https://github.com/rlidwka/sinopia/issues/147))
Now you can create your own auth plugin based on [sinopia-htpasswd](https://github.com/rlidwka/sinopia-htpasswd) package.
- WIP: web interface (issue [#73](https://github.com/rlidwka/sinopia/pull/73))
It is disabled by default, and not ready for production yet. Use at your own risk. We will enable it in the next major release.
- Some modules are now bundled by default, so users won't have to install stuff from git. We'll see what issues it causes, maybe all modules will be bundled in the future like in npm.
## 14 Sep 2014, version 0.10.x
*A bunch of development releases that are broken in various ways. Please use 0.11.x instead.*
## 7 Sep 2014, version 0.9.3
- fix several bugs that could cause "can't set headers" exception
## 3 Sep 2014, version 0.9.2
- allow "pretty" format for logging into files (issue [#88](https://github.com/rlidwka/sinopia/pull/88))
- remove outdated user existence check (issue [#115](https://github.com/rlidwka/sinopia/pull/115))
- reverted PR [#56](https://github.com/rlidwka/sinopia/issues/56) (see discussion in [#57](https://github.com/rlidwka/sinopia/issues/57))
## 13 Mar 2014, version 0.7.0
- config changes:
- breaking change: all time intervals are now specified in *seconds* instead of *milliseconds* for the sake of consistency. Change `timeout` if you have one!
- all time intervals now can be specified in [nginx notation](http://wiki.nginx.org/ConfigNotation), for example `1m 30s` will specify a 90 seconds timeout
- added `maxage` option to avoid asking public registry for the same data too often (issue [#47](https://github.com/rlidwka/sinopia/issues/47))
- added `max_fails` and `fail_timeout` options to reduce amount of requests to public registry when it's down (issue [#7](https://github.com/rlidwka/sinopia/issues/7))
- bug fixes:
- fix crash when headers are sent twice (issue [#52](https://github.com/rlidwka/sinopia/issues/52))
- all tarballs are returned with `Content-Length`, which allows [yapm](https://github.com/rlidwka/yapm) to estimate download time
- when connection to public registry is interrupted when downloading a tarball, we no longer save incomplete tarball to the disk
- other changes:
- 404 errors are returned in couchdb-like manner (issue [#56](https://github.com/rlidwka/sinopia/issues/56))
## 5 Mar 2014, version 0.6.7
- pin down express@3 version, since sinopia doesn't yet work with express@4
## 28 Feb 2014, version 0.6.5
- old SSL keys for npm are removed, solves `SELF_SIGNED_CERT_IN_CHAIN` error
## 3 Feb 2014, version 0.6.3
- validate tags and versions (issue [#40](https://github.com/rlidwka/sinopia/issues/40))
- don't crash when process.getuid doesn't exist (issue [#41](https://github.com/rlidwka/sinopia/issues/41))
## 18 Jan 2014, version 0.6.2
- adding config param to specify upload limits (issue [#39](https://github.com/rlidwka/sinopia/issues/39))
- making loose semver versions work (issue [#38](https://github.com/rlidwka/sinopia/issues/38))
## 13 Jan 2014, version 0.6.1
- support setting different storage paths for different packages (issue [#35](https://github.com/rlidwka/sinopia/issues/35))
## 30 Dec 2013, version 0.6.0
- tag support (issue [#8](https://github.com/rlidwka/sinopia/issues/8))
- adding support for npm 1.3.19+ behaviour (issue [#31](https://github.com/rlidwka/sinopia/issues/31))
- removing all support for proxying publish requests to uplink (too complex)
## 26 Dec 2013, version 0.5.9
- fixing bug with bad Accept header (issue [#32](https://github.com/rlidwka/sinopia/issues/32))
## 20 Dec 2013, version 0.5.8
- fixed a warning from js-yaml
- don't color multiline strings in logs output
- better error messages in various cases
- test format changed
## 15 Dec 2013, version 0.5.7
- try to fetch package from uplinks if user requested a tarball we don't know about (issue [#29](https://github.com/rlidwka/sinopia/issues/29))
- security fix: set express.js to production mode so we won't return stack traces to the user in case of errors
## 11 Dec 2013, version 0.5.6
- fixing a few crashes related to tags
## 8 Dec 2013, version 0.5.4
- latest tag always shows highest version available (issue [#8](https://github.com/rlidwka/sinopia/issues/8))
- added a configurable timeout for requests to uplinks (issue [#18](https://github.com/rlidwka/sinopia/issues/18))
- users with bad authentication header are considered not logged in (issue [#17](https://github.com/rlidwka/sinopia/issues/17))
## 24 Nov 2013, version 0.5.3
- added proxy support for requests to uplinks (issue [#13](https://github.com/rlidwka/sinopia/issues/13))
- changed license from default BSD to WTFPL
## 26 Oct 2013, version 0.5.2
- server now supports unpublishing local packages
- added fs-ext dependency (flock)
- fixed a few face conditions
## 20 Oct 2013, version 0.5.1
- fixed a few errors related to logging
## 12 Oct 2013, version 0.5.0
- using bunyan as a log engine
- pretty-formatting colored logs to stdout by default
- ask user before creating any config files
## 5 Oct 2013, version 0.4.3
- basic tags support for npm (read-only)
- npm star/unstar calls now return proper error
## 29 Sep 2013, version 0.4.2
## 28 Sep 2013, version 0.4.1
- using mocha for tests now
- making use of streams2 api, doesn't work on 0.8 anymore
- basic support for uploading packages to other registries
## 27 Sep 2013, version 0.4.0
- basic test suite
- storage path in config is now relative to config file location, not cwd
- proper cleanup for temporary files
## 12 Jul 2013, version 0.3.2
## 4 Jul 2013, version 0.3.1
- using ETag header for all json output, based on md5
## 20 Jun 2013, version 0.3.0
- compression for http responses
- requests for files to uplinks are now streams (no buffering)
- tarballs are now cached locally
## 19 Jun 2013, version 0.2.0
- config file changed, packages is now specified with minimatch
- ability to retrieve all packages from another registry (i.e. npmjs)
## 14 Jun 2013, version 0.1.1
- config is now autogenerated
- tarballs are now read/written from fs using streams (no buffering)
## 9 Jun 2013, version 0.1.0
- first npm version
- ability to publish packages and retrieve them locally
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at verdaccio.npm@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
We are happy you wish to contribute this project, for that reason we want to board you with this guide.
## How I contribute?
### Ways to contribute
There are many ways to contribute to the Verdaccio Project. Here’s a list of technical contributions with increasing levels of involvement and required knowledge of Verdaccio's code and operations.
* [Reporting a Bug](CONTRIBUTING.md#reporting-a-bug)
* [Improve the Documentation](http://www.verdaccio.org/docs/en/installation.html)
Please read carefully this document. It will guide you to provide maintainers and readers valuable information to boots the process solve the issue or evaluate your proposal.
## Reporting a Bug
We welcome clear bug reports. If you've found a bug in Verdaccio that isn't a security risk, please file a report in our [issue tracker](https://github.com/verdaccio/verdaccio/issues). Before you file your issue, search to see if it has already been reported. If so, up-vote (using GitHub reactions) or add additional helpful details to the existing issue to show that it's affecting multiple people.
### Check if there's a simple solution in the website.
Some of the most popular topics can be found in our website(http://www.verdaccio.org/docs/en/installation.html)
### Questions & Chat
We have tagged questions for easy follow up under the tag [questions](https://github.com/verdaccio/verdaccio/labels/question). Additionaly, I'd recommend to deliver questions in the new chat as **#questions/#development** channels at [gitter](https://gitter.im/verdaccio/).
### Using the issue tracker
The issue tracker is a channel were mostly users/developers post.
#### I want to report a bug
We considere a bug a feature that is not working as is described in the documentation. Before reporting a bug follow the next steps:
1. Use the GitHub issue search — check if the issue has already been reported.
2. Check if the issue has been fixed — try to reproduce it using the latest master or development branch in the repository.
Verdaccio still does not support all npm commands due either in the initial design were not considered important or nobody has request it yet.
## Request Features
A new feature is always welcome, thus, analyse whether your idea fits in the scope of the project and elaborate your request providing enough context, for instance:
* A wide description the advantages of your request.
* It's compatible with `npm` and `yarn`?
* You might implement your feature and provide a forked repository as example.
* Whatever you have on mind 🤓.
### Submitting a Pull Request
The following are the general steps you should follow in creating a pull request. Subsequent pull requests only need
to follow step 3 and beyond:
1. Fork the repository on GitHub
2. Clone the forked repository to your machine
3. Make your changes and commit them to your local repository
4. Rebase and push your commits to your GitHub remote fork/repository
5. Issue a Pull Request to the official repository
6. Your Pull Request is reviewed by a committer and merged into the repository
*Note*: While there are other ways to accomplish the steps using other tools, the examples here will assume the most
actions will be performed via the `git` command line.
For more information on maintaining a fork, please see the GitHub Help article [Fork a Repo](https://help.github.com/articles/fork-a-repo/) and information on
[rebasing](https://git-scm.com/book/en/v2/Git-Branching-Rebasing) from git.
### Make Changes and Commit
#### Before commit
At this point you have ready your changes, your new feature it's ready to be shipped, but, to avoid delays to merge, please be aware the build must past.
Before commit, run the test command:
```bash
yarn test
```
It won't have **eslint** errors and **all test must past**. Then, and only then, you should push and ship your **PR**.
#### Git Commit Guidelines
We follow the [conventional commit messages](https://conventionalcommits.org/) convention in order to automate Changelog generation and auto semantic versioning based on commit messages.
* feat: A new feature
* fix: A bug fix
A commit of the type feat introduces a new feature to the codebase (this correlates with MINOR in semantic versioning).
eg:
```
feat: xxxxxxxxxx
````
A commit of the type fix patches a bug in your codebase (this correlates with PATCH in semantic versioning).
eg:
```
fix: xxxxxxxxxx
````
Commits types as `docs:`,`style:`,`refactor:`,`perf:`,`test:` and `chore:` are valid but has no effect on versioning, but, it would be great if you use them.
Use `npm run commitmsg` to check your commit message.
> All PR that does not follow the commit guidelines will be hold until messages are fixed.
## Update Test
Any change in the sour code **must to include test update**, if you need support about how test works, please [refers to the following guide](https://github.com/verdaccio/verdaccio/wiki/Running-and-Debugging-tests). Please include test whether is a new feature, otherwise will be hold and never be merged.
> Documentation, website, build, deployment, assets or flow types are excluded in this section
## Plugins
Plugins are Add-ons that extend the functionality of the application. Whether you want develop your own plugin I'd suggest do the following:
1. Check whether there is a legacy sinopia plugin for the feature that you need at [npmjs](https://www.npmjs.com/search?q=sinopia).
2. There is a [life-cycle to load a plugin](https://github.com/verdaccio/verdaccio/blob/master/lib/plugin-loader.js#L22) you should keep on mind.
3. You are free to host your plugin in your repository, whether you want to host within in our organization, feel free to ask, we'll happy to host it.
4. Try a describe widely your plugin to provide a deeply understanding to your users.
- reverted PR [#56](https://github.com/rlidwka/sinopia/issues/56) (see discussion in [#57](https://github.com/rlidwka/sinopia/issues/57))
13 Mar 2014, version 0.7.0
- config changes:
- breaking change: all time intervals are now specified in *seconds* instead of *milliseconds* for the sake of consistency. Change `timeout` if you have one!
- all time intervals now can be specified in [nginx notation](http://wiki.nginx.org/ConfigNotation), for example `1m 30s` will specify a 90 seconds timeout
- added `maxage` option to avoid asking public registry for the same data too often (issue [#47](https://github.com/rlidwka/sinopia/issues/47))
- added `max_fails` and `fail_timeout` options to reduce amount of requests to public registry when it's down (issue [#7](https://github.com/rlidwka/sinopia/issues/7))
- bug fixes:
- fix crash when headers are sent twice (issue [#52](https://github.com/rlidwka/sinopia/issues/52))
- all tarballs are returned with `Content-Length`, which allows [yapm](https://github.com/rlidwka/yapm) to estimate download time
- when connection to public registry is interrupted when downloading a tarball, we no longer save incomplete tarball to the disk
- other changes:
- 404 errors are returned in couchdb-like manner (issue [#56](https://github.com/rlidwka/sinopia/issues/56))
5 Mar 2014, version 0.6.7
- pin down express@3 version, since sinopia doesn't yet work with express@4
28 Feb 2014, version 0.6.5
- old SSL keys for npm are removed, solves `SELF_SIGNED_CERT_IN_CHAIN` error
3 Feb 2014, version 0.6.3
- validate tags and versions (issue [#40](https://github.com/rlidwka/sinopia/issues/40))
- don't crash when process.getuid doesn't exist (issue [#41](https://github.com/rlidwka/sinopia/issues/41))
18 Jan 2014, version 0.6.2
- adding config param to specify upload limits (issue [#39](https://github.com/rlidwka/sinopia/issues/39))
- making loose semver versions work (issue [#38](https://github.com/rlidwka/sinopia/issues/38))
13 Jan 2014, version 0.6.1
- support setting different storage paths for different packages (issue [#35](https://github.com/rlidwka/sinopia/issues/35))
30 Dec 2013, version 0.6.0
- tag support (issue [#8](https://github.com/rlidwka/sinopia/issues/8))
- adding support for npm 1.3.19+ behaviour (issue [#31](https://github.com/rlidwka/sinopia/issues/31))
- removing all support for proxying publish requests to uplink (too complex)
26 Dec 2013, version 0.5.9
- fixing bug with bad Accept header (issue [#32](https://github.com/rlidwka/sinopia/issues/32))
20 Dec 2013, version 0.5.8
- fixed a warning from js-yaml
- don't color multiline strings in logs output
- better error messages in various cases
- test format changed
15 Dec 2013, version 0.5.7
- try to fetch package from uplinks if user requested a tarball we don't know about (issue [#29](https://github.com/rlidwka/sinopia/issues/29))
- security fix: set express.js to production mode so we won't return stack traces to the user in case of errors
11 Dec 2013, version 0.5.6
- fixing a few crashes related to tags
8 Dec 2013, version 0.5.4
- latest tag always shows highest version available (issue [#8](https://github.com/rlidwka/sinopia/issues/8))
- added a configurable timeout for requests to uplinks (issue [#18](https://github.com/rlidwka/sinopia/issues/18))
- users with bad authentication header are considered not logged in (issue [#17](https://github.com/rlidwka/sinopia/issues/17))
24 Nov 2013, version 0.5.3
- added proxy support for requests to uplinks (issue [#13](https://github.com/rlidwka/sinopia/issues/13))
- changed license from default BSD to WTFPL
26 Oct 2013, version 0.5.2
- server now supports unpublishing local packages
- added fs-ext dependency (flock)
- fixed a few face conditions
20 Oct 2013, version 0.5.1
- fixed a few errors related to logging
12 Oct 2013, version 0.5.0
- using bunyan as a log engine
- pretty-formatting colored logs to stdout by default
- ask user before creating any config files
5 Oct 2013, version 0.4.3
- basic tags support for npm (read-only)
- npm star/unstar calls now return proper error
29 Sep 2013, version 0.4.2
28 Sep 2013, version 0.4.1
- using mocha for tests now
- making use of streams2 api, doesn't work on 0.8 anymore
- basic support for uploading packages to other registries
27 Sep 2013, version 0.4.0
- basic test suite
- storage path in config is now relative to config file location, not cwd
- proper cleanup for temporary files
12 Jul 2013, version 0.3.2
4 Jul 2013, version 0.3.1
- using ETag header for all json output, based on md5
20 Jun 2013, version 0.3.0
- compression for http responses
- requests for files to uplinks are now streams (no buffering)
- tarballs are now cached locally
19 Jun 2013, version 0.2.0
- config file changed, packages is now specified with minimatch
- ability to retrieve all packages from another registry (i.e. npmjs)
14 Jun 2013, version 0.1.1
- config is now autogenerated
- tarballs are now read/written from fs using streams (no buffering)
9 Jun 2013, version 0.1.0
- first npm version
- ability to publish packages and retrieve them locally
It allows you to have a local npm registry with zero configuration. You don't have to install and replicate an entire CouchDB database. Sinopia keeps its own small database and, if a package doesn't exist there, it asks npmjs.org for it keeping only those packages you use.
Verdaccio is a simple, **zero-config-required local private npm registry**. No need for an entire database just to get started! Verdaccio comes out of the box with **its own tiny database**, and the ability to proxy other registries (eg. npmjs.org), caching the downloaded modules along the way. For those looking to extend their storage capabilities, Verdaccio **supports various community-made plugins to hook into services such as Amazon's s3 and Google Cloud Storage**.
### Use private packages
If you want to use all benefits of npm package system in your company without sending all code to the public, and use your private packages just as easy as public ones.
See [using private packages](#using-private-packages) section for details.
2. Cache npmjs.org registry.
### Cache npmjs.org registry
If you have more than one server you want to install packages on, you might want to use this to decrease latency
(presumably "slow" npmjs.org will be connected to only once per package/version) and provide limited failover (if npmjs.org is down, we might still find something useful in the cache).
(presumably "slow" npmjs.org will be connected to only once per package/version) and provide limited failover (if npmjs.org is down, we might still find something useful in the cache) or avoid issues like *[How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript](https://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/)*, *[Many packages suddenly disappeared](https://github.com/npm/registry/issues/255?source=techstories.org)* or *[Registry returns 404 for a package I have installed before](https://github.com/npm/registry/issues/329)*.
### Link multiple registries
See [using public packages](#using-public-packages-from-npmjsorg) section for details.
If you use multiples registries in your organization and need to fetch packages from multiple sources in one single project you might take advance of the uplinks feature with Verdaccio, chaining multiple registries and fetching from one single endpoint.
3. Override public packages.
If you want to use a modified version of some 3rd-party package (for example, you found a bug, but maintainer didn't accepted pull request yet), you can publish your version locally under the same name.
### Override public packages
See [override public packages](#override-public-packages) section for details.
If you want to use a modified version of some 3rd-party package (for example, you found a bug, but maintainer didn't accept pull request yet), you can publish your version locally under the same name.
## Installation
See in detail each of these [use cases](https://github.com/verdaccio/verdaccio/tree/master/docs/use-cases.md).
<h2 align="center">Get Started</h2>
Run in your terminal
```bash
# installation and starting (application will create default
# config in config.yaml you can edit later)
$ npm install -g sinopia
$ sinopia
verdaccio
```
# npm configuration
You would need set some npm configuration, this is optional.
```bash
$ npm set registry http://localhost:4873/
# if you have any restricted packages, you should add this:
$ npm set always-auth true
# if you use HTTPS, add an appropriate CA information
# ("null" means get CA list from OS)
$ npm set ca null
```
### Docker
Now you can navigate to [http://localhost:4873/](http://localhost:4873/) where your local packages will be listed and can be searched.
A Sinopia docker image [is available](https://index.docker.io/u/keyvanfatehi/docker-sinopia/)
> Warning: Verdaccio does not currently support PM2's cluster mode, running it with cluster mode may cause unknown behavior.
A Sinopia Chef cookbook [is available at Opscode community](http://community.opscode.com/cookbooks/sinopia) source: https://github.com/BarthV/sinopia-cookbook
#### Create an user and log in
### Puppet
A Sinopia puppet module [is available at puppet forge](http://forge.puppetlabs.com/saheba/sinopia) source: https://github.com/saheba/puppet-sinopia
## Configuration
When you start a server, it auto-creates a config file that adds one user (password is printed to stdout only once).
## Adding a new user
There is no utility to add a new user but you can at least use node on the command-line to generate a password. You will need to edit the config and add the user manually.
Start node and enter the following code replacing 'newpass' with the password you want to get the hash for.
You can add users and manage which users can access which packages.
This will prompt you for user credentials which will be saved on the `verdaccio` server.
It is recommended that you define a prefix for your private packages, for example "local", so all your private things will look like this: `local-foo`. This way you can clearly separate public packages from private ones.
<h2 align="center"> Docker</h2>
## Using public packages from npmjs.org
Below are the most commony needed informations,
every aspect of Docker and verdaccio is [documented separately](https://www.verdaccio.org/docs/en/docker.html)
If some package doesn't exist in the storage, server will try to fetch it from npmjs.org. If npmjs.org is down, it serves packages from cache pretending that no other packages exist. Sinopia will download only what's needed (= requested by clients), and this information will be cached, so if client will ask the same thing second time, it can be served without asking npmjs.org for it.
Example: if you successfully request express@3.0.1 from this server once, you'll able to do that again (with all it's dependencies) anytime even if npmjs.org is down. But say express@3.0.0 will not be downloaded until it's actually needed by somebody. And if npmjs.org is offline, this server would say that only express@3.0.1 (= only what's in the cache) is published, but nothing else.
```
docker pull verdaccio/verdaccio
```
## Override public packages
Available as [tags](https://hub.docker.com/r/verdaccio/verdaccio/tags/).
If you want to use a modified version of some public package `foo`, you can just publish it to your local server, so when your type `npm install foo`, it'll consider installing your version.
```
docker pull verdaccio/verdaccio:3.0.0
```
There's two options here:
### Running verdaccio using Docker
1. You want to create a separate fork and stop synchronizing with public version.
To run the docker container:
If you want to do that, you should modify your configuration file so sinopia won't make requests regarding this package to npmjs anymore. Add a separate entry for this package to *config.yaml* and remove `npmjs` from `proxy_access` list and restart the server.
```bash
docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio
```
When you publish your package locally, you should probably start with version string higher than existing one, so it won't conflict with existing package in the cache.
Docker examples are available [in this repository](https://github.com/verdaccio/docker-examples).
2. You want to temporarily use your version, but return to public one as soon as it's updated.
<h2 align="center">Compatibility</h2>
In order to avoid version conflicts, you should use a custom pre-release suffix of the next patch version. For example, if a public package has version 0.1.2, you can upload 0.1.3-my-temp-fix. This way your package will be used until its original maintainer updates his public package to 0.1.3.
Verdaccio aims to support all features of a standard npm client that make sense to support in private repository. Unfortunately, it isn't always possible.
## Compatibility
### Basic features
Sinopia aims to support all features of a standard npm client that make sense to support in private repository. Unfortunately, it isn't always possible.
No CouchDB here. This application is supposed to work with zero configuration, so filesystem is used as a storage.
If you want to use a database instead, ask for it, we'll come up with some kind of a plugin system.
### Backers
## Similar existing things
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/verdaccio#backer)]
- npm + git (I mean, using git+ssh:// dependencies) - most people seem to use this, but it's a terrible idea... *npm update* doesn't work, can't use git subdirectories this way, etc.
- [reggie](https://github.com/mbrevoort/node-reggie) - this looks very interesting indeed... I might borrow some code there.
- [shadow-npm](https://github.com/dominictarr/shadow-npm), [public service](http://shadow-npm.net/) - it uses the same code as npmjs.org + service is dead
- [gemfury](http://www.gemfury.com/l/npm-registry) and others - those are closed-source cloud services, and I'm not in a mood to trust my private code to somebody (security through obscurity yeah!)
- npm-registry-proxy, npm-delegate, npm-proxy - those are just proxies...
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/verdaccio#sponsor)]
If you have any issue you can try the following options, do no desist to ask or check our issues database, perhaps someone has asked already what you are looking for.
Verdaccio is [MIT licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE)
The Verdaccio documentation and logos (e.g., .md, .png, .sketch) files in the /docs and /assets folder) is [Creative Commons licensed](https://github.com/verdaccio/verdaccio/blob/master/LICENSE-docs).
This is mostly basic linux server configuration stuff but I felt it important to document and share the steps I took to get sinopia running permanently on my server. You will need root (or sudo) permissions for the following.
You create a shell as the sinopia user using the following command:
```bash
$ sudo su sinopia
$ cd ~
```
The 'cd ~' command send you to the home directory of the sinopia user. Make sure you run sinopia at least once to generate the config file. Edit it according to your needs.
## Listening on all addresses
If you want to listen to every external address set the listen directive in the config to:
```
# you can specify listen address (or simply a port)
listen: 0.0.0.0:4873
```
## Keeping sinopia running forever
We can use the node package called 'forever' to keep sinopia running all the time.
https://github.com/nodejitsu/forever
First install forever globally:
```bash
$ sudo npm install -g forever
```
Make sure you've started sinopia at least once to generate the config file and write down the created admin user. You can then use the following command to start sinopia:
```bash
$ forever start `which sinopia`
```
You can check the documentation for more information on how to use forever.
## Surviving server restarts
We can use crontab and forever together to restart sinopia after a server reboot.
When you're logged in as the sinopia user do the following:
```bash
$ crontab -e
```
This might ask you to choose an editor. Pick your favorite and proceed.
<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svgxmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"style="isolation:isolate"viewBox="584 207 100 100"width="100"height="100"><gid="verdaccio-tiny"><pathd=" M 621 207 L 647 207 C 667.421 207 684 223.579 684 244 L 684 270 C 684 290.421 667.421 307 647 307 L 621 307 C 600.579 307 584 290.421 584 270 L 584 244 C 584 223.579 600.579 207 621 207 Z "fill-rule="evenodd"fill="rgb(247,248,246)"/><gid="Group"><maskid="_mask_TpeGGWKzkZyRlZnBNvsTW4m5XOYp8rPn"><pathd=" M 654 249.6 L 638.8 280 L 630 280 L 606.4 232.8 L 621.6 232.8 L 634.4 258.4 L 638.8 249.6 L 654 249.6 L 654 249.6 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 654 249.6 L 638.8 280 L 630 280 L 606.4 232.8 L 621.6 232.8 L 634.4 258.4 L 638.8 249.6 L 654 249.6 L 654 249.6 Z "fill-rule="evenodd"fill="rgb(64,82,54)"mask="url(#_mask_TpeGGWKzkZyRlZnBNvsTW4m5XOYp8rPn)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(64,82,54)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_LQWMCb4dioFQVBqOSQBk62eQ75m4tAS0"><pathd=" M 656.8 244 L 641.6 244 L 647.2 232.8 L 662.4 232.8 L 656.8 244 L 656.8 244 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 656.8 244 L 641.6 244 L 647.2 232.8 L 662.4 232.8 L 656.8 244 L 656.8 244 Z "fill-rule="evenodd"fill="rgb(205,64,0)"mask="url(#_mask_LQWMCb4dioFQVBqOSQBk62eQ75m4tAS0)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_x86kQ90JupBiwv7kcsN2ukBDbOLkBAze"><pathd=" M 638.8 280 L 630 280 L 606.4 232.8 L 621.6 232.8 L 641.977 273.691 L 638.8 280 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 638.8 280 L 630 280 L 606.4 232.8 L 621.6 232.8 L 641.977 273.691 L 638.8 280 Z "fill-rule="evenodd"fill="rgb(74,94,63)"mask="url(#_mask_x86kQ90JupBiwv7kcsN2ukBDbOLkBAze)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(64,82,54)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_AwBb2BJJIBwbHBC4JbvZjdtJnlGVHGEa"><linex1="643.6"y1="234"x2="658.821"y2="234"fill="white"stroke="none"/></mask><linex1="643.6"y1="234"x2="658.821"y2="234"mask="url(#_mask_AwBb2BJJIBwbHBC4JbvZjdtJnlGVHGEa)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_vCDhnuuYBbA8AOGTeV0Bu152KaOr5I8v"><linex1="639.6"y1="238"x2="654.821"y2="238"fill="white"stroke="none"/></mask><linex1="639.6"y1="238"x2="654.821"y2="238"mask="url(#_mask_vCDhnuuYBbA8AOGTeV0Bu152KaOr5I8v)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_A6Cw6lWSJitrQex7lgDJP9a9D0orokeo"><linex1="635.6"y1="242.8"x2="650.821"y2="242.8"fill="white"stroke="none"/></mask><linex1="635.6"y1="242.8"x2="650.821"y2="242.8"mask="url(#_mask_A6Cw6lWSJitrQex7lgDJP9a9D0orokeo)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><gtransform="matrix(1,0,0,1,604.4,281)"><texttransform="matrix(1,0,0,1,8.497,14.379)"style="font-family:"Open Sans";font-weight:300;font-size:10px;font-style:italic;fill:#405236;stroke:none;">Verdaccio</text></g></g></g></svg>
<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svgxmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"style="isolation:isolate"viewBox="584 207 100 100"width="100"height="100"><gid="verdaccio-tiny"><pathd=" M 621 207 L 647 207 C 667.421 207 684 223.579 684 244 L 684 270 C 684 290.421 667.421 307 647 307 L 621 307 C 600.579 307 584 290.421 584 270 L 584 244 C 584 223.579 600.579 207 621 207 Z "fill-rule="evenodd"fill="rgb(247,248,246)"/><gid="Group"><maskid="_mask_aLJ2choBe6rGRxbST4YxzucnXJoiLXLS"><pathd=" M 654 258.6 L 638.8 289 L 630 289 L 606.4 241.8 L 621.6 241.8 L 634.4 267.4 L 638.8 258.6 L 654 258.6 L 654 258.6 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 654 258.6 L 638.8 289 L 630 289 L 606.4 241.8 L 621.6 241.8 L 634.4 267.4 L 638.8 258.6 L 654 258.6 L 654 258.6 Z "fill-rule="evenodd"fill="rgb(64,82,54)"mask="url(#_mask_aLJ2choBe6rGRxbST4YxzucnXJoiLXLS)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(64,82,54)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_VpFb8HfoVEV9oMhbDP4WCZkNHeJnsgJB"><pathd=" M 656.8 253 L 641.6 253 L 647.2 241.8 L 662.4 241.8 L 656.8 253 L 656.8 253 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 656.8 253 L 641.6 253 L 647.2 241.8 L 662.4 241.8 L 656.8 253 L 656.8 253 Z "fill-rule="evenodd"fill="rgb(205,64,0)"mask="url(#_mask_VpFb8HfoVEV9oMhbDP4WCZkNHeJnsgJB)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_PurdF8WNWO5rV7THGkszebck9RL78xOC"><pathd=" M 638.8 289 L 630 289 L 606.4 241.8 L 621.6 241.8 L 641.977 282.691 L 638.8 289 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 638.8 289 L 630 289 L 606.4 241.8 L 621.6 241.8 L 641.977 282.691 L 638.8 289 Z "fill-rule="evenodd"fill="rgb(74,94,63)"mask="url(#_mask_PurdF8WNWO5rV7THGkszebck9RL78xOC)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(64,82,54)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_0WvewKeO3yEVIIsCnImQYZQpsThG8ZRt"><linex1="643.6"y1="243"x2="658.821"y2="243"fill="white"stroke="none"/></mask><linex1="643.6"y1="243"x2="658.821"y2="243"mask="url(#_mask_0WvewKeO3yEVIIsCnImQYZQpsThG8ZRt)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_mfE3hDhlZLY11weXkNmcXFVIDG3xk8wG"><linex1="639.6"y1="247"x2="654.821"y2="247"fill="white"stroke="none"/></mask><linex1="639.6"y1="247"x2="654.821"y2="247"mask="url(#_mask_mfE3hDhlZLY11weXkNmcXFVIDG3xk8wG)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_2JlRHmgXw2jNKAshMq4eDqO60Nx4xCJU"><linex1="635.6"y1="251.8"x2="650.821"y2="251.8"fill="white"stroke="none"/></mask><linex1="635.6"y1="251.8"x2="650.821"y2="251.8"mask="url(#_mask_2JlRHmgXw2jNKAshMq4eDqO60Nx4xCJU)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><gtransform="matrix(1,0,0,1,604.4,216)"><texttransform="matrix(1,0,0,1,8.497,14.379)"style="font-family:"Open Sans";font-weight:300;font-size:10px;font-style:italic;fill:#405236;stroke:none;">Verdaccio</text></g></g></g></svg>
<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svgxmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"style="isolation:isolate"viewBox="297 325 301 100"width="301"height="100"><gid="verdaccio"><pathd=" M 334 325 L 561 325 C 581.421 325 598 341.579 598 362 L 598 388 C 598 408.421 581.421 425 561 425 L 334 425 C 313.579 425 297 408.421 297 388 L 297 362 C 297 341.579 313.579 325 334 325 Z "fill-rule="evenodd"fill="rgb(247,248,246)"/><gid="Group 2"><gid="Group 2 Copy"><gtransform="matrix(1,0,0,1,405.2,347.4)"><texttransform="matrix(1,0,0,1,0,44.892)"style="font-family:"Open Sans";font-weight:300;font-size:42px;font-style:italic;fill:#405236;stroke:none;">Verdaccio</text></g></g><gopacity="0.1011096014492754"><maskid="_mask_fCSTmVJv3QSdnixdB2jztr4W92pbW0FE"><linex1="390"y1="374"x2="390"y2="380.597"fill="white"stroke="none"/></mask><linex1="390"y1="374"x2="390"y2="380.597"mask="url(#_mask_fCSTmVJv3QSdnixdB2jztr4W92pbW0FE)"vector-effect="non-scaling-stroke"stroke-width="3.2"stroke="rgb(15,82,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/></g><gid="Group"><maskid="_mask_AEapS60hj4W5lwbVZkWRptMDQjCCQnXV"><pathd=" M 372 370.1 L 356.8 400.5 L 348 400.5 L 324.4 353.3 L 339.6 353.3 L 352.4 378.9 L 356.8 370.1 L 372 370.1 L 372 370.1 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 372 370.1 L 356.8 400.5 L 348 400.5 L 324.4 353.3 L 339.6 353.3 L 352.4 378.9 L 356.8 370.1 L 372 370.1 L 372 370.1 Z "fill-rule="evenodd"fill="rgb(64,82,54)"mask="url(#_mask_AEapS60hj4W5lwbVZkWRptMDQjCCQnXV)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(64,82,54)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_IQ7DNpRZXZtt3eyCzjEeZb9eMnCTbxVr"><pathd=" M 374.8 364.5 L 359.6 364.5 L 365.2 353.3 L 380.4 353.3 L 374.8 364.5 L 374.8 364.5 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 374.8 364.5 L 359.6 364.5 L 365.2 353.3 L 380.4 353.3 L 374.8 364.5 L 374.8 364.5 Z "fill-rule="evenodd"fill="rgb(205,64,0)"mask="url(#_mask_IQ7DNpRZXZtt3eyCzjEeZb9eMnCTbxVr)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_Ya7dwXQpCePYQlvQmIYJlgPrxT9FmhAl"><pathd=" M 356.8 400.5 L 348 400.5 L 324.4 353.3 L 339.6 353.3 L 359.977 394.191 L 356.8 400.5 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 356.8 400.5 L 348 400.5 L 324.4 353.3 L 339.6 353.3 L 359.977 394.191 L 356.8 400.5 Z "fill-rule="evenodd"fill="rgb(74,94,63)"mask="url(#_mask_Ya7dwXQpCePYQlvQmIYJlgPrxT9FmhAl)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(64,82,54)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_a52iOKSly0sSYRe2ur3JsZdbSujZeYaS"><linex1="361.6"y1="354.5"x2="376.821"y2="354.5"fill="white"stroke="none"/></mask><linex1="361.6"y1="354.5"x2="376.821"y2="354.5"mask="url(#_mask_a52iOKSly0sSYRe2ur3JsZdbSujZeYaS)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_9P3mzte4BcU1pG1EBPp7BloWoicEEU8d"><linex1="357.6"y1="358.5"x2="372.821"y2="358.5"fill="white"stroke="none"/></mask><linex1="357.6"y1="358.5"x2="372.821"y2="358.5"mask="url(#_mask_9P3mzte4BcU1pG1EBPp7BloWoicEEU8d)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_XoSOCvZ40H8L7kjslOiP3IZuNrYPgQ3F"><linex1="353.6"y1="363.3"x2="368.821"y2="363.3"fill="white"stroke="none"/></mask><linex1="353.6"y1="363.3"x2="368.821"y2="363.3"mask="url(#_mask_XoSOCvZ40H8L7kjslOiP3IZuNrYPgQ3F)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/></g></g></g></svg>
<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svgxmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"style="isolation:isolate"viewBox="417 207 100 100"width="100"height="100"><gid="verdaccio-blackwhite"><pathd=" M 454 207 L 480 207 C 500.421 207 517 223.579 517 244 L 517 270 C 517 290.421 500.421 307 480 307 L 454 307 C 433.579 307 417 290.421 417 270 L 417 244 C 417 223.579 433.579 207 454 207 Z "fill-rule="evenodd"fill="rgb(0,0,0)"/><gid="Group"><pathd=" M 487 253.729 L 471.672 284 L 462.798 284 L 439 237 L 454.328 237 L 467.235 262.492 L 471.672 253.729 L 487 253.729 L 487 253.729 Z "fill-rule="evenodd"fill="rgb(255,255,255)"fill-opacity="0.6"/><pathd=" M 484.621 248 L 489.4 248 L 495 237 L 492.621 237 L 479.8 237 L 475 237 L 475 239.357 L 478.6 239.357 L 477.8 240.929 L 471 240.929 L 471 243.286 L 476.6 243.286 L 475.4 245.643 L 467 245.643 L 467 248 L 484.621 248 Z "fill-rule="evenodd"fill="rgb(255,255,255)"/><pathd=" M 471.785 284 L 462.88 284 L 439 237 L 454.381 237 L 475 277.718 L 471.785 284 Z "fill-rule="evenodd"fill="rgb(255,255,255)"/></g></g></svg>
<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svgxmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"style="isolation:isolate"viewBox="297 207 100 100"width="100"height="100"><gid="verdaccio-tiny"><pathd=" M 334 207 L 360 207 C 380.421 207 397 223.579 397 244 L 397 270 C 397 290.421 380.421 307 360 307 L 334 307 C 313.579 307 297 290.421 297 270 L 297 244 C 297 223.579 313.579 207 334 207 Z "fill-rule="evenodd"fill="rgb(247,248,246)"/><gid="Group"><maskid="_mask_Qbns5yfCiOhckpS4fdmAtyqLr4dgZWId"><pathd=" M 367 253.6 L 351.8 284 L 343 284 L 319.4 236.8 L 334.6 236.8 L 347.4 262.4 L 351.8 253.6 L 367 253.6 L 367 253.6 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 367 253.6 L 351.8 284 L 343 284 L 319.4 236.8 L 334.6 236.8 L 347.4 262.4 L 351.8 253.6 L 367 253.6 L 367 253.6 Z "fill-rule="evenodd"fill="rgb(64,82,54)"mask="url(#_mask_Qbns5yfCiOhckpS4fdmAtyqLr4dgZWId)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(64,82,54)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_78wSwMoF9QkWIbZfueLf7FbQQz8YIBiY"><pathd=" M 369.8 248 L 354.6 248 L 360.2 236.8 L 375.4 236.8 L 369.8 248 L 369.8 248 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 369.8 248 L 354.6 248 L 360.2 236.8 L 375.4 236.8 L 369.8 248 L 369.8 248 Z "fill-rule="evenodd"fill="rgb(205,64,0)"mask="url(#_mask_78wSwMoF9QkWIbZfueLf7FbQQz8YIBiY)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_cE65ing3U6mfxM3Uwzq9wIAz5366sMZK"><pathd=" M 351.8 284 L 343 284 L 319.4 236.8 L 334.6 236.8 L 354.977 277.691 L 351.8 284 Z "fill-rule="evenodd"fill="white"stroke="none"/></mask><pathd=" M 351.8 284 L 343 284 L 319.4 236.8 L 334.6 236.8 L 354.977 277.691 L 351.8 284 Z "fill-rule="evenodd"fill="rgb(74,94,63)"mask="url(#_mask_cE65ing3U6mfxM3Uwzq9wIAz5366sMZK)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(64,82,54)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_ltwHbSFx9vnoAtoXETwxsGPEOrwwWJVd"><linex1="356.6"y1="238"x2="371.821"y2="238"fill="white"stroke="none"/></mask><linex1="356.6"y1="238"x2="371.821"y2="238"mask="url(#_mask_ltwHbSFx9vnoAtoXETwxsGPEOrwwWJVd)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_ydTg3OLbu1BCUeCqplpqMMNyOfpZaWzM"><linex1="352.6"y1="242"x2="367.821"y2="242"fill="white"stroke="none"/></mask><linex1="352.6"y1="242"x2="367.821"y2="242"mask="url(#_mask_ydTg3OLbu1BCUeCqplpqMMNyOfpZaWzM)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/><maskid="_mask_dFEBcI4uC8Gj9CbfqRoz9FrxL6bxmbWv"><linex1="348.6"y1="246.8"x2="363.821"y2="246.8"fill="white"stroke="none"/></mask><linex1="348.6"y1="246.8"x2="363.821"y2="246.8"mask="url(#_mask_dFEBcI4uC8Gj9CbfqRoz9FrxL6bxmbWv)"vector-effect="non-scaling-stroke"stroke-width="4.8"stroke="rgb(205,64,0)"stroke-linejoin="miter"stroke-linecap="square"stroke-miterlimit="10"/></g></g></svg>
<gid="Group-2-Copy"transform="translate(65.200000, 0.400000)"font-weight="300"font-size="42.4"font-family="OpenSans-LightItalic, Open Sans"fill="#405236"font-style="italic">
The authentification is tied to the auth [plugin](plugins.md) you are using. The package restrictions also is handled by the [Package Access](packages.md).
The client authentification is handled by `npm` client itself. Once you login to the application:
```bash
npm adduser --registry http://localhost:4873
```
A token is generated in the `npm` configuration file hosted in your user home folder. For more information about `.npmrc` read the [official documentation](https://docs.npmjs.com/files/npmrc).
`verdaccio`allows you to enable anonymous publish, to achieve that you will need to set up correctly your [packages access](packages.md).
Eg:
```yaml
'my-company-*':
access:$anonymous
publish:$anonymous
proxy:npmjs
```
As is described [on issue #212](https://github.com/verdaccio/verdaccio/issues/212#issuecomment-308578500) until `npm@5.3.0` and all minor releases **won't allow you publish without a token**. However `yarn` has not such limitation.
## Default htpasswd
In order to simplify the setup, `verdaccio` use a plugin based on `htpasswd`. As of version v3.0.x an [external plugin](https://github.com/verdaccio/verdaccio-htpasswd)
is used by default. The v2.x version of this package still contains the built-in version of this plugin.
```yaml
auth:
htpasswd:
file:./htpasswd
# Maximum amount of users allowed to register, defaults to "+inf".
# You can set this to -1 to disable registration.
#max_users: 1000
```
Property | Type | Required | Example | Support | Description
--- | --- | --- | --- | --- | ---
file | string | Yes | ./htpasswd | all | file that host the encrypted credentials
max_users | number | No | 1000 | all | set limit of users
In case to decide do not allow user to login, you can set `max_users: -1`.
To locate the home directory, we rely on **$XDG_DATA_HOME** as a first choice and Windows environment we look for [APPDATA environment variable](https://www.howtogeek.com/318177/what-is-the-appdata-folder-in-windows/).
## Default storage location
We use **$XDG_DATA_HOME** environment variable as default to locate the storage by default which [should be the same](https://askubuntu.com/questions/538526/is-home-local-share-the-default-value-for-xdg-data-home-in-ubuntu-14-04) as $HOME/.local/share.
If you are using a custom storage, this location is irrelevant.
This file is the cornerstone of verdaccio where you can modify the default behaviour, enable plugins and extend features.
A default configuration file is created the very first time you run `verdaccio`.
## Default Configuration
The default configuration has support for **scoped** packages and allow any user to access all packages but only **authenticated users to publish**.
```yaml
storage:./storage
auth:
htpasswd:
file:./htpasswd
uplinks:
npmjs:
url:https://registry.npmjs.org/
packages:
'@*/*':
access:$all
publish:$authenticated
proxy:npmjs
'**':
proxy:npmjs
logs:
- {type: stdout, format: pretty, level:http}
```
## Sections
The following sections explain what each property means and the different options.
### Storage
Is the location of the default storage. **Verdaccio is by default based on local file system**.
```yaml
storage:./storage
```
### Plugins
Is the location of the plugin directory. Useful for Docker/Kubernetes based deployments.
```yaml
plugins:./plugins
```
### Authentification
The authentification set up is done here, the default auth is based on `htpasswd` and is built-in. You can modify this behaviour via [plugins](plugins.md). For more information about this section read the [auth page](auth.md).
```yaml
auth:
htpasswd:
file:./htpasswd
max_users:1000
```
### Web UI
This properties allow you to modify the look and feel of the web UI. For more information about this section read the [web ui page](web.md).
```yaml
web:
enable:true
title:Verdaccio
logo:logo.png
scope:
```
### Uplinks
Uplinks is the ability of the system to fetch packages from remote registries when those packages are not available locally. For more information about this section read the [uplinks page](uplinks.md).
```yaml
uplinks:
npmjs:
url:https://registry.npmjs.org/
```
### Packages
Packages allow the user to control how the packages are gonna be accessed. For more information about this section read the [packages page](packages.md).
```yaml
packages:
'@*/*':
access:$all
publish:$authenticated
proxy:npmjs
```
## Advanced Settings
### Offline Publish
By default `verdaccio` does not allow to publish when the client is offline, that behavior can be overridden by setting this to *true*.
```yaml
publish:
allow_offline:false
```
<small>Since: `verdaccio@2.3.6` due [#223](https://github.com/verdaccio/verdaccio/pull/223)</small>
### URL Prefix
```yaml
url_prefix:https://dev.company.local/verdaccio/
```
Since: `verdaccio@2.3.6` due [#197](https://github.com/verdaccio/verdaccio/pull/197)
### Max Body Size
By default the maximum body size for a JSON document is `10mb`, if you run in errors as `"request entity too large"` you may increase this value.
```yaml
max_body_size:10mb
```
### Listen Port
`verdaccio` runs by default in the port `4873`. Changing the port can be done via [cli](cli.md) or in the configuration file, the following options are valid.
```yaml
listen:
# - localhost:4873 # default value
# - http://localhost:4873 # same thing
# - 0.0.0.0:4873 # listen on all addresses (INADDR_ANY)
# - https://example.org:4873 # if you want to use https
# - "[::1]:4873" # ipv6
# - unix:/tmp/verdaccio.sock # unix socket
```
### HTTPS
To enable `https` in `verdaccio` it's enough to set the `listen` flag with the protocol *https://*. For more information about this section read the [ssl page](ssl.md).
```yaml
https:
key:./path/verdaccio-key.pem
cert:./path/verdaccio-cert.pem
ca:./path/verdaccio-csr.pem
```
### Proxy
Proxies are special-purpose HTTP servers designed to transfer data from remote servers to local clients.
#### http_proxy and https_proxy
If you have a proxy in your network you can set a `X-Forwarded-For` header using the following properties.
```yaml
http_proxy:http://something.local/
https_proxy:https://something.local/
```
#### no_proxy
This variable should contain a comma-separated list of domain extensions proxy should not be used for.
```yaml
no_proxy:localhost,127.0.0.1
```
### Notifications
Enabling notifications to third-party tools is fairly easy via web hooks. For more information about this section read the [notifications page](notifications.md).
First of all 👏👏 thanks for visiting this page, for us means you are willing contribute to `verdaccio` and we are happy for that. Jumping into an unfamiliar code base is not easy but we are here to help you.
## Comunication Channels
If you are willing for asking, we use two channels for discussions:
As a first glance verdaccio is a single repository, but there are many ways you might contribute and a variety of technologies to practice.
### Finding my spot
All we have different skills, so, let's see where you might feel comfortable.
### I know or I want to learn Node.js
Node.js is the base of `verdaccio`, we use libraries as `express`, `commander`, `request` or `async`. Verdaccio is basically a Rest API that create a communication with `npm` clients compatible, as `yarn`.
We have a long [list of plugins](plugins.md) ready to be used and improved but at the same time [you might create your own](dev-plugins.md).
### I would prefer to work in the User Interface
Recently we have moved to modern techonologies as `React` and `element-react`. We are looking forward to see new ideas how to improve the UI.
### I feel more confortable improving the stack
Of course, we will be happy to help us improving the stack, you can upgrade dependencies as `eslint`, `stylelint`, `webpack`. You migt merely improve the `webpack` configuration would be great. Any suggestion is very welcome. Furthermore whether you have experience with **Yeoman** you might help us with the [verdaccio generator](https://github.com/verdaccio/generator-verdaccio-plugin).
Here some ideas:
* Create a common eslint rules to be used across all dependencies or plugins
* Improve Flow types definitions delivery
* Moving to Webpack 4
* Improve hot reload with Webpack
* We use babel and webpack across all dependencies, why not a common preset?
* Improve continous integration delivery
### I do great Documentation
Many contributors find typos and grammar issues, that also helps to improve the overall experience for troubleshooting.
### I am a Designer
We have a frontend website [http://www.verdaccio.org/](http://www.verdaccio.org/) that will be happy to see your ideas.
Our website is based on [Docusaurus](https://docusaurus.io/).
### I am a DevOps
We have a widely popular Docker image [https://hub.docker.com/r/verdaccio/verdaccio/](https://hub.docker.com/r/verdaccio/verdaccio/) that need maintenance and pretty likely huge improvements, we need your knowledge for the benefits of all users.
We have support for **Kubernetes**, **Puppet**, **Ansible** and **Chef** and we need help in those fields, feel free to see all repositories.
### I can do translations
Verdaccio aims to be multilingual, in order to achieve it **we have the awesome support** of [Crowdin](https://crowdin.com) that is an amazing platform for translations.
We have setup a project where you can choose your favourite language, if you do not find your language feel free to request one [creating a ticket](https://github.com/verdaccio/verdaccio/issues/new).
[Go to Crowdin Verdaccio](https://crowdin.com/project/verdaccio)
## I'm ready to contribute
If you are thinking *"I've seen already the [repositories](repositories.md) and I'm willing to start right away"* then I have good news for you, that's the next step.
You will need learn how to build, [we have prepared a guide just for that](build.md).
Once you have played around with all scripts and you know how to use them, we are ready to go to the next step, run the [**Unit Test**](test.md).
## Full list of contributors. We want to see your face here !
The method provide full access to the authentification and storage via `auth` and `storage`. `app` is the express application that allows you to add new endpoints.
> A pretty good example
of middleware plugin is the [sinopia-github-oauth](https://github.com/soundtrackyourbrand/sinopia-github-oauth) and [verdaccio-audit](https://github.com/verdaccio/verdaccio-audit).
To register a middleware we need an object with a single method called `register_middlewares` that will recieve 3 arguments (`expressApp, auth, storage`).
*Auth* is the authentification instance and *storage* is also the main Storage instance that will give you have access to all to the storage actions.
## Storage Plugin
Verdaccio by default uses a file system storage plugin [local-storage](https://github.com/verdaccio/local-storage), but, since `verdaccio@3.x` you can plug in a custom storage replacing the default behaviour.
### API
The storage API is a bit more complex, you will need to create a class that return a `IPluginStorage` implementation. Please see details bellow.
class verdaccio$IUploadTarball extends stream$PassThrough {
abort: Function;
done: Function;
_transform: Function;
abort(): void;
done(): void;
}
class verdaccio$IReadTarball extends stream$PassThrough {
abort: Function;
abort(): void;
}
```
> The Storage API is still experimental and might change in the next minor versions. For further information about Storage API please follow the [types
definitions in our official repository](https://github.com/verdaccio/flow-types).
### Storage Plugins Examples
The following list of plugins are implementing the Storage API and might be used them as example.
To pull the latest pre-built [docker image](https://hub.docker.com/r/verdaccio/verdaccio/):
```bash
docker pull verdaccio/verdaccio
```

## Tagged Versions
Since version `v2.x` you can pull docker images by [tag](https://hub.docker.com/r/verdaccio/verdaccio/tags/), as follows:
For a major version:
```bash
docker pull verdaccio/verdaccio:3
```
For a minor version:
```bash
docker pull verdaccio/verdaccio:3.0
```
For a specific (patch) version:
```bash
docker pull verdaccio/verdaccio:3.0.1
```
For the next major release using the `beta` (master branch) version.
```bash
docker pull verdaccio/verdaccio:beta
```
> If you are interested on a list of tags, [please visit the Docker Hub website](https://hub.docker.com/r/verdaccio/verdaccio/tags/).
## Running verdaccio using Docker
To run the docker container:
```bash
docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio
```
The last argument defines which image to use.
The above line will pull the latest prebuilt image from dockerhub, if you haven't done that already.
If you have [build an image locally](#build-your-own-docker-image) use `verdaccio` as the last argument.
You can use `-v` to bind mount `conf`, `storage` and `plugins` to the hosts filesystem:
```bash
V_PATH=/path/for/verdaccio; docker run -it --rm --name verdaccio -p 4873:4873 \
-v $V_PATH/conf:/verdaccio/conf \
-v $V_PATH/storage:/verdaccio/storage \
-v $V_PATH/plugins:/verdaccio/plugins \
verdaccio/verdaccio
```
>Note: Verdaccio runs as a non-root user (uid=100, gid=101) inside the container, if you use bind mount to override default, you need to make sure the mount directory is assigned to the right user. In above example, you need to run `sudo chown -R 100:101 /opt/verdaccio` otherwise you will get permission errors at runtime. [Use docker volume](https://docs.docker.com/storage/volumes/) is recommended over using bind mount.
### Plugins
Plugins can be installed in a separate directory and mounted using Docker or Kubernetes, however make sure you build plugins with native dependencies using the same base image as the Verdaccio Dockerfile.
### Docker and custom port configuration
Any `host:port` configured in `conf/config.yaml` under `listen` is currently ignored when using docker.
If you want to reach verdaccio docker instance under different port, lets say `5000`
in your `docker run` command replace `-p 4873:4873` with `-p 5000:4873`.
In case you need to specify which port to listen to **in the docker container**,
since version 2.?.? you can do so by providing additional arguments to `docker run`: `--env PORT=5000`
This changes which port the docker container exposes and the port verdaccio listens to.
Of course the numbers you give to `-p` paremeter need to match,
so assuming you want them to all be the same this is what you could copy, paste and adopt:
```bash
PORT=5000; docker run -it --rm --name verdaccio \
--env PORT -p $PORT:$PORT
verdaccio/verdaccio
```
### Using HTTPS with Docker
You can configure the protocol verdaccio is going to listen on, similarly to the port configuration.
You have to overwrite the default value("http") of the `PROTOCOL` environment variable to "https", after you specified the certificates in the config.yaml.
```bash
PROTOCOL=https; docker run -it --rm --name verdaccio \
--env PROTOCOL -p 4873:4873
verdaccio/verdaccio
```
### Using docker-compose
1. Get the latest version of [docker-compose](https://github.com/docker/compose).
2. Build and run the container:
```bash
$ docker-compose up --build
```
You can set the port to use (for both container and host) by prefixing the above command with `PORT=5000 `.
Docker will generate a named volume in which to store persistent application data. You can use `docker inspect` or `docker volume inspect` to reveal the physical location of the volume and edit the configuration, such as:
There is also an npm script for building the docker image, so you can also do:
```bash
npm run build:docker
```
Note: The first build takes some minutes to build because it needs to run `npm install`,
and it will take that long again whenever you change any file that is not listed in `.dockerignore`.
If you want to use the docker image on a rpi or a compatible device there is also a dockerfile available.
To build the docker image for raspberry pi execute:
```bash
npm run build:docker:rpi
```
Please note that for any of the above docker commands you need to have docker installed on your machine and the docker executable should be available on your `$PATH`.
## Docker Examples
There is a separate repository that hosts multiple configurations to compose Docker images with `verdaccio`, for instance, as reverse proxy:
These instructions were written for Windows Server 2012, IIS 8, [Node.js 0.12.3](https://nodejs.org/), [iisnode 0.2.16](https://github.com/tjanczuk/iisnode) and [verdaccio 2.1.0](https://github.com/verdaccio/verdaccio).
Make sure you install prerequisites (Url Rewrite Module & node) as explained in the instructions for iisnode.
* Create a new folder in Explorer where you want to host verdaccio.
For example `C:\verdaccio`.
Save [package.json](#packagejson),
[start.js](#startjs)
and [web.config](#webconfig) in this folder.
* Create a new site in Internet Information Services Manager. You can name it whatever you want.
I'll call it verdaccio in these [instructions](http://www.iis.net/learn/manage/configuring-security/application-pool-identities). Specify the path to where you saved all files and a port number.
* Go back to Explorer and give the user that runs the application pool modify rights to the folder you just created. If you've named the new site verdaccio and did not change the app pool, it's running under an ApplicationPoolIdentity and you should give the user IIS AppPool\verdaccio modify rights see instructions if you need help. (You can restrict access later if you want so that it only has modify rights on the iisnode and verdaccio\storage)
* Start a command prompt and execute the commands below to download verdaccio:
````
cd c:\verdaccio
npm install
````
* Make sure you have an inbound rule accepting TCP traffic to the port in Windows Firewall
* Thats it! Now you can navigate to the host and port that you specified
I wanted the `verdaccio` site to be the default site in IIS so I did the following:
* I made sure the .npmrc file in `c:\users{yourname}\` had the registry set to `"registry=http://localhost/"`
* I stopped the "Default Web Site" and only start the site "verdaccio" site in IIS
* I set the bindings to "http", ip address "All Unassigned" on port 80, ok any warning or prompts
These instructions are based on [Host Sinopia in IIS
on Windows](https://gist.github.com/HCanber/4dd8409f79991a09ac75). I had to tweak my web config as per below but you may find the original from the
for mentioned link works better
A default configuration file will be created `c:\verdaccio\verdaccio\config.yaml`
<!-- iisnode folder is where iisnode stores it's logs. These should
never be rewritten -->
<rule name="iisnode" stopProcessing="true">
<match url="iisnode*" />
<action type="None" />
</rule>
<!-- Rewrite all other urls in order for verdaccio to handle these -->
<rule name="verdaccio">
<match url="/*" />
<action type="Rewrite" url="start.js" />
</rule>
</rules>
</rewrite>
<!-- exclude node_modules directory and subdirectories from serving
by IIS since these are implementation details of node.js applications -->
<security>
<requestFiltering>
<hiddenSegments>
<add segment="node_modules" />
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
</configuration>
````
### Troubleshooting
- **The web interface does not load when hosted with https as it tries to download scripts over http.**
Make sure that you have correctly mentioned `url_prefix` in verdaccio config. Follow the [discussion](https://github.com/verdaccio/verdaccio/issues/622).
For more information about the CLI, please [read the cli section](cli.md).
## Docker Image
`verdaccio` has an official docker image you can use, and in most cases, the default configuration is good enough. For more information about how to install the official image, [read the docker section](docker.md).
It's a series of contraints that allow or restrict access to the local storage based in specific criteria.
The security constraints remain on the shoulders of the plugin being used, by default `verdaccio` uses the [htpasswd plugin](https://github.com/verdaccio/verdaccio-htpasswd). If you use a different plugin the behaviour might be different. The default plugin does not handle `allow_access` and `allow_publish` by itself, it uses an internal fallback in case the plugin is not ready for it.
For more information about permissions visit [the authentification section in the wiki](auth.md).
### Usage
```yalm
packages:
# scoped packages
'@scope/*':
access: all
publish: all
proxy: server2
'private-*':
access: all
publish: all
proxy: uplink1
'**':
# allow all users (including non-authenticated users) to read and
# publish all packages
access: all
publish: all
proxy: uplink2
```
if none is specified, the default one remains
```yaml
packages:
'**':
access:all
publish:$authenticated
```
The list of valid groups according the default plugins are
All users recieve all those set of permissions independently of is anonymous or not plus the groups provided by the plugin, in case of `htpasswd` return the username as a group. For instance, if you are logged as `npmUser` the list of groups will be.
```js
// groups without '$' are going to be deprecated eventually
If you want to protect specific set packages under your group, you need to do something like this. Let's use a `Regex` that covers all prefixed `npmuser-` packages. We recomend using a prefix for your packages, in that way it will be easier to protect them.
```yaml
packages:
'npmuser-*':
access:npmuser
publish:npmuser
```
Restart `verdaccio` and in your console try to install `npmuser-core`.
```bash
$ npm install npmuser-core
npm install npmuser-core
npm ERR! code E403
npm ERR! 403 Forbidden: npmuser-core@latest
npm ERR! A complete log of this run can be found in:
You can change the existing behaviour using a different plugin authentication. `verdaccio` just checks whether the user that tried to access or publish a specific package belongs to the right group.
#### Set multiple groups
Defining multiple access groups is fairly easy, just define them with a white space between them.
```yaml
'company-*':
access:admin internal
publish:admin
proxy:server1
'supersecret-*':
access:secret super-secret-area ultra-secret-area
publish:secret ultra-secret-area
proxy:server1
```
#### Blocking access to set of packages
If you want to block the acccess/publish to a specific group of packages. Just do not define `access` and `publish`.
```yaml
packages:
'old-*':
'**':
access:all
publish:$authenticated
```
#### Blocking proxying a set of specific packages
You might want to block one or several packages from fetching from remote repositories., but, at the same time, allow others to access different *uplinks*.
Let's see the following example:
```yaml
packages:
'jquery':
access:$all
publish:$all
'my-company-*':
access:$all
publish:$authenticated
'@my-local-scope/*':
access:$all
publish:$authenticated
'**':
access:all
publish:$authenticated
proxy:npmjs
```
Let's describe what we want with the above example:
* I want to host my own `jquery` dependency but I need to avoid proxying it.
* I want all dependencies that match with `my-company-*` but I need to avoid proxying them.
* I want all dependencies that are in the `my-local-scope` scope but I need to avoid proxying them.
* I want proxying for all the rest of the dependencies.
Be **aware that the order of your packages definitions is important and always use double wilcard**. Because if you do not include it `verdaccio` will include it for you and the way that your dependencies are resolved will be affected.
### Configuration
You can define mutiple `packages` and each of them must have an unique `Regex`.
Property | Type | Required | Example | Support | Description
--- | --- | --- | --- | --- | ---
access | string | No | $all | all | define groups allowed to access the package
publish | string | No | $authenticated | all | define groups allowed to publish
proxy | string | No |npmjs | all | limit look ups for specific uplink
storage | boolean | No | [true,false] | all | TODO
> We higlight that we recommend to not use **allow_access**/**allow_publish** and **proxy_access** anymore, those are deprecated and will soon be removed, please use the short version of each of those (**access**/**publish**/**proxy**).
Verdaccio is an plugabble aplication. It can be extended in many ways, either new authentication methods, adding
endpoints or using a custom storage.
> If you are interested to develop your own plugin, read the [development](dev-plugins.md) section.
## Usage
### Installation
```bash
$> npm install --global verdaccio-activedirectory
```
`verdaccio` as a sinopia fork it has backward compability with plugins that are compatible with `sinopia@1.4.0`. In such case the installation is the same.
```
$> npm install --global sinopia-memory
```
### Configuration
Open the `config.yaml` file and update the `auth` section as follows:
The default configuration looks like this, due we use a build-in `htpasswd` plugin by default that you can disable just commenting out the following lines.
### Auth Plugin Configuration
```yaml
htpasswd:
file:./htpasswd
#max_users: 1000
```
and replacing them with (in case you decide to use a `ldap` plugin.
```yaml
auth:
activedirectory:
url:"ldap://10.0.100.1"
baseDN:'dc=sample,dc=local'
domainSuffix:'sample.local'
```
#### Multiple Auth plugins
This is tecnically possible, the plugins order becames important, the the credentials will resolved in order.
```yaml
auth:
htpasswd:
file:./htpasswd
#max_users: 1000
activedirectory:
url:"ldap://10.0.100.1"
baseDN:'dc=sample,dc=local'
domainSuffix:'sample.local'
```
### Middleware Plugin Configuration
This is an example how to set up a middleware plugin. All middleware plugins must be defined in the **middlewares** namespace.
```yaml
middlewares:
audit:
enabled:true
```
> You might follow the [audit middle plugin](https://github.com/verdaccio/verdaccio-audit) as base example.
### Store Plugin Configuration
This is an example how to set up a storage plugin. All storage plugins must be defined in the **store** namespace.
```yaml
store:
memory:
limit:1000
```
> If you define a custom store, the property **storage** in the configuration file will be ignored.
## Legacy plugins
### Sinopia Plugins
(compatible all versions)
* [sinopia-npm](https://www.npmjs.com/package/sinopia-npm): auth plugin for sinopia supporting an npm registry.
* [sinopia-memory](https://www.npmjs.com/package/sinopia-memory): auth plugin for sinopia that keeps users in memory.
* [sinopia-crowd](https://www.npmjs.com/package/sinopia-crowd): auth plugin for sinopia supporting atlassian crowd.
* [sinopia-activedirectory](https://www.npmjs.com/package/sinopia-activedirectory): Active Directory authentication plugin for sinopia.
* [sinopia-github-oauth](https://www.npmjs.com/package/sinopia-github-oauth): authentication plugin for sinopia2, supporting github oauth web flow.
* [sinopia-delegated-auth](https://www.npmjs.com/package/sinopia-delegated-auth): Sinopia authentication plugin that delegates authentication to another HTTP URL
* [sinopia-altldap](https://www.npmjs.com/package/sinopia-altldap): Alternate LDAP Auth plugin for Sinopia
* [sinopia-request](https://www.npmjs.com/package/sinopia-request): An easy and fully auth-plugin with configuration to use an external API.
* [sinopia-htaccess-gpg-email](https://www.npmjs.com/package/sinopia-htaccess-gpg-email): Generate password in htaccess format, encrypt with GPG and send via MailGun API to users.
* [sinopia-mongodb](https://www.npmjs.com/package/sinopia-mongodb): An easy and fully auth-plugin with configuration to use a mongodb database.
* [sinopia-htpasswd](https://www.npmjs.com/package/sinopia-htpasswd): auth plugin for sinopia supporting htpasswd format.
* [sinopia-leveldb](https://www.npmjs.com/package/sinopia-leveldb): a leveldb backed auth plugin for sinopia private npm.
* [sinopia-gitlabheres](https://www.npmjs.com/package/sinopia-gitlabheres): Gitlab authentication plugin for sinopia.
* [sinopia-gitlab](https://www.npmjs.com/package/sinopia-gitlab): Gitlab authentication plugin for sinopia
* [sinopia-ldap](https://www.npmjs.com/package/sinopia-ldap): LDAP auth plugin for sinopia.
* [sinopia-github-oauth-env](https://www.npmjs.com/package/sinopia-github-oauth-env) Sinopia authentication plugin with github oauth web flow.
> All sinopia plugins should be compatible with all future verdaccio versions. Anyhow, we encourage contributors to migrate them to the
modern verdaccio API and using the prefix as *verdaccio-xx-name*.
## Verdaccio Plugins
(compatible since 2.1.x)
### Authorization Plugins
* [verdaccio-bitbucket](https://github.com/idangozlan/verdaccio-bitbucket): Bitbucket authentication plugin for verdaccio.
* [verdaccio-ldap](https://www.npmjs.com/package/verdaccio-ldap): LDAP auth plugin for verdaccio.
* [verdaccio-active-directory](https://github.com/nowhammies/verdaccio-activedirectory): Active Directory authentication plugin for verdaccio
* [verdaccio-gitlab](https://github.com/bufferoverflow/verdaccio-gitlab): use GitLab Personal Access Token to authenticate
* [verdaccio-htpasswd](https://github.com/verdaccio/verdaccio-htpasswd): Auth based on htpasswd file plugin (built-in) for verdaccio
* [verdaccio-github-oauth](https://github.com/aroundus-inc/verdaccio-github-oauth): Github oauth authentication plugin for verdaccio.
* [verdaccio-github-oauth-ui](https://github.com/n4bb12/verdaccio-github-oauth-ui): GitHub OAuth plugin for the verdaccio login button.
### Middleware Plugins
* [verdaccio-audit](https://github.com/verdaccio/verdaccio-audit): verdaccio plugin for *npm audit* cli support (built-in) (compatible since 3.x)
* [verdaccio-profile-api](https://github.com/ahoracek/verdaccio-profile-api): verdacci plugin for *npm profile* cli support and *npm profile set password* for *verdaccio-htpasswd* based authentificaton
### Storage Plugins
(compatible since 3.x)
* [verdaccio-memory](https://github.com/verdaccio/verdaccio-memory) Storage plugin to host packages in Memory
* [verdaccio-s3-storage](https://github.com/remitly/verdaccio-s3-storage) Storage plugin to host packages **Amazon S3**
* [verdaccio-google-cloud](https://github.com/verdaccio/verdaccio-google-cloud) Storage plugin to host packages **Google Cloud Storage**
## Caveats
> Not all these plugins are been tested continuously, some of them might not work at all.
Please if you found any issue feel free to notify the owner of each plugin.
`verdaccio` allows you protect publish, to achieve that you will need to set up correctly your [packages acces](packages).
### Package configuration
Let's see for instance the following set up. You have a set of dependencies what are prefixed with `my-company-*` and you need to protect them from anonymous or another logged user without right credentials.
```yaml
'my-company-*':
access:admin teamA teamB teamC
publish:admin teamA
proxy:npmjs
```
With this configuration, basically we allow to groups **admin** and **teamA** to * publish* and **teamA****teamB****teamC***access* to such dependencies.
### Use case: teamD try to access the dependency
So, if I am logged as **teamD**. I shouldn't be able to access all dependencies that match with `my-company-*` pattern.
```bash
➜ npm whoami
teamD
```
I won't have access to such dependencies and also won't be visible via web for user **teamD**. If I try to access the following will happen.
```bash
➜ npm install my-company-core
npm ERR! code E403
npm ERR! 403 Forbidden: webpack-1@latest
```
or with `yarn`
```bash
➜ yarn add my-company-core
yarn add v0.24.6
info No lockfile found.
[1/4] 🔍 Resolving packages...
error An unexpected error occurred: "http://localhost:5555/webpack-1: unregistered users are not allowed to access package my-company-core".
This is mostly basic linux server configuration stuff but I felt it important to document and share the steps I took to get verdaccio running permanently on my server. You will need root (or sudo) permissions for the following.
You create a shell as the verdaccio user using the following command:
```bash
$ sudo su verdaccio
$ cd ~
```
The 'cd ~' command send you to the home directory of the verdaccio user. Make sure you run verdaccio at least once to generate the config file. Edit it according to your needs.
## Listening on all addresses
If you want to listen to every external address set the listen directive in the config to:
```yaml
# you can specify listen address (or simply a port)
listen:0.0.0.0:4873
```
If you are running `verdaccio` in a Amazon EC2 Instance, [you will need set the listen in change your config file](https://github.com/verdaccio/verdaccio/issues/314#issuecomment-327852203) as is described above.
> Apache configure? Please check out the [Reverse Proxy Setup](reverse-proxy.md)
## Keeping verdaccio running forever
We can use the node package called 'forever' to keep verdaccio running all the time.
https://github.com/nodejitsu/forever
First install forever globally:
```bash
$ sudo npm install -g forever
```
Make sure you've started verdaccio at least once to generate the config file and write down the created admin user. You can then use the following command to start verdaccio:
```bash
$ forever start `which verdaccio`
```
You can check the documentation for more information on how to use forever.
## Surviving server restarts
We can use crontab and forever together to restart verdaccio after a server reboot.
When you're logged in as the verdaccio user do the following:
```bash
$ crontab -e
```
This might ask you to choose an editor. Pick your favorite and proceed.
Alternatively, if you have a certificate as `server.pfx` format, you can add the following configuration section. The passphrase is optional and only needed, if your certificate is encrypted.
````
https:
pfx: /Users/user/.config/verdaccio/server.pfx
passphrase: 'secret'
````
More info on the `key`, `cert`, `ca`, `pfx` and `passphrase` arguments on the [Node documentation](https://nodejs.org/api/tls.html#tls_tls_createsecurecontext_options)
* Run `verdaccio` in your command line.
* Open the browser and load `https://your.domain.com:port/`
This instructions are mostly valid under OSX and Linux, on Windows the paths will vary but, the steps are the same.
## Docker
If you are using the Docker image, you have to set the `PROTOCOL` environment variable to `https` as the `listen` argument is provided on the [Dockerfile](https://github.com/verdaccio/verdaccio/blob/master/Dockerfile#L43), and thus ignored from your config file.
You can also set the `PORT` environment variable if you are using a different port than `4873`.
Verdaccio has strong focus on unit testing and end to end testing. If you are willing to contribute,
please refer to the following [guide for more information](https://github.com/verdaccio/verdaccio/wiki/Developing-new-tests).
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.