容器化部署博客【2】——搭建个人图床chevereto

date: 2023-11-15 update slug: docker_deploy_blog_2 key: Docker,chevereto ref: https://blognas.hwb0307.com/linux/docker/485 cover:

准备工作

按需修改工作目录。其中,app这个目录要留给www-data:www-data用户:

work=/home/zhaohuanan/3.project/my-blog_zhaohuanan.cc/chevereto

mkdir -p $work/app/images
cd $work

按需修改端口,开启防火墙:

# 后面所有操作全在root进行!!!
ufw allow 7777/tcp comment 'chevereto' && sudo ufw reload

提前拉取镜像:

docker pull mariadb && 
docker pull nmtan/chevereto:1.4.1

接着,在./app文件夹中建立一个文件:

vim ./app/php.ini

写入以下内容:

upload_max_filesize = 100M
post_max_size = 100M
memory_limit = 3072M
max_execution_tim = 180

这个设置你可以先按我的来。以后不满意再改吧。

我们简单地看一下工作目录的准备:

tree -h $work

输出如下:

.
├── [4.0K]  app
│   ├── [4.0K]  images
│   └── [  93]  php.ini
└── [ 958]  docker-compose.yml(这个文件后面会建立)
2 directories, 2 files

为什么我要将这些目录/文件挂出来呢?后面我再解释。

./app的用户组改为www-data:www-data

sudo chown -R 33:33 $work/app/

安装Chevereto

v4(付费)和v3版本(免费)有较大的区别,详见:CHEVERETO COMPARISON ⚡️V4 vs ⚡️V3… What’s new? – YouTube。v4主要是更灵活更复杂的后台界面、移动端适配性能的增强、更加灵活的User-based API(比如API寿命)、更加安全的登陆(基于2FA)、社交媒体支持等提升,对于图床使用者来说并不重要。因此继续用v3我觉得问题也不大。可能也有一些v4开心版吧,大家看情况吧!我为了保证可迁移性,还是使用的开源版本。

配置yml文件

不了解docker的小伙伴请先看:《Docker系列 配置Docker全局环境》;《Docker系列 了解Docker Compose的配置文件》。

创建docker-compose.yml文件:

vim $work/docker-compose.yml

值得一提的是,在最新的1.6x版本中,chevereto好像不支持中文了。我也不知道为什么。所以我装了一个旧版本。如果大家介意的话,可以将:1.4.1去除。填入以下内容:(啥也别改!)

---
version: '3'

services:
  db:
    image: mariadb
    volumes:
      - ./db:/var/lib/mysql:rw
    restart: always
    networks:
      - default
    environment:
      MYSQL_ROOT_PASSWORD: chevereto_password_root # 按需更改
      MYSQL_DATABASE: chevereto # 按需更改
      MYSQL_USER: chevereto # 按需更改
      MYSQL_PASSWORD: chevereto_password # 按需更改

  app:
    image: nmtan/chevereto:1.4.1 # 固定为1.4.1,个人感觉这个版本最好用
    restart: always
    ports:
      - 7777:80 # 按需更改
    networks:
      - default
    environment:
      CHEVERETO_DB_HOST: db
      CHEVERETO_DB_NAME: chevereto # 与db的设置一一对应
      CHEVERETO_DB_USERNAME: chevereto # 与db的设置一一对应
      CHEVERETO_DB_PASSWORD: chevereto_password # 与db的设置一一对应
    volumes:
      - ./app/images:/var/www/html/images:rw
      # - ./app/content:/var/www/html/content:rw
      - ./app/php.ini:/usr/local/etc/php/php.ini:ro
      # - ./app/app/routes:/var/www/html/app/routes:rw
    depends_on:
      - db

networks:
  default:
    name: chevereto

这里,我向童鞋们说明一下初次使用mariadb的一些技巧。

一般,我们会用mariadb/mysql这些数据库软件来存储软件的数据,这样调用起来更加高效。在Docker的安装中,比如我要装chevereto应用,如果事先指定数据库的帐号和密码:

CHEVERETO_DB_NAME: chevereto # 与db的设置一一对应
CHEVERETO_DB_USERNAME: chevereto # 与db的设置一一对应
CHEVERETO_DB_PASSWORD: chevereto_password # 与db的设置一一对应

然后在安装时,与mariadb/mysql的对应上:

MYSQL_DATABASE: chevereto # 按需更改
MYSQL_USER: chevereto # 按需更改
MYSQL_PASSWORD: chevereto_password # 按需更改

这样在实际设置中,就不需要额外地设置数据库的帐户名。当然,这个密码你可以用bitwarden生成强密码。用户名不改也无所谓。

在某些时候,甚至可以通过搭建一个phpmyadmin来提供一个可视化的后台来管理mysql。不过这里我们不会这样设置。

OK,我们直接安装:

docker-compose up -d

查看日志:

docker-compose logs -f

一般看到下面的字样,即说明服务已经完成准备:

...
app_1  | [Mon May 16 13:24:00.568869 2022] [mpm_prefork:notice] [pid 8] AH00163: Apache/2.4.53 (Debian) PHP/7.4.28 configured -- resuming normal operations
app_1  | [Mon May 16 13:24:00.568924 2022] [core:notice] [pid 8] AH00094: Command line: 'apache2 -D FOREGROUND'
...

db_1   | 2022-05-16 13:24:07 0 [Note] mariadbd: ready for connections.
db_1   | Version: '10.6.5-MariaDB-1:10.6.5+maria~focal'  socket: '/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution

阿里云域名转发

https://blog.csdn.net/abilix_tony/article/details/133699069

chevereto 设置

访问https://example.com即可。会自动转到安装界面:

自己填好相关信息就可以完成登陆了。我们这里用@XL*%xdXZS^ZSrZQmXz2!D6y3r为作密码。

直接登陆,后台就是这样

我们先将语言改成简体中文。如图所示,自己改吧!

到这里,我们尝试在主页上传一张照片。随便什么都行。

然后,我们还要进行一些额外的设置。

文件夹管理

我们回到shell里:

# 返回工作目录 
cd $work

观察./app目录:

tree -hl $work/app

内容如下:

├── [4.0K]  images
│   └── [4.0K]  2022
│       └── [4.0K]  05
│           └── [4.0K]  16
│               ├── [281K]  image.md.png
│               ├── [1.7M]  image.png
│               └── [ 48K]  image.th.png
└── [  93]  php.ini

4 directories, 4 files

我们还需要将contentroutes文件夹里挂载到外面。我们最初在docker-compose里并没有挂载,因为这样会报错。

# 创建$work/app/app
mkdir -p $work/app/app

# 将content和routes文件夹里复制到宿主机目录$work/app
docker cp chevereto_app_1:/var/www/html/content/ $work/app/
docker cp chevereto_app_1:/var/www/html/app/routes/ $work/app/app/

此时在宿主机器的shell中,我们再观察一下:

tree -hl -L 2 $work/app

输出为:

├── app
│   └── routes
├── content
│   ├── images
│   └── pages
├── images
│   ├── 2022
└── php.ini

已经成功啦!

最后,不要忘记将$work/app文件夹及其子文件(夹)改为www-data:www-data所有:

sudo chown -R 33:33 $work/app

drwxrwxr-x 5 www-data   www-data   4096 Nov  6 21:47 ./
drwxrwxr-x 4 zhaohuanan zhaohuanan 4096 Nov  6 21:49 ../
drwxr-xr-x 3 www-data   www-data   4096 Nov  6 21:47 app/
drwxr-xr-x 2 www-data   www-data   4096 Nov  6 21:47 content/
drwxrwxr-x 3 www-data   www-data   4096 Nov  6 21:39 images/
-rw-rw-r-- 1 www-data   www-data     93 Nov  6 20:47 php.ini

改动yml文件

下线服务

docker-compose down

将之前的yml内容挂载的目录中的两个#去除。将contentroutes文件夹也挂载到外面来!即:

---
version: '3'

services:
  db:
    image: mariadb
    volumes:
      - ./db:/var/lib/mysql:rw
    restart: always
    networks:
      - default
    environment:
      MYSQL_ROOT_PASSWORD: chevereto_password_root # 按需更改
      MYSQL_DATABASE: chevereto # 按需更改
      MYSQL_USER: chevereto # 按需更改
      MYSQL_PASSWORD: chevereto_password # 按需更改

  app:
    image: nmtan/chevereto:1.4.1
    restart: always
    ports:
      - 7777:80 # 按需更改
    networks:
      - default
    environment:
      CHEVERETO_DB_HOST: db
      CHEVERETO_DB_NAME: chevereto # 与db的设置一一对应
      CHEVERETO_DB_USERNAME: chevereto # 与db的设置一一对应
      CHEVERETO_DB_PASSWORD: chevereto_password # 与db的设置一一对应
    volumes:
      - ./app/images:/var/www/html/images:rw
      - ./app/content:/var/www/html/content:rw
      - ./app/php.ini:/usr/local/etc/php/php.ini:ro
      - ./app/app/routes:/var/www/html/app/routes:rw
    depends_on:
      - db

networks:
  default:
    name: chevereto

然后直接上线:

docker-compose up -d

检验挂载是否生效

这里可以做一个简单的测试。我们进入dashboard:https://domain.com/dashboard。在设置--主页中,我们可以看到封面图片:

我们多上传1张封面图片,保存修改。

回到shell中,我们看一下这个文件夹:

ls $work/app/content/images/system

此时多了一张图片:home_cover_1650627141238_dba995.jpg。就是你刚刚上传的图片。当然,你上传的图片的名字应该和我这张图片是不同的。你也可以上传几张测试图片,然后在$work/app/images里看看有没有成功上传。

配置结束

备份

duplicati??

以后你要迁移chevereto图床,只要copy整个$work目录即可。

cd /home/zhaohuanan/3.project/my-blog_zhaohuanan.cc/scripts

touch backup_chevereto.sh
vim backup_chevereto.sh

#!/bin/bash

# crontab -e
# 0 05 * * * sh /home/zhaohuanan/3.project/my-blog_zhaohuanan.cc/scripts/backup_chevereto.sh

input_dir=/home/zhaohuanan/3.project/my-blog_zhaohuanan.cc/chevereto
backup_dir=/home/zhaohuanan/3.project/my-blog_zhaohuanan.cc/backup
maxnum=15
backup_name=chevereto_$(date +'%Y%m%d_%H%M%S').zip

# 备份 chevereto 目录到指定目录
zip -r $backup_dir/$backup_name $input_dir

function check_files()
{
    cd $backup_dir
    local file_lis=$(ls | grep media.*zip)
    for file in ${file_lis[@]}
    do
        num=$(ls | grep media.*zip | wc -l)
        if [[ $num -lt $maxnum ]]; then
            break
        else
            rm -f $file && echo "remove ${file}"
        fi
    done
    echo "$(ls)"
}

check_files

设置PicGo工具

地址解析

不出意外的话,访问http://pic.zhaohuanan.cc即可访问自建图床了

PicGo配置

https://blog.csdn.net/qq_19564393/article/details/108506062

用过chevereta的都知道,api上传的图片,是在一个很特别的文件夹里

上传的相册ID为1(相册不可见)

上传的用户名为 guest

为此,我自己也折腾了很久,翻阅了一些博客,但是整理的都不是很详细,所以这里详细的记录下操作,方便自己以后或其他人浏览(只要按照步骤来,就没错的)

下载PicGo插件

首先下载安装chevereto插件

接着我们就可以看到这个安装的插件了(如果看不到,就重启下PicGo软件就可以了)

获取chevereto用户名和相册ID

这个就是你的ID,记录下来。

找到这个地址,网站根目录\app\routes

里面有一个route.api.php文件,我们把它复制一份。

粘贴到同目录的overrides目录里。如下图(记住是粘贴,不是移动)

这一步的操作,就是为了用overrides\route.api.php来代替之前的route.api.php文件执行,从而保留源文件,方便以后恢复!

修改php文件 打开overrides\route.api.php文件 搜索$uploaded_id = CHV\Image::uploadToWebsite

(关键的一步)把这行代码,改成:

$uploaded_id = CHV\Image::uploadToWebsite($source, '用户名', array('album_id'=>相册ID));

设置PicGo插件变量

比如我的为

typora设置上传客户端为PicGo

可以点击【验证图片上传选项】测试是否通过。若通过,就设置好了,以后写东西自动将网图和本地图自动上传到图床中。