Discourse技术细节
源站
目前该站点运行在一台线路优化过的香港云服务器上:
sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers
Discourse对邮箱的依赖度挺高的,在这里我使用的是Resend提供的邮箱服务,再使用Cloudflare的邮箱路由对相应的邮箱进行转发。
由于该服务器我们希望部署其他服务,故我们使用 Unix Socket
将容器内的Nginx转发到宿主机内,详细教程可参考官网论坛教程:
Run other websites on the same machine as Discourse
反向代理
一般情况
为了保护原站,我们采用了其他线路优化的服务器进行反向代理:
- 在目标服务器上配置Nginx:
sudo apt-get update
sudo apt-get install nginx
- 创建站点配置文件:
创建一个新的Nginx配置文件,/etc/nginx/sites-available/discourse-proxy
sudo nano /etc/nginx/sites-available/discourse-proxy
文件中写入一下文件:(该文件已强制SSL,测试默认站点为 proxy.aicnal.tech
)
server {
listen 80;
server_name proxy.aicnal.tech;
# Redirect all HTTP requests to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name proxy.aicnal.tech;
location / {
proxy_pass https://discourse.aicnal.tech;
proxy_set_header Host $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;
}
# SSL configuration
ssl_certificate /etc/letsencrypt/live/proxy.aicnal.tech/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/proxy.aicnal.tech/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
- 启用站点配置:
创建符号链接以启用站点:
sudo ln -s /etc/nginx/sites-available/discourse-proxy /etc/nginx/sites-enabled/
- 获取SSL证书:
sudo apt-get install certbot python3-certbot-nginx
然后:
certbot --nginx
按照指引输入域名和邮箱,最后申请完成之后:
sudo systemctl restart nginx
- 访问反代后的网站:
比如说我反代后的网站就是:https://proxy.aicnal.tech
不过我建议你将 http
和 https
都测试一下,看一看强制 https
有没有成功
遭到攻击
对于反代服务器,我们可能会尝试部署**雷池**来进行初步防护,但难免会出现被DDOS或者CC打穿的现象,这时我们准备开启防火墙,关闭80和443等其他端口。
为了维护站点的正常运行,我们会尝试使用Cloudflare Tunnel的方式维护站点的正常运行:
由于Cloudflare的业务变迁,之前的Argo Tunnel被迁移到了Zero Trust中,我们原本还是准备通过 Unix
嵌套字实现Tunnel,可能是Cloudflare自身的限制(?)
所以最后我们采用了 HTTPS
的方式创建隧道,使用云服务器厂商提供的云防火墙来进行防御(因为开启本地 ufw
防火墙的话,https
的 443
端口也会被阻塞,从而无法使用