网站架构

wordpress是一个用于快速搭建博客平台的php软件,运行在apache下
wekan是一个开源看板,类似trello,可用于项目管理和计划安排
搭建步骤
环境准备
1. 安装docker
2. 拉取wordpress、mysql、wekan、mongo的docker镜像
docker pull wordpress
docker pull mysql
docker pull mongo:4.4-rc-focal
docker pull wekanteam/wekan:v5.35
# 作者反馈最新版的镜像有bug,不建议拉取最新的。不过我看他说目前已经修复了。
docker创建网络用于容器间通信
docker network create huntzou_website
启动容器
1. 启动mysql
docker run --name db-mysql --restart=always -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=<your pwd> -d --network huntzou_website f2ad9
2. 进入到mysql容器中创建数据库
docker exec -it <containerID> bash
mysql -u<your db user> -p
CREATE DATABASE <your db name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 启动wordpress
docker run --name wp-web --restart=always -v /etc/localtime:/etc/localtime --network huntzou_website -d -e WORDPRESS_DB_HOST=db-mysql -e WORDPRESS_DB_USER=<your db user> -e WORDPRESS_DB_PASSWORD=<your db pwd> -e WORDPRESS_DB_NAME=<your db name> -e WORDPRESS_TABLE_PREFIX=wp b44d
4. 启动mongodb
docker run -d --restart=always --name db-mongo -v /etc/localtime:/etc/localtime --network huntzou_website 5cea
5. 启动wekan
docker run -d --restart=always --name wekan-web -v /etc/localtime:/etc/localtime -e MONGO_URL="mongodb://db-mongo/wekan" -e ROOT_URL="http://wekan-web:8080" --network huntzou_website 0498
6. 启动nginx
docker run -d --restart=always --name nginx -v /etc/localtime:/etc/localtime --network huntzou_website -p 80:80 -p 8001:8001 -p 8002:8002 8325
其中 -v /etc/localtime:/etc/localtime
是将本机时区挂载到容器中,因为有些容器并不一定和你的服务器时间一样。
或者在容器构建之后使用命令 docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID:/etc/localtime
修改nginx配置
创建nginx配置文件 my_server_block.conf
server {
listen 0.0.0.0:80;
listen 0.0.0.0:8001;
server_name <your ip or domain>;
access_log /opt/bitnami/nginx/logs/huntzou_website.log;
error_log /opt/bitnami/nginx/logs/huntzou_website_error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://wp-web:80/;
proxy_redirect off;
}
}
server {
listen 0.0.0.0:8002;
server_name <your ip or domain>;
access_log /opt/bitnami/nginx/logs/huntzou_website.log;
error_log /opt/bitnami/nginx/logs/huntzou_website_error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://wekan-web:8080/;
proxy_redirect off;
}
}
将配置文件上传至nginx容器中
docker cp my_server_block.conf 4a8f:/opt/bitnami/nginx/conf/server_blocks/
重启nginx容器
docker restart 4a8f
添加域名解析
上述步骤均在只使用ip的情况下完成,配置完成后也只能使用ip进行访问。我现在拥有了一个已经备案的域名,并希望该网站都能通过域名来访问
注:WordPress4.90+版本后域名更换排常简单。在后台菜单“设置-常规”,把“WordPress地址(URL)和站点地址(URL)”更换成新域名地址就可以了。文章图片和特色图片都会自动更换成新域名链接。
可以在管理页面左边栏中的 “Tools-Site Health” 中看到wordpress版本

首先进入wordpress后台修改两个地址

修改完成后使用IP就不能登录后台了,原因见另一篇文章:关于wordpress中WordPress Address和Site Address的理解
修改nginx配置并重启nginx:
# 访问一级域名默认跳转到wordpress页面
server {
listen 80;
server_name woyou.cool;
rewrite ^/(.*) https://blog.woyou.cool/$1 permanent;
}
server {
listen 80;
server_name kanban.woyou.cool;
access_log /opt/bitnami/nginx/logs/huntzou_website.log;
error_log /opt/bitnami/nginx/logs/huntzou_website_error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://wekan-web:8080/;
proxy_redirect off;
}
}
server {
listen 80;
server_name blog.woyou.cool;
access_log /opt/bitnami/nginx/logs/huntzou_website.log;
error_log /opt/bitnami/nginx/logs/huntzou_website_error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://wp-web:80;
proxy_redirect off;
}
}
添加SSL证书
详见另一篇文章:Nginx反向代理wordpress开启HTTPS
其他
搭建私有音乐流媒体服务
Navidrome 是一个开源私有音乐流媒体软件,可以使用docker搭建
该播放器不支持页面上传音乐,故需要手动将音乐文件放在指定文件夹下
官网:https://www.navidrome.org/
docker镜像:https://hub.docker.com/r/deluan/navidrome
运行镜像:
docker run --restart=always --name navidrome -d --network huntzou_website -e ND_SCANSCHEDULE=1h -e ND_LOGLEVEL=error -e ND_UIWELCOMEMESSAGE="Welcome to HuntZou's private music lab" -e ND_SEARCHFULLSTRING=true -e ReverseProxyUserHeader=HTTP_X_REAL_IP d4a813d502ce
关于上述中环境变量配置说明见:https://www.navidrome.org/docs/usage/configuration-options/
由于我没有在容器中挂载宿主机磁盘,故若需要上传音乐则需要两步(也可以选择在运行时使用 -v music_folder:/music
进行挂载,则可以省略第2步)
- 先将歌曲传输到宿主机服务器上
- 再将宿主机上的歌曲复制到docker容器中
docker ps my_music.mp3 navidrome:/music
其他关于环境的配置同其他服务,在nginx中暴露出一个 music.woyou.cool
域名指向 navidrome:4533
即可通过域名访问
更新
2023/4/24
所有站点更新了ssl证书,重新创建了反向代理的nginx,使得其挂载了本地的网页目录、证书目录、配置文件,便于修改。并使用docker-compose进行创建
docker-compose.yml 文件内容:
networks:
huntzou_website:
external: true
services:
web:
image: nginx
container_name: nginx
networks:
- huntzou_website
restart: unless-stopped
volumes:
- /root/nginx/config/nginx.conf:/etc/nginx/nginx.conf:ro
- /root/nginx/certs:/certs
- /root/nginx/html:/etc/nginx/html:ro
ports:
- "80:80"
- "443:443"
注1:networks部分是必要的,因为要使用之前已经创建的网络必须提前申明(位置不一定要最上面,但一定要有),其中关键部分就是“external: true”
注2:不能使用 apt install docker-compose
安装的docker-compose,而必须使用官网上的步骤进行安装,否则网络这一块它是识别不出来的
注3:html目录挂载到容器的/etc/nginx/html目录上,这是因为如果你在nginx配置文件的root目录写html目录,默认指定的就是这个位置的html目录

关于证书部分:
申请好证书后,统一放在宿主机的 /root/nginx/certs
目录下,然后使用unzip解压即可
unzip woyou.cool_nginx.zip
# 会在当前目录下生成名为 woyou.cool_nginx 的文件夹,里面就是证书和密钥文件

因为这个目录已经挂载到了nginx容器的/certs目录下,并且在nginx.conf文件中都配置了相对于的路径,解压后就不用管了,nginx.conf 文件的一个server配置为:
events {} # 这个是必要的,否则会报错
http {
# nginx首页
server {
listen 443 ssl;
server_name woyou.cool www.woyou.cool;
ssl_certificate /certs/woyou.cool_nginx/woyou.cool_bundle.crt;
ssl_certificate_key /certs/woyou.cool_nginx/woyou.cool.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location = / {
root html;
index index.html;
}
error_page 404 = @blog;
location @blog {
rewrite ^/(.*) https://blog.woyou.cool permanent;
}
}
# wordpress
server {
listen 443 ssl;
server_name blog.woyou.cool;
#access_log /opt/bitnami/nginx/logs/huntzou_website.log;
#error_log /opt/bitnami/nginx/logs/huntzou_website_error.log;
#证书文件名称
ssl_certificate /certs/blog.woyou.cool_nginx/blog.woyou.cool_bundle.crt;
#私钥文件名称
ssl_certificate_key /certs/blog.woyou.cool_nginx/blog.woyou.cool.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header HOST $http_host;
proxy_set_header X-NginX-Proxy true;
# 这个一定要配置,告诉wordpress反向代理使用了https,不然会出很多问题
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://wp-web:80;
#proxy_pass http://frps:8082;
proxy_redirect off;
}
}
......
}
关于favicon.ico的制作,可以使用这个网站:https://www.favicon.cc/,生成的favicon.ico文件直接放在上述挂载的html文件夹下即可