将BBS网站Discourse从海外主机完美迁移到国内云服务器, 国内主机同时运行WordPress和Discourse服务...

本文主要是介绍将BBS网站Discourse从海外主机完美迁移到国内云服务器, 国内主机同时运行WordPress和Discourse服务...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我前两天把 Discourse这个论坛服务部署到了一个轻量云服务器上, 详情 给热心老哥搭个窝,2021年30分钟用Discourse搭建新一代BBS论坛站全攻略

海外的云服务在国内访问很慢, 于是我开始了将Discourse往国内云迁移的探索.

遇到的问题

  • Discourse依赖包极多, 官方推荐Docker部署, 但启动Docker的容器默认绑定了80 和 443 端口
  • Discourse 强依赖Github, 无论是安装还是构建都需要Github, 而国内云访问Github极其不稳定, 经常失败
  • Discourse官方没有给出数据迁移的详细教程, 2021年的Discourse中文网完全打不开, 要完成完美的迁移过程, 全靠自己猜

解决Docker部署默认绑定80 和 443 端口的问题

containers/app.yml 中添加以下几行参数可以解决端口映射的问题

expose:- "20080:80"   # http- "20443:443" # https

解决Discourse安装和构建期间, 访问Github失败的问题

首先按照 为国内WordPress主机配置代理,解决从插件商店下载插件失败,无法验证Google官方插件Site Kit的问题 中提供的步骤, 在国内云服务器端开启魔法上网服务

containers/app.yml 中添加以下几行参数可以解决Discourse安装和构建期间, 访问Github失败的问题

image.png
env:http_proxy: http://127.0.0.1:7890https_proxy: http://127.0.0.1:7890

另外docker 拉取基础镜像也需要走海外代理, 需要在 ~/.docker/config.json 中添加走代理服务的设置

.docker/config.json
{"proxies":{"default":{"httpProxy": "http://172.17.0.1:7890","httpsProxy": "http://172.17.0.1:7890","noProxy": "localhost,127.0.0.1"}}
}

另外, 在国内执行 ./launcher rebuild app 前, 最好在当前终端先执行以下语句

export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890

(以上均为国内云服务器, 无法魔法上网, 导致我被坑的血泪史...)

解决Discourse从海外迁移到国内的问题

首先进入已经可以提供服务的服务器, 进入默认项目目录

/var/discourse

运行 ./launcher enter app 进入容器

成功进入容器

运行discourse 可以看的命令提示

查看命令提示

输入 discourse backup, 回车获取备份包

获取备份包

备份包的位置为

/var/www/discourse/public/backups/default/discourse-2021-06-21-100849-v20210617202227.tar.gz

通过scp 将 /var/www/discourse/public/backups/default/discourse-2021-06-21-100849-v20210617202227.tar.gz 传送到国内新云服务器的/opt/ 目录

scp /var/www/discourse/public/backups/default/discourse-2021-06-21-100849-v20210617202227.tar.gz root@国内云服务器IP:/opt/

(scp这个命令真的超实用, 在容器内部也能用!建议仔细记一下scp的使用方法)

传输成功

按 Control+D 退出容器, 回到海外宿主机

退出容器

将app.yml的内容改好,我这里放一个实例文件

## this is the all-in-one, standalone Discourse Docker container template
##
## After making changes to this file, you MUST rebuild
## /var/discourse/launcher rebuild app
##
## BE *VERY* CAREFUL WHEN EDITING!
## YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
## visit http://www.yamllint.com/ to validate this file as neededtemplates:- "templates/postgres.template.yml"- "templates/redis.template.yml"- "templates/web.template.yml"- "templates/web.ratelimited.template.yml"
## Uncomment these two lines if you wish to add Lets Encrypt (https)- "templates/web.ssl.template.yml"- "templates/web.letsencrypt.ssl.template.yml"## which TCP/IP ports should this container expose?
## If you want Discourse to share a port with another webserver like Apache or nginx,
## see https://meta.discourse.org/t/17247 for details
expose:- "20080:80"   # http- "20443:443" # https- "587:587" # SMTP TSLparams:db_default_text_search_config: "pg_catalog.english"## Set db_shared_buffers to a max of 25% of the total memory.## will be set automatically by bootstrap based on detected RAM, or you can overridedb_shared_buffers: "128MB"## can improve sorting performance, but adds memory usage per-connection#db_work_mem: "40MB"## Which Git revision should this container use? (default: tests-passed)#version: tests-passedenv:LC_ALL: en_US.UTF-8LANG: en_US.UTF-8LANGUAGE: en_US.UTF-8# DISCOURSE_DEFAULT_LOCALE: en## How many concurrent web requests are supported? Depends on memory and CPU cores.## will be set automatically by bootstrap based on detected CPUs, or you can overrideUNICORN_WORKERS: 2## TODO: The domain name this Discourse instance will respond to## Required. Discourse will not work with a bare IP number.DISCOURSE_HOSTNAME: bbs.v2fy.com## Uncomment if you want the container to be started with the same## hostname (-h option) as specified above (default "$hostname-$config")#DOCKER_USE_HOSTNAME: true## TODO: List of comma delimited emails that will be made admin and developer## on initial signup example 'user1@example.com,user2@example.com'DISCOURSE_DEVELOPER_EMAILS: 'zhaoolee@gmail.com'## TODO: The SMTP mail server used to validate new accounts and send notifications# SMTP ADDRESS, username, and password are required# WARNING the char '#' in SMTP password can cause problems!DISCOURSE_SMTP_ADDRESS: smtp.exmail.qq.comDISCOURSE_SMTP_PORT: 587DISCOURSE_SMTP_USER_NAME: zhaoolee@v2fy.comDISCOURSE_SMTP_PASSWORD: "**********"#DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)DISCOURSE_SMTP_DOMAIN: v2fy.comDISCOURSE_NOTIFICATION_EMAIL: zhaoolee@v2fy.com## If you added the Lets Encrypt template, uncomment below to get a free SSL certificateLETSENCRYPT_ACCOUNT_EMAIL: zhaoolee@v2fy.com## The http or https CDN address for this Discourse instance (configured to pull)## see https://meta.discourse.org/t/14857 for details#DISCOURSE_CDN_URL: https://discourse-cdn.example.com## The maxmind geolocation IP address key for IP address lookup## see https://meta.discourse.org/t/-/137387/23 for details#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456DISCOURSE_SMTP_AUTHENTICATION: login## The Docker container is stateless; all data is stored in /shared
volumes:- volume:host: /var/discourse/shared/standaloneguest: /shared- volume:host: /var/discourse/shared/standalone/log/var-logguest: /var/log## Plugins go here
## see https://meta.discourse.org/t/19157 for details
hooks:after_code:- exec:cd: $home/pluginscmd:- git clone https://github.com/discourse/docker_manager.git## Any custom commands to run after building
run:- exec: echo "Beginning of custom commands"## If you want to set the 'From' email address for your first registration, uncomment and change:## After getting the first signup email, re-comment the line. It only needs to run once.- exec: rails r "SiteSetting.notification_email='zhaoolee@v2fy.com'"- exec: echo "End of custom commands"

将海外主机内的app.yml也传送到国内新云服务器的/opt/ 目录

scp /var/discourse/containers/app.yml  root@120.76.136.220:/opt/
发送成功

至此!在海外主机的操作完成!

登陆国内云服务器

ssh 用户名@国内云服务器ip

国内云服务器设置好魔法上网, 仔细阅读本文前方解决Discourse安装和构建期间, 访问Github失败的问题相关内容。

如果国内云主机没有安装最新版docker, 请通过以下命令安装(以CentOS7为例)

yum install -y yum-utils
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repoyum install docker-ce docker-ce-cli containerd.io -y
# 启动docker
systemctl start docker

为了便于区分,我把国内云服务器的discourse目录放到 /usr/share/nginx/bbs.v2fy.com 目录下

cd  /usr/share/nginx/bbs.v2fy.com
git clone https://github.com/discourse/discourse_docker.git  /usr/share/nginx/bbs.v2fy.com
下载成功

将/opt/app.yml放入 /usr/share/nginx/bbs.v2fy.com/containers

cp /opt/app.yml    /usr/share/nginx/bbs.v2fy.com/containers/

运行discourse服务

cd /usr/share/nginx/bbs.v2fy.com/
./launcher rebuild app

查看新容器的id

docker ps
查看容器id

将备份包拷贝到新容器中

docker cp /opt/discourse-2021-06-21-100849-v20210617202227.tar.gz   983dca831620:/var/www/discourse/public/backups/default/discourse-2021-06-21-100849-v20210617202227.tar.gz

进入新容器,恢复数据

cd /usr/share/nginx/bbs.v2fy.com/
./launcher enter app
discourse restore discourse-2021-06-21-100849-v20210617202227.tar.gz
恢复数据成功

退出容器, rebuild容器

按 Control+D 退出容器

cd /usr/share/nginx/bbs.v2fy.com/
./launcher rebuild app

现在, 我们已经将discourse的80端口映射到 20080端口, 443端口映射到20443端口

我们需要对国内云服务器的Nginx进行配置, 将请求域名bbs.v2fy.com 80端口的服务, 指向20080端口,请求域名bbs.v2fy.com 的443端口的服务, 指向20443端口

有趣的是,

安装模块

yum update -y
yum install nginx-mod-stream -y

以CentOS7 为例,安装 nginx-mod-stream 完成后, 可以在

/usr/lib64/nginx/modules/ngx_stream_module.so

找到

最终的 /etc/nginx/nginx.conf 配置为

#user  nginx;
worker_processes  1;
load_module /usr/lib64/nginx/modules/ngx_stream_module.so;error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;stream {map $ssl_preread_server_name $backend_name {bbs.v2fy.com  bbs;v2fy.com web;fangyuanxiaozhan web;default web;}upstream bbs {server 127.0.0.1:20443;}upstream web {server 127.0.0.1:30443;}server {listen       443 reuseport;listen  [::]:443 reuseport;proxy_pass   $backend_name;ssl_preread  on;}
}events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;charset utf-8,gbk;client_max_body_size 20m;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;gzip  on;server {listen 80;server_name bbs.v2fy.com;location / {proxy_pass http://127.0.0.1:20080;proxy_set_header Host $proxy_host; # 修改转发请求头,让8080端口的应用可以受到真实的请求proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}include /etc/nginx/conf.d/*.conf;
}

这个配置文件很奇妙, 有一些冗余信息, 比如其中的

upstream web {server 127.0.0.1:30443;}

是留给WordPress关联的php服务用的, 处理v2fy.com和fangyuanxiaozhan.com这两个WordPress站,原理是在30443端口开启了监听, 用于处理v2fy.com和fangyuanxiaozhan.com的请求, 这里放一个v2fy.com的配置 /etc/nginx/conf.d/v2fy.com.conf

server {listen 30080;server_name v2fy.com  www.v2fy.com;charset  utf-8;root /usr/share/nginx/v2fy.com;index index.php index.html index.htm;rewrite ^(.*)$ https://$host$1 permanent;location / {try_files $uri $uri/ /index.php$query_string =404;}error_page 404 /404.html;error_page 500 502 503 504 /50x.html;location = /50x.htm {root /usr/share/nginx/v2fy.com;}location ~ \.php$ {try_files $uri =404;fastcgi_pass unix:/var/run/php73-fpm/php73-fpm.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}server {listen 30443 ssl;   #SSL协议访问端口号为443。此处如未添加ssl,可能会造成Nginx无法启动。server_name v2fy.com  www.v2fy.com;  #将localhost修改为您证书绑定的域名,例如:www.example.com。charset  utf-8;root /usr/share/nginx/v2fy.com;index index.php index.html index.htm;ssl_certificate /etc/nginx/cert/v2fy.com.pem;   #将domain name.pem替换成您证书的文件名。ssl_certificate_key /etc/nginx/cert/v2fy.com.key;   #将domain name.key替换成您证书的密钥文件名。ssl_session_timeout 5m;ssl_ciphers  *****;  #使用此加密套件。ssl_protocols TLSv1 TLSv1.1 TLSv1.2;   #使用该协议进行配置。ssl_prefer_server_ciphers on;gzip on;gzip_min_length 1k;gzip_buffers 4 16k;#gzip_http_version 1.0;gzip_comp_level 8;gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;gzip_vary off;gzip_disable "MSIE [1-6]\.";location = /favicon.ico {log_not_found off;access_log off;}location = /robots.txt {allow all;log_not_found off;access_log off;}location / {# This is cool because no php is touched for static content.# include the "?$args" part so non-default permalinks doesn't break when using query stringtry_files $uri $uri/ /index.php?$args;}location ~ \.php$ {try_files $uri =404;fastcgi_pass unix:/var/run/php73-fpm/php73-fpm.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {expires max;log_not_found off;}location ~* .(json)$ {add_header  Content-Type 'application/json;charset=utf-8';}
}

最终进入域名服务商后台, 将bbs.v2fy.com的解析换到国内云服务器ip, 齐活!

完美迁移完成

小结

这篇文章前后耗费我一周时间, 查了大量的资料, 国内的网络条件也真是不友好, 没有魔法上网工具, 请勿尝试本文的操作, 你会秃头的... 如果你的云服务器内存不足2GB, 请做好主机被卡死的心理准备(我4GB主机, 都被卡掉重启一次)

希望这篇文章能帮到, 同样对Discourse感兴趣的你~

本文永久更新地址(欢迎来读留言,写评论):

https://www.v2fy.com/p/2021-06-21-discourse-1624274883000


http://www.taodudu.cc/news/show-8332740.html

相关文章:

  • 腾讯云被当做肉鸡了
  • 微服务通信 (Microservices communication)
  • 腾讯云轻量应用服务器使用WordPress应用镜像搭建网站应用
  • 探索云原生技术之基石-Docker容器入门篇(4)
  • kubernetes 1.26发布,这十项新特性值得关注!
  • 阿里服务器搭建Magento电子商务网站(CentOS7)
  • 云原生 | 从零开始,Minio 高性能分布式对象存储快速入手指南
  • Python - 装机系列12 设置云主机root用户的ssh免密登录
  • 设计HTML5图像和多媒体
  • Pyqt制作B站视频下载软件
  • 电源功耗压力测试软件,多少瓦的电源适合RTX 3070?实测数据告诉你
  • .NET MVC 限制上传文件大小、Url长度等
  • 数据结构--链队列的实现
  • 数据结构循环队列的基本操作C++/C
  • 利用SD存储介质扩展MAXQ20000的非易失性数据存储空间
  • Sarsa模型和Q_learning模型简记
  • Python实现的基于数据包队列管理内容
  • 四六级最新翻译
  • 什么是外观检测
  • 车载终端液晶模组最终外观检测设备
  • 计算机视觉检测外观,机器视觉外观缺陷检测的未来发展趋势是怎样的
  • 机器视觉外观检测系统的应用范围有哪些?
  • 图像处理解决流程--外观检测
  • 力的坐标转换
  • D3.js - 固定某些节点坐标的力导向布局
  • java绘制坐标轴_java二维坐标动态曲线图绘制
  • CVPR2021| 继SE,CBAM后的一种新的注意力机制:坐标注意力机制(Coordinate Attention)
  • CA-用于轻型网络的坐标注意力 | CVPR2021
  • 深度学习炼丹涨点神器之 Coordinate Attention (坐标注意力机制)
  • 如何在Java中实现发送手机短信验证码(不需要公司认证和网站链接审核也可以实现)
  • 这篇关于将BBS网站Discourse从海外主机完美迁移到国内云服务器, 国内主机同时运行WordPress和Discourse服务...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/402612

    相关文章

    服务器集群同步时间手记

    1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

    如何用Docker运行Django项目

    本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

    浅谈主机加固,六种有效的主机加固方法

    在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

    【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

    伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

    客户案例:安全海外中继助力知名家电企业化解海外通邮困境

    1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

    【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

    随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

    Linux服务器Java启动脚本

    Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

    跨系统环境下LabVIEW程序稳定运行

    在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

    实例:如何统计当前主机的连接状态和连接数

    统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

    速盾高防cdn是怎么解决网站攻击的?

    速盾高防CDN是一种基于云计算技术的网络安全解决方案,可以有效地保护网站免受各种网络攻击的威胁。它通过在全球多个节点部署服务器,将网站内容缓存到这些服务器上,并通过智能路由技术将用户的请求引导到最近的服务器上,以提供更快的访问速度和更好的网络性能。 速盾高防CDN主要采用以下几种方式来解决网站攻击: 分布式拒绝服务攻击(DDoS)防护:DDoS攻击是一种常见的网络攻击手段,攻击者通过向目标网