我的docker随笔43:问答平台answer部署
本文介绍开源问答社区平台Answer的容器化部署。
起因
笔者一直想搭建一个类似stack overflower这样的平台,自使用了Typora,就正式全面用Markdown+Typora+git来积累自己的个人知识库,但没有做到web化,现在也还在探索更好的方法。
无意间看到了 Answer 项目,觉得可能满足需求。其实这个项目早在 2022 年就已经由 SegmentFault 团队开源了,去年就进入了Apache 软件基金会孵化器。只是我知道的晚而已。
本文直接使用官方提供的docker镜像来部署。该项目使用 Golang 编写,有时间可以研究一下,当然这是后话。
概述
Answer主要功能有(摘自官方文档):
- 提问和回答 - 提出问题并从你的用户和团队那里获得答案。
- 组织内容 - 将你的内容组织为分类和标签。
- 集成 - 与你现有的工具和服务集成。
- 游戏化 - 奖励用户的贡献。
- 现代用户界面 - 现代且响应式的用户界面。
- 可扩展 - 使用插件扩展 Answer。
- 开源 - 免费且开源。
服务部署
官方有详细的安装文档,这里结合自己的实际情况给出步骤。
下载镜像
通过以下命令下载官方镜像:
docker pull apache/answer
注:也可以在docker-comose阶段自动下载。虽然自动方便,不过笔者喜欢按部就班做。
容器启动脚本
docker-compose.yaml文件:
# cat docker-compose.yaml
version: "3"
services:answer:image: apache/answercontainer_name: answerports:- '9080:80'restart: on-failurevolumes:- ./answer-data:/data# - /etc/localtime:/etc/localtime#environment:# - TZ=Asia/Shanghai
#volumes:
# answer-data:./data
docker-compose.yaml文件根据实际情况作了修改,说明如下:
- Anserver使用目录
/data存在数据,将其映射至宿主机目录。 - 映射外部端口8090。
- 本想自动设置时区,但经测试无效,因此保留注释。
启动:
docker-compose up -d
启动日志如下:
Attaching to answer
answer | [upload-dir] try to install...
answer | [upload-dir] install success, upload directory is /data/uploads
answer | [i18n] try to install i18n bundle...
answer | [i18n] find i18n bundle 42
answer | [i18n] install af_ZA.yaml bundle...
answer | [i18n] install af_ZA.yaml bundle success
answer | [i18n] install ar_SA.yaml bundle...
...
answer | [i18n] install zh_CN.yaml bundle...
answer | [i18n] install zh_CN.yaml bundle success
answer | [i18n] install zh_TW.yaml bundle...
answer | [i18n] install zh_TW.yaml bundle success
answer | install all initial environment done
answer | [SUCCESS] answer installation service will run at: http://localhost:80/install/
使用说明
输入http://<ip>:9080/,根据提示进行安装。
页面配置
步骤1:选择语言。

步骤2:选择数据库。为简单起见,使用了sqlite3。

值得说明的是,Answer 支持MarialDB/MySQL、PostgreSQL 和 SQLite 数据库。前2者需要配置数据库信息,如数据库地址、用户、密码等,见下图。而SQLite不需要额外的配置。

步骤3:创建配置文件

步骤4:配置网站信息,注意,这里填写的用户是管理员。

登录后页面如下:

添加问题/回答
根据网页提示添加即可。需要说明的是,问题必须有对应的标签,可自定义添加,也可用管理员登录统一添加。页面示例:

添加用户
路径:后台管理->用户管理。
可以批量添加用户。格式为用户名,邮箱,密码,注意事项:
- 用户名长度需大于4字符。
- 邮箱不能与已存在用户的相同。
- 密码长度需大于8字符。
示例如下:

可以修改用户状态,如停用、删除、提升至管理员,等。
网站设置
路径:后台管理->站点设置。
一般的设置较简单,根据网站提示即可。这里说一下笔者设置的地方。
登录设置,不允许用户注册。

特权设置,使用级别1。

小结
就目前情况看,即使搭建了这个平台,即使在内部推行了这个平台,使用者还是自己而已。但无论如何,还是走出了一步,还需看后续效果。
附
官方网站:https://answer.apache.org/
源码:https://github.com/apache/incubator-answer
启动日志(有删改):
$ docker-compose logs
Attaching to answer
answer | [upload-dir] try to install...
answer | [upload-dir] install success, upload directory is /data/uploads
answer | [i18n] try to install i18n bundle...
answer | [i18n] find i18n bundle 42
answer | install all initial environment done
answer | [SUCCESS] answer installation service will run at: http://localhost:80/install/
[fengxuan@master incubator-answer]$ docker-compose logs -f
Attaching to answer
answer | [upload-dir] try to install...
answer | [upload-dir] install success, upload directory is /data/uploads
answer | [i18n] try to install i18n bundle...
answer | [i18n] find i18n bundle 42
answer | install all initial environment done
answer | [SUCCESS] answer installation service will run at: http://localhost:80/install/
answer | [config-file] try to create at /data/conf/config.yaml
answer | [config-file] create directory success, config file is /data/conf/config.yaml
answer | [config-file] install success
answer | check table not exist
answer | [i18n] try to install i18n bundle...
answer | [i18n] find i18n bundle 42answer | [i18n] install zh_CN.yaml file exist, try to replace it
answer | [i18n] install zh_CN.yaml bundle...
answer | [i18n] install zh_CN.yaml bundle success
answer | [i18n] install zh_TW.yaml file exist, try to replace it
answer | [i18n] install zh_TW.yaml bundle...
answer | [i18n] install zh_TW.yaml bundle success
answer | try to create cache directory /data/cache
answer | try to load cache file from /data/cache/cache.db
answer | open /data/cache/cache.db: no such file or directory
answer | try to create database directory /data
answer | try to save cache file to /data/cache/cache.db
answer | upgrade done
answer | config file path: /data/conf/config.yaml
answer | Answer is starting..........................
answer | 2024-01-14 16:03:00.773 INFO data/data.go:118 try to load cache file from /data/cache/cache.db
answer | start cron
answer | answer Version: 1.2.1 Revision: d8c5577相关文章:
我的docker随笔43:问答平台answer部署
本文介绍开源问答社区平台Answer的容器化部署。 起因 笔者一直想搭建一个类似stack overflower这样的平台,自使用了Typora,就正式全面用MarkdownTyporagit来积累自己的个人知识库,但没有做到web化,现在也还在探索更好的方法。 无…...
17、ELK
17、ELK helm 安装 elkfk(kafka 集群外可访问) ES/Kibana <— Logstash <— Kafka <— Filebeat 部署顺序: 1、elasticsearch 2、kibana 3、kafka 4、logstash 5、filebeat kubectl create ns elkhelm3部署elkfk 1、elast…...
React+Antd+tree实现树多选功能(选中项受控+支持模糊检索)
1、先上效果 树型控件,选中项形成一棵新的树,若父选中,子自动选中,子取消,父不取消,子选中,所有的父节点自动取消。同时支持模糊检索,会检索出所有包含该内容的关联节点。 2、环境准…...
鸿蒙 WiFi 扫描流程(2)
接着上篇没有记录完的,我们继续梳理,需要上一篇做基础的请看:鸿蒙 WiFi 扫描流程(1) 上一篇我们讲到 scan_service.cpp 里面的 SingleScan 方法,继续这个方法往下看: // foundation/communicat…...
微信小程序(四十)API的封装与调用
注释很详细,直接上代码 上一篇 新增内容: 1.在单独的js文件中写js接口 2.以注册为全局wx的方式调用接口 源码: utils/testAPI.js const testAPI{/*** * param {*} title */simpleToast(title提示){//可传参,默认为‘提示’wx.sho…...
WebSocket+Http实现功能加成
WebSocketHttp实现功能加成 前言 首先,WebSocket和HTTP是两种不同的协议,它们在设计和用途上有一些显著的区别。以下是它们的主要特点和区别: HTTP (HyperText Transfer Protocol): 请求-响应模型: HTTP 是基于请求-响应模型的协…...
go语言实现LRU缓存
go语言实现LRU Cache 题目描述详细代码 题目描述 设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最…...
git的奇特知识点
展示帮助信息 git help -gThe common Git guides are:attributes Defining attributes per pathcli Git command-line interface and conventionscore-tutorial A Git core tutorial for developerscvs-migration Git for CVS usersdiff…...
按键扫描16Hz-单片机通用模板
按键扫描16Hz-单片机通用模板 一、按键扫描的原理1、直接检测高低电平类型2、矩阵扫描类型3、ADC检测类型二、key.c的实现1、void keyScan(void) 按键扫描函数①void FHiKey(void) 按键按下功能②void FSameKey(void) 按键长按功能③void FLowKey(void) 按键释放功能三、key.h的…...
在容器镜像中为了安全为什么要删除 setuid 和 setgid?
在容器镜像中删除 setuid(set user ID)和 setgid(set group ID)权限通常是出于安全考虑。这两个权限位允许进程在执行时以文件所有者或文件所属组的身份运行,而不是以调用进程的用户身份运行。 删除 setuid 和 setgid…...
Flink 动态表 (Dynamic Table) 解读
博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…...
【原创 附源码】Flutter海外登录--Google登录最详细流程
最近接触了几个海外登录的平台,踩了很多坑,也总结了很多东西,决定记录下来给路过的兄弟坐个参考,也留着以后留着回顾。更新时间为2024年2月8日,后续集成方式可能会有变动,所以目前的集成流程仅供参考&#…...
第70讲axios后端请求工具类封装
axios工具类封装: // 引入axios import axios from axios;// 创建axios实例 const httpService axios.create({// url前缀-http:xxx.xxx// baseURL: process.env.BASE_API, // 需自定义baseURL:http://localhost:80/,// 请求超时时间timeout: 3000 // 需自定义 })…...
【数学建模】【2024年】【第40届】【MCM/ICM】【F题 减少非法野生动物贸易】【解题思路】
一、题目 (一) 赛题原文 2024 ICM Problem F: Reducing Illegal Wildlife Trade Illegal wildlife trade negatively impacts our environment and threatens global biodiversity. It is estimated to involve up to 26.5 billion US dollars per y…...
第3节、电机定速转动【51单片机+L298N步进电机系列教程】
↑↑↑点击上方【目录】,查看本系列全部文章 摘要:本节介绍用定时器定时的方式,精准控制脉冲时间,从而控制步进电机速度。 一、计算过程 电机每一步的角速度等于走这一步所花费的时间,走一步角度等于步距角ÿ…...
【51单片机】LCD1602(可视化液晶屏)调试工具的使用
前言 大家好吖,欢迎来到 YY 滴 单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY…...
Netty应用(四) 之 Reactor模型 零拷贝
目录 6.Reactor模型 6.1 单线程Reactor 6.2 主从多线程Reactor (主--->Boss | 从--->Worker | 一主多从机制) 7.扩展与补充 8.Reactor模型的实现 8.1 多线程Reactor模型的实现(一个Boss线程,一个Worker线程) 8.2 多线程Reactor模…...
Huggingface上传模型
Huggingface上传自己的模型 参考 https://juejin.cn/post/7081452948550746148https://huggingface.co/blog/password-git-deprecationAdding your model to the Hugging Face Hub, huggingface.co/docs/hub/ad…Welcome,huggingface.co/welcome三句指…...
kyuubi 接入starrocks | doris
kyuubi 接入starrocks 一、环境 Hadoop集群 组件版本Hadoop3.1.1spark3.Xzookeeper3.XHive3.X kyuubi 版本 1.7.1 starrocks 2.X 已将kyuubi部署到yarn上,并且接入了spark3引擎,并通过Ambari进行kyuubi组件的管理,下面步骤为新增对sta…...
notepad++成功安装后默认显示英文怎么设置中文界面?
前几天使用电脑华为管家清理电脑后,发现一直使用的notepad软件变回了英文界面,跟刚成功安装的时候一样,那么应该怎么设置为中文界面呢?具体操作如下: 1、打开notepad软件,点击菜单栏“Settings – Prefere…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
