本次使用Docker + MySQL 8.0 的组合搭建内部知识库
多人协作的写作系统
Wiki 是一种在网络上开放且可供多人协同创作的超文本系统,由美国人沃德·坎宁安于1995年首先开发,这种超文本系统支持面向社群的协作式写作,同时也包括一组支持这种写作。沃德·坎宁安将 Wiki 定义为“一种允许一群用户用简单的描述来创建和连接一组网页的社会计算系统”。 Wiki 站点由多人维护,每个人都可以发表自己的意见,或对共同的主题进行扩展与探讨。(百度百科)
Wiki.js 几乎可以在任何支持 Node.js 的系统上运行。
这意味着它可以在Linux,macOS,Windows以及Docker / Kubernetes和Heroku等容器解决方案上运行
| 需求 | 最低配置 |
|---|---|
| CPU | 单核运行良好,建议2核 |
| 内存 | 1GB |
| 存储空间 | 至少1GB |
| 数据库 | PostgreSQL 9.5 或更高版本 |
| 数据库 | 版本 |
|---|---|
| PostgreSQL | 9.5+ |
| MySQL | 5.7.8+(建议8.0+) |
| MariaDB | 10.2.7+ |
| SQLServer | 2012+ |
| SQLite | 3.9+ |
为了支持长期维护建议尽可能使用最新版本的PostgreSQL

需要创建一个空的数据库,最好是创建单独的用户连接到数据库
本次不详细介绍 Docker 相关的配置,操作前需要准备好 Docker 环境
已经有正常使用的MySQL可以跳过此步骤
拉取最新镜像
docker pull mysql:latest
启动容器
创建一个目录用于挂载数据 /data/mysql8.0/data /data/mysql8.0/conf.d
docker run --name mysql8.0 -p 10156:3306 \
-e MYSQL_ROOT_PASSWORD=[替换成登录密码] \
-v /data/mysql8.0/data:/var/lib/mysql \
-v /data/mysql8.0/conf.d:/etc/mysql/conf.d \
--restart always \
-d mysql
创建 wiki 使用的账号
create user 'wiki'@'localhost' identified by '[your password]';
create user 'wiki'@'%' identified by '[your password]';
创建 wiki 数据库
CREATE DATABASE `wiki`;
MySQL 到这里就装备完毕了,创建 wiki 实例时使用刚刚配置的账号密码和数据库
拉取wiki镜像
docker pull requarks/wiki
启动容器
数据库密码使用上面配置好的信息
docker run -d -p 30001:3000 --name wiki \
-e "DB_TYPE=mysql" -e "DB_HOST=ip" \
-e "DB_PORT=10156" -e "DB_USER=wiki" -e "DB_PASS=[your password]" -e "DB_NAME=wiki" \
--restart always \
requarks/wiki
官方示例
下面是一个命令示例,用于运行 Wiki.js 连接到 PostgreSQL 数据库:
docker run -d -p 8080:3000 --name wiki --restart unless-stopped -e “DB_TYPE=postgres” -e “DB_HOST=db” -e “DB_PORT=5432” -e “DB_USER=wikijs” -e “DB_PASS=wikijsrocks” -e “DB_NAME=wiki” ghcr.io/requarks/wiki:2
或 MySQL 数据库:
docker run -d -p 8080:3000 --name wiki --restart unless-stopped -e “DB_TYPE=mysql” -e “DB_HOST=db” -e “DB_PORT=3306” -e “DB_USER=wikijs” -e “DB_PASS=wikijsrocks” -e “DB_NAME=wiki” ghcr.io/requarks/wiki:2
查看官方示例:使用 Docker Compose (requarks.io)
docker logs --tail 100 -f wiki

访问 https://[ip]:30001
填写基本信息,设置管理员邮箱和密码

等待安装

接下来可以快乐地使用啦

下载中文简体语言包

选择之后应用即可

网站分析 -> 供应商 -> Baidu Tongji
创建百度统计应用: 百度统计

获取代码

<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?[替换成你的key]";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
配置后代码检查出现: referrer被禁用

经过一番查询之后说在页面中添加 meta 配置
<meta name="referrer" content="strict-origin-when-cross-origin">
将代码填写到主题设置中的 Head

百度统计不生效的话直接跳过,使用 灵雀应用监控平台 进行监控
创建应用
灵雀应用监控平台 - 「51LA」旗下应用监控分析平台:https://perf.51.la/

选择异步安装,复制整个代码片段

<script>
!(function(c,i,e,b){
var h=i.createElement("script");
var f=i.getElementsByTagName("script")[0];
h.type="text/javascript";
h.crossorigin=true;
h.onload=function(){new c[b]["Monitor"]().init({id:"替换成你的key"});};
f.parentNode.insertBefore(h,f);h.src=e;})(window,document,"https://sdk.51.la/perf/js-sdk-perf.min.js","LingQue");
</script>
代码片段粘贴到 Head 部分

访问首页后过段时间就能查看监控数据了

取消定时任务中的发布状态

未登录的游客访问看到后提示 缺少访问权限;具有写入权限的管理员是可以正常访问的

验证时发送方为腾讯企业邮箱,SMTP设置为 smtp.exmail.qq.com,填写发件人邮箱的账号密码相关信息就可以了

发送测试邮件

查看邮箱信件可以看到如下信息

切换至存储 -> 目标 -> 选中Git

进入到容器内部
docker exec -it wiki /bin/bash
生成密钥(需要确认的对话直接按回车键跳过)
ssh-keygen -t rsa -C "admin@minelai.club"
查看密钥
cat /home/node/.ssh/id_rsa.pub
或
cat ~/.ssh/id_rsa.pub

密钥配置到Gitlab中:SSH密钥 -> 添加SSH密钥 -> 粘贴生成的密钥串

目标配置
| 属性 | 示例 | 说明 |
|---|---|---|
| Authentication Type | 选择ssh | |
| Repository URI | ssh://git@[xxx.com]:port | gitlab仓库地址 |
| Branch | wiki | 同步的分支 |
| SSH Private Key Mode | 验证私钥类型,不填 | |
| A-SSH Private Key Path | 生成的密钥路径,不填 | |
| B-SSH Private Key Contents | 选择路径时不填,不填 | |
| Verify SSL Certificate | 勾选 | 验证SSL |
| Username | 不填 | |
| Password/PAT | 不填 | |
| Default Author Email | 你的邮箱 | git提交日志里的邮箱 |
| Default Author Name | 你的名字 | git提交日志里的名字 |
| Local Repository Path | 不填 | |
| Git Binary Path |
同步方向
在这里建议使用 推送到目标,其它两种方式中都会把初始化之后的其它不需要的文件同步到wiki中,我们只要保留新建的页面能同步到GitLab即可

注意
若同步的时候出现如下错误消息
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0644 for '/home/node/.ssh/id_rsa.pub' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key "/home/node/.ssh/id_rsa.pub": bad permissions git@gitlab.minelai.club: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. error: Could not fetch origin

解决方案
执行授权命令
chmod 600 /home/node/.ssh/id_rsa.pub
执行 Force Sync 模块的 运行按钮

过一会儿就能在git参考查看同步的文件了

Wiki.js:https://docs.requarks.io/
Github:https://github.com/requarks/wiki
- 本文作者: lightsolid
- 关于作者: 搜索关注公众号【轻实】,个人博客
- 版权声明: 本文著作权归作者所有,转载请注明出处!
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
在这段Ruby代码中:ModuleMClassC当我尝试运行时出现“'M:Module'的未定义方法'helper'”错误c=M::C.new("world")c.work但直接从另一个类调用M::helper("world")工作正常。类不能调用在定义它们的同一模块中定义的模块函数吗?除了将类移出模块外,还有其他解决方法吗? 最佳答案 为了调用M::helper,你需要将它定义为defself.helper;结束为了进行比较,请查看以下修改后的代码段中的helper和helper2moduleMclassC
我想在Windows7上安装带有ruby1.9.3的rspec-railsgem。我收到一些错误消息,提示无法安装某些json库。所以,我使用下面的说明来解决它。来源=The'json'nativegemrequiresinstalledbuildtools从[rubyinstaller.org][3]下载[Ruby1.9.3][2]从[rubyinstaller.org][3]下载DevKit文件对于Ruby1.9.3,使用[DevKit-tdm-32-4.5.2-20110712-1620-sfx.exe][4]将DevKit解压到路径C:\Ruby193\DevKit运行cd
来自Java,我正在尝试在Ruby中实现LinkedList。我在Java中实现它的通常方法是有一个名为LinkedList的类和一个名为Node的私有(private)内部类,其中LinkedList的每个对象都作为Node对象。classLinkedListprivateclassNodeattr_accessor:val,:nextendend我不想将Node类暴露给外部世界。然而,通过Ruby中的这个设置,我可以使用这个访问LinkedList类之外的私有(private)Node类对象-node=LinkedList::Node.new我知道,在Ruby1.9中,我们可以使用
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss
我已经能够找到:a)用Ruby编写的Lisp解释器(即外部DSL)http://onestepback.org/index.cgi/Tech/Ruby/LispInRuby.redb)作为RubyDSL的Prologhttp://www.kdedevelopers.org/node/2369c)讨论Ruby“作为”一个Lisphttp://www.randomhacks.net/articles/2005/12/03/why-ruby-is-an-acceptable-lisp但奇怪的是,我实际上找不到Lisp的“内部”实现,例如Prolog的实现。我只是不够谷歌,还是还没有人发表过这
我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目
我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了
我正在使用screen,甚至在rvm1.9.2之后并且有一个合适的.rvmrc我的服务器将仍然使用jruby。我的.screenrc包含shell#{SHELL}rvm信息显示jruby。好像rvm1.9.2没有任何效果,但它在screen外工作正常。 最佳答案 好的,我找到了solution.创建一个.screenrc文件并将此代码段放入其中:shell-$SHELLofficialinstructions省略破折号。 关于ruby-RVMscreen内部损坏,我们在StackOver