📸 自建图床保姆级教程:Linux 部署 Lsky Pro + 内网云公网访问
让家里的服务器成为你的专属图床,公网 HTTPS 高速访问,登录上传全在内网,安全隔离。
一、为什么需要自建图床?
用过微博图床、SM.MS、路过图床的朋友都懂——免费图床总有这么几个痛点:
| 痛点 | 说明 |
|---|---|
| 😱 被删图 | 第三方图床说关就关,你文章里的图全裂 |
| 🐢 速度慢 | 高峰期加载慢,海外节点更糟 |
| 🔒 隐私担忧 | 图片上传到别人服务器,敏感图片不敢传 |
| 📏 容量限制 | 免费版几 GB,超过就收费 |
自建图床 + 内网云隧道穿透的组合拳,完美解决:
- ✅ 图片存在自家服务器,永不删图
- ✅ 公网 HTTPS 访问,速度由你带宽决定
- ✅ 登录/上传/管理全部走内网,公网只读图片
- ✅ 零依赖:PHP 8.2 + SQLite,连 MySQL 都不用装
二、整体架构
┌─── 公网 ─────────────────────────────────────┐
│ │
│ https://你的域名/i/xxx.png │
│ ↑ HTTPS 443 │
│ [内网云 Tunnel] │
│ ↑ SSH反向代理 :80 │
├───────────────────────────────────────────────┤
│ Linux 服务器 (lsky-image-host) │
│ ┌────────────────────── ───────────────────┐ │
│ │ PHP artisan serve --port=8080 │ │
│ │ └─ Lsky Pro (Laravel 9 + SQLite) │ │
│ │ nssh --daemon -R 80:127.0.0.1 │ │
│ └─────────────────────────────────────────┘ │
└───────────────────────────────────────────────┘
| 层级 | 组件 | 说明 |
|---|---|---|
| 公网入口 | 内网云隧道 | 通过你的域名访问 |
| 隧道客户端 | nssh | 7MB 二进制,零依赖 |
| 图床服务 | Lsky Pro V2.1 | Laravel 9 + SQLite,单进程 |
| 运行环境 | Linux 服务器 | Debian 12,1 核 1G 内存够用 |
三、Lsky Pro 是什么?
Lsky Pro 是一款开源的 PHP 图床程序,号称「您的图片在此安家」。
核心特性:
| 特性 | 详情 |
|---|---|
| 🆓 免费开源 | 基于 MIT 协议,GitHub ⭐ 4k+ |
| 🗄️ 零数据库依赖 | SQLite 可选,无需 MySQL |
| 📦 超轻量 | PHP 8.2 + Composer,7 个扩展搞定 |
| 🔌 API 丰富 | 完整的 REST API,配合 PicGo/uPic 等工具 |
| 🖼️ 支持相册管理 | 图片分类、批量操作 |
| 👥 多用户 | 支持分组、存储策略、容量配额 |
| 🛡️ 权限控制 | 可关闭注册、关闭游客上传、关闭公开画廊 |
和主流图床对比:
| 对比项 | Lsky Pro 自建 | SM.MS | 微博图床 |
|---|---|---|---|
| 存储空间 | 你硬盘多大就多大 | 5GB免费 | 有限制 |
| 图片安全 | ✅ 自己 控制 | ⚠️ 可能被删 | ❌ 经常裂图 |
| 上传速度 | 内网千兆 | 受限于国际带宽 | 国内快 |
| API接口 | ✅ 完整REST API | ✅ 有 | ❌ 无 |
| 成本 | 电费+域名 | ¥69/年起 | 免费 |
后台界面一览:

四、内网云是什么?
「内网也可以变成云」——内网云(neiwangyun.net)是一款 SSH 反向代理穿透服务,它的理念是:不需要公网 IP,不需要配置路由器,一行命令把内网服务暴露到公网。
官网: https://www.neiwangyun.net
核心能力:
| 能力 | 说明 |
|---|---|
| 🔗 SSH 反向隧道 | 基于标准 SSH -R 协议 |
| ⚡ 三端接入 | HTTP / HTTPS / 自定义端口 |
| 📦 零依赖客户端 | nssh 客户端仅 5-7MB,下载即用 |
| 🖥️ 跨平台 | Linux/Windows/macOS/路由器全支持 |
| 🔄 断线重连 | 守护进程自动维护连接 |
| 🎮 多连接管理 | --list/--restart/--stop 一键管理 |
五、Linux 上部署 Lsky Pro
5.1 安装 PHP 和扩展
Lsky Pro 依赖 PHP 8.2 + 几个扩展,最精简安装:
apt-get update -qq
apt-get install -y -qq \
php8.2-cli php8.2-sqlite3 php8.2-mbstring php8.2-gd \
php8.2-xml php8.2-curl php8.2-zip php8.2-bcmath \
php8.2-imagick unzip wget curl git composer
| 扩展 | 用途 |
|---|---|
php8.2-cli | PHP 命令行(Lsky 用 artisan serve 运行) |
php8.2-sqlite3 | SQLite 数据库驱动(零外部数据库) |
php8.2-gd + imagick | 图片处理(缩放、裁剪、水印) |
php8.2-curl | HTTP 请求(下载/API) |
💡 安装 PHP 8.2 小贴士: 如果你的系统默认 PHP 版本不是 8.2,需要先添加
sury.org源:apt-get install -y apt-transport-https lsb-release ca-certificateswget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpgecho "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.listapt-get update
5.2 下载并初始化 Lsky Pro
# 下载最新版
cd /opt
LATEST_URL=$(curl -sL https://api.github.com/repos/lsky-org/lsky-pro/releases/latest \
| grep -oP '"browser_download_url": "[^"]+' | grep -oP 'https://[^"]+' | head -1)
wget -q -O lsky-pro.zip "$LATEST_URL"
unzip -q lsky-pro.zip -d lsky-pro
cd lsky-pro
# 配置 .env(SQLite)
cp .env.example .env
sed -i 's/DB_CONNECTION=.*/DB_CONNECTION=sqlite/' .env
sed -i 's/DB_HOST=.*/DB_HOST=/' .env
sed -i 's/DB_DATABASE=.*/DB_DATABASE/' .env
touch database/database.sqlite
# 生成 APP_KEY + 数据库迁移
php artisan key:generate
php artisan migrate --force
# 如果遇到 Carbon 兼容性错误(PHP 8.2 常见)
composer update --no-dev --ignore-platform-reqs
php artisan migrate --force
⚠️ SQLite 必须用绝对路径,否则 Laravel 找不到数据库文件会报
unable to open database file。在.env中设置:DB_DATABASE=/opt/lsky-pro/database/database.sqlite
5.3 配置 systemd 开机自启
Lsky Pro 使用 PHP 自带的开发服务器(artisan serve)运行,不需要 Nginx,不需要 Apache。配置一个 systemd 服务:
cat > /etc/systemd/system/lsky-pro.service << 'EOF'
[Unit]
Description=Lsky Pro Image Hosting
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/lsky-pro
ExecStart=/usr/bin/php artisan serve --host=0.0.0.0 --port=8080
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now lsky-pro
systemctl status lsky-pro
5.4 通过 Web 完成安装
浏览器访问 http://你的服务器IP:8080:
- 自动跳转到
/install安装向导 - 检查 PHP 扩展全部通过(绿色 ✅)
- 填写管理员邮箱和密码
- 完成安装 → 重定向到登录页

5.5 管理员后台一览
登录后进入控制台,可以看到:
| 功能 | 说明 |
|---|---|
| 📊 仪表盘 | 图片数量、存储用量、用户数趋势图 |
| 🖼️ 上传图片 | 拖拽上传、快捷键粘贴 |
| 🗂️ 我的图片 | 图片列表、预览、删除、复制链接 |
| ⚙️ 设置 | 默认相册、默认存储策略、上传偏好 |
| 🖼️ 图片管理 | 全局查看/编辑/删除所有用户的图片 |
| 👥 用户管理 | 创建用户、分配容量、禁用/删除 |
| 📂 储存策略 | 本地存储 / S3 / OSS / COS / 七牛 |
| 🔧 系统设置 | 站点名、注册开关、API 开关、版本升级 |
💡 安全配置建议: 进入「系统设置」→ 关闭「开放注册」、关闭「游客上传」、关闭「登录画廊」——这样只有你自己能上传和管理图片,别人 只能通过外链查看。
六、部署内网云隧道
6.1 下载 nssh 客户端
nssh 客户端只有一个二进制文件,5-7MB,零依赖,下载即用:
👉 去 内网云官网下载页 下载对应平台的客户端
# 下载后放到 /usr/local/bin/ 并赋予执行权限
chmod +x /usr/local/bin/nssh_client
# 验证版本
nssh_client -v
💡 Linux 用户选
linux-amd64版本(arm 服务器选linux-arm64)。
6.2 测试连通性
先不加 --daemon,前台跑着看能否连上服务器:
nssh_client -R 80:127.0.0.1:8080 yourname@gz2.neiwangyun.net -p 22 --passwd yourpassword
看到以下日志表示连接成功:
INF Connected to gz2.neiwangyun.net:22
INF Tunnel established successfully!
Remote listener: 0.0.0.0:80
Local target: 127.0.0.1:8080
按 Ctrl+C 断开,接着做持久化部署。
💡 原理: nssh 用 SSH 反向隧道(
-R)将服务器的公网 80 端口映射到本地的 Lsky Pro 8080 端口。公网请求到达你的域名:80→ 通过 SSH 隧道转发 →127.0.0.1:8080(Lsky Pro)。
6.3 开机自启(crontab)
crontab -e
# 添加一行:
@reboot /usr/local/bin/nssh_client --daemon -R 80:127.0.0.1:8080 yourname@gz2.neiwangyun.net -p 22 --passwd yourpassword
✅ 为什么选 crontab @reboot 而不是 systemd? 因为 nssh 本身就有守护进程模式(
--daemon),内置断线自动重连。@reboot只负责开机拉起,运行期间的断线重连由 nssh 自己搞定。
6.4 启动守护进程
nssh_client --daemon -R 80:127.0.0.1:8080 yourname@gz2.neiwangyun.net -p 22 --passwd yourpassword
查看隧道状态:
nssh_client --list
# local-server user remote-server status
---------------------------------------------------------------
1 127.0.0.1:8080 yourname gz2.neiwangyun.net:22 online
6.5 资源占用
nssh 的资源占用极小,和 Lsky Pro 同在一个 1 核 1G 的环境里毫无压力:
| 进程 | 内存 | CPU |
|---|---|---|
php artisan serve | ~47MB | 几乎 0%(空闲) |
nssh --daemon | ~6MB | 几乎 0%(空闲) |
5 个连接也只消耗 ~10MB 内存,非常适合跑在路由器、OpenWrt、树莓派等低配设备上。
七、公网访问验证
7.1 图片访问
隧道部署完成后,公网域名即可访问图床图片:
# 公网 HTTPS 访问图片
curl -I https://你的域名/i/xxx.png
# HTTP 200 正常加载