介绍

我们有时需要上传一些图片用于个人博客,或是其他项目分享,如果你也像我一样更加希望图片存放在自己的服务器上而不是第三方平台上,那么推荐搭建一个属于自己的图床。

本文将介绍如何使用 Docker 快速部署一个基于 EasyImage 2 的图床服务。

EasyImage 特点

EasyImage 简单强大,无数据库非常适合小服务器。

  • 支持WebP格式转换
  • 支持仅登录后上传
  • 支持设置图片质量
  • 支持文字/图片水印
  • 支持设置图片指定宽/高
  • 支持上传图片转换为指定格式
  • 支持限制最低宽度/高度上传
  • 支持API
  • 在线管理图片
  • 等更多功能

部署

本文的命令适用于 Debian 12,并且需要在 root 用户下完成,请使用 sudo -isu root 切换到 root 用户进行操作。

安装 Docker

相比于直接安装 Debian 仓库中的 docker,更推荐使用 Docker 官方的源进行安装,并且将安装 docker compose 进行管理 Docker 项目。

首先需要更新和安装软件:

1
2
3
apt update
apt upgrade -y
apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates

然后加入 Docker 的 GPG 公钥和 apt 源:

1
2
3
curl -sSL https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://download.docker.com/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

中国大陆的机器可以用清华 TUNA 的国内源:

1
2
curl -sS https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

然后更新系统后即可安装 Docker CE 和 Docker Compose 插件:

1
2
apt update
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

此时可以使用 docker version 命令检查是否安装成功:

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
root@debian ~ # docker version
Client: Docker Engine - Community
Version: 27.3.1
API version: 1.47
Go version: go1.22.7
Git commit: ce12230
Built: Fri Sep 20 11:41:11 2024
OS/Arch: linux/amd64
Context: default

Server: Docker Engine - Community
Engine:
Version: 27.3.1
API version: 1.47 (minimum version 1.24)
Go version: go1.22.7
Git commit: 41ca978
Built: Fri Sep 20 11:41:11 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.22
GitCommit: 7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311c
runc:
Version: 1.1.14
GitCommit: v1.1.14-0-g2c9f560
docker-init:
Version: 0.19.0
GitCommit: de40ad0
1
2
root@debian ~ # docker compose version
Docker Compose version v2.29.7

参考:Debian 12 / Ubuntu 24.04 安装 Docker 以及 Docker Compose 教程

创建 docker-compose.yaml

使用 docker compose 管理 Docker 项目不必去记复杂的 docker run 命令,并且可以把不同的项目放在一起管理,更加的方便。

首先选择一个合适的地方比如 /root/docker-project/ 在其中创建项目文件夹,在项目文件夹中创建 docker-compose.yaml

然后填写下面的内容

docker-compose.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
services:
easyimage:
image: ddsderek/easyimage:latest
container_name: easyimage
ports:
- '8080:80'
environment:
- TZ=Asia/Shanghai
- PUID=1000
- PGID=1000
- DEBUG=false
volumes:
- '/root/data/docker_data/easyimage/config:/app/web/config'
- '/root/data/docker_data/easyimage/i:/app/web/i'
restart: unless-stopped

docker-compose.yaml 的配置中,: 前面对应主机,后面对应 docker 容器。

docker compose 的命令需要在 docker-compose.yaml 同目录下运行

在这个配置中,我们将使用 http://服务器ip:8080 访问项目,实际数据存储于服务器的 /root/data/docker_data/easyimage 目录下。

运行

首先使用下面的命令拉取镜像

1
docker compose pull

然后启动镜像

1
2
3
4
root@debian ~ # docker compose up -d
[+] Running 2/2
✔ Network easyimages_default Created
✔ Container easyimage Starte

没有报错就表示成功启动,访问 http://服务器ip:8080 即可显示 EasyIamge 2.0 安装环境检测 ,可以点击下一步继续
docker-easyimages-install-check

不过如果我们拥有域名,且希望设置 Nginx 反代,可以先终止 docker 项目,进行 Nginx 的设置。

1
docker compose down

设置 Nginx 反代

推荐使用 Nginx Proxy Manager 进行设置,或是手动填写配置文件的反代部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
location ^~ /
{
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;

set $connection_upgrade '';
if ($http_upgrade) {
set $connection_upgrade 'upgrade';
}

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
# 上传文件大小限制
client_max_body_size 10m;
}

测试并重载 Nginx 配置

1
2
nginx -t
nginx -s reload

然后我们可以将 docker-compose.yaml 中的端口部分修改如下,不再将 8080 暴露在公网。

1
2
ports:
- '127.0.0.1:8080:80'

重新启动镜像,访问 https://你的域名 在进行设置。

1
docker compose up -d

点击下一步, 在 EasyIamge 2.0 网站基础配置

  • 设置域名网站域名记得改为 https://
  • 设置管理账号,修改为自己想用的账户密码
    docker-easyimages-install-config

设置完成后会跳转到登陆界面,即可登陆账户。

docker-easyimages-login

设置调整

由于我们是个人使用,可以进行一些安全调整,前往 设置 调整下面内容

  • 图床安全 > 开启 登陆上传验证码
  • API设置 > 禁用已有 Token ,如果需要添加一个新的。

docker-easyimages-safe

节省存储空间可以在 上传设置 中将 上传图片格式转换 设置为 WEBP,现在 webp 已足够流行,不必担心兼容问题。

配合 PicGo 上传

上传时每次打开网页也比较麻烦,EasyImages 支持 API 上传,因此可以安装 PicGo

开启 API 上传功能

登录图床后台 > 图床安全 > 高级设置 > 开启API上传

下载 PicGo

访问 https://github.com/Molunerfinn/PicGo/releases 下载

macOS 打开时提示损坏,打开终端执行下面的命令,回车后输入电脑账户密码授权

1
sudo xattr -d com.apple.quarantine /Applications/PicGo.app/

安装 web-uploader 插件

参考 使用PicGo上传.md

打开 PicGo ,插件设置搜索 web-uploader,安装第一个
docker-easyimage-picgo-search-plugin

点击左侧图床设置,找到自定义Web图床,添加一个。

配置页面:

  • 图床配置名:取个名字
  • API地址:图床后台 > 设置 > API设置 页面获取
  • POST参数名image
  • JSON路径url
  • 自定义请求头: 留空不填
  • 自定义Body{"token":"your token"} token 在图床后台 > 设置 > API设置 页面获取

docker-easyimage-picgo-config

然后返回上传区,图片上传选择刚刚添加自定义图传,就可以使用 PicGo 上传了。

总结

EasyImage 简单易用,无需数据库,配置要求与资源占用都非常低,非常适合拿来当作个人图床。

不过正是由于没有数据库,无法保存文件名称(可以在设置中打开日志记录)以及设置相册分组。

错误信息

Nginx 413 上传失败

如果上传失败,浏览器 Console 信息提示 413 ,可以在 Nginx 反代设置中,调整大小限制。

1
client_max_body_size 10m;

其他

删除图片

登录图床后台 > 文件管理 > 删除文件 > 删除单张图片 可以通过图片链接快速删除特定图片。

或是使用文件管理进行删除。

未来的备份与迁移

如果未来需要更换机器或是不再使用 EasyImage ,只需备份网站配置 /i/ 的中文件夹即可,所有的图片都存放在这里。

后台与图片使用不同的域名

由于 EasyImage 的图片是本地文件存储的,在网站的设置中,我们可以为很简单的为 网站 和 图片 指定不同的域名,比如:

  • 网站域名https://upload.example.com
  • 图片域名https://img.example.com

此时我们可以在 docker-compose.yaml 中将目录映射修改为下面的形式:

1
2
3
volumes:
- '/var/www/img.example.com/config:/app/web/config'
- '/var/www/img.example.com/i:/app/web/i'

然后在主机中的 Nginx 中将 https://img.example.com 的 root 目录设置为 /var/www/img.example.com 就可以了

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
server {
listen 80;
server_name img.example.com;
return 301 https://img.example.com$request_uri;
}

server {
listen 443 ssl http2;

root /var/www/img.example.com;
index index.html index.htm index.nginx-debian.html;

server_name img.example.com;

# ssl config
# ...

location / {
try_files $uri $uri/ =404;
}

# 禁止访问 /config 路径,或直接将 config 的映射设置为其他的路径
location ~* /config {
deny all;
return 403;
}
}