本教程适用于以下操作系统版本
- Ubuntu 22.04(Jammy Jellyfish)
- Ubuntu 18.04(Bionic Beaver)
本页内容
- 先决条件
- 第 1 步 - 配置防火墙
- 第 2 步 - 安装 PostgreSQL 和实用工具
- 第 3 步 - 配置 PostgreSQL
- 第 4 步 - 安装 Node.js
- 第 5 步 - 下载 Wiki.js
- 第 6 步 - 配置并运行 Wiki.js
- 第 7 步 - 设置 systemd 服务
- 第 8 步 - 安装 Nginx
- 第 9 步 - 安装 SSL
- 第 10 步 - 配置 Nginx
- 第 11 步 - 完成安装
- 结语
Wiki.js 是一款开源、轻量级的 wiki 软件,基于 Node.js JavaScript 框架构建。它可用于编写文档、wiki 和 Web 内容,为开发者提供 Markdown 编辑器,为非技术人员提供 WYSIWYG(所见即所得)编辑器。它支持多种内容类型,包括 UML 图、使用 Tex 或 MathML 语法的数学公式以及代码。它包含多个功能模块,涵盖分析统计、身份认证、日志记录、第三方搜索引擎,以及用于将内容同步到多个存储服务的模块。
在本教程中,你将学习如何在 Ubuntu 22.04 服务器上安装 Wiki.js,并使用 PostgreSQL 数据库和 Nginx 服务器进行代理。
先决条件
- 一台运行 Ubuntu 22.04 的服务器。
- 一个具有 sudo 权限的非 root 用户。
- 一个指向你服务器的完全限定域名(FQDN)。在本教程中,我们将使用 wiki.example.com 作为域名。
- 确保系统已更新。$ sudo apt update && sudo apt upgrade
- 安装基础实用工具包。其中部分可能已安装。$ sudo apt install wget curl ca-certificates gnupg gnupg2 nano unzip lsb-release ubuntu-keyring -y
一台运行 Ubuntu 22.04 的服务器。
一个具有 sudo 权限的非 root 用户。
一个指向你服务器的完全限定域名(FQDN)。在本教程中,我们将使用 wiki.example.com 作为域名。
确保所有软件包均已更新。
$ sudo apt update && sudo apt upgrade
安装基础实用工具包。其中部分可能已安装。
$ sudo apt install wget curl ca-certificates gnupg gnupg2 nano unzip lsb-release ubuntu-keyring -y
第 1 步 - 配置防火墙
在安装任何软件包之前,第一步是配置防火墙以允许 HTTP 和 HTTPS 连接。
检查防火墙状态。
$ sudo ufw status
你应该会看到类似以下的输出。
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
允许 HTTP 和 HTTPS 端口。
$ sudo ufw allow http
$ sudo ufw allow https
再次检查状态以确认。
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
第 2 步 - 安装 PostgreSQL 和实用工具
Ubuntu 22.04 自带较旧版本的 PostgreSQL。本教程中我们将安装 Postgres 14。
安装 PostgreSQL 的软件源。
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
导入 PostgreSQL 的 GPG 密钥。
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg >/dev/null
更新系统软件源列表。
$ sudo apt update
安装 PostgreSQL 14 服务器。
$ sudo apt install -y postgresql-14
检查服务状态。
$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Tue 2022-10-25 06:24:24 UTC; 10min ago
Main PID: 4032 (code=exited, status=0/SUCCESS)
CPU: 1ms
Oct 25 06:24:24 wiki systemd[1]: Starting PostgreSQL RDBMS...
Oct 25 06:24:24 wiki systemd[1]: Finished PostgreSQL RDBMS.
第 3 步 - 配置 PostgreSQL
登录到 PostgreSQL 命令行。
$ sudo -i -u postgres psql
为 Wiki.js 创建一个新数据库。
postgres=# CREATE DATABASE wikidb;
创建一个使用强密码的新数据库用户。
postgres=# CREATE USER wikiuser WITH ENCRYPTED PASSWORD 'wikipassword';
授予该用户使用数据库的权限。
postgres=# GRANT ALL PRIVILEGES ON DATABASE wikidb TO wikiuser;
退出 Postgres 命令行。
postgres=# \q
第 4 步 - 安装 Node.js
在撰写本教程时,Wiki.js 支持 Node v16。
使用以下命令安装 Node 软件源。
$ curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
安装 Node。
$ sudo apt install nodejs -y
验证 Node 安装。
$ node --version
v16.18.0
第 5 步 - 下载 Wiki.js
创建一个用于安装 Wiki.js 的文件夹。
$ sudo mkdir -p /var/www/wikijs
将当前登录用户设置为该文件夹的所有者。
$ sudo chown $USER:$USER /var/www/wikijs
切换到该目录并下载 Wiki.js 代码压缩包。
$ cd /var/www/wikijs && wget https://github.com/Requarks/wiki/releases/latest/download/wiki-js.tar.gz
解压下载的压缩包。
$ tar xzf wiki-js.tar.gz
删除该压缩包。
$ rm wiki-js.tar.gz
第 6 步 - 配置并运行 Wiki.js
根据示例文件创建配置文件。
$ cp config.sample.yml config.yml
打开配置文件进行编辑。
$ nano config.yml
找到以下数据库设置,并将其值更新为第 3 步中配置的内容。
# PostgreSQL / MySQL / MariaDB / MS SQL Server only:
host: localhost
port: 5432
user: wikiuser
pass: wikipassword
db: wikidb
ssl: false
找到 bindIP: 0.0.0.0 这一行,并按如下方式更新。
bindIP: 127.0.0.1
这将使 Wiki.js 监听回环地址,因为我们将通过 Nginx 代理从外部访问它。
按 Ctrl + X 保存文件,并在提示时输入 Y。
使用以下命令运行 Wiki.js。
$ node server
你将收到类似的输出,确认安装成功。
Loading configuration from /var/www/wikijs/config.yml... OK
2022-10-25T06:40:46.294Z [MASTER] info: =======================================
2022-10-25T06:40:46.296Z [MASTER] info: = Wiki.js 2.5.289 =====================
2022-10-25T06:40:46.296Z [MASTER] info: =======================================
2022-10-25T06:40:46.296Z [MASTER] info: Initializing...
2022-10-25T06:40:46.962Z [MASTER] info: Using database driver pg for postgres [ OK ]
2022-10-25T06:40:46.974Z [MASTER] info: Connecting to database...
2022-10-25T06:40:47.067Z [MASTER] info: Database Connection Successful [ OK ]
2022-10-25T06:40:47.345Z [MASTER] warn: DB Configuration is empty or incomplete. Switching to Setup mode...
2022-10-25T06:40:47.345Z [MASTER] info: Starting setup wizard...
2022-10-25T06:40:47.510Z [MASTER] info: Starting HTTP server on port 3000...
2022-10-25T06:40:47.511Z [MASTER] info: HTTP Server on port: [ 3000 ]
2022-10-25T06:40:47.515Z [MASTER] info: HTTP Server: [ RUNNING ]
2022-10-25T06:40:47.515Z [MASTER] info: .......................................................................
2022-10-25T06:40:47.515Z [MASTER] info:
2022-10-25T06:40:47.516Z [MASTER] info: Browse to http://YOUR-SERVER-IP:3000/ to complete setup!
2022-10-25T06:40:47.516Z [MASTER] info:
2022-10-25T06:40:47.516Z [MASTER] info: ........................................................................
按 Ctrl + C 停止该进程。
第 7 步 - 设置 systemd 服务
上述让 Wiki.js 持续运行的方式是临时的。要使其永久生效,我们需要为 Wiki.js 创建一个 systemd 服务,将其作为后台服务运行。这样 Wiki.js 就能在系统重启后自动运行。
为 Wiki.js 创建 systemd 服务文件并打开进行编辑。
$ sudo nano /etc/systemd/system/wikijs.service
在其中粘贴以下代码。将变量 User 的值替换为你的系统用户名。
[Unit]
Description=Wiki.js
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/node server
Restart=always
User=navjot
Environment=NODE_ENV=production
WorkingDirectory=/var/www/wikijs
[Install]
WantedBy=multi-user.target
按 Ctrl + X 保存文件,并在提示时输入 Y。
重新加载 systemd 守护进程。
$ sudo systemctl daemon-reload
启用 Wiki.js 服务。
$ sudo systemctl enable wikijs
第 8 步 - 安装 Nginx
Ubuntu 22.04 自带较旧版本的 Nginx。你需要下载官方 Nginx 软件源以安装最新版本。
导入官方 Nginx 密钥。
$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
为 Nginx 设置官方软件源。
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
固定该软件源,使官方源优先于 Ubuntu 自带源。
$ echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
更新系统软件源列表。
$ sudo apt update
安装 Nginx 服务器。
$ sudo apt install nginx -y
验证安装。
$ nginx -v
nginx version: nginx/1.22.1
启动 Nginx 服务器。
$ sudo systemctl start nginx
检查服务状态。
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-10-25 06:50:05 UTC; 2s ago
Docs: https://nginx.org/en/docs/
Process: 5522 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 5523 (nginx)
Tasks: 2 (limit: 1030)
Memory: 1.8M
CPU: 4ms
CGroup: /system.slice/nginx.service
??5523 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??5524 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
Oct 25 06:50:05 wiki systemd[1]: Starting nginx - high performance web server...
第 9 步 - 安装 SSL
我们需要安装 Certbot 来生成 SSL 证书。你可以选择使用 Ubuntu 的软件源安装 Certbot,或使用 Snapd 工具获取最新版本。本教程将使用 Snapd 版本。
Ubuntu 22.04 默认已安装 Snapd。运行以下命令以确保你的 Snapd 版本是最新的。
$ sudo snap install core
$ sudo snap refresh core
安装 Certbot。
$ sudo snap install --classic certbot
使用以下命令,通过创建指向 /usr/bin 目录的符号链接,确保 Certbot 命令可以运行。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
运行以下命令来签发证书。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m
[email protected]
-d wiki.example.com
上述命令会将证书下载到服务器上的 /etc/letsencrypt/live/wiki.example.com 目录。
生成 Diffie-Hellman 组证书。
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
检查 Certbot 续期调度服务。
$ sudo systemctl list-timers
你会发现 snap.certbot.renew.service 是计划运行的服务之一。
NEXT LEFT LAST PASSED UNIT ACTIVATES
.................................................................................................................................
Tue 2022-10-25 00:00:00 UTC 17h left Tue 2022-10-25 04:49:20 UTC 2h ago logrotate.timer logrotate.service
Tue 2022-10-25 02:39:09 UTC 20h left Tue 2022-10-25 06:47:33 UTC 12min ago apt-daily.timer apt-daily.service
Tue 2022-10-25 06:02:00 UTC 8h left n/a n/a snap.certbot.renew.timer snap.certbot.renew.service
对续期过程进行一次试运行(dry run),以检查 SSL 续期是否正常工作。
$ sudo certbot renew --dry-run
如果没有看到错误,说明一切就绪。你的证书将自动续期。
第 10 步 - 配置 Nginx
创建并打开文件 /etc/nginx/conf.d/wikijs.conf 进行编辑。
$ sudo nano /etc/nginx/conf.d/wikijs.conf
在其中粘贴以下代码。
# enforce HTTPS
server {
listen 80;
listen [::]:80;
server_name wiki.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name wiki.example.com;
root /var/www/wikijs;
access_log /var/log/nginx/wiki.access.log;
error_log /var/log/nginx/wiki.error.log;
http2_push_preload on; # Enable HTTP/2 Server Push
ssl_certificate /etc/letsencrypt/live/wiki.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wiki.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/wiki.example.com/chain.pem;
ssl_session_timeout 1d;
# Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
ssl_protocols TLSv1.2 TLSv1.3;
# Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
# prevent replay attacks.
#
# @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
ssl_early_data on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:50m;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
add_header X-Early-Data $tls1_3_early_data;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:3000;
}
}
# This block is useful for debugging TLS v1.3. Please feel free to remove this
# and use the `$ssl_early_data` variable exposed by NGINX directly should you
# wish to do so.
map $ssl_early_data $tls1_3_early_data {
"~." $ssl_early_data;
default "";
}
将上述文件中的 root 路径替换为你的服务器上的目录。
按 Ctrl + X 保存文件,并在提示时输入 Y。
打开文件 /etc/nginx/nginx.conf 进行编辑。
$ sudo nano /etc/nginx/nginx.conf
在 include /etc/nginx/conf.d/*.conf; 这一行之前添加以下行。
server_names_hash_bucket_size 64;
按 Ctrl + X 保存文件,并在提示时输入 Y。
验证你的 Nginx 配置。
$ sudo nginx -t
如果没有看到错误,说明配置没有问题。
启动 Wiki.js 服务。
$ sudo systemctl start wikijs
重新加载 Nginx 服务器。
$ sudo systemctl reload nginx
第 11 步 - 完成安装
访问 URL https://wiki.example.com 以完成安装。

填写你的管理员账户信息和 URL。取消勾选 Allow Telemetry(允许遥测)选项以禁用遥测。你也可以从管理面板中禁用它。点击 Install(安装)按钮继续。
你将被带到登录页面。

输入你的账户信息,并点击 Log in(登录)按钮进入管理页面。

现在你可以开始使用 Wiki.js 了。
结语
本教程到此结束,你已学会如何在 Ubuntu 22.04 服务器上安装 Wiki.js。如果你有任何疑问,请在下方评论区留言。