【玩轉樹莓派】使用 sinopia 搭建私有 npm 伺服器

来源:http://www.cnblogs.com/ios122/archive/2017/11/22/7877018.html
-Advertisement-
Play Games

使用 sinopia 的好處是,node系的工程師,內部協作時,使用自有 npm 包,會非常方便;另外,sinopia,會緩存已經下載過的包,可以在相當程度上,加速 npm install 相關命令的執行。 今天我試著直接在樹莓派上搭建一個 sinopia 服務。最終實現的效果較為完整,基本滿足需... ...


簡介

效果展示

使用 sinopia 的好處是,node系的工程師,內部協作時,使用自有 npm 包,會非常方便;另外,sinopia,會緩存已經下載過的包,可以在相當程度上,加速 npm install 相關命令的執行。

工作中,確實有需要用到 sinopia 來作為私有 npm 伺服器的場景。原來一直在自己電腦上開啟 sinopia。這樣做最大的問題是,sinopia 後臺一直開著,會越來越耗費資源,電腦最後會變得很卡。偶爾,還會因為忘記開啟或關閉 sinopia,帶來各種不便利。

今天我試著直接在樹莓派上搭建一個 sinopia 服務。最終實現的效果較為完整,基本滿足需要了。包含用戶許可權管理,外網使用自定義功能變數名稱訪問,sinopia服務開機自啟等特性。

註意:以下 shell 命令,預設在樹莓派的shell中執行,而不是在本機電腦上。

安裝最新長期支持版 node 環境

樹莓派自帶的 node 環境是 v4.8.2,有必要升級下。

安裝 nvm

建議安裝 nvm,以方便管理多個版本的 node 環境。

# 安裝 nvm
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash

# 重啟shell

# 驗證 nvm 安裝
command -v nvm

使用 nvm 安裝最新長期支持版 node 環境

# 安裝 Node
nvm install --lts

#驗證安裝  --> v8.9.1
node -v

安裝和配置 sinopia

安裝 sinopia

# 安裝
npm install -g sinopia

# 驗證是否安裝成功 --> 這一步會輸出自動生成的配置文件路徑等信息。
sinopia

解決埠 4873 占用問題

sinopia 啟動時,預設使用 4873埠,可能會遇到埠衝突問題。

# 安裝 lsof 命令
sudo apt-get update
sudo apt-get install lsof

# 查看埠占用進程 PID
lsof -i :4873

# 殺死占用 4873 埠的進程。4649,要換為實際的 PID。
kill -9 4649

註冊一個預設賬戶

為了提高安全性,我們稍後會禁用 sinopia 的用戶註冊功能,所以先註冊一個預設的 sinopia 賬戶。需要在當前 shell 中執行 sinopia 命令開啟服務之後,再重新打開一個 shell 執行:

npm set registry http://localhost:4873/
npm adduser --registry http://localhost:4873/

用戶名,密碼,郵箱等,要記牢,適當設置的複雜點。

### 升級安裝 vim

感覺樹莓派自帶的 vim 不太好使了,我也順便升級了下。

```
# 安裝 vim
sudo apt-get update
sudo apt-get install vim

# 配置支持vim中滑鼠右鍵複製
vim ~/.vimrc
```

在 .vimrc 此文件中增加如下一行:

shell set mouse=v

配置 sinopia

配置文件路徑可以在執行 sinopia 命令時,從其輸出中查看,一般應是 /home/pi/.config/sinopia/config.yaml

基於我的使用使用經驗和文檔說明,主要配置了以下內容:

  • max_users: -1 :禁用註冊。
  • *npmjs: url: https://registry.npm.taobao.org* : 設置 npm 鏡像為淘寶源,一來可以加速 npm 公共包的安裝,二來藉助淘寶源的只讀特性,避免誤操作發佈私有 npm 包到外網上。
  • access: $authenticated:禁止匿名用戶訪問。配置後,未登錄用戶看不到 sinopia 上私有包的任何信息。
  • max_body_size: '200mb':這樣設置,會提高安裝超級 npm 包的成功率,比如 react-native 。

完整配置內容如下。如果你不是在樹莓派上配置,請把 /home/pi 替換為自己真實的用戶路徑名。

#
# This is the default config file. It allows all users to do anything,
# so don't use it on production systems.
#
# Look here for more config file examples:
# https://github.com/rlidwka/sinopia/tree/master/conf
#

# path to a directory with all packages
storage: /home/pi/.local/share/sinopia/storage

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: -1

# a list of other known repositories we can talk to

uplinks:
  npmjs:
    url: https://registry.npm.taobao.org

packages:
  '@*/*':
    # scoped packages
    access: $authenticated
    publish: $authenticated

  '*':
    # 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: $authenticated

    # allow all known users to publish packages
    # (anyone can register by default, remember?)
    publish: $authenticated

    # if package is not available locally, proxy requests to 'npmjs' registry
    proxy: npmjs

# log settings
logs:
  - {type: stdout, format: pretty, level: http}
  #- {type: file, path: sinopia.log, level: info}

max_body_size: '200mb'

可以在本地編輯器中修改好配置,然後直接複製到樹莓派上:

# 打開配置文件
vim /home/pi/.config/sinopia/config.yaml

使用粘貼命令。直接粘貼,格式會錯亂。

:set paste
i
# 右鍵粘貼即可。

配置frpc 遠程訪問

關於 frp 的配置問題,詳見:【小技巧解決大問題】使用 frp 突破阿裡雲主機無彈性公網 IP 不能用作 Web 伺服器的限制。此處只貼出 frpc 的關鍵配置變更:

[web-sinopia]
type = http
local_port = 4873
subdomain = sinopia

使用 Systemd 實現 sinopia 服務開機自啟

樹莓派,預設是帶有 Systemd 的,直接使用即可:

sudo vim /usr/lib/systemd/system/sinopia.service

sinopia.service 具體內容如下,其中/home/pi/.config/sinopia/config.yaml 要替換為自己的 config.yaml 地址:

[Unit]
DescrIPtion=sinopia
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=/home/pi/.nvm/versions/node/v8.9.1/bin/sinopia /home/pi/.config/sinopia/config.yaml
ExecStop=/bin/kill $MAINPID
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

啟動 sinopia 並設置開機啟動:

systemctl enable sinopia
systemctl start sinopia
systemctl status sinopia

其他可能有用的命令

# 禁用服務
systemctl disable sinopia

# 重新啟動服務
systemctl restart sinopia

在另一臺電腦上使用 sinopia 私有 npm 伺服器功能

假定,最終的 sinopia 伺服器的外網地址是: *http://sinopia.example.com*

真正想使用,需要在終端中配置下:

npm set registry http://sinopia.example.com
npm adduser --registry http://sinopia.example.com
npm login

配置完畢後,你可以試著發佈一個私有 npm 包:

# 在某個文件夾初始化一個新的 npm 包
npm init

# 發佈到私有 sinopia 伺服器:
npm publish

發佈成功後,在瀏覽器中登錄 *http://sinopia.example.com*,刷新頁面,應該就能看到自己剛發佈的那個包了

註意,其他用戶在使用私有庫上的包時,也應該先登錄,否則會報錯:

unregistered users are not allowed to access package

參考文檔


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.Directory//File 文件 Path 路徑 FileStream StreamReader StreamWriter 流 Directory 文件夾 目錄 //創建文件夾 Directory.CreateDirectory(@"C:\a\b"); Console.WriteLine(" ...
  • using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; namespace Cons... ...
  • 1.MD5加密 用戶在資料庫存密碼需要進行再加密,這樣一個過程叫MD5加密只要涉及到存用戶的密碼一定要用MD5加密MD5密碼一般都是16進位的把一個密碼轉換成16進位的過程就叫MD5加密把字元串加密成MD5,這樣一個過程是不可逆的。只能把字元串變成MD5值,不能把MD5值變成字元串但有人模擬過MD5 ...
  • /// /// 加密 /// public static class Encrypting { #region 使用對稱加密、解密 private static string GetEncryptKey() { return ConfigurationManager.AppSettin... ...
  • URL形式: // http://localhost:2692/PDFVIEWER/web/viewer.html?file=http://localhost:2692/TOV/DASystem/GetStreaem?path%3Dftp://ftp賬號:ftp密碼@IP地址/0001/E_File ...
  • 1 public static void CreateConfig(){ 2 //c#可以添加內置的app.config,我們通過ConfigrationManager類可以 3 //可以很輕鬆的操作相關節點,操作的方式,這裡不做多介紹, 4 //引發的問題 當程式編譯的時候會自動生成 程式名.co... ...
  • 什麼是單元測試 寫了個類,要給別人用,會不會有bug?怎麼辦?測試一下。 用main方法測試好不好?不好! 為什麼要進行單元測試 重用測試,應付將來的實現的變化。 提高士氣,明確知道我的東西是沒問題的。 JUnit4 HelloWorld 需要導入JUnit和hamcrest包 放棄舊的斷言,使用h ...
  • jar文件包括java普通類、資源文件和普通文件,在maven中即是打包src/main/java和src/main/resources資源文件夾下的所有文件。在打包的時候會自動生成MATA-INF文件夾,用於存儲maven的pom信息和MANIFEST.MF文件。例如: war文件包含全部的web ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...