自己搭建的ChatGPT国内镜像站
ChatGPT国内镜像站,国内使用ChatGPT中文版本
域名更改为
如果网站无法打开,使用下面的导航链接
欢迎体验,当前主流模型包括o1-mini模型都可免费体验,deepseek免费用:
支持
- 模拟浏览器登录访问原始chatgpt网站,ChatGPT Plus付费版本
- 支持最新的各种chatgpt模型及市面上的其它热门模型
- 支持你自己的chatgpt账号中的API key 调用访问
- 免费访问gpt-4等模型和部分画图模型
ChatGPT国内镜像站,国内使用ChatGPT中文版本
域名更改为
如果网站无法打开,使用下面的导航链接
欢迎体验,当前主流模型包括o1-mini模型都可免费体验,deepseek免费用:
支持
记录一次腾讯云镜像在本地恢复的过程
由于遇到一些限制原因导致出现了诸多错误,无法顺利恢复,不过最终经过多次尝试,终于恢复成功,特记录一下。
虽然无法访问服务器,但通过网页仍可以访问,但由于所有网络都断了,不可能下载大量数据了,想到了创建镜像然后导出到本地的操作
腾讯云创建镜像导出本地,需要先创建一个存储桶(第一次开通免费,个人50G,企业1T),并且流量是收费的,为了下载这个镜像不得不付钱搞定,整个流程到这还比较快。
镜像下载的为.vmdk
镜像,下载到本地后,导入virtualbox,开机启动,出现错误 warning: /dev/vda1 does not exist
虚拟机创建时,选择不添加虚拟硬盘,创建完成后在设置中(选择存储,在控制器那里添加硬盘)附加镜像即可
在vnc里用ls /dev
查看设备信息显示的结果中并不存在/dev/vda1
,存在/vda/sda1
如果/vda/sda1
也不存在,看看你的虚拟机是不是硬盘设置中位置没有放到 SATA端口0 的位置。
通过以下办法可以启动
进入VPS服务商提供的VNC后台界面,执行下面语句
1 | # mount /dev/sda1 /tmp |
当然,如果你更改虚拟机有时默认是正常的,那就最好不过了。原因就是虚拟机中的硬盘是sda1 但镜像中保存的是原始数据 vda1,启动时无法找到相应硬盘。
Ecs
键,进入启动界面e
键linux 16
开头的行,找到 ro
改为 rw init=sysroot/bin/sh
Ctrl+x
执行chroot /sysroot
passwd
根据提示输入两次新密码 touch /.autorelabel
更新系统信息exit
退出 reboot
命令重启我主要为了恢复这个数据库,但在本地启动后无法成功启动应用,只能新建一个同样版本的Centos7,然后把数据库data目录复制过去,启动成功。
流程如下:
下载镜像 https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
新建虚拟机 配置相关参数,启动安装
安装过程中都保持默认即可,但网络这块点击选择下启用,第一次安装后,无法连网导致我重新安装一次
安装中设置用户名和密码
进入系统后操作
修改更新源 vi /etc/yum.repos.d/CentOS-Base.repo
1 | [extras] |
1 | yum update |
网站使用cloudflare时,无法得到真正的ip,如果知道域名的ip,一般使用下面的命令探测
1 | curl -v -H "Host: leadscloud.xyz" 167.172.xx.xx |
通过-L选项进行重定向 默认情况下CURL不会发送HTTP Location headers(重定向).当一个被请求页面移动到另一个站点时,会发送一个HTTP Loaction header作为请求,然后将请求重定向到新的地址上。
1 | # 让curl使用地址重定向,此时会查询google.com.hk站点 |
curl http://www.centos.org
- -o:将文件保存为命令行中指定的文件名的文件中
- -O:使用URL中默认的文件名保存文件到本地
# 将文件下载到本地并命名为mygettext.html
curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
# 将文件保存到本地并命名为gettext.html
curl -O http://www.gnu.org/software/gettext/manual/gettext.html
同样可以使用转向字符”>”对输出进行转向输出
curl -O URL1 -O URL2
若同时从同一站点下载多个文件时,curl会尝试重用链接(connection)。
通过使用-C选项可对大文件使用断点续传功能,如:
# 当文件在下载完成之前结束该进程
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
############## 20.1%
# 通过添加-C选项继续对该文件进行下载,已经下载过的文件不会被重新下载
curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html
############### 21.1%
1 | curl -u username:password URL |
通过 -T 选项可将指定的本地文件上传到FTP服务器上
# 将myfile.txt文件上传到服务器
curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com
# 同时上传多个文件
curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com
# 从标准输入获取内容保存到服务器指定的文件中
curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt
x 选项可以为CURL添加代理功能
# 指定代理主机和端口
curl -x proxysever.test.com:3128 http://google.co.in
# 将网站的cookies信息保存到sugarcookies文件中
curl -D sugarcookies http://localhost/sugarcrm/index.php
# 使用上次保存的cookie信息
curl -b sugarcookies http://localhost/sugarcrm/index.php
-A
参数指定客户端的用户代理标头,即User-Agent
。curl的默认用户代理字符串是curl/[version]
。
1 | $ curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com |
也可以通过-H
参数直接指定标头,更改User-Agent
。
curl -H 'User-Agent: php/1.0' https://google.com
默认curl使用GET方式请求数据,这种方式下直接通过URL传递数据
可以通过 –data/-d 方式指定使用POST方式传递数据
# GET
curl -u username https://api.github.com/user?access_token=XXXXXXXXXX
# POST
curl -u username --data "param1=value1¶m2=value" https://api.github.com
# 也可以指定一个文件,将该文件中的内容当作数据传递给服务器端
curl --data @filename https://github.api.com/authorizations
注:默认情况下,通过POST方式传递过去的数据中若有特殊字符,首先需要将特殊字符转义在传递给服务器端,如value值中包含有空格,则需要先将空格转换成%20,如:
curl -d "value%201" http://hostname.com
在新版本的CURL中,提供了新的选项 –data-urlencode,通过该选项提供的参数会自动转义特殊字符。
curl --data-urlencode "value 1" http://hostname.com
除了使用GET和POST协议外,还可以通过 -X 选项指定其它协议,如:
curl -I -X DELETE https://api.github.cim
上传文件
curl --form "fileupload=@filename.txt" http://hostname/resource
通过使用 -v 和 -trace获取更多的链接信息
-i
参数:可以显示http response 的头信息,连同网页代码一起。-I
参数:则只显示http response 的头信息, 不显示网页源码。 同 –headcentos7服务器升级node 20后 n latest
,出现以下问题
1 | node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node) |
明显是GLIBC_2.27支持问题
1 | wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz |
在这之前一般都要升级gcc和make,否则在configure时会出现下面错误
1 | configure: error: |
1 | # 升级GCC(默认为4 升级为8) |
如果提示 These critical programs are missing or too old: bison
升级或安装下bison
1 | yum install -y bison |
1 | cd /root/glibc-2.28/build |
1 | /usr/bin/ld: cannot find -lnss_test2 |
请修改scripts/test-installation.pl
,新增如下内容 128行左右
1 | && $name ne "nss_test1" |
改为
1 | && $name ne "nss_test1" && $name ne "nss_test2" |
如果报错
1 | /lib/../lib64/libnss_nis.so: undefined reference to `_nsl_default_nss@GLIBC_PRIVATE' |
请加–enable-obsolete-nsl
1 | ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --enable-obsolete-nsl |
如果还是出现
1 | node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node) |
通过查看strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
发现少了GLIBCXX_3.4.20,解决方法是升级libstdc++.
1 | yum provides libstdc++.so.6 |
升级导致的语言包问题,中文有乱码
特别是crontab -e
编辑时里面的中文有些正常,有些乱码
1 | -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) |
可以通过如下解决
1 | cd /root/glibc-2.28/build |
这样每次登录ssh就不会提示 LC_ALL: cannot change locale
了。
参考链接:
1 | wget https://www.inet.no/dante/files/dante-1.4.3.tar.gz |
vi /etc/sockd.conf
1 | internal: 0.0.0.0 port=1080 |
127.0.0.1 替换成 x.x.x.x/8 即可。
配置说明: https://www.inet.no/dante/doc/1.4.x/config/server.html
1 | adduser --no-create-home --shell /usr/sbin/nologin socks # 添加一个本地用户,不创建默认目录和登录Shell |
直接以daemon模式运行
1 | sockd -D |
使用内置的-V命令测试sockd.conf文件是否正确,若正确则无任何输出
1 | sockd -V |
测试能否正常使用
1 | curl --proxy 'socks5://127.0.0.1:1080' 'https://api.ipify.org/' |
可以使用 netstat -lntp
看启动状态
1 | tcp 0 0 0.0.0.0:1080 0.0.0.0:* LISTEN 16769/sockd |
vi /etc/rc.local
1 | /usr/local/sbin/sockd -f /etc/sockd.conf & |
killall sockd
Google的API一般是下面这种使用方法,使用的是oauth2client
1 | from oauth2client.service_account import ServiceAccountCredentials |
众所周知的原因,在国内你这样使用,必须得用代理,使用requests包非常方便,但是如果是上面的代码,使用代理有点小麻烦
你需要在代码前面加上
1 | import socket |
比较麻烦。
可以用requests代替上面的操作,一般如下
1 | http = httplib2.Http(proxy_info=httplib2.ProxyInfo(httplib2.socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 1080)) |
参考代码: https://github.com/googleapis/oauth2client/blob/master/oauth2client/transport.py
在 LNMP 安装目录下找到 lnmp.conf 这个文件,编辑这个文件,在 Nginx_Modules_Options 里加上 --with-http_realip_module
,修改的命令如下:
1 | Nginx_Modules_Options='--with-http_realip_module' |
保存后执行 ./upgrade.sh nginx 来升级下 NGINX 就可以了。升级需要输入新的 NGINX 版本号,如果不想改动版本,直接输入原来的版本号即可。
修改配置文件 /usr/local/nginx/conf/nginx.conf
创建文件 touch /usr/local/nginx/conf/cloudflare_ip.conf
然后,在 server {}
里面加上下面这一行:
1 | include cloudflare_ip.conf; |
在 /root 目录下创建下面文件:
1 | update_cloudflare_ip.sh |
1 | #!/bin/bash |
执行一次脚本:/bin/bash /root/update_cloudflare_ip.sh
保存之后,配置 crontab 每周更新一次 Cloudflare 的 IP 地址(crontab -e):
1 | 0 5 * * 1 /bin/bash /root/update_cloudflare_ip.sh |
还是修改 /usr/local/nginx/conf/nginx.conf
这个文件,在 http {}
中间加入下面几行:
1 | # 这是网上大部分的教程这样写的,不对,正确的请看下面的追加 |
注意: 如果include cloudflare_ip.conf;
放在 http {}
中,$remote_addr会替换为真实的ip地址,不需要上面的修改了。
然后在网站记录的日志定义使用main这个日志格式
2023-6-5修改:
上面的代码是有问题的,网上大部分的教程也是如此,这用特地说明下
$HTTP_CF_CONNECTING_IP
是使用cloudflare后,cf传给服务器的用户真实ip, 为了防止有人伪造headers,使用了 set_real_ip_from
, 这样可以保证只能cloudflare的ip地址传过来的 headders["CF-Connecting-IP"]
我们才相信。
所以通常情况下,你不需要安装--with-http_realip_module
这个组件,大部分情况下直接相信cloudflare即可。
上面的map应该修改为
1 | map $http_cf_connecting_ip $clientRealIp { |
上面那个匹配ip的正则是错误的,比如这个ipv6地址就无法匹配 2001:41d0:303:363::1
, 这是ipv6的一种缩写形式,所以网上大部分的教程是错误的。
1 | access_log /home/wwwlogs/abc.com.log main; |
最后重载下nginx
1 | /etc/init.d/nginx reload |
这时就全部搞定了。
开了 CDN 之后使用 iptables 是没法封禁真实 IP 地址的。
Wordpress 使用 Eelementor 插件时,编辑内容,会保存到wp_postmeta中,对于中文一些替换插件 Better Search Replace
等没有问题,但如果是中文,你会发现使用替换工具替换后,内容不变。
这主要是因为中文内容保存为json格式后,会编码为unicode格式,所以无法替换,可以使用下面方法替换。
1 | select count(*) from wp_postmeta where meta_value like '%\\\\u539f\\\\u59cb\\\\u5b57%\\\\u7b26'; |
SELECT语句中四个反斜杠(\)代表一个.
在mysql的like语法中,like后边的字符串除了会在语法解析时转义一次外,还会在正则匹配时进行第二次的转义。因此如果期望最终匹配到””,就要反转义两次,也就是由”"到”"再到””。
如果是普通的精确查询(=),则无需第二次的正则转义,和INSERT语句一样。
比如 原始字符
替换为 替换字符
1 | UPDATE wp_postmeta |
可以使用js的
escape
来把中文转为unicode编码
1 | UPDATE wp_options SET option_value = replace(option_value, 'http://www.yoursitename.com', 'http://localhost') WHERE option_name = 'home' OR option_name = 'siteurl'; |
在操作前,无论使用插件还是sql语句,都要先备份数据库
1 | sudo mysqldump -u root wordpress > wordpress.sql |
1 | sudo tar -cpvzf wordpress.tar.gz /home/wwwroot/wordpress/ |
上面的命令包含5个参数,分别为:
执行上述命令后,/home/wwwroot/wordpress/
文件夹下的所有文件都会被归档和压缩。
安装centos7时,有一个提示,是否加密磁盘,选择此选项后,每次启动系统都会要求你输入密码,这样可以保证磁盘如果没有密码,放到其它电脑上也无法使用。对数据会更加安全。
但每次手动输入密码还是比较麻烦,最好是把密钥放到U盘里,插上后就可以自动解锁,不需要输入人工输入密码。
我搜索了下,网上关于此的教程都无法完美解决,没有非常完善的文档,下面两个教程是最靠谱的,我也是根据这些教程,在虚拟机上测试成功后才找到具体的原因。
https://forums.centos.org/viewtopic.php?t=53452
https://community.spiceworks.com/how_to/168683-cenos-7-encrypt-my-data-and-use-usb-key-for-unlock
以下为完整的操作步骤:
使用fat格式即可,这样在windows电脑上也能使用
先通过lsblk blkid命令,查看系统上的硬盘情况。
1 | [root@localhost ~]# lsblk |
1 | [root@localhost ~]# blkid |
上面/dev/sda3
为加密的磁盘,/dev/sdb1
为U盘(FAT文件系统)。记下他们的uuid,分别为535d89c0-9b67-4138-a0f3-0879ef2a6cc6
和 A06A-C2D3
先挂载U盘,并创建相应的文件
1 | mount /dev/sdb1 /media |
测试下添加的密钥文件有没有成功:
1 | [root@localhost ~]# cryptsetup luksOpen -v --key-file /media/cryptboot/boot.key --test-passphrase /dev/sda3 |
出现上面命令就是成功了。
1 | cp /etc/default/grub /etc/default/grub.original |
即是在 /etc/default/grub
中GRUB_CMDLINE_LINUX这一行添加 rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3
下面是修改后的
1 | GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.luks.uuid=luks-535d89c0-9b67-4138-a0f3-0879ef2a6cc6 rd.luks.key=cryptboot/boot.key:UUID=A06A-C2D3 rd.lvm.lv=centos/swap rhgb quiet" |
/etc/dracut.conf
1 | echo 'add_drivers+="vfat nls_cp437 nls_iso8859-1 ext4"' >> /etc/dracut.conf |
1 | grub2-mkconfig -o /boot/grub2/grub.cfg |
之前一直不成功的原因是,我的电脑 是uefi启动方式+GPT磁盘,所以应该使用 grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
。这点很重要。
之后重启电脑就可以了。
1 | lsof | grep deleted |
第2列是进程id,第4列是文件描述符
1 | ls -l /proc/进程id/fd/文件描述符 |
1 | cp /proc/进程id/fd/文件描述符 Newfilename |
使用上面的命令恢复文件后,发现mysql数据库只恢复了.ibd
文件,.frm
文件无法使用lsof恢复
使用其它的表结构,复制到数据库目录,或者重新创建一个表drop table tbl_name
。
1 | ALTER TABLE tbl_name DISCARD TABLESPACE; |
这个命令会删除相应的ibd文件。
从备份文件中复制ibd文件到数据库目录,然后执行下面的命令。
1 | ALTER TABLE tbl_name IMPORT TABLESPACE; |