Skip to content

Repository files navigation

ElationPic

中文 | 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 内存占用更低、 零配置,也没有数据库端口与账号可以被攻击。


安装部署

1. 放置文件

把项目放到服务器上,然后把网站根目录指向 public/,不是项目根。

项目位置    /srv/elationpic
网站根      /srv/elationpic/public

这一步很关键。data/(数据库、配置、日志)在 public/ 之外, 因此即使 Web 服务器配置写错,HTTP 也访问不到它们。

2. 打开站点

浏览器访问你的域名,会自动进入安装向导。向导会让你设置:

  • 管理员密码
  • 站点名称与描述
  • 站点网址(用于生成直链,可留空自动识别)
  • 每页显示数量、上传大小上限、缩略图最长边

完成后即可登录后台。

3. 确认这三件事

# 项目 怎么确认
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 后重新访问站点,会回到安装向导。 这不会影响已上传的图片和数据库。


使用方式

  1. 登录后台
  2. 把图片拖到上传区,或直接 Ctrl+V 粘贴截图
  3. 上传完成后点「复制直链」
  4. 把直链粘贴到任何地方

直链形如 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 为主,核心程序本身跨平台。

Roadmap

以下是计划中但尚未实现的功能,欢迎 PR:

  • 图片标签与筛选
  • 按上传日期区间筛选
  • 多档缩略图尺寸
  • GIF 的元数据剥离(当前仅支持 JPEG / PNG / WebP)

本项目刻意保持轻量。上面这些是否实现取决于实际需要,不保证全部落地。


开发文档

  • docs/DEVELOPMENT.md —— 开发过程记录:数据库结构、文件说明、部署细节、测试方式
  • docs/DESIGN.md —— 设计文档
  • docs/TEST-PLAN.md —— 测试方案与验证清单
  • deploy/README-DEPLOY.md —— 部署与服务器配置详解

License

MIT

本项目不包含任何第三方代码或依赖,全部为原创实现。

About

A lightweight personal image hosting system.

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages