From 3c8126615cd2970b10a006ff267517d098be0fd7 Mon Sep 17 00:00:00 2001
From: wanghe
Date: Mon, 5 Aug 2024 14:14:04 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20Verdaccio=20(#1867?=
=?UTF-8?q?)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/verdaccio/5.32.1/data.yml | 10 +
apps/verdaccio/5.32.1/data/config/config.yaml | 203 ++++++++++++++++++
apps/verdaccio/5.32.1/data/plugins/.gitkeep | 0
apps/verdaccio/5.32.1/data/storage/.gitkeep | 0
apps/verdaccio/5.32.1/docker-compose.yml | 20 ++
apps/verdaccio/5.32.1/scripts/init.sh | 3 +
apps/verdaccio/README.md | 3 +
apps/verdaccio/data.yml | 19 ++
apps/verdaccio/logo.png | Bin 0 -> 6802 bytes
9 files changed, 258 insertions(+)
create mode 100644 apps/verdaccio/5.32.1/data.yml
create mode 100644 apps/verdaccio/5.32.1/data/config/config.yaml
create mode 100644 apps/verdaccio/5.32.1/data/plugins/.gitkeep
create mode 100644 apps/verdaccio/5.32.1/data/storage/.gitkeep
create mode 100644 apps/verdaccio/5.32.1/docker-compose.yml
create mode 100644 apps/verdaccio/5.32.1/scripts/init.sh
create mode 100644 apps/verdaccio/README.md
create mode 100644 apps/verdaccio/data.yml
create mode 100644 apps/verdaccio/logo.png
diff --git a/apps/verdaccio/5.32.1/data.yml b/apps/verdaccio/5.32.1/data.yml
new file mode 100644
index 00000000..d7e65136
--- /dev/null
+++ b/apps/verdaccio/5.32.1/data.yml
@@ -0,0 +1,10 @@
+additionalProperties:
+ formFields:
+ - default: "40087"
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
diff --git a/apps/verdaccio/5.32.1/data/config/config.yaml b/apps/verdaccio/5.32.1/data/config/config.yaml
new file mode 100644
index 00000000..8a82cff7
--- /dev/null
+++ b/apps/verdaccio/5.32.1/data/config/config.yaml
@@ -0,0 +1,203 @@
+#
+# This is the default configuration file. It allows all users to do anything,
+# please read carefully the documentation and best practices to
+# improve security.
+#
+# Do not configure host and port under `listen` in this file
+# as it will be ignored when using docker.
+# see https://verdaccio.org/docs/en/docker#docker-and-custom-port-configuration
+#
+# Look here for more config file examples:
+# https://github.com/verdaccio/verdaccio/tree/5.x/conf
+#
+# Read about the best practices
+# https://verdaccio.org/docs/best
+
+# path to a directory with all packages
+storage: /verdaccio/storage/data
+# path to a directory with plugins to include
+plugins: /verdaccio/plugins
+
+# https://verdaccio.org/docs/webui
+web:
+ title: Verdaccio
+ # comment out to disable gravatar support
+ # gravatar: false
+ # by default packages are ordercer ascendant (asc|desc)
+ # sort_packages: asc
+ # convert your UI to the dark side
+ # darkMode: true
+ # html_cache: true
+ # by default all features are displayed
+ # login: true
+ # showInfo: true
+ # showSettings: true
+ # In combination with darkMode you can force specific theme
+ # showThemeSwitch: true
+ # showFooter: true
+ # showSearch: true
+ # showRaw: true
+ # showDownloadTarball: true
+ # HTML tags injected after manifest
+ # scriptsBodyAfter:
+ # - ''
+ # HTML tags injected before ends
+ # metaScripts:
+ # - ''
+ # - ''
+ # - ''
+ # HTML tags injected first child at
+ # bodyBefore:
+ # - '
html before webpack scripts
'
+ # Public path for template manifest scripts (only manifest)
+ # publicPath: http://somedomain.org/
+
+# https://verdaccio.org/docs/configuration#authentication
+auth:
+ htpasswd:
+ file: /verdaccio/storage/htpasswd
+ # Maximum amount of users allowed to register, defaults to "+infinity".
+ # You can set this to -1 to disable registration.
+ # max_users: 1000
+ # Hash algorithm, possible options are: "bcrypt", "md5", "sha1", "crypt".
+ # algorithm: bcrypt # by default is crypt, but is recommended use bcrypt for new installations
+ # Rounds number for "bcrypt", will be ignored for other algorithms.
+ # rounds: 10
+
+# https://verdaccio.org/docs/configuration#uplinks
+# a list of other known repositories we can talk to
+uplinks:
+ npmjs:
+ url: https://registry.npmjs.org/
+
+# Learn how to protect your packages
+# https://verdaccio.org/docs/protect-your-dependencies/
+# https://verdaccio.org/docs/configuration#packages
+packages:
+ '@*/*':
+ # scoped packages
+ access: $all
+ publish: $authenticated
+ unpublish: $authenticated
+ proxy: npmjs
+
+ '**':
+ # allow all users (including non-authenticated users) to read and
+ # publish all packages
+ #
+ # you can specify usernames/groupnames (depending on your auth plugin)
+ # and three keywords: "$all", "$anonymous", "$authenticated"
+ access: $all
+
+ # allow all known users to publish/publish packages
+ # (anyone can register by default, remember?)
+ publish: $authenticated
+ unpublish: $authenticated
+
+ # if package is not available locally, proxy requests to 'npmjs' registry
+ proxy: npmjs
+
+# To improve your security configuration and avoid dependency confusion
+# consider removing the proxy property for private packages
+# https://verdaccio.org/docs/best#remove-proxy-to-increase-security-at-private-packages
+
+# https://verdaccio.org/docs/configuration#server
+# You can specify HTTP/1.1 server keep alive timeout in seconds for incoming connections.
+# A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout.
+# WORKAROUND: Through given configuration you can workaround following issue https://github.com/verdaccio/verdaccio/issues/301. Set to 0 in case 60 is not enough.
+server:
+ keepAliveTimeout: 60
+ # Allow `req.ip` to resolve properly when Verdaccio is behind a proxy or load-balancer
+ # See: https://expressjs.com/en/guide/behind-proxies.html
+ # trustProxy: '127.0.0.1'
+
+# https://verdaccio.org/docs/configuration#offline-publish
+# publish:
+# allow_offline: false
+
+# https://verdaccio.org/docs/configuration#url-prefix
+# url_prefix: /verdaccio/
+# VERDACCIO_PUBLIC_URL='https://somedomain.org';
+# url_prefix: '/my_prefix'
+# // url -> https://somedomain.org/my_prefix/
+# VERDACCIO_PUBLIC_URL='https://somedomain.org';
+# url_prefix: '/'
+# // url -> https://somedomain.org/
+# VERDACCIO_PUBLIC_URL='https://somedomain.org/first_prefix';
+# url_prefix: '/second_prefix'
+# // url -> https://somedomain.org/second_prefix/'
+
+# https://verdaccio.org/docs/configuration#security
+# security:
+# api:
+# legacy: true
+# # recomended set to true for older installations
+# migrateToSecureLegacySignature: true
+# jwt:
+# sign:
+# expiresIn: 29d
+# verify:
+# someProp: [value]
+# web:
+# sign:
+# expiresIn: 1h # 1 hour by default
+# verify:
+# someProp: [value]
+
+# https://verdaccio.org/docs/configuration#user-rate-limit
+# userRateLimit:
+# windowMs: 50000
+# max: 1000
+
+# https://verdaccio.org/docs/configuration#max-body-size
+# max_body_size: 10mb
+
+# https://verdaccio.org/docs/configuration#listen-port
+# 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
+
+# The HTTPS configuration is useful if you do not consider use a HTTP Proxy
+# https://verdaccio.org/docs/configuration#https
+# https:
+# key: ./path/verdaccio-key.pem
+# cert: ./path/verdaccio-cert.pem
+# ca: ./path/verdaccio-csr.pem
+
+# https://verdaccio.org/docs/configuration#proxy
+# http_proxy: http://something.local/
+# https_proxy: https://something.local/
+
+# https://verdaccio.org/docs/configuration#notifications
+# notify:
+# method: POST
+# headers: [{ "Content-Type": "application/json" }]
+# endpoint: https://usagge.hipchat.com/v2/room/3729485/notification?auth_token=mySecretToken
+# content: '{"color":"green","message":"New package published: * {{ name }}*","notify":true,"message_format":"text"}'
+
+middlewares:
+ audit:
+ enabled: true
+
+# https://verdaccio.org/docs/logger
+# log settings
+log: { type: stdout, format: pretty, level: http }
+#experiments:
+# # support for npm token command
+# token: false
+# # enable tarball URL redirect for hosting tarball with a different server, the tarball_url_redirect can be a template string
+# tarball_url_redirect: 'https://mycdn.com/verdaccio/${packageName}/${filename}'
+# # the tarball_url_redirect can be a function, takes packageName and filename and returns the url, when working with a js configuration file
+# tarball_url_redirect(packageName, filename) {
+# const signedUrl = // generate a signed url
+# return signedUrl;
+# }
+
+# translate your registry, api i18n not available yet
+# i18n:
+# list of the available translations https://github.com/verdaccio/verdaccio/blob/master/packages/plugins/ui-theme/src/i18n/ABOUT_TRANSLATIONS.md
+# web: en-US
\ No newline at end of file
diff --git a/apps/verdaccio/5.32.1/data/plugins/.gitkeep b/apps/verdaccio/5.32.1/data/plugins/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/verdaccio/5.32.1/data/storage/.gitkeep b/apps/verdaccio/5.32.1/data/storage/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/apps/verdaccio/5.32.1/docker-compose.yml b/apps/verdaccio/5.32.1/docker-compose.yml
new file mode 100644
index 00000000..464739c7
--- /dev/null
+++ b/apps/verdaccio/5.32.1/docker-compose.yml
@@ -0,0 +1,20 @@
+services:
+ verdaccio:
+ image: verdaccio/verdaccio:5.32.1
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ environment:
+ - VERDACCIO_PORT=${PANEL_APP_PORT_HTTP}
+ ports:
+ - ${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP}
+ volumes:
+ - ./data/storage:/verdaccio/storage
+ - ./data/config:/verdaccio/conf
+ - ./data/plugins:/verdaccio/plugins
+ labels:
+ createdBy: "Apps"
+networks:
+ 1panel-network:
+ external: true
\ No newline at end of file
diff --git a/apps/verdaccio/5.32.1/scripts/init.sh b/apps/verdaccio/5.32.1/scripts/init.sh
new file mode 100644
index 00000000..44a563b2
--- /dev/null
+++ b/apps/verdaccio/5.32.1/scripts/init.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+chown -R 10001:65533 data
\ No newline at end of file
diff --git a/apps/verdaccio/README.md b/apps/verdaccio/README.md
new file mode 100644
index 00000000..66846fcc
--- /dev/null
+++ b/apps/verdaccio/README.md
@@ -0,0 +1,3 @@
+# Verdaccio
+
+**Verdaccio** 是一个简单的、**无需配置的本地私有 npm 注册表**。无需整个数据库即可开始使用!Verdaccio 开箱即用,带有 **自己的小型数据库**,并能够代理其他注册表(例如 npmjs.org),一路缓存下载的模块。对于那些希望扩展存储功能的用户,Verdaccio **支持各种社区制作的插件,可挂接 Amazon 的 s3、Google Cloud Storage 等服务**或创建您自己的插件。
diff --git a/apps/verdaccio/data.yml b/apps/verdaccio/data.yml
new file mode 100644
index 00000000..132df4bc
--- /dev/null
+++ b/apps/verdaccio/data.yml
@@ -0,0 +1,19 @@
+name: Verdaccio
+tags:
+ - DevOps
+title: 本地私有 NPM 注册中心
+description: 本地私有 NPM 注册中心
+additionalProperties:
+ key: verdaccio
+ name: Verdaccio
+ tags:
+ - DevOps
+ shortDescZh: 本地私有 NPM 注册中心
+ shortDescEn: local private NPM registry
+ type: tool
+ crossVersionUpdate: true
+ limit: 0
+ recommend: 0
+ website: https://verdaccio.org/
+ github: https://github.com/verdaccio/verdaccio
+ document: https://verdaccio.org/docs/what-is-verdaccio
\ No newline at end of file
diff --git a/apps/verdaccio/logo.png b/apps/verdaccio/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..1be3a3c2c926f966b14e0293c04126f341ea8656
GIT binary patch
literal 6802
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
AiU0rr
literal 0
KcmV+b0RR6000031