【玩轉樹莓派】使用 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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...