宝塔面板子目录绑定伪静态无效原因及修复方案

环境描述:
面板版本:Linux 免费版 7.4.2 (至7.4.3版依然存在)
系统版本:CentOS 8.1.1911(Py3.7.8)
浏览器版本:Chrome 84.0.4147.105 64 位

问题描述:
子目录绑定伪静态无效,原因:网站管理中,子目录绑定设置伪静态文件引用地址错误。

复现步骤:
1、添加网站域名:test.com;
2、子目录绑定:域名bbs.test.com,目录:bbs;
3、查看配置文件:网站子目录绑定的伪静态引用地址为网站主目录伪静态文件(/www/server/panel/vhost/rewrite/test.com.conf),而不是子目录伪静态文件(/www/server/panel/vhost/rewrite/test.com_bbs.conf)。

手动修复:
修改配置文件,在子目录配置中修改引用文件地址加上(_目录名)即可。

源码修复(仅限于此版本面板):
修改文件:/www/server/panel/class/panelSite.py:2223

BINDING-%s-END”’ % (domain,port,listen_ipv6,domain,webdir,version,self.setupPath,siteInfo[‘name’],public.GetConfigValue(‘logs_path’)+’/’+siteInfo[‘name’],public.GetConfigValue(‘logs_path’)+’/’+siteInfo[‘name’],domain)

为:

BINDING-%s-END”’ % (domain,port,listen_ipv6,domain,webdir,version,self.setupPath,siteInfo[‘name’]+’_’+dirName,public.GetConfigValue(‘logs_path’)+’/’+siteInfo[‘name’],public.GetConfigValue(‘logs_path’)+’/’+siteInfo[‘name’],domain)

重启面板。

我又回来了…

这次是为了什么而回?其实我也不知道。

年复一年,很多事情也是在循环中往复。没有什么特别的理由,如同突然想吃牛腩一样,来就来了。至于说,这次什么时候会走,到时候再说吧。

步入中年(划掉),迁就和妥协已成为常态,路还很长,一眼无尽。

群晖数据恢复解决方案

一直在用黑群晖(DSM5.2),前两天发现无法连接DSM了,就此开始了折腾之路。

一、无法开机:检查发现问题是主板电池没电了,更换电池后正常开机。

二、无法连接:使用群晖助手查看,提示“设置数据损毁”,建议执行重新安装操作。考虑到群晖数据保存方式,应该是可以挽回数据的。

三、导出群晖数据。

官方建议使用Ubuntu来进行数据还原操作。简化步骤如下:

1、安装Ubuntu。

2、安装DSM硬盘。

3、打开终端Terminal。

4、安装支持。

sudo -i
apt-get install mdadm
apt-get install lvm2
mdadm -Asf && vgchange -ay

这样就可以读取并拷贝DSM硬盘的数据了。

在以上过程种,第四步可能会出现以下问题。

1、Sub-process /usr/bin/dpkg returned an error code (1)

在安装lvm时可能会出现这个问题,解决方案如下:

cd /var/lib/dpkg
sudo mv info info.bak
sudo mkdir info
sudo apt-get update
sudo apt-get -f install
sudo apt-get install lvm2
sudo cp info/* info.bak/
sudo rm -r info
sudo mv info.bak info

2、/run/lvm/lvmetad.socket: connect failed

在执行mdadm -Asf && vgchange -ay时,后面的命令会出现这个问题(建议单独执行两条命令),解决:修改“/etc/lvm/lvm.conf”中的”use_lvmetad = 1“为”use_lvmetad = 0“,OK。

关于Go与GORM最近遇到的坑

其实老生常谈了,通过Struct映射数据库与JSON的时候,datetime类型会有各种异常,解决如下:

// Import package
import (
	"database/sql/driver"
	"fmt"
	"strconv"
	"time"
)

// 定义一个JSONDate类型
type JSONDate struct {
	time.Time
}

// 定义JSON构建与解析函数
func (t JSONDate) MarshalJSON() ([]byte, error) {
	formatted := fmt.Sprintf("\"%s\"", t.Format("2006-01-02"))
	return []byte(formatted), nil
}

func (t *JSONDate) UnmarshalJSON(data []byte) error {
	uq, _ := strconv.Unquote(string(data))
	value, err := time.ParseInLocation("2006-01-02", uq, time.Local)
	if err == nil {
		*t = JSONDate{Time: value}
		return nil
	}
	return err
}

// 定义数据库支持函数
func (t JSONDate) Value() (driver.Value, error) {
	var zeroTime time.Time
	if t.Time.UnixNano() == zeroTime.UnixNano() {
		return nil, nil
	}
	return t.Time, nil
}

func (t *JSONDate) Scan(v interface{}) error {
	value, ok := v.(time.Time)
	if ok {
		*t = JSONDate{Time: value}
		return nil
	}
	return fmt.Errorf("can not convert %v to timestamp", v)
}

// 定义Model
type User struct {
	Date   JSONDate        `json:"date"`
}

还遇到一个问题,关于货币类型的数据,在数据库中一般是以decimal类型存储,有时也会乘以100或者10000以integer存储。而在gorm中,因为float的长度和精度问题,不能满足需求,经过各种弯路,找到一个相对靠谱的方法:

import "github.com/shopspring/decimal"

type Bill struct {
	Amount decimal.Decimal `gorm:"type:decimal(10,2)" json:"amount,string"`
}