1. 简介

1.1 依赖的相关软件

  • DockerDocker-Compose底层运行环境
  • Minio底层的存储支持
  • Mysql关系型数据库
  • Redis缓存中间件
  • NginxProxyManager(以下简称 NPM)管理 Nginx 反向代理的开源工具
  • PortainerDocker容器管理
  • 兰空图床图片管理,如果使用第三方如阿里云S3、七牛S3,可以省略
  • CloudFlare DNS 服务提供商,解析域名
  • Halo博客系统

为什么要搭建自己的图床,不使用第三方阿里云、七牛等OSS?

  1. 完全控制:自己搭建图床,你可以完全控制数据的存储、访问权限、安全策略等,避免第三方服务商的政策变动或限制。
  2. 隐私和安全:对于高度敏感的图片或数据,自己搭建图床可以确保数据不会被第三方服务商访问或存储。
  3. 自定义功能:可以根据需要自定义图床的功能,如图片压缩、水印添加、格式转换等,满足特定业务需求。
  4. 成本管理:如果图片流量和存储需求在可控范围内,自己搭建图床可能比第三方服务商的按需计费模式更具成本效益。
  5. 无依赖性:不依赖于第三方服务商的服务质量和可用性,减少潜在的服务中断风险。

1.2 端口规划

假设域名为itweek.top,这里加上二级域名访问地址则为:https://blog.itweek.top

软件 端口 二级域名前缀
Minio 9090 - api端口
9091 - 控制台端口
m - 映射api端口
minio - 映射控制台端口
Mysql 3306
Redis 6379
NginxProxyManager 80 - HTTP端口
443 - HTTPS端口
81 - NPM管理界面端口
npm
兰空图床 8089 - HTTP端口
8088 - HTTPS端口
lsky
Portainer 9000 - 容器管理端口 pt
Halo 8090 - 博客管理端口 blog

1.3 目录相关

根目录 /home/soft/docker, 这里用来存放所有的软件部署文件

上面是使用 vscodeRemote - SSH插件远程连接到云服务器上,方便编辑配置文件和创建文件夹。

建议提前按照上述截图创建好对应目录及文件。

2. 服务器及域名

服务器:至少2核2G内存,放开 80814433306端口,这里假定ip地址为 118.60.60.118

域名:通过 泛解析NPM,可以方便地管理大量的子域名,而无需为每个子域名单独配置 DNS 记录和反向代理规则,通过 NPM,能够轻松配置和管理 SSL 证书,提升站点的安全性.这里假定域名为 itweek.top

以下通过 Namesilo申请域名及 CloudFlare设置DNS解析作为示例,介绍如何设置泛解析及为后续 NPM托管域名申请SSL证书做准备。

详细操作过程见 Namesilo+Cloudflare申请域名及DNS解析指南

按照上述操作后需要记录对应的 API令牌

3. 软件配置文件

3.1 Minio

  • docker-compose.yml
version: '3'
services:
minio:
restart: unless-stopped
image: minio/minio
container_name: minio
volumes:
- ./config:/config
- ./data:/data
# 指定控制台的端口
command: server /data --console-address ":9001"
environment:
- 'MINIO_ROOT_USER=minio'
- 'MINIO_ROOT_PASSWORD=minio'
ports:
# api端口
- 9090:9000
# 控制台端口,如果上述command不配置,默认为9090
- 9091:9001

修改 MINIO_ROOT_PASSWORD配置

3.2 Mysql

  • docker-compose.yml
version: '3'
services:
mysql:
restart: always
image: mysql:5.7.35
container_name: mysql
volumes:
- ./datadir:/var/lib/mysql:rw
- ./my.cnf:/etc/mysql/my.cnf
environment:
- "MYSQL_ROOT_PASSWORD=root"
- "TZ=Asia/Shanghai"
ports:
# 使用宿主机的3306端口映射到容器的3306端口
- 3306:3306

修改 MYSQL_ROOT_PASSWORD配置,这里如果是群晖部署,./datadir:/var/lib/mysql:rw需要指定 rw读写 权限,不然后期无法删除数据库。

  • my.cnf
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
character-set-client-handshake=FALSE
init_connect='SET NAMES utf8'
max_connections=1000
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

3.3 Redis

  • docker-compose.yml
version: '3.3'
services:
redis:
image: redis:latest
container_name: redis
restart: always
ports:
- '6379:6379'
volumes:
- ./data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
- ./logs:/logs
#配置文件启动
command: redis-server /usr/local/etc/redis/redis.conf
  • redis.conf
# 开启保护
protected-mode no # 绑定监听IP地址
bind 0.0.0.0 # 自定义密码
requirepass root # 启动端口
port 6379 # redis 默认就开启 rdb 全量备份,以下是默认的备份触发机制
# 900s内至少一次写操作则执行bgsave进行RDB持久化
save 900 1
save 300 10
save 60 10000 # 是否压缩 rdb 备份文件,默认是压缩
# 如果 redis 承载的数据量非常大的话,建议不要压缩
# 因为压缩过程中需要耗费大量 cpu 和内存资源,磁盘相对而言比较廉价
rdbcompression yes # rdb 备份的文件名
dbfilename dump.rdb # Redis 备份文件存储目录,注意:该路径是 docker 容器内的路径
dir /data # 是否开启 aof 增量备份功能,默认是否
appendonly yes
# AOF文件的名称,这里使用默认值
appendfilename appendonly.aof
# aof 增量备份的策略,这里是每秒钟一次,将累积的写命令持久化到硬盘中
appendfsync everysec

修改 requirepass配置

3.4 NPM

  • docker-compose.yml
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
# These ports are in format <host-port>:<container-port>
- '80:80' # Public HTTP Port
- '443:443' # Public HTTPS Port
- '81:81' # Admin Web Port
# Add any other Stream port you want to expose
# - '21:21' # FTP
environment:
# Mysql/Maria connection parameters:
DB_MYSQL_HOST: "172.17.0.1"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "root"
DB_MYSQL_PASSWORD: "root"
DB_MYSQL_NAME: "npm"
# Uncomment this if IPv6 is not enabled on your host
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt

修改 DB_MYSQL_PASSWORDDB_MYSQL_NAME,提前创建好npm数据库,后续数据库的表自动初始化。

create database npm default character set utf8mb4 collate utf8mb4_unicode_ci;

3.5 Portainer

可省略,这个主要是方便管理docker应用,以及查看应用日志。

  • docker-compose.yml
version: "3"
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
ports:
- "9000:9000"
volumes:
- ./data:/data
- /var/run/docker.sock:/var/run/docker.sock

3.6 Lsky Pro

  • docker-compose.yml
version: '3'
services:
lsky:
image: halcyonazure/lsky-pro-docker:latest
restart: unless-stopped
hostname: lsky
container_name: lsky
environment:
- WEB_PORT=8089
- HTTPS_PORT=8088
volumes:
- ./web:/var/www/html/
- /volume2/PUBLIC_PIC/uploads:/var/www/html/uploads
ports:
- "8089:8089"
- "8088:8088"

这里暂时不用指定mysql的配置,在初始化的时候引导界面可以指定mysql的连接信息及数据库,这里可以先创建好对应的数据库,后续数据库的表自动初始化。

create database lsky_pro default character set utf8mb4 collate utf8mb4_unicode_ci;

4. NPM设置

4.1 初始化

访问 http://118.60.60.118:81 界面,初始账号密码为

Email:    admin@example.com
Password: changeme

进去之后按照提示修改账号密码。

4.2 配置SSL证书

注意这里需要在域名提供商提前增加泛解析到该机器ip,并获取到对应的API令牌。

点击 SSL-Certificates , Add SSL Certificate,选择 Lets Encrypt

按如下要求填写信息:

  • Domain Names : *.itweek.top

  • Email Address for Lets Encrypt : 这里可以随便填写,但是最好填写域名提供商绑定的邮箱地址

  • DNS Proider选择Cloudflare

  • Credentials File Content按如下信息填写

    # Cloudflare API token
    dns_cloudflare_email = mulyzhou@gmail.com
    dns_cloudflare_api_key = 1ef26**************da3deeef3ec

    dns_cloudflare_emailEmail Address for Lets Encrypt保持一致

    dns_cloudflare_api_key 为提前申请好的API令牌

点击Save之后会去申请证书,成功之后会显示如下信息:

4.3 增加Proxy Host

点击 DashboardProxy Hosts ,Add Proxy Host

这里以NPM(二级域名为npm、端口地址为81)为例

详细信息 Details如下:

这里填写的 172.17.0.1是Docker默认的桥接网络(bridge network)的网关 IP 地址。这个 IP 地址通常用来与 Docker 容器进行网络通信。

SSL Certificate必须填 *.itweek.top,然后勾选上 Force SSLHTTP/2 Support。点击 save之后即能使用 https://npm.itweek.top访问 NPM

5. Minio设置

搭建的minio是新版的,界面和旧版的可能不一样。

5.1 配置域名

步骤和配置 NPM的域名访问一致,这里配置两个域名,一个为控制台的域名 https://minio.itweeks.top,一个为API存储桶 https://m.itweeks.top的访问域名,这样以后就能直接通过 https://m.itweeks.top/存储桶/key访问图片了。

5.2 创建地区和存储桶

登录https://minio.itweeks.top,用户名密码为 docker-compose.yml里配置的用户名和密码。

这里创建的地区为:us-east-1

创建 image的存储桶,创建成功之后点击该存储桶,然后设置存储桶的权限为 public

测试上传图片,这里上传的图片为 WX20240426-164920@2x.png,按照上面配置就能通过 https://m.itweek.top/image/WX20240426-164920@2x.png该链接访问预览该图片。

这个图片存储在服务器的位置如下,后续对该文件夹做好对应的备份即可。或者minio可以采用高可用集群部署,这里篇幅有限不再展开,感兴趣的同学可以自行研究。

5.3 申请密钥

这里记录下 Access KeySecret Key后面要用到。

6. 兰空图床设置

6.1 简介

兰空图床(Lsky Pro)是一款开源的图床程序,旨在为用户提供一个简单、方便、稳定的图像存储与分享平台。以下是兰空图床的一些主要特点和功能:

  1. 开源免费:兰空图床是开源软件,源代码托管在GitHub上,用户可以免费使用、修改和分发。
  2. 多存储支持:支持多种存储方式,包括本地存储、阿里云OSS、腾讯云COS、七牛云等第三方云存储,用户可以根据需求选择适合的存储方式。
  3. 多平台支持:兰空图床可以部署在多种平台上,包括Windows、Linux、macOS等,部署简单方便。
  4. 简洁的界面:提供简洁、美观的用户界面,操作简单,用户体验良好。
  5. API支持:提供丰富的API接口,方便开发者进行二次开发或与其他系统集成。
  6. 多用户支持:支持多用户管理,每个用户可以管理自己的图片,并可以设置不同的权限。
  7. 安全性:提供多种安全措施,包括访问控制、数据加密等,保障用户数据安全。
  8. 图片处理功能:内置图片处理功能,如缩放、裁剪、水印等,方便用户对图片进行各种操作。

兰空图床适合个人和团队使用,不仅可以用来存储和分享图片,还可以与博客、论坛等平台集成,提高图片管理效率。如果你对图床程序有需求,兰空图床是一个不错的选择。

6.2 配置域名

配置好 https://lsky.itweek.top的域名访问。

这里需要在 Custom locations下添加一个header,内容为:proxy_set_header X-Forwarded-Host $http_host;

勾选上 Force SSLHTTP/2 Support。点击 save

为什么需要在 Custom locations下添加header,具体可见官方仓库issue讨论。这里面的讨论还涉及到源码的修改,这个等应用搭建初始化完毕之后再修改。

6.3 初始化

访问 https://lsky.itweek.top,进入初始化页面。

配置数据库和管理员账号,这里要预先创建好对应的数据库 lsky_pro,数据库连接地址可以填写 172.17.0.1,用户名密码填写mysql的用户名密码,填写管理员账号邮箱及密码,点击立即安装。

6.4 修改源码

兰空图床的源码都映射在 lsky/web文件夹下

  1. 修改 /config/app.php

    'url' => env('APP_URL', 'https://xxxxx.com:50000'),

    'asset_url' => env('ASSET_URL', 'https://xxxxx.com:50000'),
  2. 修改 /app/Providers/ApServiceProvider.php第 32 行下面追加一行:

    \Illuminate\Support\Facades\URL::forceScheme('https');
  3. 修改 /app/Services/ImageService.php,在356行 'bucket_endpoint' => (bool)$configs->get(MinioOption::BucketEndpoint),下面增加: 'use_path_style_endpoint' => true,
  4. 配置cache

修改.env文件,使用 Redis

缓存驱动名称

  • CACHE_DRIVER=redis

redis 连接地址(可选)

  • REDIS_HOST=172.17.0.1

redis 连接密码(可选)

  • REDIS_PASSWORD=null

redis 连接端口(可选)

  • REDIS_PORT=6379

6.5 修改配置项

  • 系统设置 - 控制 - 关闭注册
  • 系统设置 - 控制 - 关闭画廊
  • 系统设置 - 控制 - 关闭游客上传
  • 用户管理 - 编辑用户 - 修改总用量 104857601024*1024*10 = 10G)

6.6 增加Minio存储策略

存储策略 - 新增存储策略

  • 名称 Minio
  • 存储策略 选择 Minio
  • AccessKey minio的AccessKey
  • SecretKey miniode的SecretKey
  • 连接地址 http://172.17.0.1:9090 这里直接填内网Minio的API地址
  • 区域填写 us-east-1
  • 存储桶名称 填写 image

点击确认创建,点击这里之后,不知道是不是兰空的bug,默认的图床始终无法更改为Minio,这里直接操作数据库修改默认图床。

到lsky_pro数据库的表 strategies找到 Minio的id及 groups系统默认组&游客组的id,往 group_strategy里插入一条数据。假设这里的默认组的id为1,Minio存储策略为2,执行如下sql:

INSERT INTO `lsky_pro`.`group_strategy` (`group_id`, `strategy_id`) VALUES (1, 2);

7. Halo设置

  • 应用市场 - 下载图床插件
  • 插件 - 启用图床插件
  • 点击图床插件详情 - 点击基本设置

API地址为兰空图床的访问路径(https://lsky.itweek.top) + /api/vi 。这里的 API Token如何获取?

进入兰空图床后台管理页面,点击接口。

执行如下方法:

curl --location --request POST 'https://lsky.itweek.top/api/v1/tokens' \
--header 'User-Agent: Apifox/1.0.0 (https://apifox.com)' \
--header 'Content-Type: application/json' \
--header 'Accept: */*' \
--header 'Host: image.itweek.top' \
--header 'Connection: keep-alive' \
--data-raw '{
"email":"mulyzhou@gmail.com",
"password":"*******"
}'

修改https://lsky.itweek.top及 emailpassword,这里的 emailpassword就是登录兰空图床管理后台的邮箱和账号。

执行之后返回的token即是授权token。

{
"status": true,
"message": "success",
"data": {
"token": "2|cCSkzG**********cgWoxhHXJ"
}
}

上述设置完毕之后就能在halo的后台,工具 - 图床管理 看到兰空图床的图片列表了。

至此整套halo使用兰空图床的环境就搭建完毕了。

8. 总结

这篇文档是一个详细的博客搭建指南,涵盖了从依赖的软件到目录结构等多个方面的内容。文档列出了搭建博客系统所需的软件及其用途,还解释了为什么要自建图床而不是使用第三方服务的理由,包括完全控制、隐私和安全、自定义功能、成本管理和无依赖性。

Halo博客+兰空图床搭建保姆级指南的更多相关文章

  1. Typora图片一键传——picgo使用兰空图床

    Typora picgo使用兰空图床 最近smms图床免费版的速度眼看着越来越慢,特别是到晚上,图片几乎是在原地打转,于是我想替换掉Typora中picgo默认使用的smms图床,网上的教程清一色地只 ...

  2. 强大博客搭建全过程(1)-hexo博客搭建保姆级教程

    1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...

  3. 使用Github 当作自己个人博客的图床

    使用Github 当作自己个人博客的图床 前提 本文前提: 我个人博客的草稿是存放在 github上的一个仓库 diarynote 截图存放的图片或者需要放在文章中图片,会固定存放在对应的文件夹中,我 ...

  4. 服务器部署 halo博客项目

    2020-8-9 13:45:14 有个进阶方法!  如果静态资源加载缓慢如图片,头像  则用CDN加速  (确实很秀!) https://cdn.jsdelivr.net/gh/你的用户名/你的仓库 ...

  5. 使用Hexo开源博客系统,轻松搭建你的个人博客(1)

    Hexo 是一个轻量级.简洁.高效且高逼格的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页.同时有着丰富的主题,官网或者GitHub都可 ...

  6. Halo博客的搭建

    今日主题:搭建一个私人博客 好多朋友和我说,能不能弄一个简单的私人博客啊,我说行吧,今天给你们一份福利啦! 搭建一个私人博客,就可以在自己的电脑上写博客了 Halo Halo 是一款现代化的个人独立博 ...

  7. 零成本搭建个人博客之图床和cdn加速

    本文属于零成本搭建个人博客指南系列 为什么要使用图床 博客文章中的图片资源文件一般采用本地相对/绝对路径引用,或者使用图床通过外链进行引用展示.本地引用的弊端我认为在于: 图片和博客放在同一个代码托管 ...

  8. 从零开始,搭建博客系统MVC5+EF6搭建框架(4)上,前后台页面布局页面实现,介绍使用的UI框架以及JS组件

    一.博客系统进度回顾以及页面设计 1.1页面设计说明 紧接前面基础基本完成了框架搭建,现在开始设计页面,前台页面设计我是模仿我博客园的风格来设计的,后台是常规的左右布局风格. 1.2前台页面风格 主页 ...

  9. 从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑

    前言      从上篇30岁找份程序员的工作(伪程序员的独白),文章开始,我说过我要用我自学的技术,来搭建一个博客系统,也希望大家给点意见,另外我很感谢博客园的各位朋友们,对我那篇算是自我阶段总结文章 ...

  10. 关于halo博客系统的使用踩坑——忘记登录密码

    踩坑: halo系统可以直接通过运行jar -jar halo-0.0.3.jar跑起来,也可以通过导入IDE然后运行Application的main方法跑起系统. h2数据库访问路径:http:// ...

随机推荐

  1. WTConv:小参数大感受野,基于小波变换的新型卷积 | ECCV'24

    近年来,人们尝试增加卷积神经网络(CNN)的卷积核大小,以模拟视觉Transformer(ViTs)自注意力模块的全局感受野.然而,这种方法很快就遇到了上限,并在实现全局感受野之前就达到了饱和.论文证 ...

  2. 云原生周刊:K8s 1.26 到 1.29 版本的更新 | 2024.1.29

    开源项目推荐 Skaffold Skaffold 是一个命令行工具,有助于 Kubernetes 应用程序的持续开发.您可以在本地迭代应用程序源代码,然后部署到本地或远程 Kubernetes 集群. ...

  3. Kubernetes 新型容器逃逸漏洞预警

    作者:米开朗基杨,KubeSphere 布道师,云原生重度感染者 2022 年 1 月 18 日,Linux 维护人员和供应商在 Linux 内核(5.1-rc1+)文件系统上下文功能的 legacy ...

  4. 指针进阶(函数指针)(C语言)

    目录 1. 字符指针变量 2. 数组指针变量 2.1 数组指针变量是什么? 2.2 数组指针变量怎么初始化? 3. 二维数组传参的本质 4. 函数指针变量 4.1 函数指针变量的创建 4.2 函数指针 ...

  5. Syncfusion宣布开源其为.NET MAUI开发的14个控件

    .NET MAUI是Xamarin.Forms的进化版,增加了对构建桌面应用的支持..NET MAUI的特点包括统一的框架.对桌面应用的支持.性能改进.使用现代技术以及开源特性.开源 .NET MAU ...

  6. python操作pptx设置title字体大小插入全屏图片A4尺寸实例一枚

    pip install python-pptx 安装好pptx,设置标题最大的作用是ppt里面的摘要视图显示摘要文字 参考:https://python-pptx.readthedocs.io/en/ ...

  7. mysql skip-name-resolve 的解释

    PHP交流群  717902309 为PHP广大爱好者提供技术交流,有问必答,相互学习相互进步! mysql连接很慢,登陆到服务器上查看mysql日志:IP address 'XX.XX.XX.XX' ...

  8. Minio安装以及使用

    Minio介绍 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数据和容器/虚拟机镜像等,而一个对象文 ...

  9. iconfont图标库的使用

    https://www.iconfont.cn/ -- 点击链接进入官网 择自己需要的图标加购物车 点击资源管理->我的项目 选择你需要的项目->下载到本地 将下载的压缩包进行解压,解压后 ...

  10. Redis中有事务吗?有何不同?

    与关系型数据库事务的区别 Redis事务是指将多条命令加入队列,一次批量执行多条命令,每条命令会按顺序执行,事务执行过程中不会被其他客户端发来的命令所打断.也就是说,Redis事务就是一次性.顺序性. ...