本文将介绍如何使用Docker快速搭建兰空图床
首先请参考我写的这篇文章来完成Docker的安装
这里使用了以下项目,感谢项目作者的付出:
https://github.com/HalcyonAzure/lsky-pro-docker

部署方法

请运行以下命令进行兰空图床的部署:

1
2
3
4
5
6
7
docker run -d \
--name lsky-pro \
--restart unless-stopped \
-p 8089:8089 \
-v $PWD/lsky/web:/var/www/html \
-e WEB_PORT=8089 \
halcyonazure/lsky-pro-docker:latest

也可以使用Docker-Compose部署
使用MySQL来作为数据库的话可以参考原项目 #256 来创建docker-compose.yaml,参考内容如下:

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
version: '3'
services:
lskypro:
image: halcyonazure/lsky-pro-docker:latest
restart: unless-stopped
hostname: lskypro
container_name: lskypro
environment:
- WEB_PORT=8089
volumes:
- $PWD/lsky/web:/var/www/html/
ports:
- "8089:8089"
networks:
- lsky-net

mysql-lsky:
image: mysql:5.7.22
restart: unless-stopped
# 主机名,可作为"数据库连接地址"
hostname: mysql-lsky
# 容器名称
container_name: mysql-lsky
# 修改加密规则
command: --default-authentication-plugin=mysql_native_password
volumes:
- $PWD/mysql/data:/var/lib/mysql
- $PWD/mysql/conf:/etc/mysql
- $PWD/mysql/log:/var/log/mysql
environment:
MYSQL_ROOT_PASSWORD: lAsWjb6rzSzENUYg # 数据库root用户密码,自行修改
MYSQL_DATABASE: lsky-data # 可作为"数据库名称/路径"
networks:
- lsky-net

networks:
lsky-net: {}

之后在docker-compose.yml所在目录中运行docker compose up命令即可。

反代HTTPS的设置

我使用了Nginx反代后,出现了静态资源加载异常的问题,这时候可以执行以下指令来手动修改容器内AppServiceProvider.php文件对于HTTPS的支持

注意要将lskypro改为自己容器的名字

1
docker exec -it lskypro sed -i '32 a \\\Illuminate\\Support\\Facades\\URL::forceScheme('"'"'https'"'"');' /var/www/html/app/Providers/AppServiceProvider.php

修复开源版兰空图床中通过API指定图片上传相册无效的问题

个人感觉这个不是开源版中的bug,而是特有的feature?
定位到文件/var/www/html/app/Services/ImageService.php第139行:
原代码为:

1
2
3
4
5
6
// 图片保存至默认相册(若有)
if ($albumId = $user->configs->get(UserConfigKey::DefaultAlbum)) {
if ($user->albums()->where('id', $albumId)->exists()) {
$image->album_id = $albumId;
}
}

需要修改为:
1
2
3
4
5
6
7
8
9
10
if ($request->has('album_id')) {
$image->album_id = $request->input('album_id');
} else {
// 图片保存至默认相册(若有)
if ($albumId = $user->configs->get(UserConfigKey::DefaultAlbum)) {
if ($user->albums()->where('id', $albumId)->exists()) {
$image->album_id = $albumId;
}
}
}

这个在容器里不是很好改,下面是两种用于修改的方案:
方案一:

  1. 通过docker exec -it lskypro bash进入容器
  2. 通过apt update && apt install vi安装一个文本编辑器
  3. 通过vi /var/www/html/app/Services/ImageService.php打开该文件修改

方案一说实话是个笨办法,因为网络问题,有时候需要更换容器内的apt镜像源才能正常进行安装操作

方案二(推荐):
这个操作的本质就是向一个文件中插入文本行,所以运行下面两行命令即可解决问题:

1
2
docker exec -it lskypro sed -i '139i\ if ($request->has("album_id")) {\n    $image->album_id = $request->input("album_id");\n} else {' /var/www/html/app/Services/ImageService.php
docker exec -it lskypro sed -i '148i\ }' /var/www/html/app/Services/ImageService.php

这个方案的问题在于作者有可能会在以后的版本中增删该php文件中的代码,sed命令操作的行位置可能会变,这时候就需要自己灵活修改了。
下图为效果图:

参考链接

https://github.com/HalcyonAzure/lsky-pro-docker
https://github.com/lsky-org/lsky-pro/issues/495