-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Web application deployment manager, focusing on Haskell web frameworks -- -- Deployment system for web applications, originally intended for -- hosting Yesod applications. Keter does the following actions for your -- application: . * Binds to the main port (usually port 80) and reverse -- proxies requests to your application based on virtual hostnames. * -- Provides SSL support if requested. * Automatically launches -- applications, monitors processes, and relaunches any processes which -- die. * Provides graceful redeployment support, by launching a second -- copy of your application, performing a health check, and then -- switching reverse proxying to the new process. . Keter provides many -- more advanced features and extension points. It allows configuration -- of static hosts, redirect rules, management of PostgreSQL databases, -- and more. It supports a simple bundle format for applications which -- allows for easy management of your web apps. @package keter @version 2.1.2 module Keter.Conduit.Process.Unix -- | Represents the child process which handles process cleanup. -- -- Since 0.2.1 data ProcessTracker -- | Fork off the child cleanup process. -- -- This will ideally only be run once for your entire application. -- -- Since 0.2.1 initProcessTracker :: IO ProcessTracker -- | Abstract type containing information on a process which will be -- restarted. data MonitoredProcess -- | Run the given command, restarting if the process dies. monitorProcess :: (MonadUnliftIO m, MonadLogger m) => ProcessTracker -> Maybe ByteString -> ByteString -> ByteString -> [ByteString] -> [(ByteString, ByteString)] -> (ByteString -> IO ()) -> (ExitCode -> IO Bool) -> m MonitoredProcess -- | Terminate the process and prevent it from being restarted. terminateMonitoredProcess :: MonitoredProcess -> IO () printStatus :: MonitoredProcess -> IO Text instance GHC.Show.Show Keter.Conduit.Process.Unix.ProcessTrackerException instance GHC.Exception.Type.Exception Keter.Conduit.Process.Unix.ProcessTrackerException module Keter.Config.Middleware data MiddlewareConfig AcceptOverride :: MiddlewareConfig Autohead :: MiddlewareConfig Jsonp :: MiddlewareConfig MethodOverride :: MiddlewareConfig MethodOverridePost :: MiddlewareConfig AddHeaders :: ![(ByteString, ByteString)] -> MiddlewareConfig -- | Realm [(username,password)] BasicAuth :: !String -> ![(ByteString, ByteString)] -> MiddlewareConfig -- | Status Message Local :: !Int -> !ByteString -> MiddlewareConfig processMiddleware :: [MiddlewareConfig] -> Middleware toMiddleware :: MiddlewareConfig -> Middleware composeMiddleware :: [Middleware] -> Middleware instance GHC.Generics.Generic Keter.Config.Middleware.MiddlewareConfig instance GHC.Show.Show Keter.Config.Middleware.MiddlewareConfig instance Data.Aeson.Types.FromJSON.FromJSON Keter.Config.Middleware.MiddlewareConfig instance Data.Aeson.Types.ToJSON.ToJSON Keter.Config.Middleware.MiddlewareConfig module Keter.LabelMap -- | A data structure for storing a hierarchical set of domain labels from -- TLD down, supporting wildcards. -- -- Data structure is mutually recursive with LabelEntry, and each -- level of the tree supports a static assignment for a hostname such as: -- --
-- example.com ---- -- Or a wildcard assignment for a hostname such as: -- --
-- *.example.com ---- -- Or a wildcard assignment with a set of teptions, for example: -- --
-- *.example.com -- admin.example.com ---- -- And lastly, empty labels are supported so that, of course, an -- assignment for example.com does not necessarily have any subdomains -- available. As an example suppose we have the following assigned -- domains: -- --
-- example.com -- foo.example.com -- *.bar.example.com -- *.qux.example.com -- baz.qux.example.com ---- -- This will resolve to the following value, with some loose pseudocode -- notation. -- --
-- Static (map) -- 'com' -> Unassigned Static (map) -- 'example' -> Assigned a (map) -- 'foo' -> Assigned a EmptyLabelMap -- 'bar' -> Unassigned (Wildcard (Assigned a EmptyLabelMap) -- 'qux' -> Unassigned (WildcardExcept (Assigned a (map))) -- 'baz' -> Assigned a EmptyLabelMap ---- -- Note that the hostname "bar.example.com" is unassigned, only the -- wildcard was set. data LabelMap a insert :: ByteString -> a -> LabelMap a -> LabelMap a delete :: ByteString -> LabelMap a -> LabelMap a lookup :: ByteString -> LabelMap a -> Maybe a labelAssigned :: ByteString -> LabelMap a -> Bool empty :: LabelMap a instance GHC.Classes.Eq a => GHC.Classes.Eq (Keter.LabelMap.LabelMap a) instance GHC.Show.Show (Keter.LabelMap.LabelMap a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Keter.LabelMap.LabelEntry a) instance GHC.Show.Show (Keter.LabelMap.LabelEntry a) -- | Handles allocation of temporary directories and unpacking of bundles -- into them. Sets owner and group of all created files and directories -- as necessary. module Keter.TempTarball data TempFolder setup :: FilePath -> IO TempFolder unpackTempTar :: Maybe (UserID, GroupID) -> TempFolder -> FilePath -> Text -> (FilePath -> IO a) -> IO a -- | Utilities for dealing with YAML config files which contain relative -- file paths. module Keter.Yaml.FilePath -- | Parse a config file, using the ParseYamlFile typeclass. decodeFileRelative :: ParseYamlFile a => FilePath -> IO (Either ParseException a) -- | A replacement for the .: operator which will both parse a -- file path and apply the relative file logic. lookupBase :: ParseYamlFile a => BaseDir -> Object -> Text -> Parser a -- | A replacement for the .:? operator which will both parse a -- file path and apply the relative file logic. lookupBaseMaybe :: ParseYamlFile a => BaseDir -> Object -> Text -> Parser (Maybe a) -- | The directory from which we're reading the config file. data BaseDir -- | A replacement for the standard FromJSON typeclass which can -- handle relative filepaths. class ParseYamlFile a parseYamlFile :: ParseYamlFile a => BaseDir -> Value -> Parser a data NonEmptyVector a NonEmptyVector :: !a -> !Vector a -> NonEmptyVector a instance Keter.Yaml.FilePath.ParseYamlFile a => Keter.Yaml.FilePath.ParseYamlFile (Keter.Yaml.FilePath.NonEmptyVector a) instance Keter.Yaml.FilePath.ParseYamlFile GHC.IO.FilePath instance (Keter.Yaml.FilePath.ParseYamlFile a, GHC.Classes.Ord a) => Keter.Yaml.FilePath.ParseYamlFile (Data.Set.Internal.Set a) instance Keter.Yaml.FilePath.ParseYamlFile a => Keter.Yaml.FilePath.ParseYamlFile (Data.Vector.Vector a) -- | Provides logging, versioning and some type aliases module Keter.Common -- | Name of the application. Should just be the basename of the -- application file. type Appname = Text data Plugin Plugin :: (Appname -> Object -> IO [(Text, Text)]) -> Plugin [pluginGetEnv] :: Plugin -> Appname -> Object -> IO [(Text, Text)] type Plugins = [Plugin] -- | Used for versioning data types. class ToCurrent a where { type Previous a; } toCurrent :: ToCurrent a => Previous a -> a -- | A port for an individual app to listen on. type Port = Int -- | A virtual host we want to serve content from. type Host = CI Text type HostBS = CI ByteString getAppname :: FilePath -> Text data KeterException CannotParsePostgres :: FilePath -> KeterException ExitCodeFailure :: FilePath -> ExitCode -> KeterException NoPortsAvailable :: KeterException InvalidConfigFile :: ParseException -> KeterException InvalidKeterConfigFile :: !FilePath -> !ParseException -> KeterException CannotReserveHosts :: !AppId -> !Map Host AppId -> KeterException FileNotExecutable :: !FilePath -> KeterException ExecutableNotFound :: !FilePath -> KeterException EnsureAliveShouldBeBiggerThenZero :: !Int -> KeterException [keterExceptionGot] :: KeterException -> !Int data AppId AIBuiltin :: AppId AINamed :: !Appname -> AppId data SSLConfig SSLFalse :: SSLConfig SSLTrue :: SSLConfig SSL :: !FilePath -> !Vector FilePath -> !FilePath -> SSLConfig instance GHC.Classes.Ord Keter.Common.AppId instance GHC.Classes.Eq Keter.Common.AppId instance GHC.Show.Show Keter.Common.KeterException instance GHC.Classes.Ord Keter.Common.SSLConfig instance GHC.Classes.Eq Keter.Common.SSLConfig instance GHC.Show.Show Keter.Common.SSLConfig instance Keter.Yaml.FilePath.ParseYamlFile Keter.Common.SSLConfig instance Data.Aeson.Types.ToJSON.ToJSON Keter.Common.SSLConfig instance Data.Aeson.Types.FromJSON.FromJSON Keter.Common.SSLConfig instance GHC.Exception.Type.Exception Keter.Common.KeterException instance GHC.Show.Show Keter.Common.AppId instance Keter.Common.ToCurrent a => Keter.Common.ToCurrent (GHC.Maybe.Maybe a) module Keter.Rewrite data ReverseProxyConfig ReverseProxyConfig :: Text -> Int -> Bool -> Text -> !SSLConfig -> Maybe Int -> Set RewriteRule -> Set RewriteRule -> ReverseProxyConfig [reversedHost] :: ReverseProxyConfig -> Text [reversedPort] :: ReverseProxyConfig -> Int [reversedUseSSL] :: ReverseProxyConfig -> Bool [reversingHost] :: ReverseProxyConfig -> Text [reversingUseSSL] :: ReverseProxyConfig -> !SSLConfig [reverseTimeout] :: ReverseProxyConfig -> Maybe Int [rewriteResponseRules] :: ReverseProxyConfig -> Set RewriteRule [rewriteRequestRules] :: ReverseProxyConfig -> Set RewriteRule data RewriteRule RewriteRule :: Text -> Text -> Text -> RewriteRule [ruleHeader] :: RewriteRule -> Text [ruleRegex] :: RewriteRule -> Text [ruleReplacement] :: RewriteRule -> Text data RPEntry RPEntry :: ReverseProxyConfig -> Manager -> RPEntry [config] :: RPEntry -> ReverseProxyConfig [httpManager] :: RPEntry -> Manager simpleReverseProxy :: Manager -> ReverseProxyConfig -> Application instance GHC.Show.Show Keter.Rewrite.RewriteRule instance GHC.Classes.Ord Keter.Rewrite.RewriteRule instance GHC.Classes.Eq Keter.Rewrite.RewriteRule instance GHC.Show.Show Keter.Rewrite.ReverseProxyConfig instance GHC.Classes.Ord Keter.Rewrite.ReverseProxyConfig instance GHC.Classes.Eq Keter.Rewrite.ReverseProxyConfig instance GHC.Show.Show Keter.Rewrite.RPEntry instance Data.Aeson.Types.FromJSON.FromJSON Keter.Rewrite.ReverseProxyConfig instance Data.Aeson.Types.ToJSON.ToJSON Keter.Rewrite.ReverseProxyConfig instance Data.Aeson.Types.FromJSON.FromJSON Keter.Rewrite.RewriteRule instance Data.Aeson.Types.ToJSON.ToJSON Keter.Rewrite.RewriteRule module Keter.Plugin.Postgres data Settings -- | How to create the given user/database. Default: uses the psql -- command line tool and sudo -u postgres. setupDBInfo :: Settings -> DBInfo -> IO () defaultSettings :: Settings -- | Load a set of existing connections from a config file. If the file -- does not exist, it will be created. Any newly created databases will -- automatically be saved to this file. load :: Settings -> FilePath -> IO Plugin instance GHC.Show.Show Keter.Plugin.Postgres.DBServerInfo instance GHC.Show.Show Keter.Plugin.Postgres.DBInfo instance Data.Aeson.Types.ToJSON.ToJSON Keter.Plugin.Postgres.DBInfo instance Data.Aeson.Types.FromJSON.FromJSON Keter.Plugin.Postgres.DBInfo instance Data.Aeson.Types.FromJSON.FromJSON Keter.Plugin.Postgres.DBServerInfo module Keter.Context -- | The top-level keter context monad, carrying around the main logger and -- some locally relevant configuration structure. -- -- See this blog post for an explanation of the design philosophy: -- https://www.fpcomplete.com/blog/2017/06/readert-design-pattern/ -- -- TODO: generalize as contexts instead of configs? Since -- not every state being passed around can be intuitively thought of as a -- config per se. Ex. AppManager newtype KeterM cfg a KeterM :: LoggingT (ReaderT cfg IO) a -> KeterM cfg a [runKeterM] :: KeterM cfg a -> LoggingT (ReaderT cfg IO) a withMappedConfig :: (cfg -> cfg') -> KeterM cfg' a -> KeterM cfg a instance Control.Monad.Reader.Class.MonadReader cfg (Keter.Context.KeterM cfg) instance Control.Monad.Logger.MonadLoggerIO (Keter.Context.KeterM cfg) instance Control.Monad.Logger.MonadLogger (Keter.Context.KeterM cfg) instance Control.Monad.IO.Class.MonadIO (Keter.Context.KeterM cfg) instance Control.Monad.IO.Unlift.MonadUnliftIO (Keter.Context.KeterM cfg) instance GHC.Base.Monad (Keter.Context.KeterM cfg) instance GHC.Base.Applicative (Keter.Context.KeterM cfg) instance GHC.Base.Functor (Keter.Context.KeterM cfg) -- | Legacy types from Keter version 0.4. Retained to keep backwards -- compatibility in config file format. module Keter.Config.V04 data AppConfig AppConfig :: FilePath -> [Text] -> Text -> Bool -> Set Text -> Object -> AppConfig [configExec] :: AppConfig -> FilePath [configArgs] :: AppConfig -> [Text] [configHost] :: AppConfig -> Text [configSsl] :: AppConfig -> Bool [configExtraHosts] :: AppConfig -> Set Text [configRaw] :: AppConfig -> Object data BundleConfig BundleConfig :: Maybe AppConfig -> Set StaticHost -> Set Redirect -> BundleConfig [bconfigApp] :: BundleConfig -> Maybe AppConfig [bconfigStaticHosts] :: BundleConfig -> Set StaticHost [bconfigRedirects] :: BundleConfig -> Set Redirect data StaticHost StaticHost :: Text -> FilePath -> StaticHost [shHost] :: StaticHost -> Text [shRoot] :: StaticHost -> FilePath data Redirect Redirect :: Text -> Text -> Redirect [redFrom] :: Redirect -> Text [redTo] :: Redirect -> Text data KeterConfig KeterConfig :: FilePath -> PortSettings -> HostPreference -> Port -> Maybe TLSConfig -> Maybe Text -> Set ReverseProxyConfig -> Bool -> Int -> KeterConfig [kconfigDir] :: KeterConfig -> FilePath [kconfigPortMan] :: KeterConfig -> PortSettings [kconfigHost] :: KeterConfig -> HostPreference [kconfigPort] :: KeterConfig -> Port [kconfigSsl] :: KeterConfig -> Maybe TLSConfig [kconfigSetuid] :: KeterConfig -> Maybe Text [kconfigReverseProxy] :: KeterConfig -> Set ReverseProxyConfig [kconfigIpFromHeader] :: KeterConfig -> Bool -- | Maximum request time in milliseconds per connection. [kconfigConnectionTimeBound] :: KeterConfig -> Int defaultKeterConfig :: KeterConfig -- | Default connection time bound in milliseconds. fiveMinutes :: Int data TLSConfig TLSConfig :: !Settings -> !FilePath -> !FilePath -> Maybe Config -> TLSConfig -- | Controls execution of the nginx thread. Follows the settings type -- pattern. See: http://www.yesodweb.com/book/settings-types. data PortSettings PortSettings :: [Port] -> PortSettings -- | Which ports to assign to apps. Defaults to unassigned ranges from IANA [portRange] :: PortSettings -> [Port] defaultPortSettings :: PortSettings instance GHC.Classes.Ord Keter.Config.V04.StaticHost instance GHC.Classes.Eq Keter.Config.V04.StaticHost instance GHC.Classes.Ord Keter.Config.V04.Redirect instance GHC.Classes.Eq Keter.Config.V04.Redirect instance Keter.Yaml.FilePath.ParseYamlFile Keter.Config.V04.KeterConfig instance Data.Aeson.Types.FromJSON.FromJSON Keter.Config.V04.PortSettings instance Keter.Yaml.FilePath.ParseYamlFile Keter.Config.V04.TLSConfig instance Keter.Yaml.FilePath.ParseYamlFile Keter.Config.V04.BundleConfig instance Data.Aeson.Types.FromJSON.FromJSON Keter.Config.V04.Redirect instance Keter.Yaml.FilePath.ParseYamlFile Keter.Config.V04.StaticHost instance Keter.Yaml.FilePath.ParseYamlFile Keter.Config.V04.AppConfig module Keter.Config.V10 data BundleConfig BundleConfig :: !Vector (Stanza ()) -> !Object -> BundleConfig [bconfigStanzas] :: BundleConfig -> !Vector (Stanza ()) -- | settings used for plugins [bconfigPlugins] :: BundleConfig -> !Object data ListeningPort LPSecure :: !HostPreference -> !Port -> !FilePath -> !Vector FilePath -> !FilePath -> !Bool -> ListeningPort LPInsecure :: !HostPreference -> !Port -> ListeningPort data KeterConfig KeterConfig :: FilePath -> PortSettings -> !NonEmptyVector ListeningPort -> Maybe Text -> !Vector (Stanza ()) -> Bool -> !Int -> !Int -> !Map Text Text -> !Int -> !Maybe Port -> !Maybe FilePath -> !Maybe FilePath -> !Maybe FilePath -> !Bool -> KeterConfig [kconfigDir] :: KeterConfig -> FilePath [kconfigPortPool] :: KeterConfig -> PortSettings [kconfigListeners] :: KeterConfig -> !NonEmptyVector ListeningPort [kconfigSetuid] :: KeterConfig -> Maybe Text [kconfigBuiltinStanzas] :: KeterConfig -> !Vector (Stanza ()) [kconfigIpFromHeader] :: KeterConfig -> Bool -- | External HTTP port when generating APPROOTs. [kconfigExternalHttpPort] :: KeterConfig -> !Int -- | External HTTPS port when generating APPROOTs. [kconfigExternalHttpsPort] :: KeterConfig -> !Int -- | Environment variables to be passed to all apps. [kconfigEnvironment] :: KeterConfig -> !Map Text Text -- | Maximum request time in milliseconds per connection. [kconfigConnectionTimeBound] :: KeterConfig -> !Int -- | Port for the cli to listen on [kconfigCliPort] :: KeterConfig -> !Maybe Port [kconfigUnknownHostResponse] :: KeterConfig -> !Maybe FilePath [kconfigMissingHostResponse] :: KeterConfig -> !Maybe FilePath [kconfigProxyException] :: KeterConfig -> !Maybe FilePath [kconfigRotateLogs] :: KeterConfig -> !Bool defaultKeterConfig :: KeterConfig -- | Whether we should force redirect to HTTPS routes. type RequiresSecure = Bool data Stanza port Stanza :: StanzaRaw port -> RequiresSecure -> Stanza port data StanzaRaw port StanzaStaticFiles :: !StaticFilesConfig -> StanzaRaw port StanzaRedirect :: !RedirectConfig -> StanzaRaw port StanzaWebApp :: !WebAppConfig port -> StanzaRaw port StanzaReverseProxy :: !ReverseProxyConfig -> ![MiddlewareConfig] -> !Maybe Int -> StanzaRaw port StanzaBackground :: !BackgroundConfig -> StanzaRaw port -- | An action to be performed for a requested hostname. -- -- This datatype is very similar to Stanza, but is necessarily separate -- since: -- --