个人图床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>
文件权限
需要有以下文件夹的访问权限
/tmpapp/content/app/content/languages/app/content/languages/cache/app/content/system/content/images/
chevereto安装
3种方式
压缩包安装
这种安装方式折腾了很久,但还是无法解决掉,很难受
-
下载对应的
.zip文件解压到自己的public_html文件夹中 -
创建
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';" -
配置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)
-
一般是
nginx和php-fpm间的通信问题。查看
var/log/nginx/access.log或/var/log/nginx/error.log,其中errro.log显示的信息更全。首先是在
nginx - serve - \~.php的配置中fastcgi_pass和php-fpm的配置中的listen属性不一样。即
php-fpm启动了但是9000端口还没被使用,可通过netstat -lntp查看。改成同样的
127.0.0.1:9000后,问题换了。 -
访问网页显示为404。
此时原因变为
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream。这时就是权限问题了。
在
nginx.conf中的user需要和php-fpm/www.conf中的user和group要一致,我都设成user;同时,在nginx - server - \~.php配置中修改fastcgi_param为SCRIPT_FILENAME $document_root$fastcgi_script_name。 -
这时候访问网页就是
Failed to load resource: the server responded with a status of 500 ()。——快哭了。。。这时候再看nginx的log已经看不出问题了,访问也是200。。。下面要看
php-fpm的日志,但是php-fpm默认关闭了worker进程的错误输出,所以看不到php的错误日志。需要在
php-fpm的[www]配置中加上catch_workers_output = yes , php_flag[display_errors] = on,php.ini中display_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
难受,这个方便归方便,一天就能摸透,但还是难受
配置安装
-
新建文件夹(文件夹视自身情况调整,这些将被挂载到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 -
在
/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: -
启动并运行(Up)
docker-compose \ -p chevereto-free \ -f httpd-php.yml \ up --abort-on-container-exit -
停止(Stop)
docker-compose \ -p chevereto-free \ -f httpd-php.yml \ stop -
启动(Start)
docker-compose \ -p chevereto-free \ -f httpd-php.yml \ start -
卸载(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,配置Url和Key。
Url的格式一般为:https://xxx.com/api/1/uploadKey位于Dashboard - Settings - API中。
要注意的是chevereto没有提供删除图片的API,所以在PicGo中删除后,也仅仅只是在PicGo中把记录去掉,在chevereto中还是保留的。
此外,文件名带中文的话在上传之后对应的唯一标识符会将中文去掉,生成的url也会没有中文,但图片信息还是有中文的。
上传配置
- 配置路径
Dashboard - Settings - Image upload
-
按照惯例,我是要对上传的图片按照
<时间戳>-<文件名>进行重命名的。这个重命名通过PicGo就可以完成。所以对于Chevereto来说,只要保留原文件名就可以,这点在File naming method中保留为Original即可。CHeverote文件命名的方式有四种:
Original(默认),Random,Mix Original+Random,ID。 -
但Chevereto默认的保存位置是按照日期来建立文件夹的,如
/images/2022/02/22/,为了能直观的看图,不按照区分文件夹,可以设置Storage mode为Direct(默认为Datefolders)。 -
通过Url上传的文件,默认归到
guest用户下,如果需要上传到自己用户下,我们需要复写API的配置。-
将默认的
app/routes/route.api.php文件复制到app/routes/overrides/route.api.php。 -
修改代码(修改docker容器内的文件见下一点)
CHV\Image::uploadToWebsite($source);// 这将会为juanito用户上传图片 CHV\Image::uploadToWebsite($source, 'juanito'); -
此时再上传的就是到自己的用户下。
-
Docker容器文件修改
以修改上述配置为例
-
进入容器的方式建议用
docker execdocker container ls # 查看在运行的容器 docker exec -it <container ID> bash # i表示id, t表示terminal -
可以在容器中安装vi进行修改,但为了小改而装比较难受,所以换种方法
-
使用
docker cp复制文件到主机(主机环境下)-
拷贝出来
sudo docker cp <containerId>:/var/www/html/app/routes/route.api.php /home/ubuntu -
修改
-
拷贝回去
sudo docker cp /home/ubuntu/route.api.php <containerId>:/var/www/html/app/routes/override
-
-
此时再上传已经可以上传到自己用户下

浙公网安备 33010602011771号