君匡

V1

2022/07/24阅读:12主题:自定义主题1

Docker系列八自建图床

前言

其实早在最一开始的时候,就考虑过图片应该怎么办,真的是考虑了很久,也尝试过阿里云,七牛云的oss,总得来说就是花钱存图片让我有些不是滋味。

等到多平台发布文章变为刚需,就再次把目光放在了chevereto上面,想要自建图床来使用。但是再换服务器的时候,发现还要迁移数据库和图片数据。不仅如此,更重要的是,我慢慢生出了转换域名的想法,如果真的是用了自建图床,那么之前的所有链接都会无效。

现在的方案是用墨滴上传到平台的图片数据库里,因为类似微信公众号和CSDN这种大平台,再如何也比我的个人域名更坚挺吧。

安装Chevereto

综合对比的内容不是本文的主要核心,干脆就完全舍弃好了。

所使用的chevereto网上评价还是可以的,我也没有找到其他更多的开源图床程序,就使用这个了,效果如下。

创建数据库容器

存储的方式,是需要使用数据库来辅助存储内容,所以需要先构造一个的数据库。

如何使用docker安装部署mysql或者mariadb,已经在本系列里面写到了,大家可以从我的博客右上角去搜索。

在这里只是简单附上了运行容器、创建数据库的命令。

# 创建并且运行容器
docker run \
    --name mariadb \
    -p 4305:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d \
    --restart=always \
    --privileged=true \
    -v /home/keen/docker/myriadb-10.0/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
    -v /home/keen/docker/myriadb-10.0/data/:/var/lib/mysql \
    mariadb

# 创建数据库
create database keen_chevereto DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

这里有第一个重要参数,就是数据库的名称keen_chevereto在下面会要用到的。

拉取镜像

先去寻找,再决定拉取哪个版本,最后直接拉取了最新版本的。

本意是想要直接拉取官方提供的那个版本,但是在之后发现了linuxserver/chevereto还多适配了两个armarm64,虽然我现在是用不到,但是不代表我以后不会呀,于是就选择了这个。

docker search chevereto

docker pull linuxserver/chevereto

创建外部挂载目录

递归创建存储目录。

export Chevereto=chevereto
mkdir -p /home/keen/docker/$Chevereto/config
mkdir -p /home/keen/docker/$Chevereto/data

启动容器

其实两个端口可以只映射一个的,这里的第二个重要参数信息就是连接docker数据库的名称为db,也会在下面安装的时候用到。

docker run -d \
    --restart=always \
    --name=chevereto \
    --link mariadb:db \
    -e TZ=Asia/Shanghai \
    -p 5217:80 \
    -p 5218:443 \
    -v /home/keen/docker/chevereto/config:/config \
    -v /home/keen/docker/chevereto/data:/data \
    -v /etc/localtime:/etc/localtime:ro \
    linuxserver/chevereto

初始化账号

接下来进入图床的初始化界面,一般是用IP地址:端口的方法访问,比如我的就可以用39.96.12.167:5218,但是如果你会端口转发的话,也可以达成像我一样用链接登陆:https://www.images.clzly.xyz

两个重要信息就是这个时候使用的,按照提示,输入账号、密码、邮箱等信息,至此完成安装。

配置Chevereto容器

配置图片上传大小

图片上传2m实在是太小了,这个问题,可以使用命令重启容器。重启后就可以在两个地方配置基础变量,只不过$Chevereto/config/php/php-local.ini的优先级高于$Chevereto/config/php.ini罢了。

 docker restart chevereto

修改服务器的配置文件config/php/php-local.ini,文件内容如下。

; post传递数据大小
post_max_size = 20M

; 上传文件的大小
upload_max_filesize = 20M

; 一批次最多可以上传的个数
max_file_uploads = 100

配置路由

如果是界面上正常使用图床,一般是不需要修改这里的。但是如果你有用Api的方式上传图片的需求,那么我更推荐你配置一下路由。

因为没有配置路由的话,传上来的图片全是归为访客上传的,不会在既有的相册里面存在。

首先要将容器中的配置文件复制到宿主机上来。

# 从容器中复制出来配置文件
docker cp temp:/app/chevereto/app/routes/route.api.php /home/keen/docker/$Chevereto/config/route.api.php

将里面原始的内容,进行特别的修改,比如我的用户名是 keen,相册ID是2,修改内容如下。

# 旧内容
# $uploaded_id = CHV\Image::uploadToWebsite($source);

# 新内容
$uploaded_id = CHV\Image::uploadToWebsite($source'keen', array('album_id'=>2));

接下来你可以选择关闭当前容器,用如下命令重新启动容器;当然,你也可以选择修改容器的hostconfig.json 配置文件,然后重启容器,之前的系列已经讲过,不再赘述。

docker run -d \
    --restart=always \
    --name=chevereto \
    --link mariadb:db \
    -e TZ=Asia/Shanghai \
    -p 5217:80 \
    -p 5218:443 \
    -v /home/keen/docker/$Chevereto/config:/config \
    -v /home/keen/docker/$Chevereto/data:/data \
    -v /etc/localtime:/etc/localtime:ro \
    -v /home/keen/docker/$Chevereto/config/route.api.php:/app/chevereto/app/routes/route.api.php \
    linuxserver/chevereto

配置域名转发

因为以前就是使用的Nginx,所以完全可以使用转发的方式,将端口映射到子域名。nginx的配置如下。

server {
        listen       80;
        server_name  images.clzly.xyz www.images.clzly.xyz;
        rewrite ^(.*)$  https://www.images.clzly.xyz permanent; #用于将http页面重定向到https页面
}
server {
    listen 443 ssl;
    server_name  images.clzly.xyz www.images.clzly.xyz;
    ssl_certificate     /etc/nginx/conf.d/cert3/www.images.clzly.xyz.pem;
    ssl_certificate_key /etc/nginx/conf.d/cert3/www.images.clzly.xyz.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

      location / {
            proxy_pass  https://39.96.12.167:5218; # 转发规则
      }

      location ~ .* {
            proxy_pass  https://39.96.12.167:5218; # 转发规则
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

图床迁移

图片内容是必须的,数据库也是必须的,还有配置文件更是必须的!

在切换服务器的时候,注意要把config/settings.php文件进行备份,因为这些内容中配置了数据库的信息。

<?php
$settings = array (
  'db_host' => 'db',
  'db_name' => 'keen_chevereto',
  'db_user' => 'root',
  'db_pass' => '123456',
  'db_table_prefix' => 'chv_',
  'db_driver' => 'mysql',
  'db_pdo_attrs' => 
  array (
  ),
  'debug_level' => 1,
);

完成上面三个的备份,就可以关闭并且删除原先的容器。

export Chevereto=chevereto
docker stop $Chevereto && docker rm $Chevereto

接着在新的机器上面,拉取镜像,创建外部挂载目录,导入数据库,修改配置文件,接着运行容器即可!

总结

用这篇文章记录了折腾个人图床的全过程,从安装到配置都尽量全面了,一般来说网页上直接使用,可以当个图片管理器。

但是如何使用API上传图片的部分被我单独拎出来写了一篇文章的,因为那些内容就跟本系列关系并不大了。有兴趣的可以去看看。

感谢

  1. 感谢现在的好奇,为了能成为更好的自己。
  2. 用docker快速搭建chevereto图床
  3. 解决nginx部署后css、js、图片等样式不加载的问题
  4. 修改Chevereto的API上传相册和用户

分类:

后端

标签:

后端

作者介绍

君匡
V1