使用 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
參考文檔
- Node Version Manager - Simple bash script to manage multiple active node.js versions
- sinopia 官方文檔
- 解決vim中滑鼠右鍵無法複製的問題
- vim auto insert comments '#'
- 【小技巧解決大問題】使用 frp 突破阿裡雲主機無彈性公網 IP 不能用作 Web 伺服器的限制
- 藉助 frp 隨時隨地訪問自己的樹莓派
- systemctl命令