为什么要自建图床?因为我机器在吃灰(逃 因为要给朋友一起用。
选用的图床平台为 Lsky-Pro(GitHub仓库:lsky-org/lsky-pro),对我而言功能足够多,且符合我对美观和实用的要求。
特性(From 官方文档):
- 支持本地等多种第三方云储存 AWS S3、阿里云 OSS、腾讯云 COS、七牛云、又拍云、SFTP、FTP、WebDav、Minio
- 多种数据库驱动支持,MySQL 5.7+、PostgreSQL 9.6+、SQLite 3.8.8+、SQL Server 2017+
- 支持配置使用多种缓存驱动,Memcached、Redis、DynamoDB、等其他关系型数据库,默认以文件的方式缓存
- 多图上传、拖拽上传、粘贴上传、动态设置策略上传、复制、一键复制链接
- 强大的图片管理功能,瀑布流展示,支持鼠标右键、单选多选、重命名等操作
- 自由度极高的角色组配置,可以为每个组配置多个储存策略,同时储存策略可以配置多个角色组
- 可针对角色组设置上传文件、文件夹路径命名规则、上传频率限制、图片审核等功能
- 支持图片水印、文字水印、水印平铺、设置水印位置、X/y 轴偏移量设置、旋转角度等
- 支持通过接口上传、管理图片、管理相册
- 支持在线增量更新、跨版本更新
- 图片广场
可以在官方文档中了解到更多信息。
安装前准备
Lsky-Pro需要的组件为(From 官方文档):
- PHP >= 8.0.2
- BCMath PHP 扩展
- Ctype PHP 扩展
- DOM PHP 拓展
- Fileinfo PHP 扩展
- JSON PHP 扩展
- Mbstring PHP 扩展
- OpenSSL PHP 扩展
- PDO PHP 扩展
- Tokenizer PHP 扩展
- XML PHP 扩展
- Imagick 拓展
- exec、shell_exec 函数
- readlink、symlink 函数
- putenv、getenv 函数
支持的数据库(From 官方文档):
- Mysql 5.7+
- PostgreSQL 9.6+
- SQLite 3.8.8+
- SQL Server 2017+
配置PHP
需要注意的是:在使用PHP8.2测试时会报HTTP 500错误,使用8.1版本正常,故使用8.1版继续。
获取PHP源(如果当前系统不存在):
Frequently Asked Questions · oerdnj/deb.sury.org Wiki (github.com)
curl -sSL https://packages.sury.org/php/README.txt | bash -x
sudo apt update
安装Lsky-Pro需求组件:
apt install php8.1 php8.1-cli php8.1-common php8.1-fpm php8.1-xml php8.1-curl php8.1-mysql php8.1-sqlite3 php8.1-mbstring php8.1-gd php8.1-fileinfo php8.1-exif php8.1-bcmath php8.1-imagick
可以创建index.php并包含
<?php
phpinfo();
来获得当前PHP可用的信息,并与Lsky-Pro的需求进行对照。
随后对PHP-FPM设置进行一些调整;我的配置文件位于 /etc/php/8.1/fpm/php.ini,以您的安装为准:
- upload_max_filesize = 5M 单个文件上传的最大大小。
- post_max_size = 10M 一次POST队列(即一次上传)的最大大小。
- max_execution_time = 300 最大执行时间。当上传超过此时间时,上传会被终止。以秒为单位。
- memory_limit = 128M 使用的最大内存,取决于你的用途和机器配置。
- 注释掉open_basedir(即对本行添加分号)。
保存后重启php8.1-fpm服务刷新配置文件。
配置mysql
虽然sqlite可能更lite (废话) ,但我现有服务均使用了mysql/mariadb,故直接使用mysql作为数据库。
MariaDB [(none)]> create database lsky_pro;
Query OK, 1 row affected (0.001 sec)
MariaDB [(none)]> grant all on lsky_pro.* to [email protected] identified by 'yourpasswordhere';
Query OK, 0 rows affected (0.004 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> exit;
Bye
安装Lsky-Pro本体
首先从GitHub下载最新的release版本,本文写作时为2.1,并解压至一个喜欢的位置。我放在了/var/www/img.example.com/
。
解压并修改文件权限:
wget https://github.com/lsky-org/lsky-pro/releases/download/2.1/lsky-pro-2.1.zip
unzip lsky-pro-2.1.zip
chmod -R 755 /var/www/example.com
chown -R www-data /var/www/example.com
设置nginx反代:
server {
listen 80;
listen [::]:80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;
ssl_certificate /dir/to/your/fullchain.pem;
ssl_certificate_key /dir/to/your/privkey.pem;
client_max_body_size 100M; #最大数据大小
root /var/www/example.com/public/; #注意指定至public文件夹
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header REMOTE-HOST $remote_addr;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
随后浏览器访问域名即可安装。
通过nsfwjs实现图片自动审核
原仓库:infinitered/nsfwjs
此处利用Docker:penndu/nsfw-api
可以通过作者原文直接docker run运行,但我喜欢docker-compose。docker-compose.yml如下:
version: '3'
services:
nsfw-api:
image: penndu/nsfw-api:latest
restart: unless-stopped
hostname: nsfw-api
container_name: nsfw-api
ports:
- "3000:3000"
切换左侧数字为宿主机上空闲的端口号即可使用,此时请求地址为 http://ip:3000/classify
。
也可继续搭配nginx反代端口:
server {
listen 80;
listen [::]:80;
server_name api.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/ssl/certs/api.example.com/fullchain.pem;
ssl_certificate_key /etc/ssl/certs/api.example.com/privkey.pem;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:3000/classify;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
此时直接使用根地址即可使用。
最后修改于 2022-12-14