Picsur imgur:docker部署简单易管理的图床项目

本篇博客所有图片均存放在picsur图床上,目前感觉良好。另外,由于我的服务器硬盘容量有限,所以目前只是自用。如果想要体验几天,试试好不好用,可以QQ联系我,可以开几个小号供大家体验。

写在前面

前段时间推荐了两种图床方案:npm图床jsDelivr图床
可是使用的感受并不好,如果配合CDN进行缓存可能效果还行,但是没有缓存策略的话图片有时候都难以加载。所以就像我之前所说,稳定的方案肯定是要结合云存储的,当然也可以是免费图床也可以是值得信赖的低价图床。对于没有服务器的同学,我目前比较推荐使用的是:

这些图床其实都是基于国人开发的兰空图床项目搭建的,有服务器的同学可以试试。不过它比较适合多人使用,自用的话也可以,但是感觉有点大材小用了。

所以,今天想要分享的就是一个适合自用的开源图床项目——Picsur,这是国外某位大佬开发的,目前还没有汉化版,不过词汇量不大,实在不习惯的话,可以使用浏览器自带的翻译功能。另外,这个项目本就是这位大佬找遍了GitHub,但是没有找到好用的图床项目,才用PHP写了这个项目。所以,我感觉外国程序员还是比较纯粹的,大家不必担心挂马什么的,可以放心使用。

我使用它的原因:

  • Freeimg图床暂时不支持webp格式的图片上传,picsur支持
  • 界面比兰空简单,适合个人搭建使用
  • 部署在国内服务器上,访问速度当然不慢

Freeimg图床现已支持webp格式的图片上传

效果展示

  • 上传界面,提交后直接上传

  • 可以自由设置图片格式,尤其支持webp,至于其他格式,下文会具体介绍

  • 已上传的图片

  • 支持多种图片操作,还可以设置图片有效期

  • 可以自定义用户组

还有一些其他功能

我主要是看重webp格式和它足够轻量简洁这两个优点,比兰空要简约。

功能简介

  • 支持 docker 一键部署
  • 匿名上传
  • 支持多账户
  • 适当的 CORS 限制:防止恶意的网站通过跨域请求获取或修改用户的信息
  • Exif 信息剥离
  • 支持保留原始图像的能力
  • 支持多种格式:
    1. QOI
    2. JPG
    3. PNG
    4. WEBP(支持动画)
    5. TIFF
    6. BMP
    7. GIF(支持动画)
    8. 支持转换图像
  • 支持编辑图像
    1. 调整大小
    2. 旋转
    3. 翻转
    4. 去除透明度
    5. 负片效果
    6. 灰度化处理
    7. 可删除图片
  • 正确的数据库迁移
  • 支持在列表中显示自己的图片
  • 支持聊天窗口上正确显示预览图
  • 支持设置图片有效期
  • 支持 ShareX API
  • 支持 ARM64 和 AMD64 Docker 镜像
  • 白色模式(WIP)
  • 公共画廊(WIP)
  • 相册(WIP)

EXIF 是什么?

EXIF 数据,全称”Exchangeable Image File Format”,是一种包含各种关于照片的信息的数据格式。它可以包含很多有关照片的信息,比如相机制造商、相机型号、照片拍摄日期、ISO 设置、快门速度、焦距,是否使用了闪光灯等等。一些相机还会添加地理位置的 gps 信息。

正因为 EXIF 数据可能包含这种敏感信息,例如地理位置,所以在分享照片的时候需要小心。如果不希望自己的这些信息被公开,应该在发布照片之前去除这些 EXIF 数据。

搭建环境

  • 服务器:我使用的是阿里云的ECS云服务器,其他的VPS都行
  • 操作系统:Debian 11
  • 安装好 Docker、Docker-compose(相关脚本),参考这篇博客

【非必需但建议】域名一枚,并做好解析到服务器上
【非必需】提前安装好宝塔面板海外版本 aapanel,并安装好 Nginx
【非必需但建议】安装好 Nginx Proxy Manager(我也是使用docker部署的,有时间写篇博客记录一下)

既然用作图床,服务器的硬盘当然越大越好,不过自己用的话已经足够使用了。

使用docker部署

需要事先安装 Docker和Docker compose环境,参考这篇博客

创建一下安装的目录

1
2
3
sudo -i                                 #进入root模式
mkdir -p /root/data/docker_data/picsur #创建文件所在的文件夹
cd /root/data/docker_data/picsur #进入文件夹

创建yaml文件:

1
vim docker-compose.yml

按一下键盘i,将以下代码复制到文件中,根据自己需要修改(基本不用修改)

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
version: '3'
services:
picsur:
image: ghcr.io/caramelfur/picsur:latest
container_name: picsur
ports:
- '8003:8080' #8003可以改成服务器上没有用过的端口
environment:
PICSUR_HOST: '0.0.0.0'
PICSUR_PORT: 8080
PICSUR_DB_HOST: picsur_postgres
PICSUR_DB_PORT: 5432
PICSUR_DB_USERNAME: picsur
PICSUR_DB_PASSWORD: nice-long-strong-passw0rd-here # 确保和picsur_postgres:部分的 POSTGRES_PASSWORD 匹配
PICSUR_DB_DATABASE: picsur

## 默认管理员账户是 admin, 这个没法改,密码就是下面这个你设置的
PICSUR_ADMIN_PASSWORD: different-nice-long-str0n6-passw0rd-here

## 可选的,如果没有设置会默认生产随机字符
# PICSUR_JWT_SECRET: CHANGE_ME
# PICSUR_JWT_EXPIRY: 7d

## 最大可以上传的字节数
PICSUR_MAX_FILE_SIZE: 128000000 # 128 MB
## No need to touch this, unless you use a custom frontend
# PICSUR_STATIC_FRONTEND_ROOT: "/picsur/frontend/dist"

## Warning: Verbose mode might log sensitive data
# PICSUR_VERBOSE: "true"
restart: unless-stopped

picsur_postgres:
image: postgres:14-alpine
container_name: picsur_postgres
environment:
POSTGRES_DB: picsur
POSTGRES_PASSWORD: nice-long-strong-passw0rd-here
POSTGRES_USER: picsur
restart: unless-stopped
volumes:
- ./picsur-data:/var/lib/postgresql/data # 默认数据存放在当前文件夹下的picsur-data目录中,可以自行修改

修改好之后,注意切换成英文输入法,然后按一下esc,然后:wq保存退出。

一行命令自动部署,docker真的太方便了:

1
docker compose up -d  

有些操作系统是docker-compose up -d,注意区别

打开服务器防火墙(非必需)并访问网页

有些服务器可能不需要,阿里云的服务器需要在安全组开启上面代码中我们使用的8003端口,才能使用8003端口访问服务器。

开启8003端口以后最好重启一下实例

查看端口是否被占用(以 8003 为例),输入:

1
lsof -i:8003  #查看 8003 端口是否被占用,如果被占用,重新自定义一个端口

如果啥也没出现,表示端口未被占用,可以继续下面的操作了~

如果出现:

1
-bash: lsof: command not found

运行:

1
apt install lsof  #安装 lsof

如果端口没有被占用,理论上已经可以输入 http:// + 服务器ip:8003 访问到picsur了。
端口被占用了就修改一下端口,比如改成 8081,注意 docker-compose.yml 文件里和防火墙都要改

到这里,其实已经能够使用picsur了。但是,访问的网址直接暴露了ip,而且不方便记忆,所以下面做一下反向代理。由于我现在只有一台服务器,一般反向代理需要两台以上,以后再做迁移吧。

反向代理

我这里使用的是Nginx Proxy Manager,Nginx Proxy Manager也是使用Docker部署的,参考这篇博客。熟悉宝塔的同学当然也可以使用宝塔做反向代理。

如果picsur和Nginx Proxy Manager部署在不同服务器上

  1. 在添加反向代理之前,需要确保已经完成域名解析:域名解析添加A记录,主机名自定义(这里以picsur为例),记录值为Nginx Proxy Manager所在服务器的IP地址
  2. 在Nginx Proxy Manager中添加Proxy Host

如果picsur和Nginx Proxy Manager部署在同一服务器上

与上面有一点点变化,就是在下面的这一步:

原本图中标注3的位置需要改为Docker容器内部IP
通过下面命令可以查看对应的 Docker 容器内部 IP

1
ip addr show docker0

这里涉及到的是Docker的网络模式,感兴趣的同学可以学习一下这个视频:

配置完毕,理论上已经大家可以通过域名访问picsur了。

可能会遇到无法访问,可能的原因:
Nginx Proxy Manager会用到 80、443 端口,所以服务器不能占用这些端口,或者服务器防火墙不能禁止这些端口。
关闭服务器占用80、443端口的进程,并在服务器安全组里添加80、443端口(有些服务器需要,像阿里云服务器就需要手动添加)

使用

其实也不难,大家自己攻略。因为这个项目还在开发中,所以讲一下版本更新方法,其实也不难。

更新picsur

1
2
3
4
5
6
7
8
9
10
11
cd /root/data/docker_data/picsur

docker compose down

cp -r /root/data/docker_data/picsur /root/data/docker_data/picsur.archive # 万事先备份,以防万一

docker compose pull

docker compose up -d # 请不要使用 docker-compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

1
2
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

输入y
利用 Docker 搭建的应用,更新非常容易嘿嘿

卸载picsur

1
2
3
4
5
6
7
cd /root/data/docker_data/picsur

docker-compose down

cd ..

rm -rf /root/data/docker_data/picsur # 完全删除映射到本地的数据

最后

感觉图床也就这样告一段落了,博客封面啥的就放在Freeimg图床上,毕竟有2个GB,够我造好长时间了。博客内部的图片就放在picsur上面,然后npm和jsDelivr图床就当作备用方案。这样已经足够我使用的了,大家如果有什么推荐,欢迎在评论区留言。