🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

概要

大學時期我購買了一台私用的迷你電腦,但因為後來也買了Mac,使用的機會大減。
最近,我覺得這樣放著實在可惜,決定將其伺服器化以用於學習。
這次我想整理一下其過程及利用GitHub Actions導入CI/CD的相關內容。

環境

迷你電腦:Minisforum UM680 Slim/UM870 Slim
檢證用電腦:MacBook Pro M1
USB隨身碟:隨便都可以,至少10GB以上即可。
ISO檔案:Ubuntu Server 24.04 LTS
滑鼠與鍵盤:隨便都可以,直接登錄迷你電腦操作時需要。

當時對迷你電腦一無所知就購買,但似乎規格還不錯(目前約售5萬日元)。
依用途而定,對於個人開發來說,可能可以更便宜的選擇。

迷你電腦伺服器化後,透過有線網路連接到互聯網。

伺服器化迷你電腦

安裝作業系統

參考了這篇文章
將進行作業系統的安裝。

固定IP地址

固定IP會使得之後使用ssh連接時更方便。
上面資料中IP的設定大致相同,但我將config文件的內容修改為以下:

/etc/netplan/99_config.yaml
network:
    version: 2
    ethernets:
      eno1:
        dhcp4: false
    bridges: 
      br0:
        interfaces:
          - eno1
        dhcp4: false
        addresses:
          - 192.168.11.2/24
        routes:
          - to: default
            via: 192.168.11.1
        nameservers:
          addresses:
            - 192.168.11.1
            - 8.8.8.8
            - 1.1.1.1

簡單說明上面的代碼:

  • ethernets:L2層的網路,即LAN。
    • eno1:該迷你電腦的NIC,為該迷你電腦的網路入口。
    • dhcp4: false:禁用dhcp,這是一個動態分配IP的功能。
  • bridges:將NIC集合在一起並連接的設定。
    • br0:橋的名稱
    • interfaces:指定要聚合的NIC。
    • addresses:指定希望固定的IP地址。
    • routes:在此設定路由器的IP地址。
    • nameservers:DNS的設定。

Mac用戶可從左上角的蘋果標誌 > 系統設定 > Wi-Fi點擊以查詢自己的PC與路由器的IP。
最後別忘了應用網路設定。

sudo netplan apply

SSH設定

可以參考之前的資料繼續下去,但
如果使用SSH,可以選擇不使用密碼認證,而是使用秘鑰與公鑰的認證方式。
一般而言,公開密鑰方式較安全,亦較常用於業務上。

設定完認證方法後,可以用以下命令從PC訪問。

ssh [email protected]

192.168.11.2是先前固定的IP地址。
之後無需直接登錄迷你電腦進行操作,可以從同一LAN內的PC使用SSH訪問。

構建虛擬機

接下來在伺服器內構建VM。
由於目的是導入CI/CD,因此會構建兩個容器,以下將構建CI用的VM。
參考了以下的文章。

VM構建所需的虛擬化軟體

使用了可以在Ubuntu上使用的KVM。
詳情請參考之前的資料。

安裝所需的套件

sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

確認安裝

sudo systemctl status libvirtd

若顯示“active (running)”則表示OK。

驗證虛擬化是否可用:

virsh list --all

若出現空白列表則表示沒有問題。

使用Cloud Init構建虛擬機

使用Cloud Init,可以在構建VM之前先設定初始配置。

下載ISO映像

移動到想要下載映像的資料夾後進行下載。

mkdir -p ~/vm-images
cd ~/vm-images
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img

稍後還會生成一個SSH密鑰以便從迷你電腦訪問VM。

ssh-keygen -t ed25519 -C "ci-cd@minipc"

-C後面的部分可以隨意設置。

創建Cloud Init所需的配置文件

可以將Cloud Init的初始設置整理成文件。
最終的目錄結構如下所示:

├── vm-images
│   ├── ci-seed.iso
│   ├── ci-server.qcow2
│   └── noble-server-cloudimg-amd64.img
└── vm-seed
    └── ci
        ├── meta-data
        └── user-data
mkdir -p ~/vm-seed/ci
cd ~/vm-seed/ci
sudo vi user-data
  • user-data
    
    #cloud-config
    hostname: ci-server

password: (設定的任意密碼)
chpasswd: {expire: False}
ssh_pwauth: True
ssh_authorized_keys:

  • (公開鍵(.pub)複製到此處)
    
    這樣進入伺服器時可使用  
    用戶名:ubuntu  
    密碼:已設置的密碼  
    進行登錄。  
    此外,SSH也會在IP地址固定後立即可以使用。
關於user-data的補充(可選擇跳過)

也有可以任意設置用戶名和密碼的方法。

#cloud-config
hostname: ci-server

users:
  - name: hogehoge
    gecos: Ubuntu
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: sudo
    shell: /bin/bash
    lock_passwd: false
    passwd: (任意的密碼)
    ssh_authorized_keys:
      - (複製公開鍵到此處)

chpasswd:
  list: |
    hogehoge:設定的密碼
  expire: false

ssh_pwauth: true

sudo: ALL=(ALL) NOPASSWD:ALL會禁用使用sudo時的密碼。
這次由於是個人開發,並未公開在互聯網上,因此採用此設定,但若要公開,建議設置密碼。

  • meta-data
    sudo vi meta-data

    設定主機名稱與ID。

    instance-id: ci-server-001
    local-hostname: ci-server

創建ISO映像

cd ~
mkdir vm-images
cd vm-images
genisoimage -output ci-seed.iso -volid cidata -joliet -rock ~/vm-seed/ci/user-data ~/vm-seed/ci/meta-data

使用genisoimage創建ISO映像,完成後會生成ci-seed.iso。

  • 創建差分磁碟
    qemu-img create -f qcow2 -b ~/vm-images/noble-server-cloudimg-amd64.img -F qcow2 ~/vm-images/ci-server.qcow2

    基於下載的客戶端映像創建差分磁碟(實際上是複製,但僅保存與原件的差異)。
    將磁碟大小設置為增大,以便于在虛擬機中安裝docker等各種包。

    qemu-img resize ~/vm-images/ci-server.qcow2 20G

啟動虛擬機

virt-install --name cd-server --ram 2018 --vcpus 2 --disk path=~/vm-images/cd-server.qcow2,size=20 --disk path=~/vm-images/cd-seed.iso,device=cdrom --import --graphics none --os-variant ubuntu24.04 --network bridge=br0

指定之前創建的ISO映像和差分磁碟以啟動虛擬機。

  • 登錄
    輸入之前user-data中設置的用戶名和密碼。

  • 網路設定
    /etc/netplan/50-cloud-init.yaml會自動生成。
    請修改此文件:

    50-cloud-init.yaml
    network:
    version: 2
    ethernets:
    enp1s0:
      dhcp4: no
      addresses:
        - 192.168.11.50/24
      routes:
        - to: default
          via: 192.168.11.1
      nameservers:
        addresses:
          - 192.168.11.1
          - 8.8.8.8
          - 1.1.1.1

    與先前迷你電腦的設定相比,沒有bridges的設定。
    IP會被固定化。

  • 應用網路設定

    sudo netplan apply
  • 防止cloud-init覆蓋網路設定

    sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg <<EOF
    network: {config: disabled}
    EOF

    ※如果不執行此設定,重啟時可能會重置配置。

  • 確保主機再啟動時自動啟動

    virsh autostart cd-server

驗證

這樣一來,設定全部完成,接下來就可以進行ssh等的驗證。
要退出虛擬機,執行以下命令

exit

當出現此畫面時,輸入control+]
スクリーンショット 2025-10-13 0.08.33.png

  • 驗證命令

    virsh list -all -> 確認正在運行的VM
    virsh console <伺服器名稱> -> 登入伺服器
    virsh shutdown cd-server -> 關閉伺服器
    virsh start cd-server -> 啟動伺服器
    virsh undefine cd-server -> 刪除伺服器

    執行除了最後刪除伺服器外的其他命令。

  • SSH驗證
    使用先前固定的IP進行ssh連接。

    ssh 用戶名@192.168.11.50

    確定能否成功登錄伺服器後,CI用伺服器的設定就完成了。
    CD用的構建請參見「創建Cloud Init所需的配置文件」以下部分,再重新命名進行。

CI的導入

截至目前,已經構建了兩台VM伺服器。
接下來將導入CI。

使用的服務

GitHub Actions:可在GitHub上自動化的工作流程(預定義處理與條件的組合)服務。
self-hosted runner:自行準備伺服器並可在工作流程中使用的服務。

GitHub Actions的導入

接下來將先前構建的CI用伺服器導入至GitHub Actions。
將參考以下資料來進行。

在GitHub上創建空白倉庫

私有或公共均可。

將CI用伺服器登記為Runner

參考之前的資料中的「自托管Runner的構建」將CI用伺服器登記為Runner。
按照該資料進行應該就沒有問題。

總結

這次我將PC伺服器化並註冊為GitHub Actions的Runner。
下次將實際實現Web應用程式的CI/CD。


原文出處:https://qiita.com/komikomi/items/bf3b7efddcccba57d427


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝22   💬9   ❤️6
613
🥈
我愛JS
📝4   💬14   ❤️7
274
🥉
御魂
💬1  
3
#4
2
#5
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付