一年时间,用 Golang 写了个一个博客系统 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
1379M
V2EX    分享创造

一年时间,用 Golang 写了个一个博客系统

  •  
  •   1379M 2022-11-06 10:01:34 +08:00 8119 次点击
    这是一个创建于 1074 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    地址: https://github.com/go-sonic/sonic

    Sonic [snk] ,Sonic 是一个用 Golang 开发的博客平台。

    这个项目是从去年夏天开始,断断续续写了一年,其中还因为工作的原因暂停了一段时间,现在终于写完了,尽管自己觉得有些地方仍然不是很完美,但是也完成了我当初的基本构想。

    写这个项目的原因是我自己也是一名博主,喜欢写博客,用过 Wordpress 、typecho 、Hexo 、Hugo 等,但是总有一些不满意的地方

    Halo 感觉非常不错,典型的 C/S 架构,很符合我这个后端程序员的口味。虽然 Java 是一种高性能的语言,但是缺点是占用内存较多,一些配置较低的主机并不符合要求,Go 的协程天然适合 Web 这种并发场景,并且内存占用极低。而且 Halo 自身也有些小缺陷,比如 For 循环查库,遂决定基于 Go 写一个高性能的博客框架

    需要说明的是,Sonic 的灵感来自 Halo ,也借鉴了 Halo 很多优秀的设计,后台管理界面更是直接 Fork 自 Halo 。Sonic 未来的主要目标是快、轻量、优雅的代码,希望能成为 Golang web 的 best practice 之一

    预览

    xX35qJ.png

    Features:

    • 支持多种类型的数据库:SQLite 、MySQL(TODO: PostgreSQL)
    • 体积小: 安装包仅仅只有 10Mb
    • 高性能: 文章详情页可以达到 1000 QPS(压测环境是: Intel Xeon Platinum 8260 4C 8G ,SQLite3)
    • 支持更换主题(遗憾的是目前仅有一款主题)
    • 支持 Linux 、Windows 、Mac OS 等主流操作系统,支持 x86 、x64 、Arm 、Arm64 、MIPS 等指令集架构
    • 支持对象存储(MINIO 、Google Cloud 、AWS 、AliYun)
    • Sitemap 、Rss 、Atom 支持

    安装

    下载对应平台的安装包

    根据你的操作系统和指令集下载对应的安装包

    wget https://github.com/go-sonic/sonic/releases/download/v1.0.0/sonic-linux-amd64.zip -O sonic.zip 

    解压

    unzip sonic.zip 

    运行

    可以通过 -config 选项来指定配置文件的位置

    cd sonic ./sonic -config conf/config.yaml 

    然后你就可以通过浏览器访问 sonic 了,默认的端口是 8080

    后台管理路径是 http://ip:port/admin

    TODO

    • i18n
    • PostgreSQL
    • 更好的错误处理
    • 插件系统(基于 Wasm)
    • 使用新的 web 框架(Hertz)

    License

    Source code in sonic is available under the MIT License.

    第 1 条附言    2022-11-06 19:53:00 +08:00
    建议使用默认的 SQLite3 即可,支撑几十万的数据量没有任何问题,没有必要单独安装 MySQL
    第 2 条附言    2022-12-04 16:39:55 +08:00
    59 条回复    2025-08-14 18:34:57 +08:00
    hytaoist
        1
    hytaoist  
       2022-11-06 11:19:29 +08:00   1
    line
        2
    line  
       2022-11-06 11:22:47 +08:00
    theme 没打包进去,报错了。
    Donahue
        3
    Donahue  
       2022-11-06 11:58:04 +08:00   1
    支持,之前不喜欢 halo 就是因为一个慢,另一个内存占用大,不喜欢 java.
    我就在 arm 的软路由上部署,用 go 相信性能、内存、速度都快很多
    welong
        4
    welong  
       2022-11-06 12:47:03 +08:00
    sonic 不是字节开源的高性能 JSON 库吗
    Asimov01
        5
    Asimov01  
       2022-11-06 13:38:42 +08:00   1
    Halo 用户表示支持!已 star ,希望能保持发展
    1379M
        6
    1379M  
    OP
       2022-11-06 14:02:51 +08:00
    @welong 不是,应该只是重名了。。。这个项目我在一年前就开始了。
    1379M
        7
    1379M  
    OP
       2022-11-06 14:05:50 +08:00
    @Donahue 慢主要是各种 for 循环查库,打开文章详情页有几十条 SQL 被执行。当初还考虑过用 rust 写,但是在我尝试写了一个月后发现现在 Rust 的生态一言难尽。另外 Rust 较高的上手成本也对社区生态不好。Golang 足以
    SenLief
        8
    SenLief  
       2022-11-06 15:49:40 +08:00   1
    Star
    1379M
        9
    1379M  
    OP
       2022-11-06 17:05:24 +08:00
    @line 感谢反馈,现在应该可以了。原因是 Github 的 action 自动构建的时候没有 checkout submodule
    whitedroa
        10
    whitedroa  
       2022-11-06 17:13:41 +08:00   1
    gamexg
        11
    gamexg  
       2022-11-06 17:27:34 +08:00
    无法访问此网站检查 go-sonic.org 中是否有拼写错误。
    如果拼写无误,请尝试运行 Windows 网络诊断。DNS_PROBE_FINISHED_NXDOMAIN
    whitedroa
        12
    whitedroa  
       2022-11-06 20:10:32 +08:00
    已 Star
    Acoffice
        13
    Acoffice  
       2022-11-06 20:21:46 +08:00
    @1379M #9 还是没有主题......
    1379M
        14
    1379M  
    OP
       2022-11-06 20:40:20 +08:00
    @Acoffice 有的,你可以直接下载 release 中打包好的文件。如果你是自己编译,要先 init submodule 。另外,启动后,需要先访问 ip:port/admin/#install 来安装。
    Acoffice
        15
    Acoffice  
       2022-11-06 20:59:37 +08:00
    @1379M #14 下载的就是 release 里的,Linux-amd64
    Acoffice
        16
    Acoffice  
       2022-11-06 21:00:41 +08:00
    @1379M #14 解压出来就没有 theme 这个目录.....
    1379M
        17
    1379M  
    OP
       2022-11-06 21:11:34 +08:00
    @Acoffice 我重新下载试了下,有主题相关文件。目录在 /resources/template/theme/
    yrj
        18
    yrj  
       2022-11-07 04:14:04 +08:00
    @welong 哈哈,我看到这个名字第一反应也是字节的那个库
    Acoffice
        19
    Acoffice  
       2022-11-07 09:05:40 +08:00
    @1379M #17 那根据你提供的方式启动,页面找不到 theme 的路由
    1379M
        20
    1379M  
    OP
       2022-11-07 22:55:49 +08:00
    @Acoffice 我自己按照流程试了下,没有任何问题的。可不可以提个 issue 呢,提供下 log 以及环境等信息
    Acoffice
        21
    Acoffice  
       2022-11-07 23:41:54 +08:00
    @1379M #20
    http://127.0.0.1:8080/themes/default-theme-anatole/dist/style.css?version=1.5.0-alpha.2
    http://127.0.0.1:8080/themes/default-theme-anatole/dist/main.iife.js?version=1.5.0-alpha.2

    这两个地址都加载不了
    1379M
        22
    1379M  
    OP
       2022-11-08 10:54:25 +08:00
    @Acoffice 我这里没问题,你是不是装了什么 adblock 插件?
    kennidiyuehan
        23
    kennidiyuehan  
       2022-11-08 11:07:59 +08:00
    [root@VM-8-15-centos blog]# ./sonic -config conf/config.yaml
    ./sonic: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by ./sonic)
    1379M
        24
    1379M  
    OP
       2022-11-08 11:26:18 +08:00
    @kennidiyuehan 因为使用了 SQLite3 ,所以依赖 CGO ,实测 Debian 10 没有问题。建议你安装对应的依赖,或者更换到其他 Debian 系的 Linux ,毕竟 centos 都已经成了 Centos Stream 了 ,centos 上面的软件也都很老。另一种方法是你把 CGO 关了,自己编译一份,使用 MySQL
    chaodada
        25
    chaodada  
       2022-11-08 17:52:20 +08:00
    不错很喜欢 准备再楼主基础上二开可好
    1379M
        26
    1379M  
    OP
       2022-11-08 18:03:25 +08:00
    @chaodada 没问题啊。不过我更建议的是基于本项目提 pr ,类似的项目太多意义不大,也浪费人力
    1379M
        27
    1379M  
    OP
       2022-11-08 18:04:40 +08:00
    @chaodada LICENSE 是 MIT ,你就算拿去商用也没问题
    chaodada
        28
    chaodada  
       2022-11-09 08:57:02 +08:00   1
    @1379M 哈哈、一直都想自己做个博客、wp 、typecho 、很早之前刚学 go 的时候做过一个简单的、但是总觉得不够好、正好学习一下楼主的嘿嘿
    stephenhero
        29
    stephenhero  
       2022-11-09 16:58:24 +08:00
    kingpo
        30
    kingpo  
       2022-11-10 14:33:58 +08:00
    windows 怎么部署,没看明白
    kingpo
        31
    kingpo  
       2022-11-10 14:45:15 +08:00
    @kingpo 下错版本了,当我没说。。。
    kingpo
        32
    kingpo  
       2022-11-10 14:57:49 +08:00
    草稿的文章,点击会提示网络错误
    kingpo
        33
    kingpo  
       2022-11-10 15:08:24 +08:00   1
    支持一波,已 star
    lasko
        34
    lasko  
       2022-11-10 17:23:55 +08:00   1
    支持 已 star
    zhjgo
        35
    zhjgo  
       2022-11-10 23:59:47 +08:00
    支持 已 star ,刚好在学习 go 语言,下来学习学习
    akring
        36
    akring  
       2022-11-14 12:08:46 +08:00
    看着不错,Star 了,顺便一说,Logo 有兴趣换一个吗
    1379M
        37
    1379M  
    OP
       2022-11-14 12:53:12 +08:00
    @akring logo 确实不怎么样,问题主要是我并不会设计。欢饮贡献 Logo!
    gniviliving
        38
    gniviliving  
       2022-11-14 14:44:29 +08:00
    登录后台一直报 Internal Server Error
    账号密码没问题,首页不能正常显示,日志没有输出任何信息
    kingpo
        39
    kingpo  
       2022-11-14 15:52:16 +08:00
    @gniviliving 那个命令行窗口不要关
    gniviliving
        40
    gniviliving  
       2022-11-14 16:07:45 +08:00
    @kingpo 我是 nohup /xxx/sonic --config /xxx/conf/config.yaml &的形式在后台运行的,不关怎么后台运行
    BeijingBaby
        41
    BeijingBaby  
       2022-11-14 17:27:26 +08:00   1
    已在最新一期的 dev.com.cn 开发者简报中推荐
    1379M
        42
    1379M  
    OP
       2022-11-14 18:49:19 +08:00
    @gniviliving 感谢使用。反馈问题可以到 github issue 中,需要附上具体的日志
    1379M
        43
    1379M  
    OP
       2022-11-14 18:50:28 +08:00
    @BeijingBaby Thanks !
    kawei
        44
    kawei  
       2022-11-14 21:23:55 +08:00
    https://github.com/go-sonic/theme-anatole/releases 里都没主题

    原项目的命令都是错的
    zjyl1994
        45
    zjyl1994  
       2022-11-15 00:11:19 +08:00
    @1379M 也可以考虑换一个 SQLite 实现 "github.com/glebarez/sqlite"
    因为我写自己的项目时候也遇到了部署缺 GLIBC 的问题,换了个纯 go 的 sqlite 编译就省了 CGO 的大坑 :)
    1379M
        46
    1379M  
    OP
       2022-11-15 10:47:23 +08:00
    @zjyl1994 这个考虑过。但是不知道会不会遇到其他坑,毕竟这个相当于是新的数据库,有没有 SQL 兼容的问题呢,或者数据库层面的 bug 。另外性能如何
    aegon466
        47
    aegon466  
       2022-11-15 12:26:44 +08:00
    @zjyl1994 我也遇到了这个问题 想问下直接编译就可以了吗
    zjyl1994
        48
     
       2022-11-15 22:10:23 +08:00   1
    @1379M 他的底层 DB 项目是 gitlab.com/cznic/sqlite 这个,原理是 SQLite C 代码 AST 级翻译到 Go ,我觉得兼容性不会有什么问题。个人来说使用 gorm sqlite driver 创建的数据库用这个打开然后操作都没问题。性能层面,他也有测 https://gitlab.com/cznic/sqlite/-/tree/master/benchmark
    zjyl1994
        49
    zjyl1994  
       2022-11-15 22:11:45 +08:00
    zjyl1994
        50
    zjyl1994  
       2022-11-15 22:14:21 +08:00   1
    @1379M https://gorm.io/docs/connecting_to_the_database.html#SQLite 其实看 gorm 官方也写了这个库,应该不会太差,不过我只在自己项目里用过,你自己看啦。反正我是被 GLIBC 问题坑的要死要活的,现在根本不想碰 CGO
    oldmanong
        51
    oldmanong  
       2022-11-18 11:12:10 +08:00   1
    已 fork 并运行成功,整体感觉很不错。
    几个问题:
    * resource 里一个主题都没有,启动报错。手动下载了默认主题才能用
    * readme 里没有对编译进行说明,我直接 build 的。建议做个 makefile ,如果有一些特别设置的话
    1379M
        52
    1379M  
    OP
       2022-11-18 13:06:31 +08:00
    @oldmanong 感谢,resource 里没有主题是因为主题是通过 git submodule 来获取的,后面我补充下
    KENNHI
        53
    KENNHI  
       2022-12-04 21:13:48 +08:00 via Android
    go 有 gc ,建议用 rust(
    我还在用 WordPress 呢,主要是插件好用主题多
    1379M
        54
    1379M  
    OP
       2022-12-05 11:25:46 +08:00
    @KENNHI rust 确实很好,但是上手难度高,不利于社区生态。而且 gc 对于 web app 来说没有影响吧
    yyt6801
        55
    yyt6801  
       2022-12-06 02:00:52 +08:00 via Android
    @welong 老哥,这个库貌似近期才开源 您之前有过了解是嘛?
    welong
        56
    welong  
       2022-12-07 14:09:12 +08:00
    @yyt6801
    wshn13
        57
    wshn13  
       2024-09-29 19:43:33 +08:00
    你好,请问博客项目还在活跃开发吗? 我看到自从今年 2 月发布 1.14 后就没有再更新了
    dianso
        58
    dianso  
       188 天前
    @1379M 请问还继续开发吗
    awanganddong
        59
    awanganddong  
       62 天前
    专门拉下来 go mod tidy ,发现安装的依赖比我公司的项目依赖还多,对我而言太重了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1077 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 23:09 PVG 07:09 LAX 16:09 JFK 19:09
    Do have faith in what you're doing.
    script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-11940834-2', 'v2ex.com'); ga('send', 'pageview'); ga('send', 'event', 'Node', 'topic', 'create'); ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86