Mac mini m4 自架服務

買了一陣子的Mac mini M4,考量要跑ollama,所以買了 24GB,搭配256GB硬碟,覺得買到32Gb都快可以買兩台16GB有點太盤,所以放棄。

Docker

以前都用原廠Docker來跑,在Mac或PC真的會慢到哭出來,後來發現 OrbStack 好東西,他不只有 Docker容器,還可以閃電般的跑VM,有時候需要一個完整的ubuntu就非常好用,但K8s沒好好用過就先不說,個人用免費,另外有商業用的,用過就回不去 Docker Desktop了。

Screenshot 2025-03-05 at 10.28.44 PM.png

Caddy

就跟Nginx一樣的Web server角色,但不一樣的是非常簡單的設定,而且可以幫你自動註冊 Let's Encrypt,不用再另外裝cerbot,雖然會犧牲一點點效能,相比Nginx。但方便的設定擋與SSL真的是太香了。

我就放一下 Caddy的

docker-compose.yml

services:
  caddy:
    image: caddy:latest
    restart: unless-stopped
    ports:
      - "8000:80"
      - "4433:443"
    volumes:
      - $PWD/Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    networks:
      - caddy
      - host

volumes:
  caddy_data:
    external: true
  caddy_config:

networks:
  caddy:
    external: true
  host:
    driver: bridge

為何用 8000與 4433 port對外,為了避免常用port撞到,這兩個很重要,他在註冊SSL驗domain都會需要,另外我是在家裡用中華電信浮動IP的固定IP撥號(三小),所以會有實體的固定IP,可以在家裡的AirPort(AP)設定 port forward,好讓真實對外的port可以對應到家裡內網的IP與port

Screenshot 2025-03-05 at 10.38.20 PM.png

可以看到把 external port 對應 internal port

  • 80 -> 8000
  • 443 -> 4433 這樣就可以順利的導入內網

Caddyfile

這個是Caddy會的設定檔

webdav.yourdomain {
	reverse_proxy 10.0.0.45:5000 {
		flush_interval -1
	}
	tls {
		protocols tls1.2 tls1.3
	}
}

mail.yourdomain {
	reverse_proxy mailpit:8025 {
     	 flush_interval -1
    	}
	tls {
                protocols tls1.2 tls1.3
        }
}

內部IP

如果是內網的其他設備,可以直接寫IP與Port去做轉導

其他Docker

在同一台主機上跑的其他Docker,記得要用Docker name加上port,這樣才能順利轉導,這個也是卡最久的地方,後面會有其他docker-compose.yml的寫法,讓他們可以和Caddy在同一個network透過docker name來呼叫。

Service server (Docker)

這邊以 mailpit 開發email寄信必備的服務為例

docker-compose.yml

version: '2.4'
services:
  mailpit:
    image: axllent/mailpit
    container_name: mailpit
    restart: unless-stopped
    volumes:
      - ./data:/data
    ports:
      - 8025:8025
      - 1025:1025
    environment:
      MP_MAX_MESSAGES: 5000
      MP_DATABASE: /data/mailpit.db
      MP_SMTP_AUTH_ACCEPT_ANY: 1
      MP_SMTP_AUTH_ALLOW_INSECURE: 1
      MP_UI_AUTH: "user1:passwd1 user2:passwd2"
    networks:
      - caddy
networks:
  caddy:
    external: true
  • 在services下要加上 networks caddy
  • networks 為caddy,記得要加 external: true

實際使用步驟

1. 增加需要的 docker-compose.yml

記得要設定

  • services底下的 networks
  • 最外層的 networks

2. 更改 Caddyfile

  • 設定之前別忘了到DNS先設定,不然茫茫人海,網址找不到IP。
  • 還有你家的AP port forward

可以把上面的範例抄一遍

new_service.yourdomain {
	reverse_proxy new_service:new_port {
     	 flush_interval -1
    	}
	tls {
                protocols tls1.2 tls1.3
        }
}

3.重新啟動 Caddy

docker compose down && docker compose up -d

這樣他就會去reload設定檔與註冊SSL

感想

真的勸敗一台,隨時可以搭建開發或是自己想用的服務,不要急著亂花錢去租虛擬主機

Comments

Copyright © 2023 - All right reserved