本教程适用于以下操作系统版本

  • 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 以完成安装。

在 Ubuntu 22.04 服务器上安装与配置 Wiki.js 知识库教程

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

你将被带到登录页面。

在 Ubuntu 22.04 服务器上安装与配置 Wiki.js 知识库教程

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

在 Ubuntu 22.04 服务器上安装与配置 Wiki.js 知识库教程

现在你可以开始使用 Wiki.js 了。

结语

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