中文 | English
一个简单、轻量的个人图床系统。
ElationPic 是一个单管理员、零依赖的自托管图床。上传图片,拿到直链, 粘贴到任何地方。没有注册、没有多用户、没有社交功能 —— 只做一件事并把它做好。
- 公开首页:任何人可以浏览图片墙、查看原图、复制直链
- 单管理员后台:上传、删除、搜索、改设置
- 零第三方依赖:不需要 Composer,不需要 Node,不需要额外数据库服务
- 图片由 Web 服务器直接返回,不经过 PHP,因此加载快、PHP 压力小
这不是一个「什么都能做」的图片平台。它刻意不做以下事情:
| 不做 | 原因 |
|---|---|
| 用户注册 / 多用户 | 个人图床不需要 |
| 评论 / 点赞 / 标签 / 相册 | 与「轻量」目标冲突 |
| 图片压缩 / 转码 / 加水印 | 原图按上传时的样子保存,不做任何处理 |
| 图片处理流水线 | 上传即存盘,没有队列与后台任务 |
如果你需要上面这些,ElationPic 不适合你。
浏览(公开)
- 响应式图片墙,适配手机 / 平板 / 桌面
- 可开关的首页公开:关闭后访客只看到「本站未公开」提示, 但已发出的直链仍然有效(图片由 Web 服务器直接返回,不经过程序)
- 按最新、最早、文件最大/最小、文件名排序
- 点图查看大图(灯箱),或在新标签页打开原图
- 浅色 / 深色主题:跟随系统,也可手动切换
- 首图优先加载,其余懒加载
管理(需登录)
- 拖拽上传、粘贴上传(截图后直接 Ctrl+V)
- 上传后立即给出可复制的直链
- 单张删除、勾选批量删除、全选本页
- 按原始文件名搜索
- 上传时自动移除照片隐私信息(EXIF / GPS / XMP / IPTC),默认开启
- 站点设置:标题、描述、固定网址、每页数量、上传上限、缩略图尺寸、时区、登录限速
- 修改管理员密码
备份与维护(需登录)
- 导出完整备份包:数据库 + 站点设置 + 原图,打包成一个 zip
- 导入备份包:覆盖数据库与设置,导入前自动生成回滚点
- 批量重建缩略图:改过缩略图尺寸后可让已有图片跟上
- 文件一致性自检:找出「有文件无记录」的孤儿文件与「有记录无文件」的失效记录,并可清理
- 存储概况:原图占用、磁盘剩余、用量提示
便于自行排查
- 前端错误会显示成页面上的横幅(不需要打开开发者工具),带复制按钮
- 图片列表直接标注有问题的卡片(文件丢失、原始文件名重复)
- 命令行预检脚本覆盖 PHP 版本、扩展、语法、目录权限、敏感文件、磁盘空间、
uploads可执行性
| 项目 | 选择 |
|---|---|
| 语言 | PHP 8.0.2+ |
| 数据库 | SQLite(PHP 自带,无需安装数据库服务) |
| Web 服务器 | Nginx(也兼容 Apache 等) |
| 前端 | 原生 HTML / CSS / JavaScript,无框架、无构建步骤 |
| 第三方依赖 | 无(不需要 Composer / npm) |
PHP 扩展要求:pdo_sqlite、gd、fileinfo、json、zip
为什么是 SQLite:单管理员、低并发、数据量小。相比 MySQL 内存占用更低、 零配置,也没有数据库端口与账号可以被攻击。
把项目放到服务器上,然后把网站根目录指向 public/,不是项目根。
项目位置 /srv/elationpic
网站根 /srv/elationpic/public
这一步很关键。
data/(数据库、配置、日志)在public/之外, 因此即使 Web 服务器配置写错,HTTP 也访问不到它们。
浏览器访问你的域名,会自动进入安装向导。向导会让你设置:
- 管理员密码
- 站点名称与描述
- 站点网址(用于生成直链,可留空自动识别)
- 每页显示数量、上传大小上限、缩略图最长边
完成后即可登录后台。
| # | 项目 | 怎么确认 |
|---|---|---|
| 1 | uploads/ 不能执行 PHP |
见下方说明 |
| 2 | data/ 无法通过 HTTP 访问 |
访问 /../data/config.php 应返回 403 或 404 |
| 3 | data/ 可写 |
能完成安装向导即说明可写 |
第 1 项最容易被忽略,也最要紧。Web 服务器配置里必须有:
# 上传目录:只返回静态文件,绝不执行任何脚本
location ^~ /uploads/ {
# 注意:这里不要写 fastcgi_pass
}并且这段要放在通用的 location ~ \.php$ 之前,否则不生效。
现成片段见 deploy/ 目录。
建议同时开启 gzip 与静态资源缓存 —— 首屏传输体积可从约 91 KB 降到约 28 KB。
配置片段与分步说明见 deploy/README-DEPLOY.md。
配置在安装向导中生成,之后可在后台「设置」页随时修改,不需要手工编辑文件。
配置文件位于 data/config.php,该文件不在版本库中(内含管理员密码哈希)。
仓库只提供模板 data/config.sample.php。
可配置项:
| 配置 | 说明 |
|---|---|
site_name / site_description |
站点标题与描述 |
site_url |
固定网址,用于生成直链;留空则按访问地址自动识别 |
base_path |
项目不在域名根目录时填写子路径 |
per_page |
每页显示数量 |
max_file_bytes |
单文件上传上限 |
thumb_max_edge |
缩略图最长边(0 表示不生成缩略图) |
strip_metadata |
上传时移除照片隐私元数据(EXIF / GPS / XMP / IPTC),默认开启 |
public_gallery |
首页是否公开。关闭后只影响列表展示,不影响直链 |
timezone |
时区 |
force_https |
强制跳转 HTTPS |
login_max_attempts / login_window_secs / login_lockout_secs |
登录失败限速 |
log_level |
日志级别 |
忘记密码:删除 data/config.php 后重新访问站点,会回到安装向导。
这不会影响已上传的图片和数据库。
- 登录后台
- 把图片拖到上传区,或直接 Ctrl+V 粘贴截图
- 上传完成后点「复制直链」
- 把直链粘贴到任何地方
直链形如 https://你的域名/uploads/文件名.jpg,
由 Web 服务器直接返回,不经过 PHP。
首页是公开的 —— 任何人访问你的域名都能看到图片墙。 如果不希望公开,需要自行在 Web 服务器层面加访问限制。
elationpic/
├── public/ ★ 网站根目录(只有这里对公网可见)
│ ├── index.php 首页(公开浏览)
│ ├── setup.php 安装向导
│ ├── login.php 登录
│ ├── admin.php 后台管理
│ ├── settings.php 站点设置(标题、描述、浏览)
│ ├── settings-advanced.php 安全与高级(上传、部署、安全)
│ ├── password.php 修改密码
│ ├── backup.php 备份与恢复
│ ├── maintenance.php 维护工具(存储、缩略图、自检)
│ ├── export.php 导出备份包
│ ├── import.php 导入备份包
│ ├── upload.php 上传接口
│ ├── delete.php 删除单张
│ ├── delete_many.php 批量删除
│ ├── rebuild_thumbs.php 重建缩略图
│ ├── check_consistency.php 一致性自检
│ ├── error.php 错误页
│ ├── assets/ CSS / JS
│ │ └── css/ 样式分三层:base / polish / theme
│ └── uploads/ 图片目录(禁止执行脚本)
│
├── src/ 程序代码(不在网站根目录内)
│ ├── bootstrap.php 统一引导
│ ├── helpers.php 工具函数
│ ├── db.php 数据库连接与建表
│ ├── auth.php 认证与登录限速
│ ├── csrf.php CSRF 防护
│ ├── settings.php 配置读写
│ ├── backup.php 备份包构建与解析
│ ├── images.php 图片数据读写
│ ├── upload.php 上传校验链
│ ├── thumbnails.php GD 缩略图
│ └── views/ 页面片段
│
├── data/ ★ Web 根之外,HTTP 无法访问
│ ├── config.sample.php 配置模板
│ ├── install.php 命令行初始化(可选)
│ ├── backup.php 命令行备份
│ ├── logs/ 日志
│ ├── sessions/ 会话
│ └── tmp/ 临时文件
│
├── docs/ 设计文档与开发记录
├── deploy/ 部署配置片段与说明
├── tests/ 自检与测试脚本
├── tools/ 打包脚本
└── backup/ 命令行备份输出目录
备份(数据库 + 站点设置 + 原图,打成一个 zip):
php data/backup.php也可以登录后台,在「备份」页点击下载。
备份包内含管理员密码哈希,等同站点钥匙,请妥善保管。 图片文件也建议另做增量同步到其他位置。
环境自检:
powershell -ExecutionPolicy Bypass -File tests/preflight.ps1 -Base http://你的地址功能与安全用例(需要管理员密码):
powershell -ExecutionPolicy Bypass -File tests/run-tests.ps1 -Base http://你的地址 -Password 你的密码打包分发:
powershell -ExecutionPolicy Bypass -File tools/make-package.ps1- 首页公开:默认任何人都能浏览。需要私密请自行在 Web 服务器加限制。
- 隐私元数据默认会被移除:上传时自动剥离照片中的 EXIF / GPS / XMP / IPTC。 手机拍摄的照片普遍带 GPS 坐标,而直链是公开的,等于把拍摄地点一起公开 —— 所以这个开关默认开启。可在后台「设置」中关闭。 实现方式是只删除元数据段、不重新压缩图片,画面像素逐字节不变。
- 单管理员:没有权限分级,拿到密码即拥有全部权限。
- 数据库是单文件:请定期备份。虽然程序启用了 WAL,但直接复制
database.sqlite可能丢失最近的事务 —— 请使用内置的备份功能。 - 测试脚本以 Windows PowerShell 为主,核心程序本身跨平台。
以下是计划中但尚未实现的功能,欢迎 PR:
- 图片标签与筛选
- 按上传日期区间筛选
- 多档缩略图尺寸
- GIF 的元数据剥离(当前仅支持 JPEG / PNG / WebP)
本项目刻意保持轻量。上面这些是否实现取决于实际需要,不保证全部落地。
docs/DEVELOPMENT.md—— 开发过程记录:数据库结构、文件说明、部署细节、测试方式docs/DESIGN.md—— 设计文档docs/TEST-PLAN.md—— 测试方案与验证清单deploy/README-DEPLOY.md—— 部署与服务器配置详解
本项目不包含任何第三方代码或依赖,全部为原创实现。