Files
2026-07-13 12:32:21 +08:00

144 lines
4.2 KiB
Lua

local migrations_utils = require "kong.cmd.utils.migrations"
local prefix_handler = require "kong.cmd.utils.prefix_handler"
local nginx_signals = require "kong.cmd.utils.nginx_signals"
local conf_loader = require "kong.conf_loader"
local kong_global = require "kong.global"
local kill = require "kong.cmd.utils.kill"
local log = require "kong.cmd.utils.log"
local DB = require "kong.db"
local lfs = require "lfs"
local function is_socket(path)
return lfs.attributes(path, "mode") == "socket"
end
local function cleanup_dangling_unix_sockets(socket_path)
local found = {}
for child in lfs.dir(socket_path) do
local path = socket_path .. "/" .. child
if is_socket(path) then
table.insert(found, path)
end
end
if #found < 1 then
return
end
log.warn("Found dangling unix sockets in the prefix directory (%q) while " ..
"preparing to start Kong. This may be a sign that Kong was " ..
"previously shut down uncleanly or is in an unknown state and " ..
"could require further investigation.",
socket_path)
log.warn("Attempting to remove dangling sockets before starting Kong...")
for _, sock in ipairs(found) do
if is_socket(sock) then
log.warn("removing unix socket: %s", sock)
assert(os.remove(sock))
end
end
end
local function execute(args)
args.db_timeout = args.db_timeout and (args.db_timeout * 1000) or nil
args.lock_timeout = args.lock_timeout
local conf = assert(conf_loader(args.conf, {
prefix = args.prefix
}, { starting = true }))
conf.pg_timeout = args.db_timeout or conf.pg_timeout -- connect + send + read
assert(not kill.is_running(conf.nginx_pid),
"Kong is already running in " .. conf.prefix)
assert(prefix_handler.prepare_prefix(conf, args.nginx_conf, nil, nil,
args.nginx_conf_flags))
cleanup_dangling_unix_sockets(conf.socket_path)
_G.kong = kong_global.new()
kong_global.init_pdk(_G.kong, conf)
local db = assert(DB.new(conf))
assert(db:init_connector())
local schema_state = assert(db:schema_state())
local err
xpcall(function()
if not schema_state:is_up_to_date() and args.run_migrations then
migrations_utils.up(schema_state, db, {
ttl = args.lock_timeout,
})
schema_state = assert(db:schema_state())
end
migrations_utils.check_state(schema_state)
if schema_state.missing_migrations or schema_state.pending_migrations then
local r = ""
if schema_state.missing_migrations then
log.info("Database is missing some migrations:\n%s",
tostring(schema_state.missing_migrations))
r = "\n\n"
end
if schema_state.pending_migrations then
log.info("%sDatabase has pending migrations:\n%s",
r, tostring(schema_state.pending_migrations))
end
end
assert(nginx_signals.start(conf))
log("Kong started")
end, function(e)
err = e -- cannot throw from this function
end)
if err then
log.verbose("could not start Kong, stopping services")
pcall(nginx_signals.stop, conf)
log.verbose("stopped services")
error(err) -- report to main error handler
end
end
local lapp = [[
Usage: kong start [OPTIONS]
Start Kong (Nginx and other configured services) in the configured
prefix directory.
Options:
-c,--conf (optional string) Configuration file.
-p,--prefix (optional string) Override prefix directory.
--nginx-conf (optional string) Custom Nginx configuration template.
--run-migrations (optional boolean) Run migrations before starting.
--db-timeout (optional number) Timeout, in seconds, for all database
operations.
--lock-timeout (default 60) When --run-migrations is enabled, timeout,
in seconds, for nodes waiting on the
leader node to finish running migrations.
--nginx-conf-flags (optional string) Flags that can be used to control
how Nginx configuration templates are rendered
]]
return {
lapp = lapp,
execute = execute
}