本页内容
- 准备工作
- 第 1 步 - 配置防火墙
- 第 2 步 - 安装 Docker 和 Docker Compose
- 第 3 步 - 安装 Git
- 第 4 步 - 安装 Nginx
- 第 5 步 - 安装 SSL
- 第 6 步 - 下载 BookWyrm
- 第 7 步 - 配置 BookWyrm 环境文件
- 第 8 步 - 配置 BookWyrm Docker 文件
- 第 8 步 - 配置 Nginx 和 Nginx 文件
- 第 9 步 - 安装 BookWyrm
- 第 10 步 - 访问 BookWyrm
- 第 11 步 - 备份 BookWyrm
- 第 12 步 - 更新 BookWyrm
- 第 13 步 - BookWyrm 命令行工具 手动确认用户账户 生成预览图片 生成书籍封面缩略图
- 结语
- 手动确认用户账户
- 生成预览图片
- 生成书籍封面缩略图
BookWyrm 是一个面向读书爱好者的开源联邦化社交网络。它可作为无广告的 Goodreads 替代品。它使用 ActivityPub 协议在其他 BookWyrm 实例以及 Mastodon 等使用该协议的其他服务之间发送和接收用户活动。它提供了许多功能,例如书评、评分、阅读动态、书架(如“想读”、“正在读”和“已读”)、书单,以及关注其他用户及其阅读进度。它还提供用户管理功能,例如屏蔽或手动批准关注者,以及针对状态、书架和书单的多级隐私设置。
在本教程中,你将学习如何在 Rocky Linux 9 服务器上安装 BookWyrm。
准备工作
- 一台运行 Rocky Linux 9 的服务器,至少配备 2GB 内存和 2 个 CPU 核心。
- 一个具有 sudo 权限的非 root 用户。
- 一个指向你服务器的完全限定域名(FQDN),例如 bookwyrm.example.com。
- 一个使用如 Amazon SES 或 Mailgun 等邮件服务的 SMTP 账户。
- 确保一切都是最新的。$ sudo dnf update
- 系统需要的一些软件包。$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y 其中部分软件包可能已经安装在你的系统中。
一台运行 Rocky Linux 9 的服务器,至少配备 2GB 内存和 2 个 CPU 核心。
一个具有 sudo 权限的非 root 用户。
一个指向你服务器的完全限定域名(FQDN),例如 bookwyrm.example.com。
一个使用如 Amazon SES 或 Mailgun 等邮件服务的 SMTP 账户。
确保一切都是最新的。
$ sudo dnf update
系统需要的一些软件包。
$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y
其中部分软件包可能已经安装在你的系统中。
第 1 步 - 配置防火墙
第一步是配置防火墙。Rocky Linux 使用 Firewalld 防火墙。检查防火墙的状态。
$ sudo firewall-cmd --state
running
防火墙使用不同的区域(zone),public 区域是我们将使用的默认区域。列出防火墙上所有处于活动状态的服务和端口。
$ sudo firewall-cmd --permanent --list-services
它应显示以下输出。
cockpit dhcpv6-client ssh
允许 HTTP 和 HTTPS 端口。
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
重新检查防火墙的状态。
$ sudo firewall-cmd --permanent --list-services
你应该会看到类似的输出。
cockpit dhcpv6-client http https ssh
重新加载防火墙以使更改生效。
$ sudo firewall-cmd --reload
第 2 步 - 安装 Docker 和 Docker Compose
在服务器和客户端机器上都需要执行此步骤。
安装官方 Docker 仓库。
$ sudo dnf install yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安装 Docker。
$ sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启用并运行 Docker 守护进程。
$ sudo systemctl enable docker --now
检查 Docker 服务的状态。
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
Active: active (running) since Wed 2023-09-13 09:15:08 UTC; 6s ago
TriggeredBy: ? docker.socket
Docs: https://docs.docker.com
Main PID: 6425 (dockerd)
Tasks: 9
Memory: 33.2M
CPU: 282ms
CGroup: /system.slice/docker.service
??6425 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
将你的系统用户添加到 Docker 组,以避免使用 sudo 来运行 Docker 命令。
$ sudo usermod -aG docker $(whoami)
注销后再次登录服务器以使更改生效。
第 3 步 - 安装 Git
BookWyrm 需要 Git 来下载文件,而 Rocky Linux 默认未安装 Git。运行以下命令安装 Git。
$ sudo dnf install git
验证安装。
$ git --version
git version 2.39.3
你可以用你的姓名和邮箱地址配置 Git 以备后续使用。不过此步骤是可选的。
$ git config --global user.name "Your Name"
$ git config --global user.email "
[email protected]
"
第 4 步 - 安装 Nginx
Rocky Linux 9 自带的 Nginx 版本较旧。要安装最新版本,你需要下载官方 Nginx 仓库。
创建并打开文件 /etc/yum.repos.d/nginx.repo 进行编辑。
$ sudo nano /etc/yum.repos.d/nginx.repo
在其中粘贴以下代码。
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。
安装 Nginx。
$ sudo dnf install nginx
验证安装。
$ nginx -v
nginx version: nginx/1.24.0
启用并启动 Nginx 服务器服务。
$ sudo systemctl enable nginx --now
检查服务状态。
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Active: active (running) since Wed 2023-09-13 09:16:59 UTC; 8s ago
Docs: http://nginx.org/en/docs/
Process: 8786 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 8787 (nginx)
Tasks: 3 (limit: 22979)
Memory: 2.8M
CPU: 12ms
CGroup: /system.slice/nginx.service
??8787 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??8788 "nginx: worker process"
??8789 "nginx: worker process"
第 5 步 - 安装 SSL
我们需要安装 Certbot 来生成 SSL 证书。为此我们将使用 Snapd 包安装器。由于 Rocky Linux 默认未包含它,请安装 Snapd 安装器。它需要使用 EPEL(Extra Packages for Enterprise Linux,企业版 Linux 附加软件包)仓库才能工作。
安装 EPEL 仓库。
$ sudo dnf install epel-release
安装 Snapd。
$ sudo dnf install -y snapd
启用并启动 Snap 服务。
$ sudo systemctl enable snapd --now
安装 Snap core 软件包,并确保你的 Snapd 版本是最新的。
$ sudo snap install core && sudo snap refresh core
为 Snapd 创建必要的链接。
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.sh
执行以下命令安装 Certbot。
$ sudo snap install --classic certbot
使用以下命令通过创建指向 /usr/bin 目录的符号链接,确保 Certbot 命令可以运行。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
验证安装。
$ certbot --version
certbot 2.6.0
生成 SSL 证书。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m
[email protected]
-d bookwyrm.example.com
上述命令会将证书下载到服务器上的 /etc/letsencrypt/live/bookwyrm.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 ------------------------------------------------------------------------------------------------------------------
Wed 2023-09-13 10:45:51 UTC 1h 25min left Wed 2023-09-13 09:19:00 UTC 1min 13s ago dnf-makecache.timer dnf-makecache.service
Wed 2023-09-13 18:33:00 UTC 9h left - - snap.certbot.renew.timer snap.certbot.renew.service
Thu 2023-09-14 00:00:00 UTC 14h left Wed 2023-09-13 08:32:04 UTC 48min ago logrotate.timer logrotate.service
对流程进行一次空运行(dry run),以检查 SSL 续期是否正常工作。
$ sudo certbot renew --dry-run
如果没有看到错误,说明一切就绪。你的证书将自动续期。
第 6 步 - 下载 BookWyrm
为 BookWyrm 创建一个目录。
$ mkdir ~/bookwyrm
切换到该目录。
$ cd ~/bookwyrm
从 GitHub 克隆 BookWyrm 应用的 production 分支。
$ git clone https://github.com/bookwyrm-social/bookwyrm.git .
切换到 production 分支。
$ git checkout production
通过复制示例文件来创建环境文件。
$ cp .env.example .env
第 7 步 - 配置 BookWyrm 环境文件
为 BookWyrm 生成一个密钥(secret key)。
$ openssl rand 60 | openssl base64 -A
kahYlt56TI2fZQwj0oX054u2aJE7bptHyInK4RXQadLLmXwGSDm8N1vW9uacA9N6FHoXPINPwOFTmnaT
打开环境文件进行编辑。
$ sudo nano .env
配置以下变量。
SECRET_KEY="kahYlt56TI2fZQwj0oX054u2aJE7bptHyInK4RXQadLLmXwGSDm8N1vW9uacA9N6FHoXPINPwOFTmnaT"
DOMAIN=bookwyrm.example.com
[email protected]
POSTGRES_PASSWORD=Your_Password
POSTGRES_USER=bookwyrmuser
POSTGRES_DB=bookwyrm
POSTGRES_HOST=localhost
REDIS_ACTIVITY_HOST=localhost
REDIS_ACTIVITY_PORT=6379
REDIS_ACTIVITY_PASSWORD=Your_Redis_Password
REDIS_ACTIVITY_DB_INDEX=0
REDIS_BROKER_HOST=localhost
REDIS_BROKER_PORT=6379
REDIS_BROKER_PASSWORD=Your_Redis_Password
REDIS_BROKER_DB_INDEX=1
FLOWER_USER=username
FLOWER_PASSWORD=flowerpassword
EMAIl_HOST=
EMAIL_PORT=587
EMAIL_HOST_USER=AmazonSESUSER
EMAIL_HOST_PASSWORD=AmazonSESPASSWORD
EMAIL_USE_TLS=true
EMAIL_USE_SSL=false
EMAIL_SENDER_NAME=HowtoForge
EMAIL_SENDER_DOMAIN=example.com
## only enable it if you have a fairly powered server with a minimum of 2 CPU Cores and 2GB of RAM
ENABLE_PREVIEW_IMAGES=true
让我们逐一查看环境文件中的所有变量。
- SECRET_KEY - 你上面生成的密钥
- DOMAIN - 你的 BookWyrm 实例的完全限定域名(FQDN)。在我们的例子中,它是 bookwyrm.example.com 。
- POSTGRES_PASSWORD - 第 2 步中配置的 PostgreSQL 密码。
- POSTGRES_HOST - 设置为 db,即 docker-compose.yml 文件中 PostgreSQL 的服务名称。
- POSTGRES_USER - 设置为你在第 2 步中选择的 bookwyrmuser。
- POSTGRES_DB - 设置为你在第 2 步中选择的 bookwyrm。
- REDIS_ACTIVITY_HOST 和 REDIS_BROKER_HOST - 如果你在同一台机器上托管 Redis 服务器,则将它们设置为 localhost。
- REDIS_ACTIVITY_PORT 和 REDIS_BROKER_PORT - 将它们设置为 Redis 默认端口 6379。
- REDIS_ACTIVITY_DB 和 REDIS_BROKER_DB - 分别将它们设置为 0 和 1。我们将为两者使用不同的数据库。
- REDIS_ACTIVITY_PASSWORD 和 REDIS_BROKER_PASSWORD - 将它们设置为你在第 3 步中选择的 Redis 密码。
- FLOWER_USER - 为 BookWyrm 所需的 Flower 服务选择一个用户名。
- FLOWER_PASSWORD - 为 Flower 服务选择一个密码。
- EMAIL_HOST - 设置为你所使用的邮件服务的 SMTP 主机。
- EMAIL_PORT - 设置为邮件服务的 SMTP 端口。
- EMAIL_HOST_USER - 设置为 SMTP 用户名。
- EMAIL_HOST_PASSWORD - 设置为 SMTP 密码。
- EMAIL_USE_TLS - 如果你的邮件服务使用 TLS,则将其设置为 true。
- EMAIL_USE_SSL - 如果你的邮件服务使用 SSL,则将其设置为 true。
- EMAIL_SENDER_NAME - 为你的实例发送的邮件选择发件人名称。
- EMAIL_SENDER_DOMAIN - 将其设置为邮件服务所使用的域名。
- ENABLE_PREVIEW_IMAGES - 如果你希望你的实例自动生成预览图片,则将其设置为 true。不过,由于这是一个高负载过程,请确保你的服务器拥有充足的 CPU 和内存。
完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。
第 8 步 - 配置 BookWyrm Docker 文件
打开 Docker compose 文件进行编辑。
$ nano docker-compose.yml
如你所见,docker 文件包含 Nginx 和 Certbot 两个服务。但在本教程中,我们将在外部使用 Nginx 作为反向代理服务器。因此,我们不会使用该文件中的 Certbot 服务。同时,我们需要相应地对 Nginx 服务进行更改。
在 services >> nginx >> ports 下,注释掉默认端口,并添加 ` - "8001:8001" 这一行,如下所示。同时,注释掉 Nginx 服务下的 certbot 卷(volumes)。Nginx 服务应如下所示。最后,注释掉整个 certbot 服务部分。
services:
nginx:
image: nginx:latest
logging: *default-logging
restart: unless-stopped
ports:
# - "80:80"
# - "443:443"
- "8001:8001"
depends_on:
- web
networks:
- main
volumes:
- ./nginx:/etc/nginx/conf.d
# - ./certbot/conf:/etc/nginx/ssl
# - ./certbot/data:/var/www/certbot
- static_volume:/app/static
- media_volume:/app/images
#certbot:
# image: certbot/certbot:latest
# command: certonly --webroot --webroot-path=/var/www/certbot --email ${EMAIL} --agree-tos --no-eff-email -d ${DOMAIN} -d www.${DOMAIN}
#command: renew --webroot --webroot-path /var/www/certbot
# logging: *default-logging
# volumes:
# - ./certbot/conf:/etc/letsencrypt
# - ./certbot/logs:/var/log/letsencrypt
# - ./certbot/data:/var/www/certbot
无需再做其他更改。完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。
第 8 步 - 配置 Nginx 和 Nginx 文件
复制 Nginx 生产模板文件,并将其设置为供 Nginx docker 服务使用。
$ cp nginx/production nginx/default.conf
打开 default.conf 进行编辑。
$ nano nginx/default.conf
在第一个和第三个 server 块中,将 your-domain.com 替换为你的实际 BookWyrm 域名。在我们的例子中,它是 bookwyrm.example.com 。如果你没有使用域名的 www-your-domain.com 版本,请从 server_name 中将其移除。同时,注释掉第一个 server 块下的 location ~ /.well-known/acme-challenge 块。
你的 default.conf 应类似于以下内容。
include /etc/nginx/conf.d/server_config;
upstream web {
server web:8000;
}
server {
listen [::]:80;
listen 80;
server_name bookwyrm.example.com;
# location ~ /.well-known/acme-challenge {
# allow all;
# root /var/www/certbot;
# }
# # redirect http to https
# return 301 https://your-domain.com$request_uri;
}
# server {
....
}
# Reverse-Proxy server
server {
listen [::]:8001;
listen 8001;
server_name bookwyrm.example.com;
location / {
proxy_pass http://web;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /images/ {
alias /app/images/;
}
location /static/ {
alias /app/static/;
}
}
完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。
创建并打开文件 /etc/nginx/conf.d/bookwyrm.conf 进行编辑。
$ sudo nano /etc/nginx/conf.d/bookwyrm.conf
在其中粘贴以下代码。
server {
server_name bookwyrm.example.com;
listen [::]:80;
listen 80;
# redirect http to https
return 301 https://bookwyrm.example.com$request_uri;
}
server {
access_log /var/log/nginx/bookwyrm.access.log;
error_log /var/log/nginx/bookwyrm.error.log;
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name bookwyrm.example.com;
# SSL code
ssl_certificate /etc/letsencrypt/live/bookwyrm.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/bookwyrm.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/bookwyrm.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_prefer_server_ciphers off;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
location / {
proxy_pass http://localhost:8001;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
location /images/ {
proxy_pass http://localhost:8001;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
location /static/ {
proxy_pass http://localhost:8001;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}
完成后,按 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
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重启 Nginx 服务以使新配置生效。
$ sudo systemctl restart nginx
第 9 步 - 安装 BookWyrm
切换到 BookWyrm 目录。
$ cd ~/bookwyrm
初始化数据库。该命令需要几分钟才能完成。
$ ./bw-dev migrate
完成后,你将看到类似的输出。
..............................
Applying django_celery_beat.0005_add_solarschedule_events_choices... OK
Applying django_celery_beat.0006_auto_20180322_0932... OK
Applying django_celery_beat.0007_auto_20180521_0826... OK
Applying django_celery_beat.0008_auto_20180914_1922... OK
Applying django_celery_beat.0006_auto_20180210_1226... OK
Applying django_celery_beat.0006_periodictask_priority... OK
Applying django_celery_beat.0009_periodictask_headers... OK
Applying django_celery_beat.0010_auto_20190429_0326... OK
Applying django_celery_beat.0011_auto_20190508_0153... OK
Applying django_celery_beat.0012_periodictask_expire_seconds... OK
Applying django_celery_beat.0013_auto_20200609_0727... OK
Applying django_celery_beat.0014_remove_clockedschedule_enabled... OK
Applying django_celery_beat.0015_edit_solarschedule_events_choices... OK
Applying django_celery_beat.0016_alter_crontabschedule_timezone... OK
Applying sessions.0001_initial... OK
通过编译 BookWyrm、Celery 和 Flower 的 Docker 镜像来运行应用。
$ docker compose up --build
根据服务器资源情况,此过程至少需要 10-15 分钟才能完成。请等待其完成所有镜像的编译。你的最终输出应类似于以下内容。
过程完成后,按 Ctrl + C 停止该进程。
过程完成时,你应该会看到类似的内容。
bookwyrm-nginx-1 | 2023/09/13 10:20:33 [notice] 30#30: http file cache: /var/cache/nginx/bookwyrm_cache 0.000M, bsize: 4096
bookwyrm-nginx-1 | 2023/09/13 10:20:33 [notice] 1#1: signal 17 (SIGCHLD) received from 30
bookwyrm-nginx-1 | 2023/09/13 10:20:33 [notice] 1#1: cache loader process 30 exited with code 0
bookwyrm-nginx-1 | 2023/09/13 10:20:33 [notice] 1#1: signal 29 (SIGIO) received
bookwyrm-redis_broker-1 | 1:M 13 Sep 2023 10:24:32.018 * 100 changes in 300 seconds. Saving...
bookwyrm-redis_broker-1 | 1:M 13 Sep 2023 10:24:32.018 * Background saving started by pid 21
bookwyrm-redis_broker-1 | 21:C 13 Sep 2023 10:24:32.022 * DB saved on disk
bookwyrm-redis_broker-1 | 21:C 13 Sep 2023 10:24:32.023 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
bookwyrm-redis_broker-1 | 1:M 13 Sep 2023 10:24:32.119 * Background saving terminated with success
^CGracefully stopping... (press Ctrl+C again to force)
Aborting on container exit...
canceled
初始化应用。
$ ./bw-dev setup
此过程结束时将显示你的管理员代码(admin code)。
*******************************************
Use this code to create your admin account:
299f3181-e57e-4f16-94c9-51cfc427b8df
*******************************************
你可以随时通过运行以下命令获取该代码。
$ ./bw-dev admin_code
*******************************************
Use this code to create your admin account:
299f3181-e57e-4f16-94c9-51cfc427b8df
*******************************************
安装 BookWyrm 的最后一步是启动所有剩余容器。
$ docker compose up -d
你可以使用以下命令检查容器的状态。
$ docker ps
你应该会得到类似的输出。

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
083c2dfc81f4 nginx:latest "/docker-entrypoint.…" 26 hours ago Up 26 hours 80/tcp, 0.0.0.0:8001->8001/tcp, :::8001->8001/tcp bookwyrm-nginx-1
8618c3a7b460 bookwyrm-web "gunicorn bookwyrm.w…" 26 hours ago Up 26 hours 0.0.0.0:32768->8000/tcp, :::32768->8000/tcp bookwyrm-web-1
3e67c639e21f bookwyrm-celery_beat "celery -A celerywyr…" 26 hours ago Up 26 hours bookwyrm-celery_beat-1
86a774a5bb6d bookwyrm-flower "celery -A celerywyr…" 26 hours ago Up 26 hours bookwyrm-flower-1
ac2ff1e91bb4 bookwyrm-celery_worker "celery -A celerywyr…" 26 hours ago Up 26 hours bookwyrm-celery_worker-1
bc6a64fac55c redis "docker-entrypoint.s…" 26 hours ago Up 26 hours 6379/tcp bookwyrm-redis_activity-1
ef78760b967b bookwyrm-db "/bookwyrm-entrypoin…" 26 hours ago Up 26 hours 5432/tcp bookwyrm-db-1
5ededaed00ab redis "docker-entrypoint.s…" 26 hours ago Up 26 hours 6379/tcp bookwyrm-redis_broker-1
你也可以使用以下命令检查状态。
$ docker compose ps
不过,这次的输出会略有不同。
下一步是访问 BookWyrm 并配置你的实例。
第 10 步 - 访问 BookWyrm
在浏览器中打开 URL https://bookwyrm.example.com,你将看到以下页面。

如果一切正常,点击 Continue 按钮进入下一页。

填写上一步获得的管理员密钥以及管理员账户凭据。填写完成后点击 Sign up 按钮进入下一页。

在这里,系统会要求你配置站点,并添加信息和站点政策。
接下来,点击左侧边栏的 System >> Email Configuration 来检查你的邮件设置。确认页面上列出的邮件设置,然后点击 Send test email 按钮给你自己发送一封测试邮件。

如果邮件发送成功,你应该会收到以下邮件。

你也可以从左侧边栏访问其余设置进行配置。完成所有这些操作后,你的 BookWyrm 实例即可投入使用。
第 11 步 - 备份 BookWyrm
BookWyrm 的 Docker 安装附带了一个备份(Backup)工具。它还附带了一个自动备份清理(pruning)工具,可自动清理备份文件夹。
备份创建在数据库容器的 backups 目录中。备份每天在 UTC 午夜创建。运行以下命令进入容器的 SSH shell。
$ docker exec -it bookwyrm-db-1 bash
进入容器后,检查备份目录的内容。该命令只会在容器创建时间过去 24 小时后才会显示备份。
$ ls backups -al
total 252
drwxr-xr-x. 2 root root 56 Sep 12 00:00 .
drwxr-xr-x. 1 root root 39 Sep 11 11:47 ..
-rw-r--r--. 1 root root 250380 Sep 12 00:00 backup_bookwyrm_2023-09-12.sql
-rw-r--r--. 1 root root 44 Sep 11 11:47 .env
退出 shell。
$ exit
你可以运行以下命令将备份复制到本地机器。
$ docker cp bookwyrm-db-1:/backups <host machine path>
自动数据库清理(pruning)功能默认是禁用的。要启用它,请打开 ~/bookwyrm/postgres-docker/cronfile 文件进行编辑。
$ nano ~/bookwyrm/postgres-docker/cronfile
删除最前面一行的井号( # )以取消注释。你的 cronfile 应如下所示。
0 0 * * * /usr/local/bin/bookwyrm-backup.sh
# If uncommented, this script will weed the backups directory. It will keep the 14
# most-recent backups, then one backup/week for the next four backups, then one
# backup/month after that.
0 5 * * * /usr/local/bin/bookwyrm-weed.sh -d 14 -w 4 -m -1 /backups
完成后,按 Ctrl + X 并在提示时输入 Y 以保存文件。
上述脚本将保留最近 14 个备份。
重新构建你的实例。
$ cd ~/bookwyrm
$ docker compose up --build
第 12 步 - 更新 BookWyrm
更新你的 BookWyrm 实例涉及多个步骤。首先,从 BookWyrm 的 GitHub 仓库拉取最新更改。
$ cd ~/bookwyrm
$ git pull
如果存在冲突,你需要先单独运行 git pull。
重新构建镜像。
$ docker compose rebuild
使用新构建的 Docker 镜像运行数据库迁移(Database migrations)。
$ docker compose run --rm web python manage.py migrate
编译 BookWyrm 主题。
$ docker compose run --rm web python manage.py compile_themes
加载任何已更新的静态文件。
$ docker compose run --rm web python manage.py collectstatic --no-input
关闭现有容器。
$ docker compose down --remove-orphans
使用新构建的镜像重启容器。
$ docker compose up -d
每个用户的 feed 存储在 Redis 数据库中。要重新填充某个 stream,请运行以下命令。
$ ./bw-dev populate_streams
或者你可以使用以下命令重新填充这些 stream。
$ docker compose run --rm web python manage.py populate_streams
如果不起作用或出现问题,你可以使用以下命令删除 stream 数据。
$ docker compose run --rm web python manage.py erase_streams
第 13 步 - BookWyrm 命令行工具
到目前为止,你已经看到我们使用 bw-dev 命令行工具来操作 BookWyrm。该工具可以执行许多有用的任务,甚至可以运行 Docker 命令。该工具一些常用的用途如下。
手动确认用户账户
以下命令会手动确认某个用户(username)的邮箱,并将其标记为已激活。
$ ./bw-dev confirm_email <username>
生成预览图片
如果你稍后启用了预览图片选项,则需要为之前上传的数据更新它们。运行以下命令来完成此操作。
$ ./bw-dev generate_preview_images --all
生成书籍封面缩略图
以下命令会为书籍封面生成缩略图。
$ ./bw-dev generate_thumbnails
以上只是其中一些选项。完整列表请参阅 BookWyrm CLI 手册。
结语
至此,本教程关于在 Rocky Linux 9 服务器上安装 BookWyrm 社交网络的内容就结束了。如果你有任何问题,请在下方评论区留言。