假装偶遇

一名伪Geek的自留地!

不要让不会汇报害了你

很多时候,站在领导的立场上,经常会更加认可主动汇报工作的员工,并会觉得不主动汇报工作的员工没有在努力工作。可见“会干”更加要“会汇报”,否则“白干”。带领团队多年之后,对这句话感触颇深,一方面是自己的汇报并没有做到位,另一方面团队的伙伴也一直没有形成很好的汇报习惯。那么怎么汇报工作才是最有效的呢?

工作汇报的思路和要点

汇报不是单纯的说结果,尤其不能等到搞砸了再汇报,这里总结一下汇报的思路和要点:

  1. 换位思考,提供给领导意料之外的收获;
  2. 选准时机,把握好领导心情愉悦的节点(推荐每周二和周五上午的10点);
  3. 简明扼要,结论先行,精选出领导最关心的内容,千万不要从盘古开天汇报到猴子变人,又从国内汇报到国际,一定要结论先行。有料第一,干货至上,数据准确,分析深刻。
  4. 适应风格,一把钥匙一把锁,根据不同领导的风格,确定自己的汇报风格,切不可自说自唱,自我陶醉。
阅读全文 »

背景

一直以来都想为公司搭建一个团队共享的知识库,尝试过很多解决方案,到今天终于有了一个比较靠谱的方案了,先给大家介绍下自己趟过的坑吧~

  1. 优雅的Flarum轻论坛:类似的方案其实有很多,包括修罗轻论坛,不过论坛毕竟是论坛,功能定位和知识库还是不一样,我需要一个有权限管理,可以发布体系化内容的程序。

  2. 各种共享笔记:自己平时工作一直用Onenote,真的是笔记利器,绝对的生产力工具,在Onenote基础上,尝试了OneNote Staff Notebook,微软提供的团队版Onenote,无奈同步问题和需要客户端组织了我很多的小伙伴。同类型的产品还有为知笔记、有道云笔记等等。

  3. 在线文档:非常喜欢阿里提供的语雀,不过企业空间需要5999元/年,看云文档和开源软件ShowDoc,价格倒是很便宜,不过使用上有些Geek了,还是阻挡了我的小伙伴。

  4. Wiki软件:后来有人推荐开源的维基程序,尤其是DokuWikiMediaWiki,到这里我就很推荐DokuWiki了,搭建简单,不需要数据库,备份迁移都非常的方便,使用上,看看官方文档,设置下权限,很容易就搭建出来了。

  5. Bookstack:直到最后发现了Bookstack这个神器,刚开始Bookstack对中文的支持并不好,断断续续看到Github上一直在更新,就尝试了一下,发现真的是现代版的DokuWiki啊,内容管理太方便了,权限管理特别方便,还有自动清理功能,查找不使用的图片自动删除,太贴心了有没有。

今天就详细给大家做一个新手教程,展示下如何利用traefik和Docker快速无痛搭建Bookstack知识库网站!

准备工作

服务器选择

之前一直用的是阿里云服务器,后来腾讯云,最近一直有88元1年的服务器,非常适合小团队使用,需要的小伙伴可以点这个链接

安装系统

由于系统最终借助Docker技术,主机的操作系统其实没有什么限制,只要能正常运行Docker即可,选择大家熟悉的系统就好,这里我选的是Ubuntu,主要是由于用的比较顺手哈哈。

安装好系统后,先更新一下,使用如下命令:

1
2
sudo apt update
sudo apt upgrade

安装Docker

详细的安装教程可以查看官方网站:Docker Docks

另外,如果不是云服务器安装的话,建议使用国内的镜像,比如中科大的源,速度会快很多,方法也很简单,只要把 download.docker.com 地址换成 mirrors.ustc.edu.cn/docker-ce 即可。

安装docker-compose

为了方便部署Docker镜像,我们这里采用Docker-Compose的方式,执行如下命令即可:

1
sudo apt install docker-compose

到这里,准备工作就基本完成啦,下面就要进入最重要的环节了。

安装程序Bookstack

配置好环境后,就需要编写docker-compse.yml文件了,具体命令如下:

1
2
3
4
mkdir bookstack
cd bookstack
touch docker-compose.yml
nano docker-compose.yml

上面的命令依次是新建一个名为bookstack的文件夹,转至bookstack文件夹,新建一个名为docker-compose.yml的文件,用nano编辑器打开docker-compose.yml文件。

修改好下方的代码,粘贴到docker-compose.yml文件中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
version: "3.3"

services:

traefik:
image: "traefik:latest"
container_name: "traefik"
command:
- "--log.level=DEBUG" # 测试环境下使用
- "--api=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
- "--certificatesresolvers.mytlschallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" # 测试环境下使用
- "--certificatesresolvers.mytlschallenge.acme.email=admin@gmail.com"
- "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
labels:
- "traefik.enable=true"
# Traefik面板
- "traefik.http.routers.traefik.rule=Host(`traefik.example.org`)"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik.tls.certresolver=mytlschallenge"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.middlewares=authtraefik"
- "traefik.http.middlewares.authtraefik.basicauth.users=user:$$apr1$$ATuYWcmO$$dUOXryh1xC00cNO3KEHZ30" # user/password
# 全局跳转至https
- "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
- "traefik.http.routers.http-catchall.entrypoints=web"
- "traefik.http.routers.http-catchall.middlewares=redirect-to-https@docker"
# 跳转中间件
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
volumes:
- "./traefik/letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
restart: unless-stopped


bookstack:
image: linuxserver/bookstack
container_name: bookstack
environment:
- PUID=1000
- PGID=1000
- DB_HOST=bookstack_db
- DB_USER=bookstack
- DB_PASS=password
- DB_DATABASE=bookstackapp
- APP_LANG=zh_CN
- APP_URL=https://help.example.org
- WKHTMLTOPDF=/usr/bin/wkhtmltopdf
# Mail Setting
- MAIL_DRIVER=smtp
- MAIL_FROM=service@example.com
- MAIL_FROM_NAME="XXXX知识库"
# SMTP mail options
- MAIL_HOST=smtpdm.aliyun.com
- MAIL_PORT=465
- MAIL_USERNAME=service@example.com
- MAIL_PASSWORD=password
- MAIL_ENCRYPTION=ssl
volumes:
- ./bookstack:/config
labels:
- "traefik.enable=true"
- "traefik.http.routers.bookstack.rule=Host(`help.example.org`)"
- "traefik.http.routers.bookstack.entrypoints=websecure"
- "traefik.http.routers.bookstack.tls=true"
- "traefik.http.routers.bookstack.tls.certresolver=mytlschallenge"
restart: unless-stopped
depends_on:
- bookstack_db
bookstack_db:
image: linuxserver/mariadb
container_name: bookstack_db
environment:
- PUID=1000
- PGID=1000
- MYSQL_ROOT_PASSWORD=yourdbpass
- TZ=Asia/Shanghai
- MYSQL_DATABASE=bookstackapp
- MYSQL_USER=bookstack
- MYSQL_PASSWORD=password
volumes:
- ./mariadb:/config
restart: unless-stopped

粘贴完毕后,根据服务器的情况修改配置后,按Ctrl + X,然后输入y后,按回车,退出程序。

输入docker-compose up命令后,程序会自动拉去镜像,配置完成后,就可以访问啦。

docker-compose.yml文件说明

compose文件版本

1
2
3
version: "3.3"

services:

这里定义的是docker-compose.yml文件的版本,目前最新的是3.X版本,大家可以根据自己的使用的代码更新,详细的可以查看官方说明

配置HTTPS访问

traefik有一个特别棒的功能就是可以自动申请Let’sencrypt的SSL证书,只需要加入下方的代码。

1
2
3
4
5
command:
- "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
- "--certificatesresolvers.mytlschallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" # 测试环境下使用
- "--certificatesresolvers.mytlschallenge.acme.email=admin@gmail.com"
- "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"

这里采用的是tlschallenge方式,把上面的admin@gmail.com修改成自己的邮箱即可。

需要注意的是,测试环境下,一定不要反复的去重新安装或者更换服务器,Let’sencrypty一周内申请证书的次数是有限制的,超过限制后,traefik申请的证书就不被浏览器认可了。当开启debug模式后,会输出如下代码:

1
traefik         | time="2019-11-17T13:27:52Z" level=error msg="Unable to obtain ACME certificate for domains \"traefik.example.org\": unable to generate a certificate for the domains [traefik.example.org]: acme: error: 429 :: POST :: https://acme-v02.api.letsencrypt.org/acme/new-order :: urn:ietf:params:acme:error:rateLimited :: Error creating new order :: too many certificates already issued for exact set of domains: traefik.example.org: see https://letsencrypt.org/docs/rate-limits/, url: " providerName=mytlschallenge.acme routerName=traefik rule="Host(`traefik.example.org`)"

大家可以去 https://crt.sh/ 这个网站查看自己的域名,会显示一共申请了多少个证书。

当测试好代码后,切换到生产环境时,就可以把下面这行代码注释或者删除了。

1
#  - "--certificatesresolvers.mytlschallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" # 测试环境下使用

密码保护traefik面板

traefik提供了一个非常直观的面板,我们可以通过下方的代码,为面板加密。

1
2
3
4
5
6
7
8
9
labels:
- "traefik.enable=true"
# Traefik面板
- "traefik.http.routers.traefik.rule=Host(`traefik.example.org`)"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik.tls.certresolver=mytlschallenge"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.middlewares=authtraefik"
- "traefik.http.middlewares.authtraefik.basicauth.users=user:$$apr1$$ATuYWcmO$$dUOXryh1xC00cNO3KEHZ30" # user/password

上面的代码意思是,通过traefik.example.org域名访问traefik面板,并使用https协议,访问时需要输入用户名(user)和密码(password)。

密码生成的方式很简单,针对Ubuntu服务器,先安装apache2-utils或者mini-httpd,然后使用htpasswd命令即可,代码如下:

1
2
sudo apt-get install apache2-utils
echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g

服务器返回的字段user:$$apr1$$ATuYWcmO$$dUOXryh1xC00cNO3KEHZ30就是加密过后的账号密码啦。

自动跳转到https

这个也是我非常喜欢traefik的一个原因,可以通过简单的配置就实现自动跳转到https网址,再也不用去摸索nginx的配置文件了!!!

1
2
3
4
5
6
# 全局跳转至https
- "traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`)"
- "traefik.http.routers.http-catchall.entrypoints=web"
- "traefik.http.routers.http-catchall.middlewares=redirect-to-https@docker"
# 跳转中间件
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"

配置Bookstack邮件服务器

这里再次安利一下阿里云服务器,邮件推送服务每天有200封免费额度,足够我们这些小网站使用了,配置也特别简单,只需要在文件中加入:

1
2
3
4
5
6
7
8
9
10
# Mail Setting
- MAIL_DRIVER=smtp # 发信协议
- MAIL_FROM=service@example.com # 发信邮箱
- MAIL_FROM_NAME="XXXX知识库" #发信人名称
# SMTP mail options
- MAIL_HOST=smtpdm.aliyun.com # 发信服务器地址
- MAIL_PORT=465 # 端口
- MAIL_USERNAME=service@example.com # 发信邮箱地址
- MAIL_PASSWORD=password # 密码
- MAIL_ENCRYPTION=ssl # 协议

wkhtmltopdf问题

目前Bookstack使用下来,一直有一个bug没有解决,就是docker环境下,无法正常使用wkhtmltopdf导出中文字体,一开始以为是Bookstack的bug,在官方提交了issue,后来经过大神点拨,发现可能是docker环境下的问题,又去了linuxserver上提交了issue

中文翻译问题

目前Bookstack还有很多地方没有翻译,查看了代码,就抽空做了一点点的翻译,也给作者提交了,希望可以尽快被接受,也算是为开源社区做贡献了。

着急的朋友可以下载的文件,或者自己翻译,Github的地址是https://github.com/jzoy/BookStack,找到`/resources/lang/`文件夹,把里面的`zh_CN`文件夹上传到服务器中,使用`docker ps`命令查找docker实例的id,输入如下命令:

1
sudo docker cp /home/ubuntu/zh_CN cd487e6a0260:/var/www/html/resources/lang

上述代码中,cd487e6a0260就是bookstack的实例id,/home/ubuntu/zh_CN是上传的翻译文件路径,/var/www/html/resources/lang则是docker中对应翻译文件存放的路径,不知道到的小伙伴可以用下方的代码,连接到docker实例中,用ls命令查找,然后用pwd命令输出当前位置后复制即可。

1
sudo docker exec -it cd487e6a0260 /bin/bash

当然,这只是一个临时性的方案,如果重新下载镜像,则会覆盖本地的翻译,各位小伙伴要注意。

修改文件上传限制

Bookstack默认的文件上传大小是1mb,修改这个限制也很简单,进入程序安装目录,进入bookstack/bookstack/php目录,修改php-local.ini文件成如下内容:

1
2
3
4
5
; Edit this file to override php.ini directives and restart the container

date.timezone = Asia/Shanghai
post_max_size = 20M
upload_max_filesize = 20M

上面的20M就是上传文件的限制,大家可以根据需要修改。

网站备份

网站备份的方式有很多,可以用SFTP客户端进行,不过很可能会遇到权限问题,毕竟备份资料中有数据库文件,还有log文件。还推荐使用rsync的方式,代码如下:

1
rsync -zaP --rsync-path="sudo rsync"  --delete ubuntu@site.com:/home/ubuntu/bookstack/ /home/mac/bookstack

上面这段代码是单向备份,如果服务器上删除内容,本地也会自动删除。将ubuntu@site.com替换成自己的服务器用户名和地址,/home/mac/bookstack替换成要存储的文件夹位置即可。

参考资料

traefik官方文档:https://docs.traefik.io/user-guides/docker-compose/acme-tls/

Traefik 2.0 & Docker 101:https://blog.containo.us/traefik-2-0-docker-101-fc2893944b9d

wkhtmltopdf安装:https://www.odoo.com/zh_CN/forum/help-1/question/ubuntu-18-04-lts-how-to-install-wkhtmltopdf-0-12-1-recommended-for-odoo-9-0-and-lower-134198

wkhtmltopdf中文显示空白的问题:http://www.kpt6.com/?p=35

Setting up a Reverse-Proxy with Nginx and docker-compose:https://www.domysee.com/blogposts/reverse-proxy-nginx-docker-compose

黑苹果桌面

背景

还记得乔布斯在舞台上从牛皮纸档案袋中抽出一台Macbook Air惊艳全场,到一个月后在实体店看到真机,肉眼看到还是觉得薄的不可思议,拿起来感觉像玩具。后来读研期间拿着自己的公司败了一台高配Macbook Air真的是喜欢的不得了。后来由于工作需要换了Thinkpad,但是一直很怀念苹果的系统。

偶然间看到油管大神提到 Vanilla 安装方法,可以保持系统的纯洁的同时,极大降低的黑苹果安装的难度,摩拳擦掌就准备试试,经过差不多2周时间的折腾,就有了今天这篇体验记了。如今网上已经有大量的黑苹果教程了,这里就不重复造轮子了,只把自己的一些体验和坑记录下来,给想Hackintosh的朋友一点点帮助。

阅读全文 »

如果您看到这篇文章,表示您的 blog 已经安装成功.

没错,我又开始折腾了,这次把HEXO更换成了Typecho,直接从Github上拉了最新版,安装后显示的是版本 1.2 (18.10.23)。

切换主要是HEXO维护比较繁琐,而且评论系统一直不是特别稳定,设置评论提醒功能也是超出了本人的能力。

切换之后没有去保留评论,算是有一个新的开始吧,加油!

hexo-github

自从博客从Wordpree换成了Hexo,主机也从万网的虚拟主机换成了腾讯的云服务器,就一直在折腾GitHub和Hexo相关的内容,这里就把常用的命令和技巧,做一个汇总。

GitHub篇

Windows平台安装

Windows平台GitHub的安装非常简单,只需要去Git官方网站下载安装即可,对于新手用户,可以一路“下一步”哈哈。

阅读全文 »

思考

背景

2017年换了工作后的近两年的时间里,博客也基本上没有更新,自己也很少静下心来思考和学习。虽然一直从事STEAM教育的课程研发,但是总结和输出,还是很匮乏。

工作期间也断断续续做了一些网站编程相关的工作。上个月又开始系统的学习了Python编程,毕竟人工智能的兴起加上国家对Python编程重视程度的提高,也促使自己做了这个小小的尝试。

加上这几天重新翻看了《暗时间》这本书,觉得博客不仅不能扔掉,还要好好维护一下,作为自己思考的空间和生命的记录。

阅读全文 »

最近一直在学习Hugo,一个静态网站生成器,用他搭建了公司的业务手册,导出了HTML格式的网站,放在阿里云的虚拟主机上,觉得还是需要有一个访问限制,只让公司内部的人看,所以搜索了很多网页后,总结了一个如何加密静态网页文件的方法,主要用的是apache.htaccess文件,具体方法如下:

阅读全文 »

onenote

Onenote作为一款微软出品的笔记神器,一直受很多人喜欢,但是在中国使用Onenote却是一种痛苦,Onedrive网页版被墙,Onenote网页版也无法正常打开,导致了Onenote的同步功能基本上处于不能使用的地步…很多人因此改用为知笔记,有道云笔记等等替代品。 当然了,作为一名Onenote的忠实用户,还是无法割舍,折腾了这么久,终于找到了几个解决同步问题的方法了。

阅读全文 »

起床时间截图

自从这个月初嗷嗷着要4点半起床,每天有就有各种人关注我的进度,有支持的,有看不懂的,还有说风凉话的,当然啦,这些风凉话不仅没有打击我,反而成为了我的动力,早起一周多,是时候做下总结了~

阅读全文 »

xmind-1

偶然间在twitter上看到xmind的学生优惠,只要1美元就能买到xmind 7.5 plus也就是增强版的序列号,又看了下中文的官网上,教师节优惠要199元,还是国外的优惠比较良心哈哈。

本来想找xmind7.5的破解版本的,百度了一圈也没找到,想着这个软件经常用,现在用的xmind 6 pro(专业版)也该更新了,对比了下就剁手升级了7.5版本,因为之前是在英文官网上买的,不能再国内升级,国外升级费用49美元,升级完了看到软件邀请我参加8版本的内测…这是又要剁手的节奏嘛???

阅读全文 »