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. SQL语法-列的新增、删除

    MySQL的语法: 新增列 ALTER TABLE `xxdb`.`xxtable` ADD COLUMN `xx_flag` varchar(1) NULL; 删除列 ALTER TABLE `xx ...

  2. FFmpeg开发笔记(五十七)使用Media3的Transformer加工视频文件

    ​继音视频播放器ExoPlayer之后,谷歌又推出了音视频转换器Transformer,要在音视频加工领域施展拳脚.根据Android开发者官网介绍:Jetpack Media3是Android媒体库 ...

  3. KubeSphere v4 安装指南

    日前,KubeSphere v4 发布,相较于之前的版本,新版本在架构上有了颠覆性的变化.为了让社区的各位小伙伴能够丝滑的从旧版本过渡到新版本,我们特别推出本篇安装指南文章,以供参考. 关于 Kube ...

  4. 初探AI之got-ocr2.0大模型本地部署与遇到的各种坑处理

    一.环境搭建 1.安装cuda,本人使用的是12.1版本,下载地址:https://developer.nvidia.com/cuda-12-1-1-download-archive 2.安装cond ...

  5. 这个Linux你敢用吗?

    文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是在虚拟机上运行(出现问题你可以还原),因为它们会实实在在的破坏你的系统.所以不在root等高级管理权限下执行命令是很好的习惯. 早晚有一天 ...

  6. CTime类缺陷

    如果构造CTime的时间不在下面这个范围内,会抛出异常

  7. AOT漫谈专题(第七篇): 聊一聊给C#打造的节点依赖图

    一:背景 1. 讲故事 上一篇我们聊过AOT编程中可能会遇到的三大件问题,而这三大件问题又是考验你对AOT中节点图的理解,它是一切的原点,接下来我就画几张图以个人的角度来解读下吧,不一定对. 二:理解 ...

  8. CMake 生成器表达式---条件表达式和逻辑运算符

    [写在前面] CMake 的生成器表达式用于在构建系统级别上进行条件判断和逻辑运算,它们通常用在目标属性和生成器表达式上下文中.这些表达式允许你根据不同的平台.配置或编译器来定制构建过程. 本文引用的 ...

  9. 6 年 30k star,这个明星项目停止更新!

    大家好,我是程序员鱼皮.就在昨天,GitHub 上一个知名的开源项目 Easy Excel 官宣停止更新,下面是官方原文: 公告中表示,Easy Excel 将进入维护模式,会进行 Bug 修复,但不 ...

  10. C++ 函数模板与类模板

    目录 16.1.1 函数模板 16.1.2 类模板 定义类模板 实例化模板 在类外定义成员函数 类模板成员函数的实例化 类模板和友元 模板类型别名 类模板参数的static成员 16.1.3 模板参数 ...