在此记录一下这个网站的搭建过程。
本网站使用wiki.js v2
搭建,数据库使用了postgreSQL v15
以及elasticSearch v7
,使用容器化部署,容器工具使用的是podman + podman-compose
。以下是逐步操作记录。
服务器选择的是搬瓦工 (https://bandwagonhost.com/) 的CN2GIA
类型服务器。CN2GIA
代表中国电信供全球访问的网络带宽,详细解释可以参考 https://docs.console.zenlayer.com/glossary/c/cn2, 摘抄如下:
China Telecom CN2 GIA is a network architecture used by China Telecom to provide high-speed, low-latency internet connectivity to customers. CN2 is short for "China Telecom Next Generation Carrier Network," and GIA stands for "Global Internet Access."
CN2 GIA is designed to provide customers with fast and reliable internet connectivity by using advanced networking technologies such as Multi-Protocol Label Switching (MPLS), Quality of Service (QoS), and Border Gateway Protocol (BGP) to optimize routing and minimize latency. The network also incorporates a number of security features, such as Distributed Denial of Service (DDoS) protection and intrusion detection and prevention systems, to help protect against cyber threats.
Overall, CN2 GIA is an important part of China Telecom's strategy to provide high-quality internet connectivity to customers worldwide, particularly in the Asia-Pacific region.
优秀的网络产品带来优秀的价格🤣,这个服务器非常贵,所以我只能买一个小小的用。好在够用。
搬瓦工的vps(云服务器)服务提供了比较方便的系统运维工具,包括系统重置/重装、备份恢复、资源监控等。默认提供了一个Rocky Linux 9
系统,但是这个系统我用着不是很顺手,比如说安装fail2ban(一个ssh登录保护工具)的时候就没有找到现成的文档。后来重新安装了Debian 12
。我们的搭建工作也从这里开始。
podman
是docker
的轻量化版本。官网上说,它的主要特点是:
要在Debian 12上安装podman,参考 https://podman.io/docs/installation#debian; 安装podman-compose也只需要一个命令,我写在了一起:
apt-get install podman podman-compose
然后就可以使用了!记录一下基本的命令,几乎就是docker的翻版:
podman image ls
:列出所有本地镜像podman ps
:列出所有运行中的容器podman-compose config
:(在项目目录)检查docker-compose.yml的正确性podman-compose pull
: 根据docker-compose.yml的描述,拉取镜像podman-compose up
: 根据docker-compose.yml的描述,启动服务。前台启动podman-compose up -d
: 根据docker-compose.yml的描述,启动服务。后台启动podman-compose down
: 根据docker-compose.yml的描述,停止服务。podman-compose exec -it <服务名> /bin/bash
: 如果那个容器有bash,深入容器打开这个终端(以便继续执行命令)创建一个目录用于放置wiki-js的配置文件,然后在目录中创建docker-compose.yml
文件,内容如下:
###########################################
## /path/to/your/proj/docker-compose.yml
###########################################
version: "3"
services:
db:
image: docker.io/library/postgres:15-alpine
environment:
POSTGRES_DB: dddddd
POSTGRES_PASSWORD: xxxxxxxx
POSTGRES_USER: yyyyyy
logging:
driver: "none"
restart: unless-stopped
volumes:
- db-data:/var/lib/postgresql/data
wiki:
image: ghcr.io/requarks/wiki:2
depends_on:
- db
environment:
DB_TYPE: postgres
DB_HOST: db # 是上一段的服务名
DB_PORT: 5432
DB_USER: yyyyyy
DB_PASS: xxxxxxxx
DB_NAME: dddddd
restart: unless-stopped
ports:
- "80:3000"
- "443:3443" # 用于HTTPS
volumes:
# 进一步编辑wiki-js的配置,就要将这个配置文件”拿出来“放到本地
# 这里指定了和docker-compose.yml相邻的位置
- ./config.yml:/wiki/config.yml
elastic:
image: docker.io/library/elasticsearch:7.17.25
restart: unless-stopped
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms256m -Xmx256m
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es-data:/usr/share/elasticsearch/data
volumes:
db-data:
es-data:
然后,编写config.yml文件,用于配置wiki-js。虽然wiki-js可以使用环境变量来配置,但是毕竟环境变量是后来才增加的配置方式,是第二手数据;config.yml是第一手数据,我们用第一手数据:
###########################################
## /path/to/your/proj/config.yml
###########################################
port: 3000 # 就是这样,不要改动它
db:
type: $(DB_TYPE) # 就是这样,不要改动它
host: '$(DB_HOST)'
port: $(DB_PORT)
user: '$(DB_USER)'
pass: '$(DB_PASS)'
db: $(DB_NAME)
ssl:
enabled: true
port: 3443
provider: letsencrypt
domain: your-domain.com
subscriberEmail: [email protected]
上面的配置启用了wiki-js的HTTPS功能 -- 实际上wiki-js内部集成了Let's Encrypt
,所以可以免费获得一个HTTPS证书并且自动续期。
先在前台启动,这样有问题可以及时看到日志输出;没问题了,再使用podman-compose down
+ podman-compose up -d
正式启动服务。由于我们在docker-compose.yml
文件中为postgre数据库配置了volume,所以这个重启的过程是不会丢失数据的。
cd /path/to/your/proj
podman compose up
启动之后,稍等片刻,打开你的网站 (比较保险的做法是通过HTTP访问,因为HTTPS可能要等一段时间才能安装好)例如 http://pkubangbang.cn ,此时会显示系统初始化页面,需要你创建管理员账户,并且指定外部访问的链接。填写完成后,点击下一步,等两分钟,系统初始化完成,就进入wiki的主界面了。
什么是外部访问链接?
wiki-js是一种web服务,部署之后,会在服务器上监听80和443端口,对于来自互联网的页面请求,返回页面数据。
但是,
请求-响应
并不是一锤子买卖,有时候服务器会返回一个新地址要求客户端自动跳转过去(重定向),有时候页面还包含附件,需要客户端进一步请求数据。这些情况都要求wiki-js知道自己位于哪里,或者更确切的说,wiki-js要知道客户端如何找到自己。一种典型的容易出错的情况就是涉及反向代理时。反向代理挡在服务之前,隐藏了服务器的真实地址,使得客户端以为服务就来自反向代理。对于这种情况,则需要配置”外部访问链接“为反向代理的位置,而不是服务器所在的位置。
进入主界面之后,你会发现界面都是英文。wiki-js支持国际化以及本地化,我们来配置一下。
国际化与本地化的区别
二者都和翻译有关,但是有细微的差别。对于wiki-js来说,这个系统由wiki工具(框架)以及由工具创造的wiki文档(内容)组成。
- 所谓国际化,指的是使用不同语言的用户,在使用同一个系统时,能默认看到特定语言的内容,并切换显示其他语言的内容。
- 所谓本地化,指的是wiki工具能够按照用户使用的语言显示命令。通常需要安装一些语言包才能实现目标。
作为管理员,找到页面中的配置按钮,然后在配置页面,选择”Locales“(语言包),然后在界面右侧(或者下方如果浏览器不够宽)下载语言包,然后在”Site Locale“(网站语言)下拉框中选择需要的语言即可完成本地化。
如果你的wiki-js是私有化部署的(或者说部署在air-gapped环境),那么你需要手动下载语言包,并且使用”sideLoading“方法,让wiki-js来读取你提供的配置。详见 https://docs.requarks.io/en/install/sideload
docker-compose.yml
中提供了一个elasticSearch服务(服务名叫做elastic)。在此基础上可以很方便地增加elasticSearch,用于提高页面搜索速度和质量。
作为管理员,打开配置页面,然后找到”搜索引擎“功能,选择elasticSearch。配置项如下:
以上的配置就足够运行一个简单的搜索服务了,但是它对于中文的支持不是特别好。要支持中文,你需要使用icu-analyzer
。
icu-analyzer
是一个elasticsearch的插件。如果elasticsearch不是用容器安装的,那么只需要执行下面的命令就可以完成插件安装:
elasticsearch-plugin install analysis-icu
# 重启服务
systemctl restart elasticsearch
在docker/podman中,情况会有所不同:我们要将插件的安装结果叠加在docker镜像上。一种简单的办法是,使用dockerfile
自行打包:
##################################################
## /path/to/your/proj/elasticsearch-icu.dockerfile
##################################################
# 使用官方 Elasticsearch 7.17.25 镜像作为基础镜像
FROM docker.io/library/elasticsearch:7.17.25
# 安装 ICU 插件
RUN elasticsearch-plugin install analysis-icu
然后改造docker-compose.yml
文件,使用build
而不是image
来指定镜像的来源,就像这样:
###########################################
## /path/to/your/proj/docker-compose.yml
###########################################
version: "3"
services:
db:
image: docker.io/library/postgres:15-alpine
environment:
POSTGRES_DB: dddddd
POSTGRES_PASSWORD: xxxxxxxx
POSTGRES_USER: yyyyyy
logging:
driver: "none"
restart: unless-stopped
volumes:
- db-data:/var/lib/postgresql/data
wiki:
image: ghcr.io/requarks/wiki:2
depends_on:
- db
environment:
DB_TYPE: postgres
DB_HOST: db # 是上一段的服务名
DB_PORT: 5432
DB_USER: yyyyyy
DB_PASS: xxxxxxxx
DB_NAME: dddddd
restart: unless-stopped
ports:
- "80:3000"
- "443:3443" # 用于HTTPS
volumes:
# 进一步编辑wiki-js的配置,就要将这个配置文件”拿出来“放到本地
# 这里指定了和docker-compose.yml相邻的位置
- ./config.yml:/wiki/config.yml
elastic:
# image: docker.io/library/elasticsearch:7.17.25
build:
context: .
dockerfile: elasticsearch-icu.dockerfile
restart: unless-stopped
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms256m -Xmx256m
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es-data:/usr/share/elasticsearch/data
volumes:
db-data:
es-data:
然后,重新启动服务。podman-compose down && podman-compose up -d
。这次启动时,podman会先打包新镜像,然后再用新的镜像启动服务。
最后,在配置页面,指定Analyzer: icu_analyzer
,点击应用按钮保存配置,然后重建索引 -- 大功告成!