diff --git a/docker-compose-v4.yml b/docker-compose-v4.yml index 0da0631..ea85469 100644 --- a/docker-compose-v4.yml +++ b/docker-compose-v4.yml @@ -7,18 +7,17 @@ services: driver: json-file options: max-size: "20m" + max-file: "3" environment: DB_TYPE: ${DB_TYPE:-sqlite} DB_PATH: /app/data/gost.db DATABASE_URL: ${DATABASE_URL:-} JWT_SECRET: ${JWT_SECRET} - LOG_DIR: /app/logs SERVER_ADDR: :6365 TZ: Asia/Shanghai ports: - "${BACKEND_PORT}:6365" volumes: - - backend_logs:/app/logs - sqlite_data:/app/data networks: - gost-network @@ -63,6 +62,7 @@ services: driver: json-file options: max-size: "20m" + max-file: "3" ports: - "${FRONTEND_PORT}:80" depends_on: @@ -79,9 +79,6 @@ volumes: postgres_data: name: postgres_data driver: local - backend_logs: - name: backend_logs - driver: local networks: diff --git a/docker-compose-v6.yml b/docker-compose-v6.yml index e8080ec..cb7ae47 100644 --- a/docker-compose-v6.yml +++ b/docker-compose-v6.yml @@ -7,18 +7,17 @@ services: driver: json-file options: max-size: "20m" + max-file: "3" environment: DB_TYPE: ${DB_TYPE:-sqlite} DB_PATH: /app/data/gost.db DATABASE_URL: ${DATABASE_URL:-} JWT_SECRET: ${JWT_SECRET} - LOG_DIR: /app/logs SERVER_ADDR: :6365 TZ: Asia/Shanghai ports: - "${BACKEND_PORT}:6365" volumes: - - backend_logs:/app/logs - sqlite_data:/app/data networks: - gost-network @@ -63,6 +62,7 @@ services: driver: json-file options: max-size: "20m" + max-file: "3" ports: - "${FRONTEND_PORT}:80" depends_on: @@ -79,9 +79,6 @@ volumes: postgres_data: name: postgres_data driver: local - backend_logs: - name: backend_logs - driver: local networks: diff --git a/go-backend/internal/http/handler/mutations.go b/go-backend/internal/http/handler/mutations.go index 78f7cd9..49cb324 100644 --- a/go-backend/internal/http/handler/mutations.go +++ b/go-backend/internal/http/handler/mutations.go @@ -688,6 +688,9 @@ func (h *Handler) tunnelUpdate(w http.ResponseWriter, r *http.Request) { return } runtimeState.TunnelID = id + + inIp := buildTunnelInIP(runtimeState.InNodes, runtimeState.Nodes) + var federationBindings []sqlite.FederationTunnelBinding var federationReleaseRefs []federationRuntimeReleaseRef if typeVal == 2 { @@ -700,7 +703,7 @@ func (h *Handler) tunnelUpdate(w http.ResponseWriter, r *http.Request) { applyTunnelPortsToRequest(req, runtimeState) _, err = tx.Exec(`UPDATE tunnel SET name=?, type=?, flow=?, traffic_ratio=?, status=?, in_ip=?, updated_time=? WHERE id=?`, - asString(req["name"]), typeVal, asInt64(req["flow"], 1), asFloat(req["trafficRatio"], 1.0), asInt(req["status"], 1), nullableText(asString(req["inIp"])), now, id) + asString(req["name"]), typeVal, asInt64(req["flow"], 1), asFloat(req["trafficRatio"], 1.0), asInt(req["status"], 1), nullableText(inIp), now, id) if err != nil { response.WriteJSON(w, response.Err(-2, err.Error())) return diff --git a/go-backend/internal/store/sqlite/repository.go b/go-backend/internal/store/sqlite/repository.go index 3a6232b..0ff75fe 100644 --- a/go-backend/internal/store/sqlite/repository.go +++ b/go-backend/internal/store/sqlite/repository.go @@ -400,7 +400,7 @@ func (r *Repository) GetUserPackageForwards(userID int64) ([]UserForwardDetail, } rows, err := r.db.Query(` - SELECT f.id, f.name, f.tunnel_id, t.name, f.remote_addr, f.in_flow, f.out_flow, f.status, f.created_time + SELECT f.id, f.name, f.tunnel_id, COALESCE(t.name, ''), f.remote_addr, f.in_flow, f.out_flow, f.status, f.created_time FROM forward f LEFT JOIN tunnel t ON t.id = f.tunnel_id WHERE f.user_id = ? @@ -719,7 +719,7 @@ func (r *Repository) ListForwards() ([]map[string]interface{}, error) { } rows, err := r.db.Query(` - SELECT f.id, f.user_id, f.user_name, f.name, f.tunnel_id, t.name, f.remote_addr, f.strategy, + SELECT f.id, f.user_id, f.user_name, f.name, f.tunnel_id, COALESCE(t.name, ''), f.remote_addr, f.strategy, f.in_flow, f.out_flow, f.created_time, f.status, f.inx FROM forward f LEFT JOIN tunnel t ON t.id = f.tunnel_id @@ -1297,11 +1297,32 @@ func bootstrapSchema(db *store.DB, schemaSQL, seedSQL string) error { return nil } +const currentSchemaVersion = 1 + +func getSchemaVersion(db *store.DB) int { + _, _ = db.Exec(`CREATE TABLE IF NOT EXISTS schema_version (version INTEGER NOT NULL DEFAULT 0)`) + var v int + if err := db.QueryRow(`SELECT version FROM schema_version LIMIT 1`).Scan(&v); err != nil { + _, _ = db.Exec(`INSERT INTO schema_version(version) VALUES(0)`) + return 0 + } + return v +} + +func setSchemaVersion(db *store.DB, v int) { + _, _ = db.Exec(`UPDATE schema_version SET version = ?`, v) +} + func migrateSchema(db *store.DB) error { if db == nil { return errors.New("nil db") } + ver := getSchemaVersion(db) + if ver >= currentSchemaVersion { + return nil + } + ensureColumn := func(table, col, typ string) { var dummy interface{} err := db.QueryRow(fmt.Sprintf("SELECT %s FROM %s LIMIT 1", col, table)).Scan(&dummy) @@ -1351,6 +1372,7 @@ func migrateSchema(db *store.DB) error { return err } } + setSchemaVersion(db, currentSchemaVersion) return nil }