mirror of https://github.com/usual2970/certimate
				
				
				
			Merge branch 'main' into feat/notify
						commit
						2a1af1e7cd
					
				| 
						 | 
				
			
			@ -2,6 +2,7 @@ package deployer
 | 
			
		|||
 | 
			
		||||
import (
 | 
			
		||||
	"certimate/internal/domain"
 | 
			
		||||
	"certimate/internal/utils/rand"
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"errors"
 | 
			
		||||
| 
						 | 
				
			
			@ -82,7 +83,7 @@ func (t *tencentCdn) uploadCert() (string, error) {
 | 
			
		|||
 | 
			
		||||
	request.CertificatePublicKey = common.StringPtr(t.option.Certificate.Certificate)
 | 
			
		||||
	request.CertificatePrivateKey = common.StringPtr(t.option.Certificate.PrivateKey)
 | 
			
		||||
	request.Alias = common.StringPtr(t.option.Domain)
 | 
			
		||||
	request.Alias = common.StringPtr(t.option.Domain + "_" + rand.RandStr(6))
 | 
			
		||||
	request.Repeatable = common.BoolPtr(true)
 | 
			
		||||
 | 
			
		||||
	response, err := client.UploadCertificate(request)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,7 +62,10 @@ func deploy(ctx context.Context, record *models.Record) error {
 | 
			
		|||
		history.record(checkPhase, "证书在有效期内且已部署,跳过", &RecordInfo{
 | 
			
		||||
			Info: []string{fmt.Sprintf("证书有效期至 %s", expiredAt.Format("2006-01-02"))},
 | 
			
		||||
		}, true)
 | 
			
		||||
		return err
 | 
			
		||||
 | 
			
		||||
		// 跳过的情况也算成功
 | 
			
		||||
		history.setWholeSuccess(true)
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	history.record(checkPhase, "检查通过", nil, true)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -119,5 +122,7 @@ func deploy(ctx context.Context, record *models.Record) error {
 | 
			
		|||
	app.GetApp().Logger().Info("部署成功")
 | 
			
		||||
	history.record(deployPhase, "部署成功", nil, true)
 | 
			
		||||
 | 
			
		||||
	history.setWholeSuccess(true)
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,7 @@ type history struct {
 | 
			
		|||
	PhaseSuccess bool                    `json:"phaseSuccess"`
 | 
			
		||||
	DeployedAt   string                  `json:"deployedAt"`
 | 
			
		||||
	Cert         *applicant.Certificate  `json:"cert"`
 | 
			
		||||
	WholeSuccess bool                    `json:"wholeSuccess"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func NewHistory(record *models.Record) *history {
 | 
			
		||||
| 
						 | 
				
			
			@ -68,6 +69,10 @@ func (a *history) setCert(cert *applicant.Certificate) {
 | 
			
		|||
	a.Cert = cert
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *history) setWholeSuccess(success bool) {
 | 
			
		||||
	a.WholeSuccess = success
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a *history) commit() error {
 | 
			
		||||
	collection, err := app.GetApp().Dao().FindCollectionByNameOrId("deployments")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -81,6 +86,7 @@ func (a *history) commit() error {
 | 
			
		|||
	record.Set("log", a.Log)
 | 
			
		||||
	record.Set("phase", string(a.Phase))
 | 
			
		||||
	record.Set("phaseSuccess", a.PhaseSuccess)
 | 
			
		||||
	record.Set("wholeSuccess", a.WholeSuccess)
 | 
			
		||||
 | 
			
		||||
	if err := app.GetApp().Dao().SaveRecord(record); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,704 @@
 | 
			
		|||
package migrations
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
 | 
			
		||||
	"github.com/pocketbase/dbx"
 | 
			
		||||
	"github.com/pocketbase/pocketbase/daos"
 | 
			
		||||
	m "github.com/pocketbase/pocketbase/migrations"
 | 
			
		||||
	"github.com/pocketbase/pocketbase/models"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	m.Register(func(db dbx.Builder) error {
 | 
			
		||||
		jsonData := `[
 | 
			
		||||
			{
 | 
			
		||||
				"id": "z3p974ainxjqlvs",
 | 
			
		||||
				"created": "2024-07-29 10:02:48.334Z",
 | 
			
		||||
				"updated": "2024-09-19 00:27:35.936Z",
 | 
			
		||||
				"name": "domains",
 | 
			
		||||
				"type": "base",
 | 
			
		||||
				"system": false,
 | 
			
		||||
				"schema": [
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "iuaerpl2",
 | 
			
		||||
						"name": "domain",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "ukkhuw85",
 | 
			
		||||
						"name": "email",
 | 
			
		||||
						"type": "email",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"exceptDomains": null,
 | 
			
		||||
							"onlyDomains": null
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "v98eebqq",
 | 
			
		||||
						"name": "crontab",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "alc8e9ow",
 | 
			
		||||
						"name": "access",
 | 
			
		||||
						"type": "relation",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"collectionId": "4yzbv8urny5ja1e",
 | 
			
		||||
							"cascadeDelete": false,
 | 
			
		||||
							"minSelect": null,
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"displayFields": null
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "topsc9bj",
 | 
			
		||||
						"name": "certUrl",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "vixgq072",
 | 
			
		||||
						"name": "certStableUrl",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "g3a3sza5",
 | 
			
		||||
						"name": "privateKey",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "gr6iouny",
 | 
			
		||||
						"name": "certificate",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "tk6vnrmn",
 | 
			
		||||
						"name": "issuerCertificate",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "sjo6ibse",
 | 
			
		||||
						"name": "csr",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "x03n1bkj",
 | 
			
		||||
						"name": "expiredAt",
 | 
			
		||||
						"type": "date",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": "",
 | 
			
		||||
							"max": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "srybpixz",
 | 
			
		||||
						"name": "targetType",
 | 
			
		||||
						"type": "select",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"values": [
 | 
			
		||||
								"aliyun-oss",
 | 
			
		||||
								"aliyun-cdn",
 | 
			
		||||
								"aliyun-dcdn",
 | 
			
		||||
								"ssh",
 | 
			
		||||
								"webhook",
 | 
			
		||||
								"tencent-cdn",
 | 
			
		||||
								"qiniu-cdn"
 | 
			
		||||
							]
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "xy7yk0mb",
 | 
			
		||||
						"name": "targetAccess",
 | 
			
		||||
						"type": "relation",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"collectionId": "4yzbv8urny5ja1e",
 | 
			
		||||
							"cascadeDelete": false,
 | 
			
		||||
							"minSelect": null,
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"displayFields": null
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "6jqeyggw",
 | 
			
		||||
						"name": "enabled",
 | 
			
		||||
						"type": "bool",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "hdsjcchf",
 | 
			
		||||
						"name": "deployed",
 | 
			
		||||
						"type": "bool",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "aiya3rev",
 | 
			
		||||
						"name": "rightnow",
 | 
			
		||||
						"type": "bool",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "ixznmhzc",
 | 
			
		||||
						"name": "lastDeployedAt",
 | 
			
		||||
						"type": "date",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": "",
 | 
			
		||||
							"max": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "ghtlkn5j",
 | 
			
		||||
						"name": "lastDeployment",
 | 
			
		||||
						"type": "relation",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"collectionId": "0a1o4e6sstp694f",
 | 
			
		||||
							"cascadeDelete": false,
 | 
			
		||||
							"minSelect": null,
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"displayFields": null
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "zfnyj9he",
 | 
			
		||||
						"name": "variables",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "1bspzuku",
 | 
			
		||||
						"name": "group",
 | 
			
		||||
						"type": "relation",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"collectionId": "teolp9pl72dxlxq",
 | 
			
		||||
							"cascadeDelete": false,
 | 
			
		||||
							"minSelect": null,
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"displayFields": null
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "g65gfh7a",
 | 
			
		||||
						"name": "nameservers",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				],
 | 
			
		||||
				"indexes": [
 | 
			
		||||
					"CREATE UNIQUE INDEX ` + "`" + `idx_4ABO6EQ` + "`" + ` ON ` + "`" + `domains` + "`" + ` (` + "`" + `domain` + "`" + `)"
 | 
			
		||||
				],
 | 
			
		||||
				"listRule": null,
 | 
			
		||||
				"viewRule": null,
 | 
			
		||||
				"createRule": null,
 | 
			
		||||
				"updateRule": null,
 | 
			
		||||
				"deleteRule": null,
 | 
			
		||||
				"options": {}
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"id": "4yzbv8urny5ja1e",
 | 
			
		||||
				"created": "2024-07-29 10:04:39.685Z",
 | 
			
		||||
				"updated": "2024-09-19 00:27:35.936Z",
 | 
			
		||||
				"name": "access",
 | 
			
		||||
				"type": "base",
 | 
			
		||||
				"system": false,
 | 
			
		||||
				"schema": [
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "geeur58v",
 | 
			
		||||
						"name": "name",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "iql7jpwx",
 | 
			
		||||
						"name": "config",
 | 
			
		||||
						"type": "json",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"maxSize": 2000000
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "hwy7m03o",
 | 
			
		||||
						"name": "configType",
 | 
			
		||||
						"type": "select",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"values": [
 | 
			
		||||
								"aliyun",
 | 
			
		||||
								"tencent",
 | 
			
		||||
								"ssh",
 | 
			
		||||
								"webhook",
 | 
			
		||||
								"cloudflare",
 | 
			
		||||
								"qiniu",
 | 
			
		||||
								"namesilo",
 | 
			
		||||
								"godaddy"
 | 
			
		||||
							]
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "lr33hiwg",
 | 
			
		||||
						"name": "deleted",
 | 
			
		||||
						"type": "date",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": "",
 | 
			
		||||
							"max": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "hsxcnlvd",
 | 
			
		||||
						"name": "usage",
 | 
			
		||||
						"type": "select",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"values": [
 | 
			
		||||
								"apply",
 | 
			
		||||
								"deploy",
 | 
			
		||||
								"all"
 | 
			
		||||
							]
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "c8egzzwj",
 | 
			
		||||
						"name": "group",
 | 
			
		||||
						"type": "relation",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"collectionId": "teolp9pl72dxlxq",
 | 
			
		||||
							"cascadeDelete": false,
 | 
			
		||||
							"minSelect": null,
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"displayFields": null
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				],
 | 
			
		||||
				"indexes": [
 | 
			
		||||
					"CREATE UNIQUE INDEX ` + "`" + `idx_wkoST0j` + "`" + ` ON ` + "`" + `access` + "`" + ` (` + "`" + `name` + "`" + `)"
 | 
			
		||||
				],
 | 
			
		||||
				"listRule": null,
 | 
			
		||||
				"viewRule": null,
 | 
			
		||||
				"createRule": null,
 | 
			
		||||
				"updateRule": null,
 | 
			
		||||
				"deleteRule": null,
 | 
			
		||||
				"options": {}
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"id": "0a1o4e6sstp694f",
 | 
			
		||||
				"created": "2024-07-30 06:30:27.801Z",
 | 
			
		||||
				"updated": "2024-09-22 11:46:35.167Z",
 | 
			
		||||
				"name": "deployments",
 | 
			
		||||
				"type": "base",
 | 
			
		||||
				"system": false,
 | 
			
		||||
				"schema": [
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "farvlzk7",
 | 
			
		||||
						"name": "domain",
 | 
			
		||||
						"type": "relation",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"collectionId": "z3p974ainxjqlvs",
 | 
			
		||||
							"cascadeDelete": false,
 | 
			
		||||
							"minSelect": null,
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"displayFields": null
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "jx5f69i3",
 | 
			
		||||
						"name": "log",
 | 
			
		||||
						"type": "json",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"maxSize": 2000000
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "qbxdtg9q",
 | 
			
		||||
						"name": "phase",
 | 
			
		||||
						"type": "select",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"values": [
 | 
			
		||||
								"check",
 | 
			
		||||
								"apply",
 | 
			
		||||
								"deploy"
 | 
			
		||||
							]
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "rglrp1hz",
 | 
			
		||||
						"name": "phaseSuccess",
 | 
			
		||||
						"type": "bool",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "lt1g1blu",
 | 
			
		||||
						"name": "deployedAt",
 | 
			
		||||
						"type": "date",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": "",
 | 
			
		||||
							"max": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "wledpzgb",
 | 
			
		||||
						"name": "wholeSuccess",
 | 
			
		||||
						"type": "bool",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {}
 | 
			
		||||
					}
 | 
			
		||||
				],
 | 
			
		||||
				"indexes": [],
 | 
			
		||||
				"listRule": null,
 | 
			
		||||
				"viewRule": null,
 | 
			
		||||
				"createRule": null,
 | 
			
		||||
				"updateRule": null,
 | 
			
		||||
				"deleteRule": null,
 | 
			
		||||
				"options": {}
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"id": "_pb_users_auth_",
 | 
			
		||||
				"created": "2024-09-12 13:09:54.234Z",
 | 
			
		||||
				"updated": "2024-09-19 00:27:35.937Z",
 | 
			
		||||
				"name": "users",
 | 
			
		||||
				"type": "auth",
 | 
			
		||||
				"system": false,
 | 
			
		||||
				"schema": [
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "users_name",
 | 
			
		||||
						"name": "name",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "users_avatar",
 | 
			
		||||
						"name": "avatar",
 | 
			
		||||
						"type": "file",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"mimeTypes": [
 | 
			
		||||
								"image/jpeg",
 | 
			
		||||
								"image/png",
 | 
			
		||||
								"image/svg+xml",
 | 
			
		||||
								"image/gif",
 | 
			
		||||
								"image/webp"
 | 
			
		||||
							],
 | 
			
		||||
							"thumbs": null,
 | 
			
		||||
							"maxSelect": 1,
 | 
			
		||||
							"maxSize": 5242880,
 | 
			
		||||
							"protected": false
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				],
 | 
			
		||||
				"indexes": [],
 | 
			
		||||
				"listRule": "id = @request.auth.id",
 | 
			
		||||
				"viewRule": "id = @request.auth.id",
 | 
			
		||||
				"createRule": "",
 | 
			
		||||
				"updateRule": "id = @request.auth.id",
 | 
			
		||||
				"deleteRule": "id = @request.auth.id",
 | 
			
		||||
				"options": {
 | 
			
		||||
					"allowEmailAuth": true,
 | 
			
		||||
					"allowOAuth2Auth": true,
 | 
			
		||||
					"allowUsernameAuth": true,
 | 
			
		||||
					"exceptEmailDomains": null,
 | 
			
		||||
					"manageRule": null,
 | 
			
		||||
					"minPasswordLength": 8,
 | 
			
		||||
					"onlyEmailDomains": null,
 | 
			
		||||
					"onlyVerified": false,
 | 
			
		||||
					"requireEmail": false
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"id": "dy6ccjb60spfy6p",
 | 
			
		||||
				"created": "2024-09-12 23:12:21.677Z",
 | 
			
		||||
				"updated": "2024-09-19 00:27:35.937Z",
 | 
			
		||||
				"name": "settings",
 | 
			
		||||
				"type": "base",
 | 
			
		||||
				"system": false,
 | 
			
		||||
				"schema": [
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "1tcmdsdf",
 | 
			
		||||
						"name": "name",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "f9wyhypi",
 | 
			
		||||
						"name": "content",
 | 
			
		||||
						"type": "json",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"maxSize": 2000000
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				],
 | 
			
		||||
				"indexes": [
 | 
			
		||||
					"CREATE UNIQUE INDEX ` + "`" + `idx_RO7X9Vw` + "`" + ` ON ` + "`" + `settings` + "`" + ` (` + "`" + `name` + "`" + `)"
 | 
			
		||||
				],
 | 
			
		||||
				"listRule": null,
 | 
			
		||||
				"viewRule": null,
 | 
			
		||||
				"createRule": null,
 | 
			
		||||
				"updateRule": null,
 | 
			
		||||
				"deleteRule": null,
 | 
			
		||||
				"options": {}
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				"id": "teolp9pl72dxlxq",
 | 
			
		||||
				"created": "2024-09-13 12:51:05.611Z",
 | 
			
		||||
				"updated": "2024-09-19 00:27:35.937Z",
 | 
			
		||||
				"name": "access_groups",
 | 
			
		||||
				"type": "base",
 | 
			
		||||
				"system": false,
 | 
			
		||||
				"schema": [
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "7sajiv6i",
 | 
			
		||||
						"name": "name",
 | 
			
		||||
						"type": "text",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"min": null,
 | 
			
		||||
							"max": null,
 | 
			
		||||
							"pattern": ""
 | 
			
		||||
						}
 | 
			
		||||
					},
 | 
			
		||||
					{
 | 
			
		||||
						"system": false,
 | 
			
		||||
						"id": "xp8admif",
 | 
			
		||||
						"name": "access",
 | 
			
		||||
						"type": "relation",
 | 
			
		||||
						"required": false,
 | 
			
		||||
						"presentable": false,
 | 
			
		||||
						"unique": false,
 | 
			
		||||
						"options": {
 | 
			
		||||
							"collectionId": "4yzbv8urny5ja1e",
 | 
			
		||||
							"cascadeDelete": false,
 | 
			
		||||
							"minSelect": null,
 | 
			
		||||
							"maxSelect": null,
 | 
			
		||||
							"displayFields": null
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				],
 | 
			
		||||
				"indexes": [
 | 
			
		||||
					"CREATE UNIQUE INDEX ` + "`" + `idx_RgRXp0R` + "`" + ` ON ` + "`" + `access_groups` + "`" + ` (` + "`" + `name` + "`" + `)"
 | 
			
		||||
				],
 | 
			
		||||
				"listRule": null,
 | 
			
		||||
				"viewRule": null,
 | 
			
		||||
				"createRule": null,
 | 
			
		||||
				"updateRule": null,
 | 
			
		||||
				"deleteRule": null,
 | 
			
		||||
				"options": {}
 | 
			
		||||
			}
 | 
			
		||||
		]`
 | 
			
		||||
 | 
			
		||||
		collections := []*models.Collection{}
 | 
			
		||||
		if err := json.Unmarshal([]byte(jsonData), &collections); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return daos.New(db).ImportCollections(collections, true, nil)
 | 
			
		||||
	}, func(db dbx.Builder) error {
 | 
			
		||||
		return nil
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
				
			
			@ -5,7 +5,7 @@
 | 
			
		|||
    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
    <title>Certimate - Your Trusted SSL Automation Partner</title>
 | 
			
		||||
    <script type="module" crossorigin src="/assets/index-BLKGMHXS.js"></script>
 | 
			
		||||
    <script type="module" crossorigin src="/assets/index-Cum7econ.js"></script>
 | 
			
		||||
    <link rel="stylesheet" crossorigin href="/assets/index-BmYeXvQX.css">
 | 
			
		||||
  </head>
 | 
			
		||||
  <body class="bg-background">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,13 +56,22 @@ const AccessSSHForm = ({
 | 
			
		|||
 | 
			
		||||
  const originGroup = data ? (data.group ? data.group : "") : "";
 | 
			
		||||
 | 
			
		||||
  const domainReg = /^(?:\*\.)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/;
 | 
			
		||||
  const ipReg =
 | 
			
		||||
    /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
 | 
			
		||||
 | 
			
		||||
  const formSchema = z.object({
 | 
			
		||||
    id: z.string().optional(),
 | 
			
		||||
    name: z.string().min(1).max(64),
 | 
			
		||||
    configType: accessFormType,
 | 
			
		||||
    host: z.string().ip({
 | 
			
		||||
      message: "请输入合法的IP地址",
 | 
			
		||||
    }),
 | 
			
		||||
    host: z.string().refine(
 | 
			
		||||
      (str) => {
 | 
			
		||||
        return ipReg.test(str) || domainReg.test(str);
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        message: "请输入正确的域名或IP",
 | 
			
		||||
      }
 | 
			
		||||
    ),
 | 
			
		||||
    group: z.string().optional(),
 | 
			
		||||
    port: z.string().min(1).max(5),
 | 
			
		||||
    username: z.string().min(1).max(64),
 | 
			
		||||
| 
						 | 
				
			
			@ -316,7 +325,7 @@ const AccessSSHForm = ({
 | 
			
		|||
                name="host"
 | 
			
		||||
                render={({ field }) => (
 | 
			
		||||
                  <FormItem className="grow">
 | 
			
		||||
                    <FormLabel>服务器IP</FormLabel>
 | 
			
		||||
                    <FormLabel>服务器HOST</FormLabel>
 | 
			
		||||
                    <FormControl>
 | 
			
		||||
                      <Input placeholder="请输入Host" {...field} />
 | 
			
		||||
                    </FormControl>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ const DeployState = ({ deployment }: DeployStateProps) => {
 | 
			
		|||
 | 
			
		||||
  return (
 | 
			
		||||
    <>
 | 
			
		||||
      {deployment.phase === "deploy" && deployment.phaseSuccess ? (
 | 
			
		||||
      {(deployment.phase === "deploy" && deployment.phaseSuccess) || deployment.wholeSuccess ? (
 | 
			
		||||
        <CircleCheck size={16} className="text-green-700" />
 | 
			
		||||
      ) : (
 | 
			
		||||
        <>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ export type Deployment = {
 | 
			
		|||
  };
 | 
			
		||||
  phase: Pahse;
 | 
			
		||||
  phaseSuccess: boolean;
 | 
			
		||||
  wholeSuccess: boolean;
 | 
			
		||||
  deployedAt: string;
 | 
			
		||||
  created: string;
 | 
			
		||||
  updated: string;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
export const version = "Certimate v0.1.9";
 | 
			
		||||
export const version = "Certimate v0.1.10";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue