编辑
2025-01-07
Docker
00
请注意,本文编写于 85 天前,最后修改于 51 天前,其中某些信息可能已经过时。

目录

组件说明
部署流程
配置Alist
基本配置
配置Nginx Proxy Manager反代
配置Lsky
基本配置
配置Nginx Proxy Manager

本文主要内容

本文介绍如何搭建基于Alist+Lsky的图床系统,包括:

  1. 使用Docker部署Alist作为存储后端
  2. 使用Docker部署Lsky作为图床前端
  3. Nginx反向代理配置与防盗链设置

组件说明

  • Alist: 作为存储后端,用于对接各类网盘
  • Lsky: 作为图床前端,提供图片上传和管理功能
  • Nginx: 提供反向代理和防盗链功能
  • PostgreSQL: 为Lsky提供数据存储(配置参考

部署流程

配置Alist

基本配置

  1. 创建并编辑docker-compose.yaml
    bash
    mkdir -p ~/docker_data/alist && cd ~/docker_data/alist && nano docker-compose.yaml
    添加以下内容:
    yaml
    services: alist: image: 'xhofe/alist:latest' networks: - network container_name: alist volumes: - './alist:/opt/alist/data' ports: - '65023:5244' environment: - PUID=0 - PGID=0 - UMASK=022 restart: unless-stopped Aria2-Pro: container_name: aria2-pro image: p3terx/aria2-pro environment: - PUID=0 - PGID=0 - UMASK_SET=022 - RPC_SECRET=CcARDo2PM7qJazYj1ywpKBNz9VSY # 修改成自己的RPC密码 - RPC_PORT=6800 - LISTEN_PORT=6888 - DISK_CACHE=64M - IPV6_MODE=false - UPDATE_TRACKERS=true - CUSTOM_TRACKER_URL= - TZ=Asia/Shanghai - SPECIAL_MODE=rclone volumes: - ./aria2-config:/config - ./downloads:/downloads - ./alist/alist/temp/aria2:/opt/alist/data/temp/aria2 # 必须共享alist的缓存文件夹,否则alist使用aria2离线下载会报错找不到文件 networks: - network #ports: #- 6800:6800 #- 6888:6888 #- 6888:6888/udp restart: unless-stopped # 限制log大小 logging: driver: json-file options: max-size: 1m networks: network: driver: bridge
  2. 启动Alist服务
    bash
    docker compose up -d
  3. 访问http://your-ip:65023,按照下面的流程进行配置。
    • 配置Aria2。填入地址和密钥。 image.png

      注意

      Aria2地址中的host为你的aria2容器名称。这里为Aria2-Pro

    • 配置存储。这里以OneDrive为例(具体配置流程请参考Alist文档image.png

      注意

      如果要开启Lsky的原图保护和动态水印的话,那么对应的存储的WebDAV策略必须是本地代理!!!!否则访问Lsky生成的带水印的图片链接会造成404(直接访问/Blog/图片路径没问题)

    • 创建一个用于访问图床的账号。注意这里的基本路径需要和上面存储里的挂载路径一致 image.png

配置Nginx Proxy Manager反代

  1. 如图配置(SSL证书获取不赘述) image.png

配置Lsky

基本配置

  1. 创建并编辑docker-compose.yaml
    bash
    mkdir -p ~/docker_data/lskypro && cd ~/docker_data/lskypro && nano docker-compose.yaml
    添加以下内容:
    yaml
    services: lskypro: image: halcyonazure/lsky-pro-docker:latest restart: unless-stopped hostname: lskypro container_name: lskypro volumes: - ./web:/var/www/html/ ports: - 65022:8089 networks: - pgsql_network networks: pgsql_network: external: true

    networks是用外部数据库网络配置是为了在不暴露数据库端口的情况下,使得在后续网页配置数据库阶段可以直接使用PostgreSQL容器名(参考教程容器名为db)作为数据库连接host。

  2. 启动LskyPro服务
    bash
    docker compose up -d
  3. 在PostgreSQL数据库中创建一个Database。根据上面教程部署PostgreSQL数据库后,复制下面脚本内容到~/docker_data/pgsql下,然后写入你想要的Database名称到databases内。这里以lskypro为例。
    bash
    #!/bin/bash set -e # List of databases to create or ensure exist databases=("lskypro" "typecho-blog") # 定义 PostgreSQL 环境变量 DB_USER="typecho_lim" # 替换为您的 Postgres 用户名 DB_NAME="postgres" # 替换为默认的初始数据库名称 # 遍历数据库列表并创建数据库 for db in "${databases[@]}"; do # 执行 SELECT 命令并将结果传递给 grep if ! docker compose exec db psql -v ON_ERROR_STOP=1 --username "$DB_USER" --dbname "$DB_NAME" -c "SELECT 1 FROM pg_database WHERE datname='$db'" | grep -q "1"; then echo "Database '$db' does not exist, creating it..." docker compose exec db psql -v ON_ERROR_STOP=1 --username "$DB_USER" --dbname "$DB_NAME" -c "CREATE DATABASE $db" else echo "Database '$db' already exists." fi done echo "All databases have been created or verified."
  4. 访问http://your-ip:65022,如图完成配置。

    image.png image.png

  5. 添加一个新存储策略。存储策略 -> 创建存储策略。Alist图床文件夹里里必须要对应有Blog这个对于文件夹(可以自行替换,只要保证图床访问域名最后部分在Alist里有对应名称文件夹即可) image.png

    上文在Alist搭建部分创建的账号的基本路径和Alist的存储挂载路径一致(这里是图床),意味着通过此账号的/dav接口访问时,直是返回的/图床/*文件夹内的文件(不包括/图床自己)。(例如访问/dav/Blog/1.png对应到Alist里是/图床/Blog/1.png)因此上图里的路径前缀实际访问的是/图床/Blog

配置Nginx Proxy Manager

  1. 如图配置(SSL证书获取不赘述) image.png

  2. 配置Custom Location

    - 这一步主要是为了解决在设置防盗链后,Lsky自己的thumbnails失效无法访问的问题 image.png - 配置防盗链。注意这里需要指向到Alist的服务,不是Lksy服务!! CleanShot 2025-01-08 at 21.54.57@2x.png

    nginx
    localtion ~ ^/(.*\.(jpeg|jpg|png|gif|tif|bmp|ico|psd|webp))$ { proxy_cache public-cache; # 设置缓存区域。进入NPM docker容器,cat /etc/nginx/nginx.conf | grep proxy_cache_path,可以看到有public-cach和private-cache两个选择 proxy_cache_valid 200 301 302 1d; # 当后端返回状态码为 200,301,302时,将该响应缓存 1 天。 proxy_cache_valid 404 1m; # 404 页面缓存 1 分钟 proxy_ignore_headers Cache-Control Set-Cookie; # 由于上有服务器有Cache-Control,会导致前端访问图片返回x-cache:CONFIG_NOCACHE,因此需要ignore上游的Cache-Control add_header X-Cache-Status $upstream_cache_status; # 监控缓存状态,并查看哪些请求被缓存,哪些没有被缓存。HIT:命中缓存,MISS:未命中,可能是第一次请求,BYPASS:缓存被绕过,可能是因为配置或缓存已过期。 proxy_pass http://172.17.0.1:65023/dav/$1 proxy_set_header Authorization "Basic xxxxx"; valid_referers none blocked server_names *.useforall.com ~\.google\. ~\.bing\. ~\.baidu\. ; if ($invalid_referer) { rewrite ^/ http://img.buo.us.kg/i/2025/01/05/zgqtqm.webp; } }

    讲解

    1. 如果访问链接内包含thumbnails,那么还是指向Lsky服务自己;
    2. 其次,如果访问的是jpeg|jpg|png|gif|tif|bmp|ico|psd|webp这些文件,那么赋值到$1然后在proxy_pass调用;
    3. 把创建的Alist账户的用户名和密码做base64加密(输入用户名:密码),然后替换proxy_set_header Authorization里的xxxxx为加密后字符串;
    4. valid_referers 相当于一个白名单列表,里面配置的都是放行名单,支持正则表达式;
    5. none 表示允许请求报文中没有 referer 的情况,目的是为了让图片能直接通过浏览器地址栏打开;
    6. blocked 表示允许请求报文中有 referer,但值为空或无效的情况,主要是为了应对请求通过防火墙或代理服务器时,referer 的值被删除或伪装的情形;
    7. *.useforall.com 是允许的所有子域名;
    8. ~\.google\. ~\.bing\. ~\.baidu\. 等是为了不影响各大搜索引擎收录的,当然,如果还想放行其它的网站也可以继续追加,如github等。

本文作者:Lim

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!