跳到主要内容

📸 自建图床保姆级教程: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 │ │
│ └─────────────────────────────────────────┘ │
└───────────────────────────────────────────────┘
层级组件说明
公网入口内网云隧道通过你的域名访问
隧道客户端nssh7MB 二进制,零依赖
图床服务Lsky Pro V2.1Laravel 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/年起免费

后台界面一览:

Lsky Pro 后台仪表盘


四、内网云是什么?

「内网也可以变成云」——内网云(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-cliPHP 命令行(Lsky 用 artisan serve 运行)
php8.2-sqlite3SQLite 数据库驱动(零外部数据库)
php8.2-gd + imagick图片处理(缩放、裁剪、水印)
php8.2-curlHTTP 请求(下载/API)

💡 安装 PHP 8.2 小贴士: 如果你的系统默认 PHP 版本不是 8.2,需要先添加 sury.org 源:

apt-get install -y apt-transport-https lsb-release ca-certificates
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt-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

  1. 自动跳转到 /install 安装向导
  2. 检查 PHP 扩展全部通过(绿色 ✅)
  3. 填写管理员邮箱和密码
  4. 完成安装 → 重定向到登录页

Lsky Pro 登录页

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 正常加载

7.2 安全隔离验证

登录页、管理后台、上传接口在公网上全部不可达:

功能内网公网
首页/登录页✅ 302 → /login❌ 不可达
管理后台✅ 可访问❌ 不可达
图片上传 API✅ 可用❌ 不可达
图片浏览 /i/*200 OK

上传图片的正确姿势:

  • 内网用户 → 浏览器访问 http://你的服务器IP:8080 → 登录 → 拖拽上传
  • 外网用户 → 浏览器只能看到你分享的图片链接 → 无法做任何操作

7.3 PicGo 配置(可选)

如果你常用 Markdown 写文章,推荐配合 PicGo 桌面客户端一键上传:

字段
图床类型兰空图床 (Lankong)
Serverhttp://你的服务器IP:8080(内网用)
Auth TokenLsky Pro 后台 → 用户 → API Token

八、部署成本统计

项目配置成本
Linux 服务器1 核 1G 即可已有(电费忽略)
内网云隧道HTTP+HTTPS+自定义端口¥0(有免费额度)
域名内网云提供¥0
总计¥0

九、常见问题

Q: PHP 8.2 怎么装?

Debian 12/Ubuntu 22.04+ 默认仓库可能没有 PHP 8.2,需要添加 sury.org 源:

apt-get install -y apt-transport-https lsb-release ca-certificates
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt-get update
apt-get install -y 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

Q: artisan serve 报 Carbon 兼容性错误?

cd /opt/lsky-pro
composer update --no-dev --ignore-platform-reqs
php artisan migrate --force

Q: 公网访问不了?

# 1. 检查隧道是否在线
nssh_client --list

# 2. 检查 Lsky Pro 是否在跑
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080
# 应该返回 302

# 3. 检查 nssh TCP 连接
lsof -i -P -n | grep nssh
# 看到 ESTABLISHED 就说明隧道已通

Q: 想用域名 HTTPS 怎么办?

内网云隧道天然支持 HTTPS。配置完成后直接用 https://你的域名 访问即可,证书由内网云自动签发。


十、总结

👍 好的地方:

  • 部署全程不用 MySQL、不用 Nginx、不用 Docker——极度简洁
  • nssh 二进制 7MB,启动即连,从来没有断过
  • 公网 HTTPS 加载图片 200-300ms,体验和商业图床相当
  • 管理全部走内网,安全上完全放心

⚠️ 注意的地方:

  • php artisan serve 是单线程 PHP 服务器,大并发上传建议加 Nginx
  • SQLite 适合个人/小团队(几十万张以内),大规模建议 MySQL
  • 内网云隧道免费额度有限,大流量场景需付费

一个值得尝试的组合:

内网 Lsky Pro(管理上传)
+ 内网云隧道(公网穿透)
= 你的专属高速图床

📚 参考链接


📝 本教程由内网云团队整理,如有问题欢迎反馈。