mirror of
https://github.com/Sagit-chu/flvx.git
synced 2026-10-08 18:56:37 +08:00
Merge pull request #100 from Sagit-chu/opencode/gentle-comet
fix(tunnel): auto-update entry node IP on every tunnel update
This commit is contained in:
@@ -7,18 +7,17 @@ services:
|
|||||||
driver: json-file
|
driver: json-file
|
||||||
options:
|
options:
|
||||||
max-size: "20m"
|
max-size: "20m"
|
||||||
|
max-file: "3"
|
||||||
environment:
|
environment:
|
||||||
DB_TYPE: ${DB_TYPE:-sqlite}
|
DB_TYPE: ${DB_TYPE:-sqlite}
|
||||||
DB_PATH: /app/data/gost.db
|
DB_PATH: /app/data/gost.db
|
||||||
DATABASE_URL: ${DATABASE_URL:-}
|
DATABASE_URL: ${DATABASE_URL:-}
|
||||||
JWT_SECRET: ${JWT_SECRET}
|
JWT_SECRET: ${JWT_SECRET}
|
||||||
LOG_DIR: /app/logs
|
|
||||||
SERVER_ADDR: :6365
|
SERVER_ADDR: :6365
|
||||||
TZ: Asia/Shanghai
|
TZ: Asia/Shanghai
|
||||||
ports:
|
ports:
|
||||||
- "${BACKEND_PORT}:6365"
|
- "${BACKEND_PORT}:6365"
|
||||||
volumes:
|
volumes:
|
||||||
- backend_logs:/app/logs
|
|
||||||
- sqlite_data:/app/data
|
- sqlite_data:/app/data
|
||||||
networks:
|
networks:
|
||||||
- gost-network
|
- gost-network
|
||||||
@@ -63,6 +62,7 @@ services:
|
|||||||
driver: json-file
|
driver: json-file
|
||||||
options:
|
options:
|
||||||
max-size: "20m"
|
max-size: "20m"
|
||||||
|
max-file: "3"
|
||||||
ports:
|
ports:
|
||||||
- "${FRONTEND_PORT}:80"
|
- "${FRONTEND_PORT}:80"
|
||||||
depends_on:
|
depends_on:
|
||||||
@@ -79,9 +79,6 @@ volumes:
|
|||||||
postgres_data:
|
postgres_data:
|
||||||
name: postgres_data
|
name: postgres_data
|
||||||
driver: local
|
driver: local
|
||||||
backend_logs:
|
|
||||||
name: backend_logs
|
|
||||||
driver: local
|
|
||||||
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -7,18 +7,17 @@ services:
|
|||||||
driver: json-file
|
driver: json-file
|
||||||
options:
|
options:
|
||||||
max-size: "20m"
|
max-size: "20m"
|
||||||
|
max-file: "3"
|
||||||
environment:
|
environment:
|
||||||
DB_TYPE: ${DB_TYPE:-sqlite}
|
DB_TYPE: ${DB_TYPE:-sqlite}
|
||||||
DB_PATH: /app/data/gost.db
|
DB_PATH: /app/data/gost.db
|
||||||
DATABASE_URL: ${DATABASE_URL:-}
|
DATABASE_URL: ${DATABASE_URL:-}
|
||||||
JWT_SECRET: ${JWT_SECRET}
|
JWT_SECRET: ${JWT_SECRET}
|
||||||
LOG_DIR: /app/logs
|
|
||||||
SERVER_ADDR: :6365
|
SERVER_ADDR: :6365
|
||||||
TZ: Asia/Shanghai
|
TZ: Asia/Shanghai
|
||||||
ports:
|
ports:
|
||||||
- "${BACKEND_PORT}:6365"
|
- "${BACKEND_PORT}:6365"
|
||||||
volumes:
|
volumes:
|
||||||
- backend_logs:/app/logs
|
|
||||||
- sqlite_data:/app/data
|
- sqlite_data:/app/data
|
||||||
networks:
|
networks:
|
||||||
- gost-network
|
- gost-network
|
||||||
@@ -63,6 +62,7 @@ services:
|
|||||||
driver: json-file
|
driver: json-file
|
||||||
options:
|
options:
|
||||||
max-size: "20m"
|
max-size: "20m"
|
||||||
|
max-file: "3"
|
||||||
ports:
|
ports:
|
||||||
- "${FRONTEND_PORT}:80"
|
- "${FRONTEND_PORT}:80"
|
||||||
depends_on:
|
depends_on:
|
||||||
@@ -79,9 +79,6 @@ volumes:
|
|||||||
postgres_data:
|
postgres_data:
|
||||||
name: postgres_data
|
name: postgres_data
|
||||||
driver: local
|
driver: local
|
||||||
backend_logs:
|
|
||||||
name: backend_logs
|
|
||||||
driver: local
|
|
||||||
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -688,6 +688,9 @@ func (h *Handler) tunnelUpdate(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
runtimeState.TunnelID = id
|
runtimeState.TunnelID = id
|
||||||
|
|
||||||
|
inIp := buildTunnelInIP(runtimeState.InNodes, runtimeState.Nodes)
|
||||||
|
|
||||||
var federationBindings []sqlite.FederationTunnelBinding
|
var federationBindings []sqlite.FederationTunnelBinding
|
||||||
var federationReleaseRefs []federationRuntimeReleaseRef
|
var federationReleaseRefs []federationRuntimeReleaseRef
|
||||||
if typeVal == 2 {
|
if typeVal == 2 {
|
||||||
@@ -700,7 +703,7 @@ func (h *Handler) tunnelUpdate(w http.ResponseWriter, r *http.Request) {
|
|||||||
applyTunnelPortsToRequest(req, runtimeState)
|
applyTunnelPortsToRequest(req, runtimeState)
|
||||||
|
|
||||||
_, err = tx.Exec(`UPDATE tunnel SET name=?, type=?, flow=?, traffic_ratio=?, status=?, in_ip=?, updated_time=? WHERE id=?`,
|
_, 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 {
|
if err != nil {
|
||||||
response.WriteJSON(w, response.Err(-2, err.Error()))
|
response.WriteJSON(w, response.Err(-2, err.Error()))
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -400,7 +400,7 @@ func (r *Repository) GetUserPackageForwards(userID int64) ([]UserForwardDetail,
|
|||||||
}
|
}
|
||||||
|
|
||||||
rows, err := r.db.Query(`
|
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
|
FROM forward f
|
||||||
LEFT JOIN tunnel t ON t.id = f.tunnel_id
|
LEFT JOIN tunnel t ON t.id = f.tunnel_id
|
||||||
WHERE f.user_id = ?
|
WHERE f.user_id = ?
|
||||||
@@ -719,7 +719,7 @@ func (r *Repository) ListForwards() ([]map[string]interface{}, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rows, err := r.db.Query(`
|
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
|
f.in_flow, f.out_flow, f.created_time, f.status, f.inx
|
||||||
FROM forward f
|
FROM forward f
|
||||||
LEFT JOIN tunnel t ON t.id = f.tunnel_id
|
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
|
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 {
|
func migrateSchema(db *store.DB) error {
|
||||||
if db == nil {
|
if db == nil {
|
||||||
return errors.New("nil db")
|
return errors.New("nil db")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ver := getSchemaVersion(db)
|
||||||
|
if ver >= currentSchemaVersion {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
ensureColumn := func(table, col, typ string) {
|
ensureColumn := func(table, col, typ string) {
|
||||||
var dummy interface{}
|
var dummy interface{}
|
||||||
err := db.QueryRow(fmt.Sprintf("SELECT %s FROM %s LIMIT 1", col, table)).Scan(&dummy)
|
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
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
setSchemaVersion(db, currentSchemaVersion)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user