个人图床Chevereto搭建

Chevereto 是一个自建图片托管网站,目前已更新到V4,但也开始收费,但可以选择使用另一个分支:Cheverote-Free,是基于Cheverote V3.16.2版本,目前已停止维护,只提供基本的功能,供个人或小型社区免费试用。

作为穷鬼,自然是选择chevereto-free了(哭)

网上大部分教程都是依赖于宝塔面板,但由于我自己的服务器刚开始的时候只有1核2G,在尝试了宝塔面板之后感觉系统卡得一批,所以就不再使用,本身也觉得过于依赖面板对于服务器以及操作系统的理解没什么帮助。

说是这么说,但某些Bug还是超出了自己已知范围。。。后面采用docker进行安装。不想浪费时间的可以直接跳去Docker-compose部分看

环境要求

基本环境

  • PHP 7.4
    • Chevereto要求不受限制地访问所有PHP函数。如果删除任何PHP函数,可能会导致Chevereto失败或根本无法工作。
    • 不能配置set_time_limit参数
  • MySQL 5.7 / 8 - MariaDB 10
  • Apache HTTP Web Server / Nginx
    • mod_rewrite

Image Library

添加建议的ImageMagick配置到/etc/ImageMagick-6/policy.xml

<policymap>
    <!-- policies -->
    <policy domain="resource" name="width" value="16KP"/>
    <policy domain="resource" name="height" value="16KP"/>
</policymap>

文件权限

需要有以下文件夹的访问权限

  • /tmp
  • app/content/
  • app/content/languages/
  • app/content/languages/cache/
  • app/content/system/
  • content/
  • images/

chevereto安装

3种方式

压缩包安装

这种安装方式折腾了很久,但还是无法解决掉,很难受

  1. 下载对应的.zip文件解压到自己的public_html文件夹中

  2. 创建 chevereto用户和chevereto数据库

    sudo mysql -uroot -ppassword -e "CREATE DATABASE chevereto; \
        CREATE USER 'chevereto' IDENTIFIED BY 'user_database_password'; \
        GRANT ALL ON chevereto.* TO 'chevereto' IDENTIFIED BY 'user_database_password';"
    
  3. 配置Nginx

    # nginx 配置
    	
    	# Disable access to sensitive application files
        location ~* (app|content|lib)/.*\.(po|php|lock|sql)$ {
            return 404;
        }
        location ~* composer\.json|composer\.lock|.gitignore$ {
            return 404;
        }
        location ~* /\.ht {
            return 404;
        }
    
        # Image not found replacement
        location ~* \.(jpe?g|png|gif|webp)$ {
            log_not_found off;
            error_page 404 /content/images/system/default/404.gif;
        }
        # CORS header (avoids font rendering issues)
        location ~* \.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js)$ {
            add_header Access-Control-Allow-Origin "*";
        }
    
        # PHP front controller
        location / {
            index index.php;
            try_files $uri $uri/ /index.php$is_args$query_string;
        }
    
        # Single PHP-entrypoint (disables direct access to .php files)
        location ~* \.php$  {
            include fastcgi_params;
            fastcgi_intercept_errors on;
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        }
    
出现问题:访问网页502(Bad Gateway)
  1. 一般是nginxphp-fpm间的通信问题。

    查看var/log/nginx/access.log/var/log/nginx/error.log,其中errro.log显示的信息更全。

    首先是在nginx - serve - \~.php 的配置中fastcgi_passphp-fpm的配置中的listen属性不一样。

    php-fpm启动了但是9000端口还没被使用,可通过netstat -lntp查看。

    改成同样的127.0.0.1:9000后,问题换了。

  2. 访问网页显示为404。

    此时原因变为FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

    这时就是权限问题了。

    nginx.conf中的user需要和php-fpm/www.conf中的usergroup要一致,我都设成user;同时,在nginx - server - \~.php 配置中修改fastcgi_paramSCRIPT_FILENAME $document_root$fastcgi_script_name

  3. 这时候访问网页就是Failed to load resource: the server responded with a status of 500 ()。——快哭了。。。这时候再看nginxlog已经看不出问题了,访问也是200。。。

    下面要看php-fpm的日志,但是php-fpm默认关闭了worker进程的错误输出,所以看不到php的错误日志。

    需要在php-fpm[www]配置中加上catch_workers_output = yes , php_flag[display_errors] = on php.inidisplay_errors=On(向浏览器返回错误),日志输入路径位于[global]下的error_log属性。

    这时候出现Uncaught TypeError: Cannot read properties of null (reading 'src')

    这个真不知道该怎么解决了,估计是环境问题,难受。所以最后改用了Docker来实现

Installer安装

这种方法似乎免费版没有。

下载installer.php文件,执行后自动生成。

curl -S -o installer.php -L "https://github.com/chevereto/installer/releases/download/$TAG/installer.php"

Docker-compose

难受,这个方便归方便,一天就能摸透,但还是难受

配置安装
  1. 新建文件夹(文件夹视自身情况调整,这些将被挂载到Docker容器中)

    mkdir -p /home/www/html/chevereto
    mkdir -p /home/www/html/chevereto/database
    mkdir -p /home/www/html/chevereto/images
    mkdir -p /home/www/html/chevereto/content
    # 修改相关目录属性,
    chmod 777 /home/www/html/chevereto
    chmod 777 /home/www/html/chevereto/database
    chmod 777 /home/www/html/chevereto/images
    chmod 777 /home/www/html/chevereto/content
    
  2. /home/www/html/cheverto目录下新建docker-compose.yml文件

    参考chevereto-free/httpd-php.yml

    注意,由于默认的database未配置端口映射,所以database这个服务通过无法在主机上建立连接,只能进入docker容器中查看,也是自己初次使用的疏忽,可以在database中添加

    ports: 
    - 3307:3306
    

    将主机的3307端口映射到容器的3306端口,不配置不影响使用,但如果是突然对其内部的结构感兴趣了,没办法用数据库连接工具还是挺难受的TAT

    version: "3.2"
    
    services:
      database:
        container_name: chevereto-free_database
        image: mariadb:focal
        networks:
          - chevereto
        volumes: # 映射:前面为主机地址,后面为Docker容器内地址
          - database:/var/lib/mysql:rw
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: chevereto
          MYSQL_USER: chevereto
          MYSQL_PASSWORD: user_database_password
    
      chevereto:
        container_name: chevereto-free_app
        image: ghcr.io/rodber/chevereto-free:1.6
        networks:
          - chevereto
        volumes:
          - ./images:/var/www/html/images/:rw
          - ./content:/var/www/html/content/:rw
          - ./php.ini:/user/local/etc/php/php.ini:ro
        ports:
          - 8810:80
        restart: always
        environment:
          CHEVERETO_TAG: "free"
          CHEVERETO_DB_HOST: database
          CHEVERETO_DB_USER: chevereto
          CHEVERETO_DB_PASS: user_database_password
          CHEVERETO_DB_PORT: 3306
          CHEVERETO_DB_NAME: chevereto
          CHEVERETO_DISABLE_UPDATE_HTTP: 1
          CHEVERETO_DISABLE_UPDATE_CLI: 1
          CHEVERETO_HTTPS: 0
    
    volumes: 
      database:
      content:
      storage:
    
    networks:
      chevereto:
    
  3. 启动并运行(Up)

    docker-compose \
        -p chevereto-free \
        -f httpd-php.yml \
        up --abort-on-container-exit
    
  4. 停止(Stop)

    docker-compose \
        -p chevereto-free \
        -f httpd-php.yml \
        stop
    
  5. 启动(Start)

    docker-compose \
        -p chevereto-free \
        -f httpd-php.yml \
        start
    
  6. 卸载(Down)

    docker-compose \
        -p chevereto-free \
        -f httpd-php.yml \
        down --volumes
    
Docker下Nginx反向代理
upstream img.xxx.com {  
    server 127.0.0.1:8810; # 端口改为docker容器提供的端口
}

server {
    listen 80;
    server_name  img.xxx.com;
    return 301 https://img.xxx.com$request_uri;
}

server {
    listen 443 ssl;
    server_name  img.xxx.com;
    gzip on;    

    # ssl 配置
    ssl_certificate ssl/1_img.xxx.com.crt;
    ssl_certificate_key ssl/2_img.xxx.com.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/chevereto_docker_access.log combined;
    error_log  /var/log/nginx/chevereto_docker_error.log;

    location / {
        proxy_redirect off;
        proxy_pass http://img.xxx.com;

        proxy_set_header  Host                $http_host;
        proxy_set_header  X-Real-IP           $remote_addr;
        proxy_set_header  X-Forwarded-Ssl     on;
        proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto   $scheme;
        proxy_set_header  X-Frame-Options     SAMEORIGIN;

        client_max_body_size        100m;
        client_body_buffer_size     128k;

        proxy_buffer_size           4k;
        proxy_buffers               4 32k;
        proxy_busy_buffers_size     64k;
        proxy_temp_file_write_size  64k;
    }
}

使用

Pic-Go插件

为了更好地使用图床来写Markdown,当然是得Typora+picGo`了。

Pic-Go插件中搜索chevereto,配置UrlKey

  • Url的格式一般为:https://xxx.com/api/1/upload
  • Key位于Dashboard - Settings - API中。

要注意的是chevereto没有提供删除图片的API,所以在PicGo中删除后,也仅仅只是在PicGo中把记录去掉,在chevereto中还是保留的。

此外,文件名带中文的话在上传之后对应的唯一标识符会将中文去掉,生成的url也会没有中文,但图片信息还是有中文的。

上传配置

  • 配置路径 Dashboard - Settings - Image upload
  1. 按照惯例,我是要对上传的图片按照<时间戳>-<文件名>进行重命名的。这个重命名通过PicGo就可以完成。所以对于Chevereto来说,只要保留原文件名就可以,这点在File naming method中保留为Original即可。

    CHeverote文件命名的方式有四种:Original(默认), Random, Mix Original+Random, ID

  2. 但Chevereto默认的保存位置是按照日期来建立文件夹的,如/images/2022/02/22/,为了能直观的看图,不按照区分文件夹,可以设置Storage modeDirect(默认为Datefolders)。

  3. 通过Url上传的文件,默认归到guest用户下,如果需要上传到自己用户下,我们需要复写API的配置。

    1. 将默认的app/routes/route.api.php文件复制到app/routes/overrides/route.api.php

    2. 修改代码(修改docker容器内的文件见下一点)

      CHV\Image::uploadToWebsite($source);
      
      // 这将会为juanito用户上传图片
      CHV\Image::uploadToWebsite($source, 'juanito');
      
    3. 此时再上传的就是到自己的用户下。

Docker容器文件修改

以修改上述配置为例

  1. 进入容器的方式建议用docker exec

    docker container ls  # 查看在运行的容器
    
    docker exec -it <container ID> bash # i表示id, t表示terminal
    
  2. 可以在容器中安装vi进行修改,但为了小改而装比较难受,所以换种方法

  3. 使用docker cp 复制文件到主机(主机环境下)

    1. 拷贝出来

      sudo docker cp <containerId>:/var/www/html/app/routes/route.api.php /home/ubuntu
      
    2. 修改

    3. 拷贝回去

      sudo docker cp  /home/ubuntu/route.api.php <containerId>:/var/www/html/app/routes/override
      
  4. 此时再上传已经可以上传到自己用户下

参考

posted @ 2024-12-23 14:27  Zang998  阅读(334)  评论(0)    收藏  举报  来源