从闲置到实用:如何把 Mac mini 变成个人开发和家庭服务器

从闲置到实用:如何把 Mac mini 变成个人开发和家庭服务器

一、引言

你是否有一台闲置的 Mac mini 正在吃灰?或者正在考虑购买一台轻量级的设备来搭建家庭服务器?Mac mini 以其紧凑的体积、优秀的性能功耗比和静音运行的特点,是搭建家庭服务器的理想选择。

为什么要利用闲置的 Mac mini

相比传统的服务器硬件,Mac mini 有以下优势:

  • 低功耗:24小时运行电费成本极低
  • 静音:几乎无噪音,适合放在家中任何位置
  • 性能出色:Apple Silicon 芯片提供强劲的计算能力
  • 体积小巧:不占用太多空间
  • 稳定可靠:macOS 系统稳定性很好

家庭/个人场景下的常见需求

通过改造 Mac mini,我们可以实现:

  • 私人 Git 服务器:托管个人代码,保护隐私
  • 家庭 NAS / 多媒体服务器:集中存储和共享文件、照片、视频
  • 远程开发机:随时随地连接到熟悉的开发环境
  • 轻量级网站或应用托管:运行个人博客、小型应用等

然而,家庭网络通常没有公网 IP,这意味着我们无法从外网直接访问家中的 Mac mini。这就是我们需要解决的核心问题。

二、整体方案概述

问题分析

家庭网络环境的主要挑战:

  1. 没有公网 IP:大多数家庭宽带都是通过运营商的 NAT 网络接入,无法从外网直接访问
  2. 动态 IP:即使有公网 IP,通常也是动态分配的,IP 地址会变化
  3. 防火墙限制:运营商和路由器的防火墙会阻止外网的主动连接

解决方案:frp + 云服务器

frp(Fast Reverse Proxy)是一个专注于内网穿透的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。通过 frp,我们可以:

  • 将内网服务安全地暴露到公网
  • 实现内网穿透,无需公网 IP
  • 支持多种协议和端口转发

核心架构:

1
远程访问者 ←→ HTTPS/SSH ←→ 云服务器(公网)←→ frps ←→ frpc ←→ Mac mini(内网) ←→ 本地服务

这种架构的优势:

  • 成本低:只需要一台便宜的云服务器
  • 安全性高:通过加密隧道传输数据
  • 稳定可靠:frp 经过大量生产环境验证
  • 配置简单:配置文件清晰,易于维护

三、准备工作

硬件要求

  • Mac mini:任何型号都可以,建议 8GB 内存以上
  • 存储空间:根据需求准备足够的存储,可以外接硬盘扩展
  • 网络连接:稳定的家庭宽带,建议上行带宽 > 10Mbps

软件环境

Mac mini 端:

  • macOS:任何支持的版本(建议 macOS 12+)
  • Homebrew:用于安装软件包
  • Xcode Command Line Tools:提供基础开发工具

安装 Homebrew:

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安装 Command Line Tools:

1
xcode-select --install

云服务器选择

选择一台具有公网 IP 的云服务器,推荐配置:

  • CPU:1核心即可
  • 内存:1-2GB
  • 带宽:根据使用需求,1-5Mbps 通常够用
  • 系统:Ubuntu 20.04+ 或 CentOS 7+

推荐服务商:

  • 国内:阿里云轻量应用服务器、腾讯云轻量应用服务器
  • 国外:Vultr、DigitalOcean、AWS EC2(按使用付费)

💡 成本参考:国内轻量服务器约 24-60 元/月,国外 VPS 约 3.5-10 美元/月

基础环境配置

在云服务器上安装必要软件:

1
2
3
4
5
6
7
# Ubuntu/Debian
sudo apt update
sudo apt install -y wget curl unzip

# CentOS/RHEL
sudo yum update -y
sudo yum install -y wget curl unzip

配置防火墙(重要):

1
2
3
4
5
6
7
8
9
10
11
# Ubuntu(使用 ufw)
sudo ufw allow 22 # SSH
sudo ufw allow 7000 # frp 服务端口
sudo ufw allow 6000 # frp 管理端口
sudo ufw enable

# CentOS(使用 firewalld)
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --permanent --add-port=7000/tcp
sudo firewall-cmd --permanent --add-port=6000/tcp
sudo firewall-cmd --reload

在 Mac mini 上启用必要服务:

1
2
3
4
5
# 启用 SSH(远程登录)
sudo systemsetup -setremotelogin on

# 启用屏幕共享(可选)
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.screensharing.plist

四、frp 配置与部署

⚠️ 重要说明:本文已更新为 frp 0.64.0 版本,使用最新的 TOML 配置格式。如果你使用的是旧版本的 frp(< 0.52.0),建议升级到最新版本以获得更好的性能和安全性。INI 配置格式已被弃用,未来版本将移除对 INI 的支持。

4.1 在云服务器上部署 frps(服务端)

下载与安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 登录云服务器
ssh root@your-server-ip

# 下载 frp(以 0.64.0 版本为例)
cd /opt
sudo wget https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_linux_amd64.tar.gz

# 解压
sudo tar -xzf frp_0.64.0_linux_amd64.tar.gz
sudo mv frp_0.64.0_linux_amd64 frp
cd frp

# 查看文件
ls -la
# 输出应该包含:frps(服务端)、frpc(客户端)、配置文件等

编写 frps.toml 配置

💡 注意:从 frp 0.52.0 版本开始,配置文件格式已从 INI 更改为 TOML、YAML 和 JSON。INI 格式已被弃用,建议使用新的 TOML 格式。

1
sudo vim /opt/frp/frps.toml

配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
# frps 监听的端口,用于接收 frpc 的连接
bindPort = 7000

# 认证配置
auth.method = "token"
auth.token = "your_secret_token_here"

# 默认为 127.0.0.1,如果需要公网访问,需要修改为 0.0.0.0。
webServer.addr = "0.0.0.0"
webServer.port = 7500
# dashboard 用户名密码,可选,默认为空
webServer.user = "admin"
webServer.password = "your_password_here"

启动服务并设置开机自启

创建 systemd 服务文件:

1
sudo vim /etc/systemd/system/frps.service

服务配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

启动并启用服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启动 frps 服务
sudo systemctl start frps

# 设置开机自启
sudo systemctl enable frps

# 查看服务状态
sudo systemctl status frps

# 查看服务日志
sudo journalctl -u frps -f

4.2 在 Mac mini 上部署 frpc(客户端)

安装 frp

1
2
3
4
5
6
7
8
# 使用 Homebrew 安装(推荐)
brew install frp

# 或者手动下载安装
cd ~/Downloads
wget https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_darwin_arm64.tar.gz
tar -xzf frp_0.64.0_darwin_arm64.tar.gz
sudo mv frp_0.64.0_darwin_arm64 /usr/local/frp

编写 frpc.toml 配置文件

1
2
3
4
5
# 创建配置目录
sudo mkdir -p /usr/local/etc/frp

# 创建配置文件
sudo vim /usr/local/etc/frp/frpc.toml

配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 服务端地址和端口
serverAddr = "your-server-ip"
serverPort = 7000

# 认证配置(与服务端保持一致)
auth.method = "token"
auth.token = "your_secret_token_here"

# 管理面板配置,可选,默认为空
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "your_password_here"

# 代理配置 - SSH
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222

# 代理配置 - Web 服务(示例)
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080

# 代理配置 - VNC(屏幕共享)
[[proxies]]
name = "vnc"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5900
remotePort = 5900

启动与后台运行

方法一:使用 launchctl(推荐)

创建 LaunchDaemon 配置:

1
sudo vim /Library/LaunchDaemons/com.frp.frpc.plist

配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.frp.frpc</string>

<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/frpc</string>
<string>-c</string>
<string>/usr/local/etc/frp/frpc.toml</string>
</array>

<key>RunAtLoad</key>
<true/>

<key>KeepAlive</key>
<true/>

<key>StandardErrorPath</key>
<string>/var/log/frpc.error.log</string>

<key>StandardOutPath</key>
<string>/var/log/frpc.out.log</string>
</dict>
</plist>

加载并启动服务:

1
2
3
4
5
6
7
8
# 加载服务
sudo launchctl load /Library/LaunchDaemons/com.frp.frpc.plist

# 启动服务
sudo launchctl start com.frp.frpc

# 查看服务状态
sudo launchctl list | grep frpc

4.3 测试连接与远程访问

验证 frp 连接状态

查看服务端状态:

1
2
3
# 访问仪表板
# 在浏览器中打开:http://your-server-ip:7500
# 使用 admin/your_password_here 登录

查看客户端状态:

1
2
3
# 访问本地管理界面
# 浏览器打开:http://127.0.0.1:7400
# 使用 admin/your_password_here 登录

测试 SSH 远程连接

1
2
3
4
# 从任意外网位置连接到 Mac mini
ssh username@your-server-ip -p 2222

# 如果配置正确,应该能够成功连接到 Mac mini

常见问题排查

连接失败的可能原因:

  1. 防火墙设置:确保云服务器开放了相应端口
  2. token 不匹配:检查客户端和服务端的 token 是否一致
  3. 网络问题:测试云服务器和 Mac mini 的网络连通性
  4. 端口冲突:确保配置的端口没有被其他服务占用

调试命令:

1
2
3
4
5
6
7
8
# 测试服务端端口开放
telnet your-server-ip 7000

# 查看端口占用
lsof -i :7000

# 测试网络连通性
ping your-server-ip

五、常见应用场景实践

5.1 远程 SSH:随时远程连接 Mac mini

SSH 是最基础也是最重要的远程访问方式,通过 SSH 你可以:

  • 远程执行命令和脚本
  • 传输文件(scp、rsync)
  • 端口转发(本地/远程端口转发)
  • 搭建安全隧道

SSH 配置优化:

在 Mac mini 上编辑 SSH 配置:

1
sudo vim /etc/ssh/sshd_config

推荐配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 基础配置
Port 22
Protocol 2
PermitRootLogin no

# 安全配置
PasswordAuthentication yes # 初期可以用密码,后期建议改为 no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 性能配置
ClientAliveInterval 60
ClientAliveCountMax 3
MaxAuthTries 3
MaxSessions 10

# 禁用一些不必要的功能
X11Forwarding no
AllowAgentForwarding no
PermitTunnel no

重启 SSH 服务:

1
2
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load /System/Library/LaunchDaemons/ssh.plist

客户端连接示例:

1
2
3
4
5
6
7
8
9
10
11
# 基础连接
ssh username@your-server-ip -p 2222

# 使用密钥连接
ssh -i ~/.ssh/id_rsa username@your-server-ip -p 2222

# 端口转发(将远程的 8080 端口转发到本地 8080)
ssh -L 8080:localhost:8080 username@your-server-ip -p 2222

# 后台运行保持连接
ssh -fN -L 8080:localhost:8080 username@your-server-ip -p 2222

5.2 文件访问 / NAS:多种文件共享方案

方案一:SMB/AFP 文件共享

启用 macOS 文件共享:

1
2
3
4
5
# 启用 SMB 文件共享
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smbd.plist

# 或通过系统设置启用
# 系统设置 > 通用 > 共享 > 文件共享

在 frpc.toml 中添加 SMB 代理:

1
2
3
4
5
6
7
# 在现有的 frpc.toml 文件中添加
[[proxies]]
name = "smb"
type = "tcp"
localIP = "127.0.0.1"
localPort = 445
remotePort = 4445

客户端访问:

1
2
3
4
5
6
7
8
# Windows
\\your-server-ip:4445

# macOS
smb://your-server-ip:4445

# Linux
sudo mount -t cifs //your-server-ip:4445/share /mnt/macmini -o username=your_username

方案二:使用 Nextcloud 搭建私人云盘

使用 Docker 安装 Nextcloud:

1
2
3
4
5
6
7
8
9
10
11
# 安装 Docker
brew install docker

# 启动 Docker Desktop

# 运行 Nextcloud
docker run -d \
--name nextcloud \
-p 8080:80 \
-v nextcloud_data:/var/www/html \
nextcloud:latest

在 frpc.toml 中添加 Nextcloud 代理:

1
2
3
4
5
6
7
# 在现有的 frpc.toml 文件中添加
[[proxies]]
name = "nextcloud"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080

现在你可以通过 http://your-server-ip:8080 访问你的私人云盘。

方案三:使用 FTP/SFTP

启用内置 FTP:

1
2
# macOS 内置 FTP 已被弃用,建议使用 SFTP
# SFTP 基于 SSH,无需额外配置

客户端连接:

1
2
3
4
5
6
7
# 使用 SFTP
sftp -P 2222 username@your-server-ip

# 使用图形化工具:FileZilla、Cyberduck 等
# 主机:your-server-ip
# 端口:2222
# 协议:SFTP

5.3 私人 Git 服务:托管代码仓库

方案一:使用 Gitea(推荐)

安装 Gitea:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 下载 Gitea(M 系列芯片)
cd ~/Downloads
wget -O gitea https://dl.gitea.io/gitea/1.21.0/gitea-1.21.0-darwin-arm64
chmod +x gitea
sudo mv gitea /usr/local/bin/

# 创建 git 用户
sudo dscl . -create /Users/git
sudo dscl . -create /Users/git UserShell /bin/bash
sudo dscl . -create /Users/git RealName "Git Version Control"
sudo dscl . -create /Users/git UniqueID 1001
sudo dscl . -create /Users/git PrimaryGroupID 20
sudo dscl . -create /Users/git NFSHomeDirectory /Users/git
sudo mkdir /Users/git
sudo chown git:staff /Users/git

创建配置文件:

1
2
sudo mkdir -p /etc/gitea
sudo vim /etc/gitea/app.ini

配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[server]
HTTP_PORT = 3000
DOMAIN = your-server-ip
ROOT_URL = http://your-server-ip:3000/

[database]
DB_TYPE = sqlite3
PATH = /Users/git/gitea/data/gitea.db

[repository]
ROOT = /Users/git/gitea-repositories

[security]
INSTALL_LOCK = false
SECRET_KEY = your-secret-key-here

创建启动脚本:

1
sudo vim /Library/LaunchDaemons/com.gitea.gitea.plist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.gitea.gitea</string>

<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/gitea</string>
<string>web</string>
<string>--config</string>
<string>/etc/gitea/app.ini</string>
</array>

<key>RunAtLoad</key>
<true/>

<key>KeepAlive</key>
<true/>

<key>UserName</key>
<string>git</string>

<key>StandardErrorPath</key>
<string>/var/log/gitea.error.log</string>

<key>StandardOutPath</key>
<string>/var/log/gitea.out.log</string>
</dict>
</plist>

在 frpc.toml 中添加 Gitea 代理:

1
2
3
4
5
6
7
# 在现有的 frpc.toml 文件中添加
[[proxies]]
name = "gitea"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3000
remotePort = 3000

现在你可以通过 http://your-server-ip:3000 访问你的私人 Git 服务。

5.4 媒体中心:搭建 Plex、Jellyfin

使用 Plex 搭建媒体中心

安装 Plex Media Server:

1
2
3
4
# 下载 Plex
# 从官网下载:https://www.plex.tv/media-server-downloads/

# 安装后,Plex 会自动启动并监听 32400 端口

在 frpc.toml 中添加 Plex 代理:

1
2
3
4
5
6
7
# 在现有的 frpc.toml 文件中添加
[[proxies]]
name = "plex"
type = "tcp"
localIP = "127.0.0.1"
localPort = 32400
remotePort = 32400

配置媒体库:

  1. 访问 http://your-server-ip:32400/web
  2. 创建媒体库,指向你的视频文件目录
  3. Plex 会自动扫描并整理媒体文件

使用 Jellyfin(开源替代方案)

使用 Docker 安装 Jellyfin:

1
2
3
4
5
6
7
docker run -d \
--name jellyfin \
-p 8096:8096 \
-v jellyfin_config:/config \
-v jellyfin_cache:/cache \
-v /path/to/media:/media \
jellyfin/jellyfin:latest

在 frpc.toml 中添加代理:

1
2
3
4
5
6
7
# 在现有的 frpc.toml 文件中添加
[[proxies]]
name = "jellyfin"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8096
remotePort = 8096

5.5 轻量应用托管:Node.js、FastAPI、小型网站

托管 Node.js 应用

示例:简单的 Express 应用

1
2
3
4
5
6
7
8
9
10
11
12
// app.js
const express = require('express');
const app = express();
const port = 3001;

app.get('/', (req, res) => {
res.send('Hello from Mac mini Server!');
});

app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});

使用 PM2 管理 Node.js 应用:

1
2
3
4
5
6
7
8
9
# 安装 PM2
npm install -g pm2

# 启动应用
pm2 start app.js --name "my-app"

# 设置开机自启
pm2 startup
pm2 save

在 frpc.toml 中添加代理:

1
2
3
4
5
6
7
# 在现有的 frpc.toml 文件中添加
[[proxies]]
name = "nodejs-app"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3001
remotePort = 3001

托管 Python FastAPI 应用

示例应用:

1
2
3
4
5
6
7
8
9
10
11
12
# main.py
from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get("/")
async def read_root():
return {"message": "Hello from Mac mini FastAPI!"}

if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)

使用 systemd 管理(通过 Docker):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Dockerfile
FROM python:3.9-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .
EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

# 构建并运行
docker build -t my-fastapi .
docker run -d --name my-fastapi -p 8000:8000 my-fastapi

在 frpc.toml 中添加代理:

1
2
3
4
5
6
7
# 在现有的 frpc.toml 文件中添加
[[proxies]]
name = "fastapi"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8000
remotePort = 8000

六、安全与优化

6.1 使用 frp 的 token/鉴权

强化 token 安全:

1
2
3
# 生成一个强密码作为 token
openssl rand -base64 32
# 输出类似:abc123def456ghi789jkl012mno345pqr678stu901vwx234yz=

在服务端和客户端配置文件中使用相同的强 token:

1
2
3
# frps.toml 和 frpc.toml 中都要设置
auth.method = "token"
auth.token = "abc123def456ghi789jkl012mno345pqr678stu901vwx234yz="

启用 TLS 加密:

1
2
3
4
5
6
7
8
# frps.toml
bindPort = 7000
transport.tls.force = true

# frpc.toml
serverAddr = "your-server-ip"
serverPort = 7000
transport.tls.enable = true

6.2 配置云服务器的防火墙和安全组

使用 iptables 配置防火墙

基础防火墙规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 清空现有规则
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X

# 设置默认策略
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许 SSH(22 端口)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许 frp 端口
sudo iptables -A INPUT -p tcp --dport 7000 -j ACCEPT # frp 服务端口
sudo iptables -A INPUT -p tcp --dport 6000 -j ACCEPT # frp 仪表板

# 允许代理端口(根据需要添加)
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT # SSH 代理
sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT # Gitea
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT # Web 应用

# 保存规则
sudo iptables-save > /etc/iptables/rules.v4

云服务商安全组配置

阿里云安全组规则示例:

协议 端口范围 授权对象 描述
TCP 22 0.0.0.0/0 SSH 登录
TCP 7000 0.0.0.0/0 frp 服务端口
TCP 6000 你的IP/32 frp 仪表板(限制访问)
TCP 2222 0.0.0.0/0 SSH 代理端口
TCP 3000-8999 0.0.0.0/0 应用端口范围

腾讯云防火墙规则类似配置。

6.3 为 Mac mini 启用 SSH Key 登录,关闭密码登录

生成和配置 SSH 密钥

在客户端生成密钥对:

1
2
3
4
5
6
7
# 生成 RSA 密钥(推荐 4096 位)
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"

# 或生成 Ed25519 密钥(更安全)
ssh-keygen -t ed25519 -C "your-email@example.com"

# 密钥默认保存在 ~/.ssh/id_rsa(或 id_ed25519)

将公钥复制到 Mac mini:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 方法一:使用 ssh-copy-id
ssh-copy-id -p 2222 username@your-server-ip

# 方法二:手动复制
cat ~/.ssh/id_rsa.pub | ssh -p 2222 username@your-server-ip 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'

# 方法三:直接在 Mac mini 上操作
# 在 Mac mini 上:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
# 粘贴公钥内容
chmod 600 ~/.ssh/authorized_keys

修改 SSH 配置禁用密码登录:

1
2
# 在 Mac mini 上编辑 SSH 配置
sudo vim /etc/ssh/sshd_config

关键配置修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 禁用密码登录
PasswordAuthentication no
ChallengeResponseAuthentication no

# 启用密钥登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 禁用空密码
PermitEmptyPasswords no

# 禁用 root 登录
PermitRootLogin no

# 限制登录尝试
MaxAuthTries 3

# 指定允许登录的用户(可选)
AllowUsers your_username

重启 SSH 服务:

1
2
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load /System/Library/LaunchDaemons/ssh.plist

6.4 frp 流量加密压缩参数

启用数据压缩

在 frpc.toml 中启用压缩:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
serverAddr = "your-server-ip"
serverPort = 7000
auth.method = "token"
auth.token = "your-secret-token"

# 启用数据压缩
transport.useCompression = true

# 为特定代理启用压缩
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222
transport.useCompression = true

配置带宽限制

限制带宽使用:

1
2
3
4
5
6
7
8
9
10
11
12
# frps.toml 中限制总带宽
bindPort = 7000
transport.bandwidthLimit = "100MB" # 限制总带宽为 100MB/s

# frpc.toml 中为特定代理限制带宽
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222
transport.bandwidthLimit = "1MB" # 限制此代理带宽为 1MB/s

启用端口复用优化

1
2
3
# frps.toml 和 frpc.toml 中都启用
transport.tcpMux = true
transport.tcpMuxKeepaliveInterval = 60

6.5 资源监控与日志查看

设置日志轮转

配置 logrotate:

1
2
# 在云服务器上创建 logrotate 配置
sudo vim /etc/logrotate.d/frp

配置内容:

1
2
3
4
5
6
7
8
9
10
11
12
/var/log/frps.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 nobody nobody
postrotate
systemctl reload frps > /dev/null 2>&1 || true
endscript
}

在 Mac mini 上设置日志管理:

1
2
# 使用 newsyslog 管理日志
sudo vim /etc/newsyslog.conf

添加行:

1
/var/log/frpc.log    644  5     1000  *     Z

监控系统资源

创建简单的监控脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# monitor.sh
#!/bin/bash

# 检查 frp 进程状态
if ! pgrep -f "frpc" > /dev/null; then
echo "$(date): frpc is not running, restarting..." >> /var/log/frp_monitor.log
sudo launchctl start com.frp.frpc
fi

# 检查磁盘使用率
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 80 ]; then
echo "$(date): Disk usage is ${DISK_USAGE}%" >> /var/log/frp_monitor.log
fi

# 检查内存使用率
MEMORY_USAGE=$(vm_stat | grep "Pages free" | awk '{print $3}' | sed 's/\.//')
echo "$(date): System status check completed" >> /var/log/frp_monitor.log

设置定时任务:

1
2
3
4
5
# 编辑 crontab
crontab -e

# 添加监控任务(每 5 分钟检查一次)
*/5 * * * * /path/to/monitor.sh

查看连接状态和性能

查看 frp 连接状态:

1
2
3
4
5
# 访问 frps 仪表板
curl -u admin:password http://your-server-ip:6000/api/status

# 查看当前连接
curl -u admin:password http://your-server-ip:6000/api/proxy/tcp

监控网络流量:

1
2
3
4
5
6
# 使用 nettop 监控网络使用
sudo nettop -m tcp

# 使用 iftop 监控流量(需安装)
brew install iftop
sudo iftop -i en0

七、总结与展望

闲置设备的价值再利用

通过这篇文章的实践,我们成功将一台闲置的 Mac mini 改造成了功能强大的个人服务器。这种改造的价值体现在:

经济效益:

  • 避免了购买专业服务器的高昂成本
  • 充分利用现有硬件资源,降低设备闲置浪费
  • 云服务器成本相对较低(月费用 20-60 元)

功能完整性:

  • 实现了多种实用功能:远程开发、文件存储、代码托管、媒体中心
  • 满足个人和小团队的大部分需求
  • 性能足以支撑中等规模的应用负载

技术成长:

  • 学习了 frp 内网穿透技术
  • 掌握了 macOS 服务器配置和管理
  • 提升了网络安全和系统运维能力

frp 的更多玩法

除了本文介绍的基础应用场景,frp 还有更多高级用法:

多端口代理和负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 负载均衡配置示例
[[proxies]]
name = "web1"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8001
remotePort = 8080
loadBalancer.group = "web"
loadBalancer.groupKey = "123456"

[[proxies]]
name = "web2"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8002
remotePort = 8080
loadBalancer.group = "web"
loadBalancer.groupKey = "123456"

HTTP/HTTPS 代理和自定义域名

1
2
3
4
5
6
7
8
9
10
11
12
# HTTP 代理配置
[[proxies]]
name = "web-http"
type = "http"
localPort = 8080
customDomains = ["your-domain.com"]

[[proxies]]
name = "web-https"
type = "https"
localPort = 8080
customDomains = ["secure.your-domain.com"]

UDP 代理和 P2P 连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# UDP 代理(适用于游戏服务器等)
[[proxies]]
name = "game-server"
type = "udp"
localIP = "127.0.0.1"
localPort = 7777
remotePort = 7777

# P2P 连接
[[proxies]]
name = "p2p-ssh"
type = "xtcp"
secretKey = "your-secret-key"
localIP = "127.0.0.1"
localPort = 22

后续可扩展方案

结合 Docker 容器化部署

创建 Docker Compose 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# docker-compose.yml
version: '3.8'
services:
gitea:
image: gitea/gitea:latest
ports:
- "3000:3000"
volumes:
- gitea_data:/data
restart: always

nextcloud:
image: nextcloud:latest
ports:
- "8080:80"
volumes:
- nextcloud_data:/var/www/html
restart: always

jellyfin:
image: jellyfin/jellyfin:latest
ports:
- "8096:8096"
volumes:
- jellyfin_config:/config
- /Users/Shared/Media:/media
restart: always

volumes:
gitea_data:
nextcloud_data:
jellyfin_config:

这样可以更容易地管理多个服务,并且具有更好的隔离性和可移植性。

集成 Kubernetes(k8s)

对于更复杂的场景,可以在 Mac mini 上搭建单节点 k8s 集群:

1
2
3
4
5
# 安装 k3s(轻量级 k8s)
curl -sfL https://get.k3s.io | sh -

# 部署应用
kubectl apply -f your-app-deployment.yaml

家庭自动化集成(Home Assistant)

安装 Home Assistant:

1
2
3
4
5
6
7
8
9
# 使用 Docker 安装
docker run -d \
--name homeassistant \
--privileged \
--restart=unless-stopped \
-e TZ=Asia/Shanghai \
-v homeassistant_config:/config \
-p 8123:8123 \
ghcr.io/home-assistant/home-assistant:stable

在 frpc.toml 中添加代理:

1
2
3
4
5
6
7
# 在现有的 frpc.toml 文件中添加
[[proxies]]
name = "homeassistant"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8123
remotePort = 8123

这样你就可以远程控制家中的智能设备了。

性能优化建议

硬件优化:

  • 升级到 SSD 存储以提升 I/O 性能
  • 增加内存支持更多并发服务
  • 考虑外接网络存储(NAS)扩展容量

软件优化:

  • 定期清理日志和临时文件
  • 使用 SSD 优化的文件系统设置
  • 配置合理的服务启动顺序

网络优化:

  • 升级家庭宽带带宽
  • 使用有线连接而非 Wi-Fi
  • 优化 frp 参数和压缩设置

结语

将闲置的 Mac mini 改造成个人服务器是一个非常有价值的项目。它不仅能够满足我们的实际需求,还能让我们学习到很多有用的技术知识。

随着云原生技术的发展,个人服务器的可能性越来越大。无论是作为学习平台、开发环境,还是家庭数据中心,Mac mini 都能够胜任。

希望这篇文章能够帮助你成功搭建自己的个人服务器,让闲置的设备重新焕发生机!


参考资源

💡 提示:在实际部署过程中,请根据自己的具体情况调整配置参数,并注意数据备份和安全防护。

从闲置到实用:如何把 Mac mini 变成个人开发和家庭服务器

https://blog.ailln.com/v2ai/2025/08/28/linux/19-frp/

作者

Ailln

发布于

2025-08-28

更新于

2025-08-28

许可协议

评论