#分享#Jank:一款基于Go语言的高效极简博客系统

今天有大佬在LOC里分享他开发的Go语言博客,以下在大佬自己写的简介:Jank是一款采用Go语言和Echo框架开发的轻量级博客系统,设计理念强调极简架构、高性能与模块化扩展。该项目由开发者Fenderisfine和AlexeiLeery等贡献者共同维护,已收获GitHub 179+ star,适用于个人博客搭建、技术社区建设等场景。

博主看了一下演示站,挺不错的,而且直接可以使用docker部署,非常方便,有想玩的兄弟可以试试。

官方项目地址

https://github.com/Done-0/Jank

官方部署教程

基础设施

  • 操作系统:Debian 12.2 64位 UEFI版
  • CPU & 内存:2核(vCPU) 2 GiB
  • 公网带宽:1Mbps
  • 硬盘:40G SSD

docker 篇

使用官方源安装 Docker

以下操作需要在 root 用户下完成,请使用 sudo -i 或 su root 切换到 root 用户进行操作。

首先,安装一些必要的软件包:

apt update
apt upgrade -y
apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates

然后加入 Docker 的 GPG 公钥和 apt 源:

curl -sSL https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://download.docker.com/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

国内机器可以用清华 TUNA 的国内源:

curl -sS https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

然后更新系统后即可安装 Docker CE 和 Docker Compose 插件:

apt update
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

此时可以使用 docker version 命令检查是否安装成功:

root@debian ~ # docker version
Client: Docker Engine - Community
 Version:           28.0.1
 API version:       1.48
 Go version:        go1.23.6
 Git commit:        068a01e
 Built:             Wed Feb 26 10:41:16 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          28.0.1
  API version:      1.48 (minimum version 1.24)
  Go version:       go1.23.6
  Git commit:       bbd0a17
  Built:            Wed Feb 26 10:41:16 2025
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          1.7.25
  GitCommit:        bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
 runc:
  Version:          1.2.4
  GitCommit:        v1.2.4-0-g6c52b3f
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

安装 Docker Compose

因为我们已经安装了 docker-compose-plugin,所以 Docker 目前已经自带 docker compose 命令,基本上可以替代 docker-compose:

root@debian ~ # docker compose version
Docker Compose version v2.27.1

修改 Docker 配置

以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘 (泪的教训):

cat > /etc/docker/daemon.json << EOF
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "20m",
        "max-file": "3"
    },
    "ipv6": true,
    "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
    "experimental":true,
    "ip6tables":true
}
EOF

然后重启 Docker 服务:

systemctl restart docker

docker 换源[国内环境]

sudo mkdir -p /etc/docker
vim /etc/docker/daemon.json  
{
  "registry-mirrors" : ["https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc",
    "https://do.nark.eu.org",
    "https://dc.j8.work",
    "https://dockerproxy.com",
    "https://gst6rzl9.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "http://mirrors.ustc.edu.cn/",
    "https://mirrors.tuna.tsinghua.edu.cn/",
    "http://mirrors.sohu.com/" 
    ],
     "insecure-registries" : [
        "registry.docker-cn.com",
        "docker.mirrors.ustc.edu.cn"
        ],
    "debug": true,
    "experimental": false
}

重载配置并重启 docker 服务

sudo systemctl daemon-reload
sudo systemctl restart docker

查看是否配置成功

docker info
root@ubuntu-database:/etc/docker# docker info
Client: Docker Engine - Community
 Version:    27.3.1
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.17.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.29.7
    Path:     /usr/libexec/docker/cli-plugins/docker-compose
 
Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 27.3.1
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 57f17b0a6295a39009d861b89e3b3b87b005ca27
 runc version: v1.1.14-0-g2c9f560
 init version: de40ad0
 Security Options:
  apparmor
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 6.8.0-49-generic
 Operating System: Ubuntu 24.04 LTS
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.709GiB
 Name: ubuntu-database
 ID: acb5a888-7140-4e43-8924-6fc325481944
 Docker Root Dir: /var/lib/docker
 Debug Mode: true
  File Descriptors: 23
  Goroutines: 40
  System Time: 2024-11-27T13:09:10.861401847Z
  EventsListeners: 0
 Experimental: false
 Insecure Registries:
  docker.mirrors.ustc.edu.cn
  registry.docker-cn.com
  127.0.0.0/8
 Registry Mirrors:
  https://docker.registry.cyou/
  https://docker-cf.registry.cyou/
  https://dockercf.jsdelivr.fyi/
  https://docker.jsdelivr.fyi/
  https://dockertest.jsdelivr.fyi/
  https://mirror.aliyuncs.com/
  https://dockerproxy.com/
  https://mirror.baidubce.com/
  https://docker.m.daocloud.io/
  https://docker.nju.edu.cn/
  https://docker.mirrors.sjtug.sjtu.edu.cn/
  https://docker.mirrors.ustc.edu.cn/
  https://mirror.iscas.ac.cn/
  https://docker.rainbond.cc/
  https://do.nark.eu.org/
  https://dc.j8.work/
  https://gst6rzl9.mirror.aliyuncs.com/
  https://registry.docker-cn.com/
  http://hub-mirror.c.163.com/
  http://mirrors.ustc.edu.cn/
  https://mirrors.tuna.tsinghua.edu.cn/
  http://mirrors.sohu.com/
 Live Restore Enabled: false
 
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

项目篇

项目结构

backend/ # 后端项目
configs/ # 配置文件
frontend/ # 前端项目
ssl/ # SSL 证书
docker-compose.yml

示例如下:

项目结构

nginx 配置: configs/nginx.conf

  1. server_name: 域名,如果有多个域名请用空格分隔;

主要修改的部分为 fenderisfine.icu 和 www.fenderisfine.icu,需要修改为自己的域名

  1. ssl_certificate 和 ssl_certificate_key: 证书路径和密钥路径,请修改为自己的证书路径和密钥路径

主要修改的部分为 fenderisfine.icu.pem 和 fenderisfine.icu.key,需要与项目根目录下 ssl 文件夹内的证书文件名保持一致

    # HTTP 重定向到 HTTPS
    server {
        listen 80;
        server_name fenderisfine.icu www.fenderisfine.icu; # 请修改为自己的域名
        return 301 https://$host$request_uri;
    }

    # HTTPS 服务器配置
    server {
        listen 443 ssl;
        server_name fenderisfine.icu www.fenderisfine.icu; # 请修改为自己的域名
        
        ssl_certificate     /etc/ssl/fenderisfine.icu.pem; # 请修改为自己的证书路径
        ssl_certificate_key /etc/ssl/fenderisfine.icu.key; # 请修改为自己的证书密钥路径

后端配置: backend/configs/config.yml

  1. QQ_SMTP:请求改为自己的 SMTP 授权码,这个授权码只是做个示范,请使用自己的授权码
  2. FROM_EMAIL:请修改为自己的 QQ 邮箱
  3. DB_USER 和 DB_PSW:请修改为自己的数据库用户名和密码,这里只要跟 docker-compose 配置保持一致即可
  4. REDIS_HOST 和 REDIS_PORT:请修改为自己的 Redis 地址和端口,这里只要跟 docker-compose 配置保持一致即可
# 应用相关
app:
  APP_NAME: "JANK_BLOG"
  APP_HOST: "0.0.0.0"
  APP_PORT: "9010"
  QQ_SMTP: "djxhwqvipodabegd" # 请求改为自己的 SMTP 授权码,这个授权码只是做个示范,请使用自己的授权码
  FROM_EMAIL: "927171598@qq.com" # 请修改为自己的 QQ 邮箱

database:
  DB_NAME: "jank_db"
  DB_HOST: "postgres_db"
  DB_PORT: "5432"
  DB_USER: "" # 请修改为自己的数据库用户名
  DB_PSW: "" # 请修改为自己的数据库密码

# Redis 相关
redis:
  REDIS_HOST: "redis_db"
  REDIS_PORT: "6379"
  REDIS_DB: "0"
  REDIS_PSW: ""

前端配置: frontend/src/lib/axios/index.ts

  1. baseURL: 请求基准 URL,请修改为自己的后端地址

主要修改的部分为 http://localhost:9010/api ,域名加 /api 后缀即可,例如 https://fenderisfine.icu/api

/**
 * 默认请求配置
 * @param baseURL 请求基准 URL
 * @param timeout 请求超时时间
 * @param headers 请求头
 */
const defaultConfig = {
  baseURL: "http://localhost:9010/api",
  timeout: 5000,
  headers: {
    'Content-Type': 'application/json',
  },
};

因为前端是未完成的项目,还不支持很灵活的定制,例如页面的定制、路由的配置等,这里只能自己码起来了

docker-compose配置: docker-compose.yml

  1. 此处修改的部分为 和 ,请修改为自己的数据库用户名和密码,这里只要跟后端的配置保持一致即可
services:
  postgres:
    image: postgres:15
    container_name: postgres_db
    restart: always
    environment:
      - POSTGRES_DB=jank_db
      - POSTGRES_USER=
      - POSTGRES_PASSWORD=

部署篇

  1. zip 压缩项目文件,上传到服务器
  2. 解压到指定目录

Debian 下的压缩 (zip) 解压缩 (unzip) 命令

# 更新软件源
sudo apt update
# 安装 zip
apt install -y zip
# 解压到指定目录,例如解压home目录下的项目文件到当前目录,unzip -o -d ./ docker.jank.com.zip
unzip -o -d /path filename.zip

-o: 不提示的情况下覆盖文件;
-d: -d /path 指明将文件解压缩到/path目录下; 如果不指定则解压缩到当前目录下.

  1. 进入项目目录启动 docker-compose
cd ./docker.jank.com
# 启动 docker-compose(新版本把 docker-compose 命令整合成了 docker compose)
docker compose up -d
  1. 请根据实际情况打开服务器的 9010、80、443、5432 和 6379 和 587 端口,

预计等待时间 640s 左右,具体时间视网络环境和硬件配置而定。
如果出现错误,请检查检查配置是否正确,并删除所有docker缓存镜像和容器,然后重新启动 docker-compose。

如果你的服务器什么都还没有,那么这些代码可能帮你快速解决问题:

# 停止并清空你的docker,让他焕然一新
docker rm $(docker ps -aq) 2>/dev/null || true && docker rmi $(docker images -q) -f 2>/dev/null || true && docker volume prune -f && docker network prune -f && docker builder prune -af && docker system prune -af
# 强制重新构建镜像并启动 docker-compose
docker compose up -d --build --force-recreate

使用篇

  1. 创建账号

这台演示机器使用的是阿里云服务器,25 和 465 端口不能使用,只有 587 端口能够发送邮件,注册完账号后请关闭该端口,这里给你一个示例:

backend/internal/utils/email_utils.go 修改配置,将 25 端口改为 587 端口。

const (
	SUBJECT         = "【Jank Blog】注册验证码"
	QqEmailSmtp     = "smtp.qq.com"
	QqEmailSmtpPort = ":587" # 此处修改为 587
)

  1. 发布文章

这里需要先登录账号,拿到 access_token,然后添加 access_token 到请求头中才能发布文章。

此处我使用的是 Postman 工具,你可以使用其他工具也可以,这里给你一个示范:

是不是觉得很麻烦,我也这样觉得的,等前端出来了就不用这么折磨人了。

操作图

  1. 访问 :9010/api/v1/verification/sendImgVerificationCode?email= 获取图形验证码,拷贝 imgBase64 字段的值到浏览器查看验证码

其中 是你的服务器 IP, 是你的邮箱。

图形验证码

  1. 访问 :9010/api/v1/account/loginAccount 填写你看到的图形验证码,登陆账号

其中 是你的服务器 IP。

{
  "email": "927171598@qq.com",
  "password": "**********",
  "img_verification_code": "qhfs"
}
  1. 访问 :9010/api/v1/article/createArticle 把你刚刚获取到的 access_token 添加到请求头中,发布文章

其中 是你的服务器 IP。

发布文章

发布文章

转载请注明:开心VPS测评 » #分享#Jank:一款基于Go语言的高效极简博客系统

赞 (0)