当前位置: 首页 > news >正文

Chevereto 图床搭建(转发)

 

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

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

  • Chevereto

    • GitHub:chevere/chevere: High quality library for modern PHP
    • Docs:Chevere
    • Docs-cn:简介 - Chevereto-中文文档
  • Chevereto-Free

    • GitHub:rodber/chevereto-free

    • Docs: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 fileslocation ~* (app|content|lib)/.*\.(po|php|lock|sql)$ {return 404;}location ~* composer\.json|composer\.lock|.gitignore$ {return 404;}location ~* /\.ht {return 404;}# Image not found replacementlocation ~* \.(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 controllerlocation / {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] = onphp.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_databaseimage: mariadb:focalnetworks:- cheveretovolumes: # 映射:前面为主机地址,后面为Docker容器内地址- database:/var/lib/mysql:rwrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: passwordMYSQL_DATABASE: cheveretoMYSQL_USER: cheveretoMYSQL_PASSWORD: user_database_passwordchevereto:container_name: chevereto-free_appimage: ghcr.io/rodber/chevereto-free:1.6networks:- cheveretovolumes:- ./images:/var/www/html/images/:rw- ./content:/var/www/html/content/:rw- ./php.ini:/user/local/etc/php/php.ini:roports:- 8810:80restart: alwaysenvironment:CHEVERETO_TAG: "free"CHEVERETO_DB_HOST: databaseCHEVERETO_DB_USER: cheveretoCHEVERETO_DB_PASS: user_database_passwordCHEVERETO_DB_PORT: 3306CHEVERETO_DB_NAME: cheveretoCHEVERETO_DISABLE_UPDATE_HTTP: 1CHEVERETO_DISABLE_UPDATE_CLI: 1CHEVERETO_HTTPS: 0volumes: 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(默认), RandomMix Original+RandomID

  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. 此时再上传已经可以上传到自己用户下

参考

  • Ubuntu 下如何升级到 PHP 7.4 ? | PHP优质外文翻译 | PHP 技术论坛
  • 使用 Docker 安装 Chevereto - 掘金
  • Nginx + Php-fpm 一个神奇的502错误 - 简书
  • php-fpm启动成功但是9000端口没被用? - SegmentFault 思否
  • PHP Primary script unknown 终极解决方法 - SegmentFault 思否
  • 【5分钟玩转Lighthouse】打造沉浸式Markdown写作环境 - 云+社区 - 腾讯云
  • docker compose 部署迁移 Chevereto 图床程序教程 - 思有云 - IOIOX
 
 
http://www.jsqmd.com/news/801791/

相关文章:

  • 修复控油洗发水推荐:清爽好物精选 - 速递信息
  • Vidscribe:基于yt-dlp与多引擎ASR的视频转文字一体化解决方案
  • LayerDivider:5分钟掌握智能插画分层终极指南
  • DOL-CHS-MODS游戏模组整合:一键开启完整中文体验
  • 2026年大连搬家公司深度横评:从个人搬迁到企业迁移的一站式解决方案 - 精选优质企业推荐官
  • 从仿真到实战:Multisim火灾报警电路中的三极管驱动设计与电流验算避坑指南
  • 论文AI率高怎么破?2026实用指南:避坑+快速降AI方法+工具推荐 - agihub
  • 中西医结合考研辅导班推荐:专门针对性培训机构评测 - michalwang
  • 终极指南:3分钟为Windows 11 24H2 LTSC恢复微软商店的完整教程
  • 重构欲望程度游戏体验:DOL-CHS-MODS个性化模组配置完全指南
  • Moonlight TV:3步实现电视大屏游戏串流,告别显卡限制
  • 高通音频架构(四):从ASoC到ADSP的数据流转与功耗优化
  • 2026年湘潭高端门窗定制指南:系统断桥铝门窗与中空玻璃阳光房深度横评 - 优质企业观察收录
  • AI时代下,孩子还有必要学习编程吗?
  • 深度解析:Jsxer - Adobe ExtendScript二进制格式的极速反编译器技术揭秘
  • 论文降AI率通关指南:7个实用技巧+高效工具一次讲清 - agihub
  • 分布式爬虫实战:Redis+Scrapy搭建高并发采集系统
  • Taotoken模型广场功能体验一站式比较与选用主流模型
  • 终极Windows Defender控制指南:开源工具完全掌控系统安全
  • BBDown完全指南:5分钟掌握B站视频下载的终极方案
  • 蓬松洗发水推荐:丰盈蓬松的控油洗发水 - 速递信息
  • 兵器科学与技术考研辅导班推荐:专门针对性培训机构评测 - michalwang
  • 2026年三网随身WiFi深度横评:华为、飞猫、格行、云齐品,谁才是真正的“信号自由”之选? - 资讯焦点
  • DOL-CHS-MODS开源工具优化方案使用指南
  • 终极免费解决方案:3分钟永久解锁科学文库加密PDF,完整恢复文献自由使用权
  • 【独家首发】DeepSeek内部API Gateway SLO治理手册:SLI定义、错误预算分配、告警收敛策略(含Prometheus+Grafana完整Dashboard模板)
  • 别慌!Linux服务器突然死机重启,用这5个命令快速定位是软件bug还是硬件问题
  • 电气工程考研辅导班推荐:专门针对性培训机构评测 - michalwang
  • 如何用Perplexity Science秒级定位顶刊论文?——3步构建可复现、可验证、可审计的学术搜索工作流
  • 别再搞混了!SD卡协议与FatFs文件系统里的Block和Sector到底啥关系?