使用 sinopia 的好處是,node系的工程師,內部協做時,使用自有 npm 包,會很是方便;另外,sinopia,會緩存已經下載過的包,能夠在至關程度上,加速 npm install 相關命令的執行。php
工做中,確實有須要用到 sinopia 來做爲私有 npm 服務器的場景。原來一直在本身電腦上開啓 sinopia。這樣作最大的問題是,sinopia 後臺一直開着,會愈來愈耗費資源,電腦最後會變得很卡。偶爾,還會由於忘記開啓或關閉 sinopia,帶來各類不便利。html
今天我試着直接在樹莓派上搭建一個 sinopia 服務。最終實現的效果較爲完整,基本知足須要了。包含用戶權限管理,外網使用自定義域名訪問,sinopia服務開機自啓等特性。node
注意:如下 shell 命令,默認在樹莓派的shell中執行,而不是在本機電腦上。react
樹莓派自帶的 node 環境是 v4.8.2,有必要升級下。linux
建議安裝 nvm,以方便管理多個版本的 node 環境。ios
# 安裝 nvm wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash # 重啓shell # 驗證 nvm 安裝 command -v nvm
# 安裝 Node nvm install --lts #驗證安裝 --> v8.9.1 node -v
# 安裝 npm install -g sinopia # 驗證是否安裝成功 --> 這一步會輸出自動生成的配置文件路徑等信息。 sinopia
sinopia 啓動時,默認使用 4873端口,可能會遇到端口衝突問題。git
# 安裝 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 執行:github
npm set registry http://localhost:4873/ npm adduser --registry http://localhost:4873/
用戶名,密碼,郵箱等,要記牢,適當設置的複雜點。web
### 升級安裝 vimshell
感受樹莓派自帶的 vim 不太好使了,我也順便升級了下。
# 安裝 vim sudo apt-get update sudo apt-get install vim # 配置支持vim中鼠標右鍵複製 vim ~/.vimrc
在 .vimrc 此文件中增長以下一行:
set mouse=v
配置文件路徑能夠在執行 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 # 右鍵粘貼便可。
關於 frp 的配置問題,詳見:【小技巧解決大問題】使用 frp 突破阿里雲主機無彈性公網 IP 不能用做 Web 服務器的限制。此處只貼出 frpc 的關鍵配置變動:
[web-sinopia] type = http local_port = 4873 subdomain = 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 服務器的外網地址是: 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
[Node Version Manager - Simple bash script to manage multiple active node.js versions